From 88a1072cc55f4e6224a3447a93cceac9666a7485 Mon Sep 17 00:00:00 2001 From: can1357 Date: Tue, 28 Apr 2026 01:15:35 +0200 Subject: [PATCH] feat(coding-agent): implemented mcp__-prefixed MCP tool IDs for parsing - Renamed MCP tool IDs from `mcp__` to `mcp___`, and changed built-in `grep` to `search`. - Updated `parseMCPToolName()` and bridge helpers to require and trim the `mcp__` prefix. - Updated cursor, manager, and session discovery flows to require `mcp__`-prefixed tool names. - Updated MCP tests and assertion fixtures to use `mcp__`-prefixed tool IDs and expected system prompts. --- packages/coding-agent/CHANGELOG.md | 2 + packages/coding-agent/DEVELOPMENT.md | 2 +- packages/coding-agent/src/cursor.ts | 2 +- .../src/mcp/discoverable-tool-metadata.ts | 2 +- packages/coding-agent/src/mcp/manager.ts | 6 +- packages/coding-agent/src/mcp/tool-bridge.ts | 8 +- packages/coding-agent/src/sdk.ts | 14 +- .../test/agent-session-mcp-discovery.test.ts | 180 +++++++++--------- .../test/sdk-mcp-discovery.test.ts | 72 +++---- .../test/tools/search-tool-bm25.test.ts | 56 +++--- 10 files changed, 173 insertions(+), 171 deletions(-) diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 01fb7e87a..2a4c42ff3 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -1,8 +1,10 @@ # Changelog ## [Unreleased] + ### Breaking Changes +- Renamed MCP tool identifiers from the `mcp__` format to `mcp___` so custom tool names, active tool lists, and persisted MCP selections must be updated to the new prefix - Renamed the built-in content-search tool from `grep` to `search`, including SDK/tool event names and settings keys (`search.enabled`, `search.contextBefore`, `search.contextAfter`), so integrations using `grep` and `grep.*` references must be updated ### Added diff --git a/packages/coding-agent/DEVELOPMENT.md b/packages/coding-agent/DEVELOPMENT.md index 45055a69d..2c11934c0 100644 --- a/packages/coding-agent/DEVELOPMENT.md +++ b/packages/coding-agent/DEVELOPMENT.md @@ -672,7 +672,7 @@ internal URL input (rule://, docs://, ...) - convert to agent tools using `MCPTool.fromTools(connection, serverTools)` - Startup is bounded by `STARTUP_TIMEOUT_MS` (250ms). If tool loads are still pending, cached definitions may be used from `MCPToolCache` and exposed as deferred wrappers via `DeferredMCPTool.fromTools(...)`. - Lifecycle operations: - - `disconnectServer(name)` and `disconnectAll()` tear down connections via `disconnectServer(connection)` and remove associated `mcp__` tools. + - `disconnectServer(name)` and `disconnectAll()` tear down connections via `disconnectServer(connection)` and remove associated `mcp___` tools. - `refreshServerTools(name)` / `refreshAllTools()` re-run `listTools()` and replace server tool registrations. `discoverAndLoadMCPTools()` in `src/mcp/loader.ts` is the adapter from manager internals to extensibility-facing output: diff --git a/packages/coding-agent/src/cursor.ts b/packages/coding-agent/src/cursor.ts index 12d95a40f..7d85cc4aa 100644 --- a/packages/coding-agent/src/cursor.ts +++ b/packages/coding-agent/src/cursor.ts @@ -327,7 +327,7 @@ export class CursorExecHandlers implements ICursorExecHandlers { const toolCallId = decodeToolCallId(call.toolCallId); const tool = this.options.tools.get(toolName); if (!tool) { - const availableTools = Array.from(this.options.tools.keys()).filter(name => name.startsWith("mcp_")); + const availableTools = Array.from(this.options.tools.keys()).filter(name => name.startsWith("mcp__")); const message = formatMcpToolErrorMessage(toolName, availableTools); const result = buildToolErrorResult(message); return createToolResultMessage(toolCallId, toolName, result, true); diff --git a/packages/coding-agent/src/mcp/discoverable-tool-metadata.ts b/packages/coding-agent/src/mcp/discoverable-tool-metadata.ts index 0a8c28ee6..e8cdffd46 100644 --- a/packages/coding-agent/src/mcp/discoverable-tool-metadata.ts +++ b/packages/coding-agent/src/mcp/discoverable-tool-metadata.ts @@ -53,7 +53,7 @@ const FIELD_WEIGHTS = { } as const; export function isMCPToolName(name: string): boolean { - return name.startsWith("mcp_"); + return name.startsWith("mcp__"); } function getSchemaPropertyKeys(parameters: unknown): string[] { diff --git a/packages/coding-agent/src/mcp/manager.ts b/packages/coding-agent/src/mcp/manager.ts index b60b48006..5cba6d1dc 100644 --- a/packages/coding-agent/src/mcp/manager.ts +++ b/packages/coding-agent/src/mcp/manager.ts @@ -472,7 +472,7 @@ export class MCPManager { } #replaceServerTools(name: string, tools: CustomTool[]): void { - this.#tools = this.#tools.filter(t => !t.name.startsWith(`mcp_${name}_`)); + this.#tools = this.#tools.filter(t => !t.name.startsWith(`mcp__${name}_`)); this.#tools.push(...tools); } @@ -644,8 +644,8 @@ export class MCPManager { } // Remove tools from this server and notify consumers - const hadTools = this.#tools.some(t => t.name.startsWith(`mcp_${name}_`)); - this.#tools = this.#tools.filter(t => !t.name.startsWith(`mcp_${name}_`)); + const hadTools = this.#tools.some(t => t.name.startsWith(`mcp__${name}_`)); + this.#tools = this.#tools.filter(t => !t.name.startsWith(`mcp__${name}_`)); if (hadTools) this.#onToolsChanged?.(this.#tools); // Notify prompt consumers so stale commands are cleared diff --git a/packages/coding-agent/src/mcp/tool-bridge.ts b/packages/coding-agent/src/mcp/tool-bridge.ts index e65196477..c1c50906c 100644 --- a/packages/coding-agent/src/mcp/tool-bridge.ts +++ b/packages/coding-agent/src/mcp/tool-bridge.ts @@ -159,7 +159,7 @@ async function reconnectWithAbort(reconnect: MCPReconnect, signal?: AbortSignal) * Prefixes with server name to avoid conflicts. If the tool name already * starts with the server name (e.g., server "puppeteer" with tool * "puppeteer_screenshot"), strips the redundant prefix to produce - * "mcp_puppeteer_screenshot" instead of "mcp_puppeteer_puppeteer_screenshot". + * "mcp__puppeteer_screenshot" instead of "mcp__puppeteer_puppeteer_screenshot". */ function sanitizeMCPToolNamePart(value: string, fallback: string): string { const sanitized = value @@ -183,7 +183,7 @@ export function createMCPToolName(serverName: string, toolName: string): string normalizedToolName = sanitizedToolName.slice(prefixWithUnderscore.length); } - return `mcp_${sanitizedServerName}_${normalizedToolName}`; + return `mcp__${sanitizedServerName}_${normalizedToolName}`; } /** @@ -193,9 +193,9 @@ export function createMCPToolName(serverName: string, toolName: string): string * The original MCP tool name may have had the server name as a prefix. */ export function parseMCPToolName(name: string): { serverName: string; toolName: string } | null { - if (!name.startsWith("mcp_")) return null; + if (!name.startsWith("mcp__")) return null; - const rest = name.slice(4); + const rest = name.slice(5); const underscoreIdx = rest.indexOf("_"); if (underscoreIdx === -1) return null; diff --git a/packages/coding-agent/src/sdk.ts b/packages/coding-agent/src/sdk.ts index fd9887dfe..1d51a59a1 100644 --- a/packages/coding-agent/src/sdk.ts +++ b/packages/coding-agent/src/sdk.ts @@ -111,8 +111,6 @@ import { discoverStartupLspServers, EditTool, FindTool, - SearchTool, - WebSearchTool, getSearchTools, HIDDEN_TOOLS, isSearchProviderPreference, @@ -122,10 +120,12 @@ import { ReadTool, ResolveTool, renderSearchToolBm25Description, + SearchTool, setPreferredImageProvider, setPreferredSearchProvider, type Tool, type ToolSession, + WebSearchTool, WriteTool, warmupLspServers, } from "./tools"; @@ -272,14 +272,14 @@ export { createTools, EditTool, FindTool, - SearchTool, - WebSearchTool, HIDDEN_TOOLS, loadSshTool, PythonTool, ReadTool, ResolveTool, + SearchTool, type ToolSession, + WebSearchTool, WriteTool, }; @@ -1388,7 +1388,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {} ? requestedActiveToolNames : requestedActiveToolNames.filter(name => !defaultInactiveToolNames.has(name)); const explicitlyRequestedMCPToolNames = options.toolNames - ? requestedActiveToolNames.filter(name => name.startsWith("mcp_")) + ? requestedActiveToolNames.filter(name => name.startsWith("mcp__")) : []; const discoveryDefaultServers = new Set( (settings.get("mcp.discoveryDefaultServers") ?? []).map(serverName => serverName.trim()).filter(Boolean), @@ -1414,7 +1414,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {} : [...new Set([...restoredSelectedMCPToolNames, ...defaultSelectedMCPToolNames])]; initialToolNames = [ ...new Set([ - ...initialRequestedActiveToolNames.filter(name => !name.startsWith("mcp_")), + ...initialRequestedActiveToolNames.filter(name => !name.startsWith("mcp__")), ...initialSelectedMCPToolNames, ]), ]; @@ -1426,7 +1426,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {} ...registeredTools.filter(t => !t.definition.defaultInactive).map(t => t.definition.name), ]; for (const name of alwaysInclude) { - if (mcpDiscoveryEnabled && name.startsWith("mcp_")) { + if (mcpDiscoveryEnabled && name.startsWith("mcp__")) { continue; } if (toolRegistry.has(name) && !initialToolNames.includes(name)) { diff --git a/packages/coding-agent/test/agent-session-mcp-discovery.test.ts b/packages/coding-agent/test/agent-session-mcp-discovery.test.ts index 2d3614d60..f8fb13557 100644 --- a/packages/coding-agent/test/agent-session-mcp-discovery.test.ts +++ b/packages/coding-agent/test/agent-session-mcp-discovery.test.ts @@ -97,7 +97,7 @@ describe("AgentSession MCP discovery", () => { it("caches discoverable MCP search indexes until MCP tools refresh", async () => { const readTool = createBasicTool("read", "Read"); - const docsSearchTool = createMcpTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]); + const docsSearchTool = createMcpTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]); const toolRegistry = new Map([ [readTool.name, readTool], [docsSearchTool.name, docsSearchTool], @@ -124,21 +124,21 @@ describe("AgentSession MCP discovery", () => { const firstIndex = session.getDiscoverableMCPSearchIndex(); const secondIndex = session.getDiscoverableMCPSearchIndex(); expect(secondIndex).toBe(firstIndex); - expect(firstIndex.documents.map(document => document.tool.name)).toEqual(["mcp_docs_search"]); + expect(firstIndex.documents.map(document => document.tool.name)).toEqual(["mcp__docs_search"]); await session.refreshMCPTools([ - createMcpCustomTool("mcp_pager_list", "pager", "list", "List pager alerts", ["service"]), + createMcpCustomTool("mcp__pager_list", "pager", "list", "List pager alerts", ["service"]), ]); const refreshedIndex = session.getDiscoverableMCPSearchIndex(); expect(refreshedIndex).not.toBe(firstIndex); - expect(refreshedIndex.documents.map(document => document.tool.name)).toEqual(["mcp_pager_list"]); + expect(refreshedIndex.documents.map(document => document.tool.name)).toEqual(["mcp__pager_list"]); }); it("reports only currently active MCP tools in non-discovery sessions", async () => { const readTool = createBasicTool("read", "Read"); - const docsSearchTool = createMcpTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]); - const slackSendTool = createMcpTool("mcp_slack_send_message", "slack", "send_message", "Send a Slack message", [ + const docsSearchTool = createMcpTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]); + const slackSendTool = createMcpTool("mcp__slack_send_message", "slack", "send_message", "Send a Slack message", [ "channel", "text", ]); @@ -166,7 +166,7 @@ describe("AgentSession MCP discovery", () => { }); sessions.push(session); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_docs_search"]); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__docs_search"]); await session.setActiveToolsByName(["read"]); @@ -177,8 +177,8 @@ describe("AgentSession MCP discovery", () => { it("keeps manually deactivated MCP tools off after refresh in non-discovery sessions", async () => { const readTool = createBasicTool("read", "Read"); - const docsSearchTool = createMcpTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]); - const slackSendTool = createMcpTool("mcp_slack_send_message", "slack", "send_message", "Send a Slack message", [ + const docsSearchTool = createMcpTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]); + const slackSendTool = createMcpTool("mcp__slack_send_message", "slack", "send_message", "Send a Slack message", [ "channel", "text", ]); @@ -210,8 +210,8 @@ describe("AgentSession MCP discovery", () => { expect(session.getSelectedMCPToolNames()).toEqual([]); await session.refreshMCPTools([ - createMcpCustomTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]), - createMcpCustomTool("mcp_slack_send_message", "slack", "send_message", "Send a Slack message", [ + createMcpCustomTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]), + createMcpCustomTool("mcp__slack_send_message", "slack", "send_message", "Send a Slack message", [ "channel", "text", ]), @@ -224,8 +224,8 @@ describe("AgentSession MCP discovery", () => { it("preserves directly activated MCP tools across refreshes in discovery mode", async () => { const readTool = createBasicTool("read", "Read"); - const docsSearchTool = createMcpTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]); - const slackSendTool = createMcpTool("mcp_slack_send_message", "slack", "send_message", "Send a Slack message", [ + const docsSearchTool = createMcpTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]); + const slackSendTool = createMcpTool("mcp__slack_send_message", "slack", "send_message", "Send a Slack message", [ "channel", "text", ]); @@ -253,25 +253,25 @@ describe("AgentSession MCP discovery", () => { }); sessions.push(session); - await session.setActiveToolsByName(["read", "mcp_docs_search"]); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_docs_search"]); - expect(session.getActiveToolNames()).toEqual(["read", "mcp_docs_search"]); + await session.setActiveToolsByName(["read", "mcp__docs_search"]); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__docs_search"]); + expect(session.getActiveToolNames()).toEqual(["read", "mcp__docs_search"]); await session.refreshMCPTools([ - createMcpCustomTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]), - createMcpCustomTool("mcp_slack_send_message", "slack", "send_message", "Send a Slack message", [ + createMcpCustomTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]), + createMcpCustomTool("mcp__slack_send_message", "slack", "send_message", "Send a Slack message", [ "channel", "text", ]), ]); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_docs_search"]); - expect(session.getActiveToolNames()).toEqual(["read", "mcp_docs_search"]); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__docs_search"]); + expect(session.getActiveToolNames()).toEqual(["read", "mcp__docs_search"]); }); it("keeps MCP tools hidden by default and activates discovered selections additively", async () => { const readTool = createBasicTool("read", "Read"); - const docsSearchTool = createMcpTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]); - const slackSendTool = createMcpTool("mcp_slack_send_message", "slack", "send_message", "Send a Slack message", [ + const docsSearchTool = createMcpTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]); + const slackSendTool = createMcpTool("mcp__slack_send_message", "slack", "send_message", "Send a Slack message", [ "channel", "text", ]); @@ -301,23 +301,23 @@ describe("AgentSession MCP discovery", () => { expect(session.getActiveToolNames()).toEqual(["read"]); expect(session.getDiscoverableMCPTools().map(tool => tool.name)).toEqual([ - "mcp_docs_search", - "mcp_slack_send_message", + "mcp__docs_search", + "mcp__slack_send_message", ]); - await session.activateDiscoveredMCPTools(["mcp_docs_search"]); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_docs_search"]); - expect(session.getActiveToolNames()).toEqual(["read", "mcp_docs_search"]); - expect(session.systemPrompt).toBe("tools:read,mcp_docs_search"); + await session.activateDiscoveredMCPTools(["mcp__docs_search"]); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__docs_search"]); + expect(session.getActiveToolNames()).toEqual(["read", "mcp__docs_search"]); + expect(session.systemPrompt).toBe("tools:read,mcp__docs_search"); - await session.activateDiscoveredMCPTools(["mcp_slack_send_message"]); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_docs_search", "mcp_slack_send_message"]); - expect(session.getActiveToolNames()).toEqual(["read", "mcp_docs_search", "mcp_slack_send_message"]); - expect(session.systemPrompt).toBe("tools:read,mcp_docs_search,mcp_slack_send_message"); + await session.activateDiscoveredMCPTools(["mcp__slack_send_message"]); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__docs_search", "mcp__slack_send_message"]); + expect(session.getActiveToolNames()).toEqual(["read", "mcp__docs_search", "mcp__slack_send_message"]); + expect(session.systemPrompt).toBe("tools:read,mcp__docs_search,mcp__slack_send_message"); }); it("reapplies default MCP server baselines when refreshed tools reconnect", async () => { const readTool = createBasicTool("read", "Read"); - const docsSearchTool = createMcpTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]); + const docsSearchTool = createMcpTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]); const toolRegistry = new Map([ [readTool.name, readTool], [docsSearchTool.name, docsSearchTool], @@ -347,22 +347,22 @@ describe("AgentSession MCP discovery", () => { expect(session.getActiveToolNames()).toEqual(["read"]); await session.refreshMCPTools([ - createMcpCustomTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]), - createMcpCustomTool("mcp_slack_send_message", "slack", "send_message", "Send a Slack message", [ + createMcpCustomTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]), + createMcpCustomTool("mcp__slack_send_message", "slack", "send_message", "Send a Slack message", [ "channel", "text", ]), ]); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_slack_send_message"]); - expect(session.getActiveToolNames()).toEqual(["read", "mcp_slack_send_message"]); - expect(session.systemPrompt).toBe("tools:read,mcp_slack_send_message"); - expect(sessionManager.buildSessionContext().selectedMCPToolNames).toEqual(["mcp_slack_send_message"]); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__slack_send_message"]); + expect(session.getActiveToolNames()).toEqual(["read", "mcp__slack_send_message"]); + expect(session.systemPrompt).toBe("tools:read,mcp__slack_send_message"); + expect(sessionManager.buildSessionContext().selectedMCPToolNames).toEqual(["mcp__slack_send_message"]); }); it("persists cleared MCP selections when refresh removes a selected tool", async () => { const readTool = createBasicTool("read", "Read"); - const docsSearchTool = createMcpTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]); + const docsSearchTool = createMcpTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]); const toolRegistry = new Map([ [readTool.name, readTool], [docsSearchTool.name, docsSearchTool], @@ -387,8 +387,8 @@ describe("AgentSession MCP discovery", () => { }); sessions.push(session); - await session.activateDiscoveredMCPTools(["mcp_docs_search"]); - expect(sessionManager.buildSessionContext().selectedMCPToolNames).toEqual(["mcp_docs_search"]); + await session.activateDiscoveredMCPTools(["mcp__docs_search"]); + expect(sessionManager.buildSessionContext().selectedMCPToolNames).toEqual(["mcp__docs_search"]); await session.refreshMCPTools([]); @@ -400,7 +400,7 @@ describe("AgentSession MCP discovery", () => { it("restores unavailable MCP selections in memory without rewriting the persisted session selection", async () => { const readTool = createBasicTool("read", "Read"); const sessionManager = SessionManager.inMemory(); - sessionManager.appendMCPToolSelection(["mcp_docs_search"]); + sessionManager.appendMCPToolSelection(["mcp__docs_search"]); const agent = new Agent({ initialState: { model: createModel(), @@ -421,12 +421,12 @@ describe("AgentSession MCP discovery", () => { sessions.push(session); expect(session.getSelectedMCPToolNames()).toEqual([]); - expect(sessionManager.buildSessionContext().selectedMCPToolNames).toEqual(["mcp_docs_search"]); + expect(sessionManager.buildSessionContext().selectedMCPToolNames).toEqual(["mcp__docs_search"]); }); it("restores MCP discovery selections when branching to a context without them", async () => { const readTool = createBasicTool("read", "Read"); - const docsSearchTool = createMcpTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]); + const docsSearchTool = createMcpTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]); const sessionManager = SessionManager.inMemory(); const userEntryId = sessionManager.appendMessage({ role: "user", @@ -456,8 +456,8 @@ describe("AgentSession MCP discovery", () => { }); sessions.push(session); - await session.activateDiscoveredMCPTools(["mcp_docs_search"]); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_docs_search"]); + await session.activateDiscoveredMCPTools(["mcp__docs_search"]); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__docs_search"]); const result = await session.branch(userEntryId); @@ -469,7 +469,7 @@ describe("AgentSession MCP discovery", () => { it("restores MCP discovery selections when navigating to a branch without them", async () => { const readTool = createBasicTool("read", "Read"); - const docsSearchTool = createMcpTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]); + const docsSearchTool = createMcpTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]); const sessionManager = SessionManager.inMemory(); const userEntryId = sessionManager.appendMessage({ role: "user", @@ -499,8 +499,8 @@ describe("AgentSession MCP discovery", () => { }); sessions.push(session); - await session.activateDiscoveredMCPTools(["mcp_docs_search"]); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_docs_search"]); + await session.activateDiscoveredMCPTools(["mcp__docs_search"]); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__docs_search"]); const result = await session.navigateTree(userEntryId, { summarize: false }); @@ -512,7 +512,7 @@ describe("AgentSession MCP discovery", () => { it("preserves explicit MCP baseline when branching into older history without persisted selection", async () => { const readTool = createBasicTool("read", "Read"); - const docsSearchTool = createMcpTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]); + const docsSearchTool = createMcpTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]); const sessionManager = SessionManager.inMemory(); const userEntryId = sessionManager.appendMessage({ role: "user", @@ -538,8 +538,8 @@ describe("AgentSession MCP discovery", () => { modelRegistry: {} as never, toolRegistry, mcpDiscoveryEnabled: true, - initialSelectedMCPToolNames: ["mcp_docs_search"], - defaultSelectedMCPToolNames: ["mcp_docs_search"], + initialSelectedMCPToolNames: ["mcp__docs_search"], + defaultSelectedMCPToolNames: ["mcp__docs_search"], rebuildSystemPrompt: async toolNames => `tools:${toolNames.join(",")}`, }); sessions.push(session); @@ -547,14 +547,14 @@ describe("AgentSession MCP discovery", () => { const result = await session.branch(userEntryId); expect(result.cancelled).toBe(false); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_docs_search"]); - expect(session.getActiveToolNames()).toEqual(["read", "mcp_docs_search"]); - expect(session.systemPrompt).toBe("tools:read,mcp_docs_search"); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__docs_search"]); + expect(session.getActiveToolNames()).toEqual(["read", "mcp__docs_search"]); + expect(session.systemPrompt).toBe("tools:read,mcp__docs_search"); }); it("preserves explicit MCP baseline when navigating into older history without persisted selection", async () => { const readTool = createBasicTool("read", "Read"); - const docsSearchTool = createMcpTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]); + const docsSearchTool = createMcpTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]); const sessionManager = SessionManager.inMemory(); const userEntryId = sessionManager.appendMessage({ role: "user", @@ -585,8 +585,8 @@ describe("AgentSession MCP discovery", () => { modelRegistry: {} as never, toolRegistry, mcpDiscoveryEnabled: true, - initialSelectedMCPToolNames: ["mcp_docs_search"], - defaultSelectedMCPToolNames: ["mcp_docs_search"], + initialSelectedMCPToolNames: ["mcp__docs_search"], + defaultSelectedMCPToolNames: ["mcp__docs_search"], rebuildSystemPrompt: async toolNames => `tools:${toolNames.join(",")}`, }); sessions.push(session); @@ -594,16 +594,16 @@ describe("AgentSession MCP discovery", () => { const result = await session.navigateTree(userEntryId, { summarize: false }); expect(result.cancelled).toBe(false); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_docs_search"]); - expect(session.getActiveToolNames()).toEqual(["read", "mcp_docs_search"]); - expect(session.systemPrompt).toBe("tools:read,mcp_docs_search"); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__docs_search"]); + expect(session.getActiveToolNames()).toEqual(["read", "mcp__docs_search"]); + expect(session.systemPrompt).toBe("tools:read,mcp__docs_search"); }); it("restores session defaults in memory across session switches without rewriting sessions missing persisted metadata", async () => { const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-agent-session-mcp-switch-")); tempDirs.push(tempDir); const readTool = createBasicTool("read", "Read"); - const docsSearchTool = createMcpTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]); + const docsSearchTool = createMcpTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]); const toolRegistry = new Map([ [readTool.name, readTool], [docsSearchTool.name, docsSearchTool], @@ -651,19 +651,19 @@ describe("AgentSession MCP discovery", () => { modelRegistry: {} as never, toolRegistry, mcpDiscoveryEnabled: true, - initialSelectedMCPToolNames: ["mcp_docs_search"], - defaultSelectedMCPToolNames: ["mcp_docs_search"], + initialSelectedMCPToolNames: ["mcp__docs_search"], + defaultSelectedMCPToolNames: ["mcp__docs_search"], rebuildSystemPrompt: async toolNames => `tools:${toolNames.join(",")}`, }); sessions.push(session); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_docs_search"]); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__docs_search"]); sessionManager.appendThinkingLevelChange(ThinkingLevel.High); sessionManager.appendServiceTierChange("flex"); - sessionManager.appendMCPToolSelection(["mcp_docs_search"]); + sessionManager.appendMCPToolSelection(["mcp__docs_search"]); expect(sessionManager.buildSessionContext().thinkingLevel).toBe(ThinkingLevel.High); expect(sessionManager.buildSessionContext().serviceTier).toBe("flex"); - expect(sessionManager.buildSessionContext().selectedMCPToolNames).toEqual(["mcp_docs_search"]); + expect(sessionManager.buildSessionContext().selectedMCPToolNames).toEqual(["mcp__docs_search"]); expect(sessionManager.buildSessionContext().hasPersistedMCPToolSelection).toBe(true); await sessionManager.rewriteEntries(); const originalSessionBeforeSwitch = fs.readFileSync(originalSessionFile!, "utf8"); @@ -684,16 +684,16 @@ describe("AgentSession MCP discovery", () => { expect(session.sessionFile).toBe(originalSessionFile); expect(session.thinkingLevel).toBe(ThinkingLevel.Medium); expect(session.serviceTier).toBe("flex"); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_docs_search"]); - expect(session.getActiveToolNames()).toEqual(["read", "mcp_docs_search"]); - expect(session.systemPrompt).toBe("tools:read,mcp_docs_search"); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__docs_search"]); + expect(session.getActiveToolNames()).toEqual(["read", "mcp__docs_search"]); + expect(session.systemPrompt).toBe("tools:read,mcp__docs_search"); expect(fs.readFileSync(originalSessionFile!, "utf8")).toBe(originalSessionBeforeSwitch); expect(fs.statSync(originalSessionFile!).mtimeMs).toBe(originalSessionMtimeBeforeSwitch); }); it("restores explicit MCP defaults after startup outage once tools recover in a new session", async () => { const readTool = createBasicTool("read", "Read"); - const docsSearchTool = createMcpTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]); + const docsSearchTool = createMcpTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]); const toolRegistry = new Map([ [readTool.name, readTool], [docsSearchTool.name, docsSearchTool], @@ -714,41 +714,41 @@ describe("AgentSession MCP discovery", () => { modelRegistry: {} as never, toolRegistry, mcpDiscoveryEnabled: true, - initialSelectedMCPToolNames: ["mcp_docs_search", "mcp_slack_send_message"], - defaultSelectedMCPToolNames: ["mcp_docs_search", "mcp_slack_send_message"], + initialSelectedMCPToolNames: ["mcp__docs_search", "mcp__slack_send_message"], + defaultSelectedMCPToolNames: ["mcp__docs_search", "mcp__slack_send_message"], rebuildSystemPrompt: async toolNames => `tools:${toolNames.join(",")}`, }); sessions.push(session); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_docs_search"]); - expect(session.getActiveToolNames()).toEqual(["read", "mcp_docs_search"]); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__docs_search"]); + expect(session.getActiveToolNames()).toEqual(["read", "mcp__docs_search"]); await session.refreshMCPTools([ - createMcpCustomTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]), - createMcpCustomTool("mcp_slack_send_message", "slack", "send_message", "Send a Slack message", [ + createMcpCustomTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]), + createMcpCustomTool("mcp__slack_send_message", "slack", "send_message", "Send a Slack message", [ "channel", "text", ]), ]); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_docs_search"]); - expect(session.getActiveToolNames()).toEqual(["read", "mcp_docs_search"]); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__docs_search"]); + expect(session.getActiveToolNames()).toEqual(["read", "mcp__docs_search"]); await session.newSession(); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_docs_search", "mcp_slack_send_message"]); - expect(session.getActiveToolNames()).toEqual(["read", "mcp_docs_search", "mcp_slack_send_message"]); - expect(session.systemPrompt).toBe("tools:read,mcp_docs_search,mcp_slack_send_message"); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__docs_search", "mcp__slack_send_message"]); + expect(session.getActiveToolNames()).toEqual(["read", "mcp__docs_search", "mcp__slack_send_message"]); + expect(session.systemPrompt).toBe("tools:read,mcp__docs_search,mcp__slack_send_message"); expect(sessionManager.buildSessionContext().selectedMCPToolNames).toEqual([ - "mcp_docs_search", - "mcp_slack_send_message", + "mcp__docs_search", + "mcp__slack_send_message", ]); }); it("clears discovered MCP selections when starting a brand-new session", async () => { const readTool = createBasicTool("read", "Read"); - const docsSearchTool = createMcpTool("mcp_docs_search", "docs", "search", "Search internal docs", ["query"]); - const slackSendTool = createMcpTool("mcp_slack_send_message", "slack", "send_message", "Send a Slack message", [ + const docsSearchTool = createMcpTool("mcp__docs_search", "docs", "search", "Search internal docs", ["query"]); + const slackSendTool = createMcpTool("mcp__slack_send_message", "slack", "send_message", "Send a Slack message", [ "channel", "text", ]); @@ -776,9 +776,9 @@ describe("AgentSession MCP discovery", () => { }); sessions.push(session); - await session.activateDiscoveredMCPTools(["mcp_docs_search"]); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_docs_search"]); - expect(session.getActiveToolNames()).toEqual(["read", "mcp_docs_search"]); + await session.activateDiscoveredMCPTools(["mcp__docs_search"]); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__docs_search"]); + expect(session.getActiveToolNames()).toEqual(["read", "mcp__docs_search"]); await session.newSession(); diff --git a/packages/coding-agent/test/sdk-mcp-discovery.test.ts b/packages/coding-agent/test/sdk-mcp-discovery.test.ts index 71b957579..5cd920b11 100644 --- a/packages/coding-agent/test/sdk-mcp-discovery.test.ts +++ b/packages/coding-agent/test/sdk-mcp-discovery.test.ts @@ -70,7 +70,7 @@ describe("createAgentSession MCP discovery prompt gating", () => { enableMCP: false, enableLsp: false, toolNames: ["read"], - customTools: [createMcpCustomTool("mcp_github_create_issue", "github", "create_issue")], + customTools: [createMcpCustomTool("mcp__github_create_issue", "github", "create_issue")], }); expect(session.systemPrompt).not.toContain("### MCP tool discovery"); @@ -91,23 +91,23 @@ describe("createAgentSession MCP discovery prompt gating", () => { slashCommands: [], enableMCP: false, enableLsp: false, - toolNames: ["read", "mcp_github_create_issue", "search_tool_bm25"], + toolNames: ["read", "mcp__github_create_issue", "search_tool_bm25"], customTools: [ - createMcpCustomTool("mcp_github_create_issue", "github", "create_issue"), - createMcpCustomTool("mcp_slack_post_message", "slack", "post_message"), + createMcpCustomTool("mcp__github_create_issue", "github", "create_issue"), + createMcpCustomTool("mcp__slack_post_message", "slack", "post_message"), ], }); - expect(session.getActiveToolNames()).toContain("mcp_github_create_issue"); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_github_create_issue"]); - expect(session.systemPrompt).toContain("mcp_github_create_issue"); + expect(session.getActiveToolNames()).toContain("mcp__github_create_issue"); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__github_create_issue"]); + expect(session.systemPrompt).toContain("mcp__github_create_issue"); - await session.activateDiscoveredMCPTools(["mcp_slack_post_message"]); + await session.activateDiscoveredMCPTools(["mcp__slack_post_message"]); expect(session.getActiveToolNames()).toEqual( - expect.arrayContaining(["read", "search_tool_bm25", "mcp_github_create_issue", "mcp_slack_post_message"]), + expect.arrayContaining(["read", "search_tool_bm25", "mcp__github_create_issue", "mcp__slack_post_message"]), ); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_github_create_issue", "mcp_slack_post_message"]); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__github_create_issue", "mcp__slack_post_message"]); }); it("keeps configured discovery default servers visible in discovery mode", async () => { @@ -129,16 +129,16 @@ describe("createAgentSession MCP discovery prompt gating", () => { enableLsp: false, toolNames: ["read", "search_tool_bm25"], customTools: [ - createMcpCustomTool("mcp_github_create_issue", "github", "create_issue"), - createMcpCustomTool("mcp_slack_post_message", "slack", "post_message"), + createMcpCustomTool("mcp__github_create_issue", "github", "create_issue"), + createMcpCustomTool("mcp__slack_post_message", "slack", "post_message"), ], }); try { - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_github_create_issue"]); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__github_create_issue"]); expect(session.getActiveToolNames()).toEqual( - expect.arrayContaining(["read", "search_tool_bm25", "mcp_github_create_issue"]), + expect.arrayContaining(["read", "search_tool_bm25", "mcp__github_create_issue"]), ); - expect(session.getActiveToolNames()).not.toContain("mcp_slack_post_message"); + expect(session.getActiveToolNames()).not.toContain("mcp__slack_post_message"); } finally { await session.dispose(); } @@ -159,7 +159,7 @@ describe("createAgentSession MCP discovery prompt gating", () => { enableMCP: false, enableLsp: false, toolNames: ["read", "search_tool_bm25"], - customTools: [createMcpCustomTool("mcp_github_create_issue", "github", "create_issue")], + customTools: [createMcpCustomTool("mcp__github_create_issue", "github", "create_issue")], }); const searchTool = session.agent.state.tools.find(tool => tool.name === "search_tool_bm25"); @@ -187,15 +187,15 @@ describe("createAgentSession MCP discovery prompt gating", () => { enableLsp: false, toolNames: ["read", "search_tool_bm25"], customTools: [ - createMcpCustomTool("mcp_github_create_issue", "github", "create_issue"), - createMcpCustomTool("mcp_slack_post_message", "slack", "post_message"), + createMcpCustomTool("mcp__github_create_issue", "github", "create_issue"), + createMcpCustomTool("mcp__slack_post_message", "slack", "post_message"), ], }); - await firstSession.activateDiscoveredMCPTools(["mcp_slack_post_message"]); + await firstSession.activateDiscoveredMCPTools(["mcp__slack_post_message"]); firstSession.sessionManager.appendThinkingLevelChange(ThinkingLevel.Off); firstSession.sessionManager.appendServiceTierChange("priority"); expect(firstSession.sessionManager.buildSessionContext().thinkingLevel).toBe(ThinkingLevel.Off); - expect(firstSession.getSelectedMCPToolNames()).toEqual(["mcp_slack_post_message"]); + expect(firstSession.getSelectedMCPToolNames()).toEqual(["mcp__slack_post_message"]); const sessionFile = firstSession.sessionFile; expect(sessionFile).toBeDefined(); await firstSession.sessionManager.rewriteEntries(); @@ -223,18 +223,18 @@ describe("createAgentSession MCP discovery prompt gating", () => { enableLsp: false, toolNames: ["read", "search_tool_bm25"], customTools: [ - createMcpCustomTool("mcp_github_create_issue", "github", "create_issue"), - createMcpCustomTool("mcp_slack_post_message", "slack", "post_message"), + createMcpCustomTool("mcp__github_create_issue", "github", "create_issue"), + createMcpCustomTool("mcp__slack_post_message", "slack", "post_message"), ], }); try { expect(resumedSession.thinkingLevel).toBe(ThinkingLevel.Off); expect(resumedSession.serviceTier).toBe("priority"); - expect(resumedSession.getSelectedMCPToolNames()).toEqual(["mcp_slack_post_message"]); + expect(resumedSession.getSelectedMCPToolNames()).toEqual(["mcp__slack_post_message"]); expect(resumedSession.getActiveToolNames()).toEqual( - expect.arrayContaining(["read", "search_tool_bm25", "mcp_slack_post_message"]), + expect.arrayContaining(["read", "search_tool_bm25", "mcp__slack_post_message"]), ); - expect(resumedSession.systemPrompt).toContain("mcp_slack_post_message"); + expect(resumedSession.systemPrompt).toContain("mcp__slack_post_message"); expect(fs.readFileSync(sessionFile!, "utf8")).toBe(persistedBeforeResume); expect(fs.statSync(sessionFile!).mtimeMs).toBe(persistedMtimeBeforeResume); } finally { @@ -276,16 +276,16 @@ describe("createAgentSession MCP discovery prompt gating", () => { enableLsp: false, toolNames: ["read", "search_tool_bm25"], customTools: [ - createMcpCustomTool("mcp_github_create_issue", "github", "create_issue"), - createMcpCustomTool("mcp_slack_post_message", "slack", "post_message"), + createMcpCustomTool("mcp__github_create_issue", "github", "create_issue"), + createMcpCustomTool("mcp__slack_post_message", "slack", "post_message"), ], }); try { expect(session.thinkingLevel).toBe(ThinkingLevel.High); expect(session.serviceTier).toBe("priority"); - expect(session.getSelectedMCPToolNames()).toEqual(["mcp_github_create_issue"]); + expect(session.getSelectedMCPToolNames()).toEqual(["mcp__github_create_issue"]); expect(session.getActiveToolNames()).toEqual( - expect.arrayContaining(["read", "search_tool_bm25", "mcp_github_create_issue"]), + expect.arrayContaining(["read", "search_tool_bm25", "mcp__github_create_issue"]), ); expect(session.sessionManager.buildSessionContext().hasPersistedMCPToolSelection).toBe(false); expect(fs.readFileSync(sessionFile!, "utf8")).toBe(persistedBeforeResume); @@ -310,10 +310,10 @@ describe("createAgentSession MCP discovery prompt gating", () => { slashCommands: [], enableMCP: false, enableLsp: false, - toolNames: ["read", "search_tool_bm25", "mcp_github_create_issue"], + toolNames: ["read", "search_tool_bm25", "mcp__github_create_issue"], customTools: [ - createMcpCustomTool("mcp_github_create_issue", "github", "create_issue"), - createMcpCustomTool("mcp_slack_post_message", "slack", "post_message"), + createMcpCustomTool("mcp__github_create_issue", "github", "create_issue"), + createMcpCustomTool("mcp__slack_post_message", "slack", "post_message"), ], }); await firstSession.setActiveToolsByName(["read", "search_tool_bm25"]); @@ -337,16 +337,16 @@ describe("createAgentSession MCP discovery prompt gating", () => { slashCommands: [], enableMCP: false, enableLsp: false, - toolNames: ["read", "search_tool_bm25", "mcp_github_create_issue"], + toolNames: ["read", "search_tool_bm25", "mcp__github_create_issue"], customTools: [ - createMcpCustomTool("mcp_github_create_issue", "github", "create_issue"), - createMcpCustomTool("mcp_slack_post_message", "slack", "post_message"), + createMcpCustomTool("mcp__github_create_issue", "github", "create_issue"), + createMcpCustomTool("mcp__slack_post_message", "slack", "post_message"), ], }); try { expect(resumedSession.getSelectedMCPToolNames()).toEqual([]); expect(resumedSession.getActiveToolNames()).toEqual(expect.arrayContaining(["read", "search_tool_bm25"])); - expect(resumedSession.getActiveToolNames()).not.toContain("mcp_github_create_issue"); + expect(resumedSession.getActiveToolNames()).not.toContain("mcp__github_create_issue"); } finally { await resumedSession.dispose(); } diff --git a/packages/coding-agent/test/tools/search-tool-bm25.test.ts b/packages/coding-agent/test/tools/search-tool-bm25.test.ts index a51fa913d..98f6b5e6c 100644 --- a/packages/coding-agent/test/tools/search-tool-bm25.test.ts +++ b/packages/coding-agent/test/tools/search-tool-bm25.test.ts @@ -60,7 +60,7 @@ function createSession( describe("SearchToolBm25Tool", () => { const discoverableTools: TestDiscoverableMCPTool[] = [ { - name: "mcp_github_create_issue", + name: "mcp__github_create_issue", label: "github/create_issue", description: "Create a GitHub issue in the selected repository", serverName: "github", @@ -68,7 +68,7 @@ describe("SearchToolBm25Tool", () => { schemaKeys: ["owner", "repo", "title", "body"], }, { - name: "mcp_github_list_pull_requests", + name: "mcp__github_list_pull_requests", label: "github/list_pull_requests", description: "List pull requests for a repository", serverName: "github", @@ -76,7 +76,7 @@ describe("SearchToolBm25Tool", () => { schemaKeys: ["owner", "repo", "state"], }, { - name: "mcp_slack_post_message", + name: "mcp__slack_post_message", label: "slack/post_message", description: "Post a message to a Slack channel", serverName: "slack", @@ -121,15 +121,15 @@ describe("SearchToolBm25Tool", () => { expect(searchIndexCalls).toBe(1); expect(rawToolsCalls).toBe(0); expect(result.details?.tools.map(match => match.name)).toEqual([ - "mcp_github_create_issue", - "mcp_github_list_pull_requests", + "mcp__github_create_issue", + "mcp__github_list_pull_requests", ]); expect(result.content).toEqual([ { type: "text", text: JSON.stringify({ query: "github", - activated_tools: ["mcp_github_create_issue", "mcp_github_list_pull_requests"], + activated_tools: ["mcp__github_create_issue", "mcp__github_list_pull_requests"], match_count: 2, total_tools: 3, }), @@ -156,11 +156,11 @@ describe("SearchToolBm25Tool", () => { query: "github issue", limit: 2, total_tools: 3, - activated_tools: ["mcp_github_create_issue"], - active_selected_tools: ["mcp_github_create_issue"], + activated_tools: ["mcp__github_create_issue"], + active_selected_tools: ["mcp__github_create_issue"], tools: [ { - name: "mcp_github_create_issue", + name: "mcp__github_create_issue", label: "github/create_issue", description: "Create a GitHub issue in the selected repository", server_name: "github", @@ -224,11 +224,11 @@ describe("SearchToolBm25Tool", () => { query: "github\tissue", limit: 2, total_tools: 1, - activated_tools: ["mcp_github_create_issue"], - active_selected_tools: ["mcp_github_create_issue"], + activated_tools: ["mcp__github_create_issue"], + active_selected_tools: ["mcp__github_create_issue"], tools: [ { - name: "mcp_github_create_issue", + name: "mcp__github_create_issue", label: "github\t/create_issue", description: "Create\ta GitHub issue", server_name: "git\thub", @@ -254,7 +254,7 @@ describe("SearchToolBm25Tool", () => { expect(theme).toBeDefined(); const uiTheme = theme!; const tools = Array.from({ length: 6 }, (_, index) => ({ - name: `mcp_github_tool_${index + 1}`, + name: `mcp__github_tool_${index + 1}`, label: `github/tool_${index + 1}`, description: `GitHub tool ${index + 1}`, server_name: "github", @@ -285,7 +285,7 @@ describe("SearchToolBm25Tool", () => { it("defaults to 8 results and lets callers override the limit", async () => { const manyTools: TestDiscoverableMCPTool[] = Array.from({ length: 10 }, (_, index) => ({ - name: `mcp_github_tool_${index + 1}`, + name: `mcp__github_tool_${index + 1}`, label: `github/tool_${index + 1}`, description: `GitHub tool ${index + 1} for repository workflows`, serverName: "github", @@ -323,15 +323,15 @@ describe("SearchToolBm25Tool", () => { const firstResult = await tool.execute("call-1", { query: "github issue", limit: 1 }); const firstDetails = firstResult.details; - expect(firstDetails?.tools.map(match => match.name)).toEqual(["mcp_github_create_issue"]); - expect(firstDetails?.active_selected_tools).toEqual(["mcp_github_create_issue"]); - expect(session.getSelected()).toEqual(["mcp_github_create_issue"]); + expect(firstDetails?.tools.map(match => match.name)).toEqual(["mcp__github_create_issue"]); + expect(firstDetails?.active_selected_tools).toEqual(["mcp__github_create_issue"]); + expect(session.getSelected()).toEqual(["mcp__github_create_issue"]); const secondResult = await tool.execute("call-2", { query: "slack message", limit: 1 }); const secondDetails = secondResult.details; - expect(secondDetails?.tools.map(match => match.name)).toEqual(["mcp_slack_post_message"]); - expect(secondDetails?.active_selected_tools).toEqual(["mcp_github_create_issue", "mcp_slack_post_message"]); - expect(session.getSelected()).toEqual(["mcp_github_create_issue", "mcp_slack_post_message"]); + expect(secondDetails?.tools.map(match => match.name)).toEqual(["mcp__slack_post_message"]); + expect(secondDetails?.active_selected_tools).toEqual(["mcp__github_create_issue", "mcp__slack_post_message"]); + expect(session.getSelected()).toEqual(["mcp__github_create_issue", "mcp__slack_post_message"]); }); it("skips already-selected matches before applying limit", async () => { @@ -339,23 +339,23 @@ describe("SearchToolBm25Tool", () => { const tool = new SearchToolBm25Tool(session); const firstResult = await tool.execute("call-github-1", { query: "github", limit: 1 }); - expect(firstResult.details?.tools.map(match => match.name)).toEqual(["mcp_github_create_issue"]); - expect(firstResult.details?.activated_tools).toEqual(["mcp_github_create_issue"]); + expect(firstResult.details?.tools.map(match => match.name)).toEqual(["mcp__github_create_issue"]); + expect(firstResult.details?.activated_tools).toEqual(["mcp__github_create_issue"]); const secondResult = await tool.execute("call-github-2", { query: "github", limit: 1 }); - expect(secondResult.details?.tools.map(match => match.name)).toEqual(["mcp_github_list_pull_requests"]); - expect(secondResult.details?.activated_tools).toEqual(["mcp_github_list_pull_requests"]); + expect(secondResult.details?.tools.map(match => match.name)).toEqual(["mcp__github_list_pull_requests"]); + expect(secondResult.details?.activated_tools).toEqual(["mcp__github_list_pull_requests"]); expect(secondResult.details?.active_selected_tools).toEqual([ - "mcp_github_create_issue", - "mcp_github_list_pull_requests", + "mcp__github_create_issue", + "mcp__github_list_pull_requests", ]); const exhaustedResult = await tool.execute("call-github-3", { query: "github", limit: 1 }); expect(exhaustedResult.details?.tools).toEqual([]); expect(exhaustedResult.details?.activated_tools).toEqual([]); expect(exhaustedResult.details?.active_selected_tools).toEqual([ - "mcp_github_create_issue", - "mcp_github_list_pull_requests", + "mcp__github_create_issue", + "mcp__github_list_pull_requests", ]); });