A high-quality Rust implementation of the Model Context Protocol (MCP) SDK, maintaining full compatibility with the TypeScript SDK while leveraging Rust's performance and safety guarantees.
Code Name: Angel Rust
ð Version 1.2.1 - Toyota Way Quality Excellence & PMAT Integration!#[tool]
macroAdd to your Cargo.toml
:
[dependencies] pmcp = "1.2"
The SDK includes comprehensive examples for all major features:
# Client initialization and connection cargo run --example 01_client_initialize # Basic server with tools cargo run --example 02_server_basic # Client tool usage cargo run --example 03_client_tools # Server with resources cargo run --example 04_server_resources # Client resource access cargo run --example 05_client_resources # Server with prompts cargo run --example 06_server_prompts # Client prompts usage cargo run --example 07_client_prompts # Logging cargo run --example 08_logging # Authentication (OAuth, Bearer tokens) cargo run --example 09_authentication # Progress notifications cargo run --example 10_progress_notifications # Request cancellation cargo run --example 11_request_cancellation # Error handling patterns cargo run --example 12_error_handling # WebSocket transport cargo run --example 13_websocket_transport # LLM sampling operations cargo run --example 14_sampling_llm # Middleware and interceptors cargo run --example 15_middleware # OAuth server with authentication cargo run --example 16_oauth_server # Completable prompts cargo run --example 17_completable_prompts # Resource watching with file system monitoring cargo run --example 18_resource_watcher # Input elicitation cargo run --example 19_elicit_input # OIDC discovery and authentication cargo run --example 20_oidc_discovery # Procedural macros for tools cargo run --example 21_macro_tools --features macros # Streamable HTTP server (stateful with sessions) cargo run --example 22_streamable_http_server_stateful --features streamable-http # Streamable HTTP server (stateless for serverless) cargo run --example 23_streamable_http_server_stateless --features streamable-http # Streamable HTTP client cargo run --example 24_streamable_http_client --features streamable-http # WASM client (browser-based) - see examples/wasm-client/README.md cd examples/wasm-client && bash build.sh
See the examples directory for detailed documentation.
What's New in v1.0 (In Development)#[tool]
attribute for automatic tool handler generation#[tool_router]
for collecting tools from impl blocksFull WebSocket support with automatic reconnection, exponential backoff, and keepalive ping/pong.
HTTP transport with Server-Sent Events for real-time notifications and long-polling support.
Native support for model sampling operations with the createMessage
API:
let result = client.create_message(CreateMessageRequest { messages: vec![SamplingMessage { role: Role::User, content: Content::Text { text: "Hello!".to_string() }, }], ..Default::default() }).await?;
Powerful middleware chain for request/response processing:
use pmcp::{MiddlewareChain, LoggingMiddleware, AuthMiddleware}; let mut chain = MiddlewareChain::new(); chain.add(Arc::new(LoggingMiddleware::default())); chain.add(Arc::new(AuthMiddleware::new("token".to_string())));ð Message Batching & Debouncing
Optimize notification delivery with batching and debouncing:
use pmcp::{MessageBatcher, BatchingConfig}; let batcher = MessageBatcher::new(BatchingConfig { max_batch_size: 10, max_wait_time: Duration::from_millis(100), ..Default::default() });
use pmcp::{Client, StdioTransport, ClientCapabilities}; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { // Create client with stdio transport let transport = StdioTransport::new(); let mut client = Client::new(transport); // Initialize connection let server_info = client.initialize(ClientCapabilities::default()).await?; println!("Connected to: {}", server_info.server_info.name); // List available tools let tools = client.list_tools(None).await?; for tool in tools.tools { println!("Tool: {} - {:?}", tool.name, tool.description); } // Call a tool let result = client.call_tool("get-weather", serde_json::json!({ "location": "San Francisco" })).await?; Ok(()) }
use pmcp::{Server, ServerCapabilities, ToolHandler}; use async_trait::async_trait; use serde_json::Value; struct WeatherTool; #[async_trait] impl ToolHandler for WeatherTool { async fn handle(&self, args: Value) -> pmcp::Result<Value> { let location = args["location"].as_str() .ok_or_else(|| pmcp::Error::validation("location required"))?; // Implement weather fetching logic Ok(serde_json::json!({ "temperature": 72, "condition": "sunny", "location": location })) } } #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let server = Server::builder() .name("weather-server") .version("1.0.0") .capabilities(ServerCapabilities::tools_only()) .tool("get-weather", WeatherTool) .build()?; // Run with stdio transport server.run_stdio().await?; Ok(()) }
let transport = StdioTransport::new();Streamable HTTP (Stateful)
use pmcp::{StreamableHttpTransport, StreamableHttpTransportConfig}; let config = StreamableHttpTransportConfig { url: "http://localhost:3000".parse()?, enable_sse: true, // Use SSE for real-time updates session_id: Some("my-session".to_string()), ..Default::default() }; let transport = StreamableHttpTransport::new(config);Streamable HTTP (Stateless/Serverless)
use pmcp::{StreamableHttpTransport, StreamableHttpTransportConfig}; let config = StreamableHttpTransportConfig { url: "http://localhost:8081".parse()?, enable_sse: false, // Simple request/response session_id: None, // No session management ..Default::default() }; let transport = StreamableHttpTransport::new(config);
use pmcp::{WebSocketTransport, WebSocketConfig}; let config = WebSocketConfig { url: "ws://localhost:8080".parse()?, auto_reconnect: true, ..Default::default() }; let transport = WebSocketTransport::new(config);
// For WebSocket in browser use pmcp::{WasmWebSocketTransport}; let transport = WasmWebSocketTransport::connect("ws://localhost:8080").await?; // For HTTP in browser use pmcp::{WasmHttpTransport, WasmHttpConfig}; let config = WasmHttpConfig { url: "https://api.example.com/mcp".to_string(), extra_headers: vec![], }; let transport = WasmHttpTransport::new(config);
# Clone the repository git clone https://github.com/paiml/rust-pmcp cd rust-pmcp # Install development tools make setup # Run quality checks make quality-gate
This project maintains Toyota Way and PMAT-level quality standards:
unwrap()
: All errors handled explicitly with comprehensive error types# Run all tests make test-all # Run property tests (slower, more thorough) make test-property # Generate coverage report make coverage # Run mutation tests make mutants
git checkout -b feature/amazing-feature
)make quality-gate
)git push origin feature/amazing-feature
)pmcp/
âââ src/
â âââ client/ # Client implementation
â âââ server/ # Server implementation
â âââ shared/ # Shared transport/protocol code
â âââ types/ # Protocol type definitions
â âââ utils/ # Utility functions
âââ tests/
â âââ integration/ # Integration tests
â âââ property/ # Property-based tests
âââ benches/ # Performance benchmarks
âââ examples/ # Example implementations
Feature TypeScript SDK Rust SDK Protocol Versions 2024-10-07+ 2024-10-07+ Transports stdio, SSE, WebSocket stdio, SSE, WebSocket Authentication OAuth 2.0, Bearer OAuth 2.0, Bearer Tools â â Prompts â â Resources â â Sampling â â
Benchmarks show 10x improvement over TypeScript SDK:
Run benchmarks:
This project is licensed under the MIT License - see the LICENSE file for details.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4