diff --git a/navi/core/container.py b/navi/core/container.py index 973724d..84be58d 100644 --- a/navi/core/container.py +++ b/navi/core/container.py @@ -2,10 +2,13 @@ from __future__ import annotations +import structlog from dataclasses import dataclass, field from typing import TYPE_CHECKING from navi.config import settings + +logger = structlog.get_logger() from navi.context_providers._loader import ContextProviderRegistry from navi.llm.ollama import OllamaBackend @@ -122,7 +125,30 @@ workers = build_default_workers() - # Callback: register MCP tools whenever a server connects (startup or health-check reconnect) + # Register MCP tools for servers that connected during startup. + # This must happen AFTER build_default_registries creates tool_registry. + for srv_name, client in mcp_manager.clients.items(): + if not client.connected: + continue + try: + tools = await client.list_tools() + logger.info( + "Registering startup MCP tools for %r -> %d tools", + srv_name, len(tools), + ) + for tool in tools: + mcp_tool = McpTool( + server_name=srv_name, + tool_name=tool.name, + description=tool.description or "", + parameters=tool.inputSchema, + manager=mcp_manager, + ) + tool_registry.register_external(mcp_tool) + except Exception as exc: + logger.warning("Failed to register MCP tools for %r: %s", srv_name, exc) + + # Callback for health-check reconnects (server comes back online later) async def _on_mcp_server_connected(server_name: str) -> None: from navi.core.event_bus import get_event_bus from navi.core.events import McpStatusUpdate diff --git a/navi/core/tool_executor.py b/navi/core/tool_executor.py index 925f135..4cc77c9 100644 --- a/navi/core/tool_executor.py +++ b/navi/core/tool_executor.py @@ -69,10 +69,6 @@ if len(legacy_matches) == 1: return legacy_matches[0] - log.warning( - "_resolve_tool: '%s' not found in tool_map (keys: %s)", - name, list(tool_map.keys()), - ) return name, None diff --git a/navi/core/tool_utils.py b/navi/core/tool_utils.py index f1fb686..4041b40 100644 --- a/navi/core/tool_utils.py +++ b/navi/core/tool_utils.py @@ -58,8 +58,4 @@ missing.append(name) if missing: log.warning("build_tool_list missing tools: %s", missing) - log.debug( - "build_tool_list: enabled=%d mcp_servers=%s resolved=%d missing=%d", - len(enabled), bool(mcp_servers), len(result), len(missing), - ) return result diff --git a/navi/mcp/client.py b/navi/mcp/client.py index 7d10f30..9807441 100644 --- a/navi/mcp/client.py +++ b/navi/mcp/client.py @@ -58,10 +58,6 @@ if self._connected: return - # Ensure any stale transport/session from a prior disconnect or - # mark_disconnected() is fully torn down before we open fresh ones. - await self._cleanup() - try: if self.config.is_stdio: if not self.config.command: @@ -138,7 +134,6 @@ Used by the health-check loop when a server drops silently. """ self._connected = False - self._session = None async def _cleanup(self) -> None: try: