Expand description
§tower-mcp
Tower-native Model Context Protocol (MCP) implementation for Rust.
This crate provides a composable, middleware-friendly approach to building MCP servers and clients using the Tower service abstraction.
§Philosophy
Unlike framework-style MCP implementations, tower-mcp treats MCP as just another
protocol that can be served through Tower’s Service trait. This means:
- Standard tower middleware (tracing, metrics, rate limiting, auth) just works
- Same service can be exposed over multiple transports (stdio, HTTP, WebSocket)
- Easy integration with existing tower-based applications (axum, tonic, etc.)
§Quick Start: Server
Build an MCP server with tools, resources, and prompts:
use tower_mcp::{BoxError, McpRouter, ToolBuilder, CallToolResult, StdioTransport};
use schemars::JsonSchema;
use serde::Deserialize;
#[derive(Debug, Deserialize, JsonSchema)]
struct GreetInput {
name: String,
}
#[tokio::main]
async fn main() -> Result<(), BoxError> {
// Define a tool
let greet = ToolBuilder::new("greet")
.description("Greet someone by name")
.handler(|input: GreetInput| async move {
Ok(CallToolResult::text(format!("Hello, {}!", input.name)))
})
.build()?;
// Create router and run over stdio
let router = McpRouter::new()
.server_info("my-server", "1.0.0")
.tool(greet);
StdioTransport::new(router).run().await?;
Ok(())
}§Quick Start: Client
Connect to an MCP server and call tools:
use tower_mcp::BoxError;
use tower_mcp::client::{McpClient, StdioClientTransport};
#[tokio::main]
async fn main() -> Result<(), BoxError> {
// Connect to server
let transport = StdioClientTransport::spawn("my-mcp-server", &[]).await?;
let mut client = McpClient::new(transport);
// Initialize and list tools
client.initialize("my-client", "1.0.0").await?;
let tools = client.list_tools().await?;
// Call a tool
let result = client.call_tool("greet", serde_json::json!({"name": "World"})).await?;
println!("{:?}", result);
Ok(())
}§Key Types
§Server
McpRouter- Routes MCP requests to tools, resources, and promptsToolBuilder- Builder for defining tools with type-safe handlersResourceBuilder- Builder for defining resourcesPromptBuilder- Builder for defining promptsStdioTransport- Stdio transport for CLI servers
§Client
McpClient- Client for connecting to MCP serversStdioClientTransport- Spawn and connect to server subprocesses
§Protocol
CallToolResult- Tool execution result with contentReadResourceResult- Resource read resultGetPromptResult- Prompt expansion resultContent- Text, image, audio, or resource content
§Feature Flags
full- Enable all optional featureshttp- HTTP/SSE transport for web serverswebsocket- WebSocket transport for bidirectional communicationchildproc- Child process transport for subprocess managementoauth- OAuth 2.1 resource server support (token validation, metadata endpoint)testing- Test utilities ([TestClient]) for ergonomic MCP server testing
§MCP Specification
This crate implements the MCP specification (2025-11-25): https://modelcontextprotocol.io/specification/2025-11-25
Re-exports§
pub use async_task::Task;pub use async_task::TaskStore;pub use client::ClientTransport;pub use client::McpClient;pub use client::StdioClientTransport;pub use context::ChannelClientRequester;pub use context::ClientRequester;pub use context::ClientRequesterHandle;pub use context::NotificationReceiver;pub use context::NotificationSender;pub use context::OutgoingRequest;pub use context::OutgoingRequestReceiver;pub use context::OutgoingRequestSender;pub use context::RequestContext;pub use context::RequestContextBuilder;pub use context::ServerNotification;pub use context::outgoing_request_channel;pub use error::BoxError;pub use error::Error;pub use error::Result;pub use error::ToolError;pub use jsonrpc::JsonRpcLayer;pub use jsonrpc::JsonRpcService;pub use prompt::Prompt;pub use prompt::PromptBuilder;pub use prompt::PromptHandler;pub use protocol::CallToolResult;pub use protocol::CompleteParams;pub use protocol::CompleteResult;pub use protocol::Completion;pub use protocol::CompletionArgument;pub use protocol::CompletionReference;pub use protocol::CompletionsCapability;pub use protocol::Content;pub use protocol::ContentRole;pub use protocol::CreateMessageParams;pub use protocol::CreateMessageResult;pub use protocol::ElicitAction;pub use protocol::ElicitFieldValue;pub use protocol::ElicitFormParams;pub use protocol::ElicitFormSchema;pub use protocol::ElicitMode;pub use protocol::ElicitRequestParams;pub use protocol::ElicitResult;pub use protocol::ElicitUrlParams;pub use protocol::ElicitationCapability;pub use protocol::ElicitationCompleteParams;pub use protocol::GetPromptResult;pub use protocol::GetPromptResultBuilder;pub use protocol::IncludeContext;pub use protocol::JsonRpcMessage;pub use protocol::JsonRpcRequest;pub use protocol::JsonRpcResponse;pub use protocol::JsonRpcResponseMessage;pub use protocol::ListRootsParams;pub use protocol::ListRootsResult;pub use protocol::McpRequest;pub use protocol::McpResponse;pub use protocol::ModelHint;pub use protocol::ModelPreferences;pub use protocol::PrimitiveSchemaDefinition;pub use protocol::PromptMessage;pub use protocol::PromptReference;pub use protocol::PromptRole;pub use protocol::ReadResourceResult;pub use protocol::ResourceContent;pub use protocol::ResourceReference;pub use protocol::Root;pub use protocol::RootsCapability;pub use protocol::SamplingCapability;pub use protocol::SamplingContent;pub use protocol::SamplingContentOrArray;pub use protocol::SamplingMessage;pub use protocol::SamplingTool;pub use protocol::ToolChoice;pub use resource::Resource;pub use resource::ResourceBuilder;pub use resource::ResourceHandler;pub use resource::ResourceTemplate;pub use resource::ResourceTemplateBuilder;pub use resource::ResourceTemplateHandler;pub use router::Extensions;pub use router::McpRouter;pub use router::RouterRequest;pub use router::RouterResponse;pub use session::SessionPhase;pub use session::SessionState;pub use tool::Tool;pub use tool::ToolBuilder;pub use tool::ToolHandler;pub use transport::BidirectionalStdioTransport;pub use transport::CatchError;pub use transport::GenericStdioTransport;pub use transport::StdioTransport;pub use transport::SyncStdioTransport;
Modules§
- async_
task - Async task management for long-running MCP operations
- auth
- Authentication middleware helpers for MCP servers
- client
- MCP Client implementation
- context
- Request context for MCP handlers
- error
- Error types for tower-mcp
- jsonrpc
- JSON-RPC 2.0 service layer
- prompt
- Prompt definition and builder API
- protocol
- MCP protocol types based on JSON-RPC 2.0
- resource
- Resource definition and builder API
- router
- MCP Router - routes requests to tools, resources, and prompts
- session
- MCP session state management
- tool
- Tool definition and builder API
- transport
- MCP transport implementations