pub struct McpToolset<S = ()>{ /* private fields */ }tools only.Expand description
MCP Toolset - connects to an MCP server and exposes its tools as ADK tools.
This toolset implements the ADK Toolset trait and bridges the gap between
MCP servers and ADK agents. It:
- Connects to an MCP server via the provided transport
- Discovers available tools from the server
- Converts MCP tools to ADK-compatible
Toolimplementations - Proxies tool execution calls to the MCP server
§Example
use adk_tool::McpToolset;
use rmcp::{ServiceExt, transport::TokioChildProcess};
use tokio::process::Command;
// Create MCP client connection to a local server
let client = ().serve(TokioChildProcess::new(
Command::new("npx")
.arg("-y")
.arg("@modelcontextprotocol/server-everything")
)?).await?;
// Create toolset from the client
let toolset = McpToolset::new(client);
// Add to agent
let agent = LlmAgentBuilder::new("assistant")
.toolset(Arc::new(toolset))
.build()?;Implementations§
Source§impl<S> McpToolset<S>
impl<S> McpToolset<S>
Sourcepub fn new(client: RunningService<RoleClient, S>) -> McpToolset<S>
pub fn new(client: RunningService<RoleClient, S>) -> McpToolset<S>
Create a new MCP toolset from a running MCP client service.
The client should already be connected and initialized.
Use rmcp::ServiceExt::serve() to create the client.
§Example
use rmcp::{ServiceExt, transport::TokioChildProcess};
use tokio::process::Command;
let client = ().serve(TokioChildProcess::new(
Command::new("my-mcp-server")
)?).await?;
let toolset = McpToolset::new(client);Sourcepub fn with_client_handler(
client: RunningService<RoleClient, S>,
) -> McpToolset<S>
pub fn with_client_handler( client: RunningService<RoleClient, S>, ) -> McpToolset<S>
Create a McpToolset from a RunningService with a custom ClientHandler.
This is functionally identical to new() but makes the intent explicit
when using a custom ClientHandler type.
§Example
use rmcp::ServiceExt;
use adk_tool::McpToolset;
let client = my_custom_handler.serve(transport).await?;
let toolset = McpToolset::with_client_handler(client);Sourcepub fn with_name(self, name: impl Into<String>) -> McpToolset<S>
pub fn with_name(self, name: impl Into<String>) -> McpToolset<S>
Set a custom name for this toolset.
Sourcepub fn with_task_support(self, config: McpTaskConfig) -> McpToolset<S>
pub fn with_task_support(self, config: McpTaskConfig) -> McpToolset<S>
Enable task support for long-running operations.
When enabled, tools marked as is_long_running() will use MCP’s
async task lifecycle (SEP-1686) instead of blocking calls.
§Example
let toolset = McpToolset::new(client)
.with_task_support(McpTaskConfig::enabled()
.poll_interval(Duration::from_secs(2))
.timeout(Duration::from_secs(300)));Sourcepub fn with_connection_factory<F>(self, factory: Arc<F>) -> McpToolset<S>where
F: ConnectionFactory<S> + 'static,
pub fn with_connection_factory<F>(self, factory: Arc<F>) -> McpToolset<S>where
F: ConnectionFactory<S> + 'static,
Provide a connection factory to enable automatic MCP reconnection.
Sourcepub fn with_refresh_config(self, config: RefreshConfig) -> McpToolset<S>
pub fn with_refresh_config(self, config: RefreshConfig) -> McpToolset<S>
Configure MCP reconnect/retry behavior.
Sourcepub fn with_filter<F>(self, filter: F) -> McpToolset<S>
pub fn with_filter<F>(self, filter: F) -> McpToolset<S>
Sourcepub fn with_tools(self, tool_names: &[&str]) -> McpToolset<S>
pub fn with_tools(self, tool_names: &[&str]) -> McpToolset<S>
Sourcepub async fn cancellation_token(&self) -> RunningServiceCancellationToken
pub async fn cancellation_token(&self) -> RunningServiceCancellationToken
Get a cancellation token that can be used to shutdown the MCP server.
Call cancel() on the returned token to cleanly shutdown the MCP server.
This should be called before exiting to avoid EPIPE errors.
§Example
let toolset = McpToolset::new(client);
let cancel_token = toolset.cancellation_token().await;
// ... use the toolset ...
// Before exiting:
cancel_token.cancel();Sourcepub async fn list_resources(
&self,
) -> Result<Vec<Annotated<RawResource>>, AdkError>
pub async fn list_resources( &self, ) -> Result<Vec<Annotated<RawResource>>, AdkError>
List static resources from the connected MCP server.
Returns the list of resources advertised by the server via the
resources/list protocol method. Returns an empty Vec when the
server does not support resources (i.e. responds with
MethodNotFound).
§Errors
Returns AdkError::Tool on transport or unexpected server errors.
Sourcepub async fn list_resource_templates(
&self,
) -> Result<Vec<Annotated<RawResourceTemplate>>, AdkError>
pub async fn list_resource_templates( &self, ) -> Result<Vec<Annotated<RawResourceTemplate>>, AdkError>
List URI template resources from the connected MCP server.
Returns the list of resource templates advertised by the server via
the resourceTemplates/list protocol method. Returns an empty Vec
when the server does not support resource templates (i.e. responds
with MethodNotFound).
§Errors
Returns AdkError::Tool on transport or unexpected server errors.
Sourcepub async fn read_resource(
&self,
uri: &str,
) -> Result<Vec<ResourceContents>, AdkError>
pub async fn read_resource( &self, uri: &str, ) -> Result<Vec<ResourceContents>, AdkError>
Read a resource by URI from the connected MCP server.
Delegates to the resources/read protocol method. Returns the
resource contents on success.
§Errors
Returns AdkError::Tool("resource not found: {uri}") when the URI
does not match any resource on the server. Returns a generic
AdkError::Tool on transport or other server errors.
Source§impl McpToolset<AdkClientHandler>
impl McpToolset<AdkClientHandler>
Sourcepub async fn with_elicitation_handler<T, E, A>(
transport: T,
handler: Arc<dyn ElicitationHandler>,
) -> Result<McpToolset<AdkClientHandler>, AdkError>
pub async fn with_elicitation_handler<T, E, A>( transport: T, handler: Arc<dyn ElicitationHandler>, ) -> Result<McpToolset<AdkClientHandler>, AdkError>
Create a McpToolset with elicitation support from a transport.
This creates the MCP client using AdkClientHandler, which advertises
elicitation capabilities and delegates requests to the provided handler.
§Example
use adk_tool::{McpToolset, ElicitationHandler, AutoDeclineElicitationHandler};
use rmcp::transport::TokioChildProcess;
use tokio::process::Command;
use std::sync::Arc;
let transport = TokioChildProcess::new(Command::new("my-mcp-server"))?;
let handler = Arc::new(AutoDeclineElicitationHandler);
let toolset = McpToolset::with_elicitation_handler(transport, handler).await?;§ConnectionFactory with Elicitation
To preserve elicitation across reconnections, clone the Arc<dyn ElicitationHandler>
into your ConnectionFactory implementation:
use adk_tool::{McpToolset, ElicitationHandler};
use adk_tool::mcp::ConnectionFactory;
use rmcp::{ServiceExt, service::{RoleClient, RunningService}};
use rmcp::transport::TokioChildProcess;
use tokio::process::Command;
use std::sync::Arc;
struct MyReconnectFactory {
handler: Arc<dyn ElicitationHandler>,
server_command: String,
}
// The factory creates a fresh AdkClientHandler on each reconnection,
// so the new connection advertises elicitation capabilities.
// The ConnectionFactory trait itself is unchanged.Trait Implementations§
Source§impl<S> Toolset for McpToolset<S>
impl<S> Toolset for McpToolset<S>
Auto Trait Implementations§
impl<S> Freeze for McpToolset<S>
impl<S = ()> !RefUnwindSafe for McpToolset<S>
impl<S> Send for McpToolset<S>
impl<S> Sync for McpToolset<S>
impl<S> Unpin for McpToolset<S>
impl<S> UnsafeUnpin for McpToolset<S>
impl<S = ()> !UnwindSafe for McpToolset<S>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request