Newer
Older
navi-1 / navi / tools / mcp_status.py
"""Built-in tool to list connected MCP servers and their exposed tools."""

from navi.mcp import McpManager

from .base import Tool, ToolResult


class McpStatusTool(Tool):
    name = "mcp_status"
    description = (
        "Show the status of all configured MCP servers and the tools they expose. "
        "Use this to discover what external tools are currently available."
    )
    parameters = {
        "type": "object",
        "properties": {},
        "required": [],
    }

    def __init__(self, manager: McpManager | None = None) -> None:
        self._manager = manager

    async def execute(self, params: dict) -> ToolResult:
        if self._manager is None:
            return ToolResult(
                success=False,
                output="",
                error="MCP manager not available.",
            )

        lines: list[str] = []
        for name, client in self._manager.clients.items():
            status = "connected" if client.connected else "disconnected"
            lines.append(f"Server: {name} ({status})")
            try:
                tools = await client.list_tools()
                for t in tools:
                    lines.append(f"  - {t.name}: {t.description or 'no description'}")
            except Exception as exc:
                lines.append(f"  (failed to list tools: {exc})")

        if not lines:
            return ToolResult(success=True, output="No MCP servers configured.")

        return ToolResult(success=True, output="\n".join(lines))