Skip to main content

Crate tower_mcp

Crate tower_mcp 

Source
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

§Client

§Protocol

§Feature Flags

  • full - Enable all optional features
  • http - HTTP/SSE transport for web servers
  • websocket - WebSocket transport for bidirectional communication
  • childproc - Child process transport for subprocess management
  • oauth - 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