Files
zesdex/apps/infrastructure/src/mcp/manager.rs
T
asepharyana 7b0b53671f style: format seluruh workspace dengan cargo fmt
Menyeragamkan format kode sesuai rustfmt (126 file). Sebelumnya
lefthook pre-commit 'cargo fmt --check' akan gagal pada commit apa pun.
2026-08-27 22:10:28 +07:00

68 lines
1.7 KiB
Rust

//! 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<String, McpServerHandle>,
}
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<McpServerHandle> {
self.servers.remove(name)
}
pub fn list(&self) -> Vec<McpServerHandle> {
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()
}
}