use std::sync::Arc;
use super::builder::AgentBuilder;
use super::Agent;
use crate::mcp::tool_adapter::McpToolAdapter;
use crate::mcp::{load_config_file, McpClient, McpError, McpServerConfig};
impl AgentBuilder {
pub fn with_mcp_server(mut self, config: McpServerConfig) -> Self {
self.mcp_servers.push(config);
self
}
pub fn with_mcp_config_file(mut self, path: impl AsRef<std::path::Path>) -> Self {
self.mcp_config_files.push(path.as_ref().to_path_buf());
self
}
}
pub(super) async fn connect_mcp_servers(
agent: &mut Agent,
servers: Vec<McpServerConfig>,
config_files: Vec<std::path::PathBuf>,
) -> Result<(), crate::error::Error> {
for config in servers {
let client = Arc::new(
McpClient::new(config.clone()).map_err(|e| crate::error::Error::Mcp(e.to_string()))?,
);
let tools = client
.list_tools()
.await
.map_err(|e| crate::error::Error::Mcp(e.to_string()))?;
for tool_def in tools {
if config.should_include_tool(&tool_def.name) {
let adapter = if let Some(namespace) = config.namespace() {
McpToolAdapter::new_with_namespace(Arc::clone(&client), tool_def, namespace)
} else {
McpToolAdapter::new(Arc::clone(&client), tool_def)
};
agent.add_tool(adapter);
}
}
agent.mcp_clients.push(client);
}
for path in config_files {
let server_configs = load_config_file(&path)
.await
.map_err(|e| crate::error::Error::Mcp(e.to_string()))?;
for config in server_configs {
let client = Arc::new(
McpClient::new(config.clone())
.map_err(|e| crate::error::Error::Mcp(e.to_string()))?,
);
let tools = client
.list_tools()
.await
.map_err(|e| crate::error::Error::Mcp(e.to_string()))?;
for tool_def in tools {
if config.should_include_tool(&tool_def.name) {
let adapter = McpToolAdapter::new(Arc::clone(&client), tool_def);
agent.add_tool(adapter);
}
}
agent.mcp_clients.push(client);
}
}
Ok(())
}
impl Agent {
pub async fn add_mcp_server(&mut self, config: McpServerConfig) -> Result<(), McpError> {
let client = Arc::new(McpClient::new(config.clone())?);
let tools = client.list_tools().await?;
for tool_def in tools {
if config.should_include_tool(&tool_def.name) {
let adapter = if let Some(namespace) = config.namespace() {
McpToolAdapter::new_with_namespace(Arc::clone(&client), tool_def, namespace)
} else {
McpToolAdapter::new(Arc::clone(&client), tool_def)
};
self.add_tool(adapter);
}
}
self.mcp_clients.push(client);
Ok(())
}
pub async fn add_mcp_config_file(
&mut self,
path: impl AsRef<std::path::Path>,
) -> Result<(), McpError> {
let server_configs = load_config_file(path).await?;
for config in server_configs {
let client = Arc::new(McpClient::new(config.clone())?);
let tools = client.list_tools().await?;
for tool_def in tools {
if config.should_include_tool(&tool_def.name) {
let adapter = McpToolAdapter::new(Arc::clone(&client), tool_def);
self.add_tool(adapter);
}
}
self.mcp_clients.push(client);
}
Ok(())
}
}