From f18d0e829842083d422e18678077b13c0dcbd891 Mon Sep 17 00:00:00 2001 From: deniz salman Date: Thu, 14 May 2026 16:11:31 +0300 Subject: [PATCH 1/2] fix(mcp): prefix mcp tool names with server name to avoid collisions Multiple MCP servers exposing tools with the same name (e.g., 'query' from multiple postgres servers) overwrite each other in _tool_dict. Prefix tool names with the server name so each tool remains unique and accessible. --- src/kimi_cli/soul/toolset.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/kimi_cli/soul/toolset.py b/src/kimi_cli/soul/toolset.py index 3868d3bdb..f35745586 100644 --- a/src/kimi_cli/soul/toolset.py +++ b/src/kimi_cli/soul/toolset.py @@ -698,8 +698,9 @@ def __init__( runtime: Runtime, **kwargs: Any, ): + tool_name = f"{server_name}_{mcp_tool.name}" super().__init__( - name=mcp_tool.name, + name=tool_name, description=( f"This is an MCP (Model Context Protocol) tool from MCP server `{server_name}`.\n\n" f"{mcp_tool.description or 'No description provided.'}" From 77ef4727d57e64edc92b1e5e29a3f170d3e59ad7 Mon Sep 17 00:00:00 2001 From: deniz salman Date: Thu, 14 May 2026 16:16:58 +0300 Subject: [PATCH 2/2] fix(mcp): namespace approval action_name by server to prevent cross-server auto-approval When multiple MCP servers expose tools with the same name (e.g. read_file), the shared _action_name = 'mcp:read_file' caused auto-approval on one server to bypass approval on another. Prefix _action_name with the server-scoped tool name so each server's tool has a distinct approval identity. --- src/kimi_cli/soul/toolset.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kimi_cli/soul/toolset.py b/src/kimi_cli/soul/toolset.py index f35745586..6b22b5d5d 100644 --- a/src/kimi_cli/soul/toolset.py +++ b/src/kimi_cli/soul/toolset.py @@ -712,7 +712,7 @@ def __init__( self._client = client self._runtime = runtime self._timeout = timedelta(milliseconds=runtime.config.mcp.client.tool_call_timeout_ms) - self._action_name = f"mcp:{mcp_tool.name}" + self._action_name = f"mcp:{tool_name}" async def __call__(self, *args: Any, **kwargs: Any) -> ToolReturnValue: description = f"Call MCP tool `{self._mcp_tool.name}`."