mcp_client_rust/
registry.rs

1use std::{
2    collections::HashMap,
3    sync::{Arc, Mutex},
4};
5
6use mcp_error_rs::{Error, Result};
7use mcp_transport_rs::client::{impls::sse::SseTransport, traits::ClientTransport};
8use once_cell::sync::Lazy;
9
10use crate::client::McpClient;
11
12/// MCP Client Registry
13#[derive(Default)]
14pub struct McpClientRegistry {
15    clients: Mutex<HashMap<String, Arc<McpClient<SseTransport>>>>,
16}
17
18impl McpClientRegistry {
19    pub fn register(&self, server_id: &str, client: Arc<McpClient<SseTransport>>) {
20        let mut map = self.clients.lock().unwrap();
21        map.insert(server_id.to_string(), client);
22    }
23
24    pub fn get(&self, server_id: &str) -> Result<Arc<McpClient<SseTransport>>> {
25        let map = self.clients.lock().unwrap();
26        map.get(server_id).cloned().ok_or_else(|| {
27            Error::System(format!("MCP client not found for server_id: {}", server_id))
28        })
29    }
30}
31
32/// Global MCP client registry
33static MCP_CLIENT_REGISTRY: Lazy<McpClientRegistry> = Lazy::new(McpClientRegistry::default);
34
35/// Get the global MCP client registry
36pub fn get_mcp_registry() -> &'static McpClientRegistry {
37    &MCP_CLIENT_REGISTRY
38}
39
40/// Initialize and register a default MCP client
41pub async fn register_mcp_clients(configs: Vec<(&str, &str)>) -> Result<()> {
42    for (server_id, url) in configs {
43        let transport = SseTransport::new(url);
44        transport.start().await?;
45        let client = Arc::new(McpClient::new(transport));
46        get_mcp_registry().register(server_id, client);
47    }
48    Ok(())
49}