feat(mcp_service): enhance MCP server handling to support custom MCP servers

This commit is contained in:
Davidson Gomes 2025-05-07 19:19:53 -03:00
parent 442369505a
commit f98a6c405e
2 changed files with 96 additions and 60 deletions

View File

@ -96,7 +96,7 @@ class AgentBuilder:
# Get MCP tools from the configuration # Get MCP tools from the configuration
mcp_tools = [] mcp_tools = []
mcp_exit_stack = None mcp_exit_stack = None
if agent.config.get("mcp_servers"): if agent.config.get("mcp_servers") or agent.config.get("custom_mcp_servers"):
mcp_tools, mcp_exit_stack = await self.mcp_service.build_tools( mcp_tools, mcp_exit_stack = await self.mcp_service.build_tools(
agent.config, self.db agent.config, self.db
) )

View File

@ -47,6 +47,7 @@ class MCPService:
tools, exit_stack = await MCPToolset.from_server( tools, exit_stack = await MCPToolset.from_server(
connection_params=connection_params connection_params=connection_params
) )
return tools, exit_stack return tools, exit_stack
except Exception as e: except Exception as e:
@ -93,8 +94,10 @@ class MCPService:
self.exit_stack = AsyncExitStack() self.exit_stack = AsyncExitStack()
try: try:
mcp_servers = mcp_config.get("mcp_servers", [])
if mcp_servers is not None:
# Process each MCP server in the configuration # Process each MCP server in the configuration
for server in mcp_config.get("mcp_servers", []): for server in mcp_servers:
try: try:
# Search for the MCP server in the database # Search for the MCP server in the database
mcp_server = get_mcp_server(db, server["id"]) mcp_server = get_mcp_server(db, server["id"])
@ -106,12 +109,16 @@ class MCPService:
server_config = mcp_server.config_json.copy() server_config = mcp_server.config_json.copy()
# Replaces the environment variables in the config_json # Replaces the environment variables in the config_json
if "env" in server_config: if "env" in server_config and server_config["env"] is not None:
for key, value in server_config["env"].items(): for key, value in server_config["env"].items():
if value.startswith("env@@"): if value and value.startswith("env@@"):
env_key = value.replace("env@@", "") env_key = value.replace("env@@", "")
if env_key in server.get("envs", {}): if server.get("envs") and env_key in server.get(
server_config["env"][key] = server["envs"][env_key] "envs", {}
):
server_config["env"][key] = server["envs"][
env_key
]
else: else:
logger.warning( logger.warning(
f"Environment variable '{env_key}' not provided for the MCP server {mcp_server.name}" f"Environment variable '{env_key}' not provided for the MCP server {mcp_server.name}"
@ -119,7 +126,9 @@ class MCPService:
continue continue
logger.info(f"Connecting to MCP server: {mcp_server.name}") logger.info(f"Connecting to MCP server: {mcp_server.name}")
tools, exit_stack = await self._connect_to_mcp_server(server_config) tools, exit_stack = await self._connect_to_mcp_server(
server_config
)
if tools and exit_stack: if tools and exit_stack:
# Filters incompatible tools # Filters incompatible tools
@ -127,6 +136,7 @@ class MCPService:
# Filters tools compatible with the agent # Filters tools compatible with the agent
agent_tools = server.get("tools", []) agent_tools = server.get("tools", [])
if agent_tools:
filtered_tools = self._filter_tools_by_agent( filtered_tools = self._filter_tools_by_agent(
filtered_tools, agent_tools filtered_tools, agent_tools
) )
@ -143,20 +153,46 @@ class MCPService:
) )
except Exception as e: except Exception as e:
logger.error(f"Error connecting to MCP server {server['id']}: {e}") logger.error(
f"Error connecting to MCP server {server.get('id', 'unknown')}: {e}"
)
continue continue
custom_mcp_servers = mcp_config.get("custom_mcp_servers", [])
if custom_mcp_servers is not None:
# Process custom MCP servers # Process custom MCP servers
for server in mcp_config.get("custom_mcp_servers", []): for server in custom_mcp_servers:
if not server:
logger.warning(
"Empty server configuration found in custom_mcp_servers"
)
continue
try: try:
logger.info(
f"Connecting to custom MCP server: {server.get('url', 'unknown')}"
)
tools, exit_stack = await self._connect_to_mcp_server(server) tools, exit_stack = await self._connect_to_mcp_server(server)
if tools:
self.tools.extend(tools) self.tools.extend(tools)
else:
logger.warning("No tools returned from custom MCP server")
continue
if exit_stack:
await self.exit_stack.enter_async_context(exit_stack) await self.exit_stack.enter_async_context(exit_stack)
logger.info( logger.info(
f"Custom MCP server connected successfully. Added {len(tools)} tools." f"Custom MCP server connected successfully. Added {len(tools)} tools."
) )
else:
logger.warning(
"No exit_stack returned from custom MCP server"
)
except Exception as e: except Exception as e:
logger.error(f"Error connecting to MCP server {server['id']}: {e}") logger.error(
f"Error connecting to custom MCP server {server.get('url', 'unknown')}: {e}"
)
continue continue
logger.info( logger.info(