diff --git a/plugins/provider-claude-code/src/bridge/__tests__/bridge.test.ts b/plugins/provider-claude-code/src/bridge/__tests__/bridge.test.ts index 7a635befa..90f530b61 100644 --- a/plugins/provider-claude-code/src/bridge/__tests__/bridge.test.ts +++ b/plugins/provider-claude-code/src/bridge/__tests__/bridge.test.ts @@ -1,3 +1,5 @@ +import { Client } from "@modelcontextprotocol/sdk/client/index.js"; +import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js"; import { chmodSync, mkdirSync, @@ -106,6 +108,8 @@ interface ControlledClaudeQuery { } interface ClaudeQueryCallOptions { + mcpServers?: BridgeSessionOptions["mcpServers"]; + allowedTools?: string[]; canUseTool?: CanUseTool; env?: Record; extraArgs?: Record; @@ -706,7 +710,7 @@ describe("bridge", () => { } }); - it("publishes a context snapshot after a turn and invalidates it at compaction", async () => { + it("retains the attached MCP server and tool listing across a compact boundary", async () => { const bridge = createBridgeJsonRpcTestHarness(handleLine); const queries: ControlledClaudeQuery[] = []; queryMock.mockImplementation(() => { @@ -727,6 +731,7 @@ describe("bridge", () => { threadId, cwd: "/tmp/worktree", instructionMode: "append", + dynamicTools: [{ name: "catalog_probe", description: "Check tool visibility", inputSchema: { type: "object" } }], options: { permissionMode: "accept-edits", permissionScope: "workspace", @@ -737,6 +742,15 @@ describe("bridge", () => { }, }); await bridge.waitForResponse(1); + const attachedOptions = getLatestQueryOptions(); + const mcpServer = attachedOptions.mcpServers?.["bb-bridge"]; + if (!mcpServer || mcpServer.type !== "sdk") throw new Error("Expected attached SDK MCP server"); + const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); + await mcpServer.instance.connect(serverTransport); + const client = new Client({ name: "catalog-probe", version: "1.0.0" }); + await client.connect(clientTransport); + expect((await client.listTools()).tools.map((tool) => tool.name)).toEqual(["catalog_probe"]); + expect(attachedOptions.allowedTools).toContain("mcp__bb-bridge__catalog_probe"); bridge.sendRequest( 2, "turn/start", @@ -807,6 +821,10 @@ describe("bridge", () => { }); expect(queries[0].getContextUsage).toHaveBeenCalledTimes(2); }); + expect(queryMock).toHaveBeenCalledTimes(1); + expect(getLatestQueryOptions().mcpServers?.["bb-bridge"]).toBe(mcpServer); + expect((await client.listTools()).tools.map((tool) => tool.name)).toEqual(["catalog_probe"]); + await client.close(); } finally { await stopBridgeThread({ bridge, queries, threadId }); bridge.restore();