diff --git a/backend/app/services/mcp/client_manager.py b/backend/app/services/mcp/client_manager.py index 927652a..b13b8e4 100644 --- a/backend/app/services/mcp/client_manager.py +++ b/backend/app/services/mcp/client_manager.py @@ -122,16 +122,24 @@ class MCPClientManager: ) async def _connect_all_servers(self) -> None: - """Connect to all enabled MCP servers.""" + """Connect to all enabled MCP servers concurrently.""" + import asyncio + enabled_servers = self._registry.get_enabled_configs() - for name, config in enabled_servers.items(): + async def connect_server(name: str, config: "MCPServerConfig") -> None: try: await self._pool.get_connection(name, config) logger.info("Connected to MCP server: %s", name) except Exception as e: logger.error("Failed to connect to MCP server %s: %s", name, e) + # Connect to all servers concurrently for faster startup + await asyncio.gather( + *(connect_server(name, config) for name, config in enabled_servers.items()), + return_exceptions=True, + ) + async def shutdown(self) -> None: """ Shutdown the MCP client manager. diff --git a/backend/app/services/mcp/config.py b/backend/app/services/mcp/config.py index 9e8f825..99f3c2c 100644 --- a/backend/app/services/mcp/config.py +++ b/backend/app/services/mcp/config.py @@ -179,6 +179,8 @@ def load_mcp_config(path: str | Path | None = None) -> MCPConfig: 2. MCP_CONFIG_PATH environment variable 3. Default path (backend/mcp_servers.yaml) 4. Empty config if no file exists + + In test mode (IS_TEST=True), retry settings are reduced for faster tests. """ if path is None: path = os.environ.get("MCP_CONFIG_PATH", str(DEFAULT_CONFIG_PATH)) @@ -189,7 +191,18 @@ def load_mcp_config(path: str | Path | None = None) -> MCPConfig: # Return empty config if no file exists (allows runtime registration) return MCPConfig() - return MCPConfig.from_yaml(path) + config = MCPConfig.from_yaml(path) + + # In test mode, reduce retry settings to speed up tests + is_test = os.environ.get("IS_TEST", "").lower() in ("true", "1", "yes") + if is_test: + for server_config in config.mcp_servers.values(): + server_config.retry_attempts = 1 # Single attempt + server_config.retry_delay = 0.1 # 100ms instead of 1s + server_config.retry_max_delay = 0.5 # 500ms max + server_config.timeout = 2 # 2s timeout instead of 30-120s + + return config def create_default_config() -> MCPConfig: