Crates.io | turbomcp-protocol |
lib.rs | turbomcp-protocol |
version | 1.1.0-exp.3 |
created_at | 2025-08-26 17:17:09.244763+00 |
updated_at | 2025-08-29 19:50:16.133037+00 |
description | Model Context Protocol (MCP) specification implementation with JSON-RPC and schema validation |
homepage | |
repository | https://github.com/Epistates/turbomcp |
max_upload_size | |
id | 1811553 |
size | 304,735 |
Complete Model Context Protocol (MCP) specification implementation with JSON-RPC 2.0 and runtime schema validation.
turbomcp-protocol
provides a complete, specification-compliant implementation of the Model Context Protocol (MCP) version 2025-06-18. This crate handles all protocol-level concerns including message formatting, capability negotiation, and runtime validation.
jsonschema
crate┌─────────────────────────────────────────────┐
│ TurboMCP Protocol │
├─────────────────────────────────────────────┤
│ MCP Message Types │
│ ├── InitializeRequest/Response │
│ ├── Tool/Resource/Prompt messages │
│ ├── Capability negotiation │
│ └── Notification handling │
├─────────────────────────────────────────────┤
│ JSON-RPC 2.0 Layer │
│ ├── Request/Response correlation │
│ ├── ID generation and tracking │
│ ├── Error code standardization │
│ └── Batch message processing │
├─────────────────────────────────────────────┤
│ Schema Validation │
│ ├── Runtime JSON schema validation │
│ ├── Parameter type checking │
│ ├── Response format validation │
│ └── Custom schema extension support │
└─────────────────────────────────────────────┘
use turbomcp_protocol::{
InitializeRequest, InitializeResponse,
ToolsListRequest, ToolsListResponse,
ToolsCallRequest, ToolsCallResponse,
ResourcesListRequest, ResourcesListResponse,
ResourcesReadRequest, ResourcesReadResponse,
PromptsListRequest, PromptsListResponse,
PromptsGetRequest, PromptsGetResponse,
};
use turbomcp_protocol::{
JsonRpcRequest, JsonRpcResponse, JsonRpcNotification,
JsonRpcError, ErrorCode, RequestId,
};
use turbomcp_protocol::{
JsonRpcRequest, JsonRpcResponse, InitializeRequest,
ToolsListRequest, McpError
};
// Parse incoming JSON-RPC request
let json_data = r#"{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": {"name": "test-client", "version": "1.0.0"}
}
}"#;
let request: JsonRpcRequest = serde_json::from_str(json_data)?;
// Handle specific message types
match request.method.as_str() {
"initialize" => {
let init_req: InitializeRequest = serde_json::from_value(request.params)?;
// Process initialization
},
"tools/list" => {
let tools_req: ToolsListRequest = serde_json::from_value(request.params)?;
// Process tools list request
},
_ => {
// Handle unknown method
}
}
use turbomcp_protocol::{validate_tool_call, ToolCallParams, ValidationResult};
// Define tool parameters with schema validation
#[derive(serde::Serialize, serde::Deserialize)]
struct AddParams {
a: f64,
b: f64,
}
// Validate tool call parameters
let params = serde_json::json!({"a": 5.0, "b": 3.0});
let result: ValidationResult = validate_tool_call("add", ¶ms)?;
match result {
ValidationResult::Valid => {
// Parameters are valid, proceed with tool call
let add_params: AddParams = serde_json::from_value(params)?;
},
ValidationResult::Invalid(errors) => {
// Handle validation errors
for error in errors {
eprintln!("Validation error: {}", error);
}
}
}
use turbomcp_protocol::{
ServerCapabilities, ClientCapabilities, CapabilitySet,
ToolCapability, ResourceCapability, PromptCapability
};
// Define server capabilities
let server_caps = ServerCapabilities {
tools: Some(ToolCapability {}),
resources: Some(ResourceCapability {
subscribe: true,
list_changed: true
}),
prompts: Some(PromptCapability {}),
experimental: None,
};
// Define client capabilities
let client_caps = ClientCapabilities {
sampling: None,
roots: Some(RootCapability {
list_changed: true
}),
experimental: None,
};
// Negotiate capabilities
let negotiated = negotiate_capabilities(&server_caps, &client_caps)?;
use turbomcp_protocol::{JsonRpcError, ErrorCode, McpError};
// Create protocol-specific errors
fn handle_tool_error(error: &str) -> JsonRpcError {
JsonRpcError {
code: ErrorCode::InvalidParams,
message: format!("Tool validation failed: {}", error),
data: None,
}
}
// Convert to MCP error
let mcp_error = McpError::Protocol(handle_tool_error("Missing parameter 'name'"));
use turbomcp_protocol::{JsonRpcRequest, JsonRpcResponse, RequestId};
use serde::{Serialize, Deserialize};
// Define custom message types
#[derive(Serialize, Deserialize)]
struct CustomRequest {
custom_field: String,
optional_data: Option<serde_json::Value>,
}
#[derive(Serialize, Deserialize)]
struct CustomResponse {
result: String,
metadata: serde_json::Value,
}
// Create custom JSON-RPC messages
fn create_custom_request(id: RequestId, params: CustomRequest) -> JsonRpcRequest {
JsonRpcRequest {
jsonrpc: "2.0".to_string(),
id,
method: "custom/method".to_string(),
params: serde_json::to_value(params).unwrap(),
}
}
sequenceDiagram
participant Client
participant Protocol as turbomcp-protocol
participant Server
Client->>Protocol: Raw JSON message
Protocol->>Protocol: Parse JSON-RPC
Protocol->>Protocol: Validate message format
Protocol->>Protocol: Extract MCP message
Protocol->>Protocol: Validate against schema
Protocol->>Server: Typed MCP message
Server->>Protocol: Typed MCP response
Protocol->>Protocol: Serialize response
Protocol->>Protocol: Wrap in JSON-RPC
Protocol->>Client: JSON response
Feature | Description | Default |
---|---|---|
validation |
Enable runtime schema validation | ✅ |
extensions |
Enable MCP extension message types | ❌ |
batch |
Enable JSON-RPC batch processing | ✅ |
async-validation |
Enable async schema validation | ❌ |
initialize
- Protocol initialization and capability negotiationinitialized
- Initialization completion notificationtools/list
- List available toolstools/call
- Execute a tool with parametersresources/list
- List available resourcesresources/read
- Read resource contentresources/updated
- Resource change notificationprompts/list
- List available promptsprompts/get
- Get prompt contentcapabilities/changed
- Capability change notificationProtocol handling is automatic when using the main framework:
use turbomcp::prelude::*;
#[server]
impl MyServer {
#[tool("Add numbers")]
async fn add(&self, a: f64, b: f64) -> McpResult<f64> {
// Protocol parsing and validation handled automatically
Ok(a + b)
}
}
For custom implementations or integrations:
use turbomcp_protocol::{McpServer, JsonRpcRequest, JsonRpcResponse};
struct CustomProtocolHandler;
impl CustomProtocolHandler {
async fn handle_message(&self, raw_json: &str) -> Result<String, Box<dyn std::error::Error>> {
// Parse JSON-RPC message
let request: JsonRpcRequest = serde_json::from_str(raw_json)?;
// Handle based on method
let response = match request.method.as_str() {
"tools/list" => self.handle_tools_list(request).await?,
"tools/call" => self.handle_tools_call(request).await?,
_ => return Err("Unknown method".into()),
};
// Serialize response
Ok(serde_json::to_string(&response)?)
}
}
# Build with all features
cargo build --features validation,extensions,batch
# Build minimal (no validation)
cargo build --no-default-features
# Run protocol compliance tests
cargo test
# Test with all message types
cargo test --features extensions
# Validate against MCP specification
cargo test test_mcp_compliance
# Generate JSON schemas from Rust types
cargo run --example generate_schemas
# Validate example messages
cargo test test_message_validation
Licensed under the MIT License.
Part of the TurboMCP high-performance Rust SDK for the Model Context Protocol.