pub struct UnifiedMcpServer { /* private fields */ }Expand description
A unified MCP server that aggregates multiple tools
The UnifiedMcpServer implements the ToolProtocol trait and routes tool execution requests to the appropriate underlying tool protocol implementation based on the tool name.
This allows a single server instance to expose multiple tools with different implementations, making it suitable for deployment as an MCP HTTP service that can be accessed by multiple agents.
§Thread Safety
The server is thread-safe and can be shared across multiple concurrent
tool executions using Arc<UnifiedMcpServer>.
Implementations§
Source§impl UnifiedMcpServer
impl UnifiedMcpServer
Sourcepub async fn register_tool(
&mut self,
tool_name: &str,
protocol: Arc<dyn ToolProtocol>,
)
pub async fn register_tool( &mut self, tool_name: &str, protocol: Arc<dyn ToolProtocol>, )
Register a tool with the server
§Arguments
tool_name- The identifier for the tool (e.g., “memory”, “bash”)protocol- The ToolProtocol implementation for this tool
§Example
use cloudllm::mcp_server::UnifiedMcpServer;
use cloudllm::tools::Memory;
use cloudllm::tool_protocols::MemoryProtocol;
use std::sync::Arc;
let memory = Arc::new(Memory::new());
let memory_protocol = Arc::new(MemoryProtocol::new(memory));
let mut server = UnifiedMcpServer::new();
server.register_tool("memory", memory_protocol).await;Sourcepub async fn unregister_tool(&mut self, tool_name: &str)
pub async fn unregister_tool(&mut self, tool_name: &str)
Unregister a tool from the server
Sourcepub async fn tool_count(&self) -> usize
pub async fn tool_count(&self) -> usize
Get the number of registered tools
Trait Implementations§
Source§impl Clone for UnifiedMcpServer
impl Clone for UnifiedMcpServer
Source§fn clone(&self) -> UnifiedMcpServer
fn clone(&self) -> UnifiedMcpServer
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Default for UnifiedMcpServer
impl Default for UnifiedMcpServer
Source§impl ToolProtocol for UnifiedMcpServer
impl ToolProtocol for UnifiedMcpServer
Source§fn execute<'life0, 'life1, 'async_trait>(
&'life0 self,
tool_name: &'life1 str,
parameters: Value,
) -> Pin<Box<dyn Future<Output = Result<ToolResult, Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn execute<'life0, 'life1, 'async_trait>(
&'life0 self,
tool_name: &'life1 str,
parameters: Value,
) -> Pin<Box<dyn Future<Output = Result<ToolResult, Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Execute a tool by routing to the appropriate protocol
§Routing Logic
- Look up the tool name in the registry
- If found, delegate to that tool’s protocol
- If not found, return NotFound error
Source§fn list_tools<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Vec<ToolMetadata>, Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn list_tools<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Vec<ToolMetadata>, Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
List all available tools across all registered protocols
This aggregates tool metadata from all registered tool protocols. Each protocol is queried at most once even if multiple tool names are registered to the same protocol instance.
Source§fn get_tool_metadata<'life0, 'life1, 'async_trait>(
&'life0 self,
tool_name: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<ToolMetadata, Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_tool_metadata<'life0, 'life1, 'async_trait>(
&'life0 self,
tool_name: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<ToolMetadata, Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Get metadata for a specific tool
This searches across all registered protocols to find the tool.
Source§fn protocol_name(&self) -> &str
fn protocol_name(&self) -> &str
Protocol identifier
Source§fn initialize<'life0, 'async_trait>(
&'life0 mut self,
) -> Pin<Box<dyn Future<Output = Result<(), Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn initialize<'life0, 'async_trait>(
&'life0 mut self,
) -> Pin<Box<dyn Future<Output = Result<(), Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Initialize the server (initializes all registered protocols)
Source§fn shutdown<'life0, 'async_trait>(
&'life0 mut self,
) -> Pin<Box<dyn Future<Output = Result<(), Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn shutdown<'life0, 'async_trait>(
&'life0 mut self,
) -> Pin<Box<dyn Future<Output = Result<(), Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Shutdown the server (shuts down all registered protocols)