//! Manages MCP server connections — start, stop, list, and dispatch //! tool calls to remote MCP servers. use std::collections::HashMap; /// Metadata for a connected MCP server. #[derive(Debug, Clone)] pub struct McpServerHandle { pub name: String, pub transport: String, } /// Manages MCP server connections. #[derive(Clone)] pub struct McpManager { servers: HashMap, } impl McpManager { pub fn new() -> Self { McpManager { servers: HashMap::new(), } } } impl Default for McpManager { fn default() -> Self { Self::new() } } impl McpManager { /// Register an MCP server by name and transport string. /// /// Returns an error if a server with the same name is already registered. pub fn register(&mut self, name: &str, transport: &str) -> anyhow::Result<()> { if self.servers.contains_key(name) { anyhow::bail!("MCP server '{name}' is already registered"); } self.servers.insert( name.to_string(), McpServerHandle { name: name.to_string(), transport: transport.to_string(), }, ); Ok(()) } /// Remove a registered MCP server and return its handle, if it existed. pub fn unregister(&mut self, name: &str) -> Option { self.servers.remove(name) } pub fn list(&self) -> Vec { self.servers.values().cloned().collect() } pub fn get(&self, name: &str) -> Option<&McpServerHandle> { self.servers.get(name) } pub fn is_empty(&self) -> bool { self.servers.is_empty() } }