mcp_client_rust/
registry.rs1use 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#[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
32static MCP_CLIENT_REGISTRY: Lazy<McpClientRegistry> = Lazy::new(McpClientRegistry::default);
34
35pub fn get_mcp_registry() -> &'static McpClientRegistry {
37 &MCP_CLIENT_REGISTRY
38}
39
40pub 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}