//! MCP Protocol Messages //! //! Request and response types for MCP methods. use serde::{Deserialize, Serialize}; use serde_json::Value; use std::collections::HashMap; // ============================================================================ // INITIALIZE // ============================================================================ /// Initialize request from client #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct InitializeRequest { pub protocol_version: String, pub capabilities: ClientCapabilities, pub client_info: ClientInfo, } impl Default for InitializeRequest { fn default() -> Self { Self { protocol_version: "2024-11-05".to_string(), capabilities: ClientCapabilities::default(), client_info: ClientInfo { name: "unknown".to_string(), version: "0.0.0".to_string(), }, } } } #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ClientCapabilities { #[serde(skip_serializing_if = "Option::is_none")] pub roots: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub sampling: Option>, } #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ClientInfo { pub name: String, pub version: String, } /// Initialize response to client #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct InitializeResult { pub protocol_version: String, pub server_info: ServerInfo, pub capabilities: ServerCapabilities, #[serde(skip_serializing_if = "Option::is_none")] pub instructions: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ServerInfo { pub name: String, pub version: String, } #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ServerCapabilities { #[serde(skip_serializing_if = "Option::is_none")] pub tools: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub resources: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub prompts: Option>, } // ============================================================================ // TOOLS // ============================================================================ /// Tool description for tools/list #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ToolDescription { pub name: String, #[serde(skip_serializing_if = "Option::is_none")] pub description: Option, pub input_schema: Value, } /// Result of tools/list #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ListToolsResult { pub tools: Vec, } /// Request for tools/call #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct CallToolRequest { pub name: String, #[serde(default)] pub arguments: Option, } /// Result of tools/call #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct CallToolResult { pub content: Vec, #[serde(skip_serializing_if = "Option::is_none")] pub is_error: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ToolResultContent { #[serde(rename = "type")] pub content_type: String, pub text: String, } // ============================================================================ // RESOURCES // ============================================================================ /// Resource description for resources/list #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ResourceDescription { pub uri: String, pub name: String, #[serde(skip_serializing_if = "Option::is_none")] pub description: Option, #[serde(skip_serializing_if = "Option::is_none")] pub mime_type: Option, } /// Result of resources/list #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ListResourcesResult { pub resources: Vec, } /// Request for resources/read #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ReadResourceRequest { pub uri: String, } /// Result of resources/read #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ReadResourceResult { pub contents: Vec, } #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ResourceContent { pub uri: String, #[serde(skip_serializing_if = "Option::is_none")] pub mime_type: Option, #[serde(skip_serializing_if = "Option::is_none")] pub text: Option, #[serde(skip_serializing_if = "Option::is_none")] pub blob: Option, }