diff --git a/navi/api/deps.py b/navi/api/deps.py index 57bf3b4..02df568 100644 --- a/navi/api/deps.py +++ b/navi/api/deps.py @@ -99,8 +99,25 @@ async def register_mcp_tools(registry: ToolRegistry, manager: McpManager) -> None: - """(kept for backward compat; MCP tools are already registered at startup).""" - pass + """Register all currently connected MCP tools into the tool registry.""" + from navi.mcp.tools import McpTool + + for name, client in manager.clients.items(): + if not client.connected: + continue + try: + tools = await client.list_tools() + for tool in tools: + mcp_tool = McpTool( + server_name=name, + tool_name=tool.name, + description=tool.description or "", + parameters=tool.inputSchema, + manager=manager, + ) + registry.register_external(mcp_tool) + except Exception as exc: + log.warning("Failed to register MCP tools for %r: %s", name, exc) # Backward-compat re-exports so nothing outside breaks diff --git a/navi/mcp/client.py b/navi/mcp/client.py index 9807441..7d10f30 100644 --- a/navi/mcp/client.py +++ b/navi/mcp/client.py @@ -58,6 +58,10 @@ 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: @@ -134,6 +138,7 @@ Used by the health-check loop when a server drops silently. """ self._connected = False + self._session = None async def _cleanup(self) -> None: try: