From f438cca9479b693bf978c5436a0bd41d238c8d96 Mon Sep 17 00:00:00 2001 From: Yufeng He <40085740+universeplayer@users.noreply.github.com> Date: Mon, 30 Mar 2026 13:00:16 +0800 Subject: [PATCH] fix: route MCP server log notifications to loguru instead of TUI fastmcp's default log_handler uses RichHandler(stderr=True), which dumps MCP server log notifications (e.g. SearXNG startup messages) directly into the TUI. Pass a custom handler that routes through loguru at DEBUG level so these messages go to the log file only. Fixes #1624 --- src/kimi_cli/soul/toolset.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/kimi_cli/soul/toolset.py b/src/kimi_cli/soul/toolset.py index 718bcde65..51a800cd7 100644 --- a/src/kimi_cli/soul/toolset.py +++ b/src/kimi_cli/soul/toolset.py @@ -269,10 +269,17 @@ async def load_mcp_tools( connected. """ import fastmcp + from fastmcp.client.logging import LogMessage from fastmcp.mcp_config import MCPConfig, RemoteMCPServer from kimi_cli.ui.shell.prompt import toast + async def _mcp_log_handler(message: LogMessage) -> None: + """Route MCP server log notifications to loguru instead of rich stderr.""" + data = message.data + msg = data.get("message") or data.get("msg") or str(data) + logger.debug("MCP server log: {msg}", msg=msg) + async def _check_oauth_tokens(server_url: str) -> bool: """Check if OAuth tokens exist for the server.""" try: @@ -372,7 +379,10 @@ async def _connect(): if isinstance(server_config, RemoteMCPServer) and server_config.auth == "oauth": oauth_servers[server_name] = server_config.url - client = fastmcp.Client(MCPConfig(mcpServers={server_name: server_config})) + client = fastmcp.Client( + MCPConfig(mcpServers={server_name: server_config}), + log_handler=_mcp_log_handler, + ) self._mcp_servers[server_name] = MCPServerInfo( status="pending", client=client, tools=[] )