diff --git a/packages/core/src/tools/mcp-client-manager.test.ts b/packages/core/src/tools/mcp-client-manager.test.ts index 5a36f39d71d..daaf6404a4b 100644 --- a/packages/core/src/tools/mcp-client-manager.test.ts +++ b/packages/core/src/tools/mcp-client-manager.test.ts @@ -558,6 +558,32 @@ describe('McpClientManager', () => { expect(McpClient).not.toHaveBeenCalled(); }); + it('reports unmatched disabled tools on pool and incremental discovery', async () => { + const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); + const getDisabledTools = () => new Set(['run_shel_command']); + + const { config: poolConfiguration, manager: poolMcpManager } = poolManager( + () => ({ srv: {} }), + vi.fn().mockResolvedValue(mkConn('srv')), + { getDisabledTools }, + ); + await poolMcpManager.discoverAllMcpTools(poolConfiguration); + + const incrementalConfig = mkConfig(() => ({}), { + isMcpServerDisabled: () => false, + getDisabledTools, + }); + const incrementalManager = mkManager({ config: incrementalConfig }); + await incrementalManager.discoverAllMcpToolsIncremental(incrementalConfig); + + expect(warnSpy).toHaveBeenCalledTimes(2); + expect( + warnSpy.mock.calls.every(([line]) => + String(line).includes('run_shel_command'), + ), + ).toBe(true); + }); + it('refreshes metadata on a retained unpooled connection without transport churn', async () => { let serverConfig = { command: 'node', diff --git a/packages/core/src/tools/mcp-client-manager.ts b/packages/core/src/tools/mcp-client-manager.ts index 0f4cc26c688..91af4b9c64e 100644 --- a/packages/core/src/tools/mcp-client-manager.ts +++ b/packages/core/src/tools/mcp-client-manager.ts @@ -1789,6 +1789,7 @@ export class McpClientManager { } // Same settled-registry report as the per-session bulk pass (#12435). warnOnUnmatchedEagerToolEntries(cliConfig); + warnOnUnmatchedDisabledToolEntries(cliConfig); } private releaseAllPooledConnections(): void { @@ -2408,6 +2409,8 @@ export class McpClientManager { // MCP hot-reload reconcile both land here, so this is where a misspelt // `tools.eager` entry becomes visible (#12435). warnOnUnmatchedEagerToolEntries(cliConfig); + // Repeated discovery is deduplicated by the helper's per-Config ledger. + warnOnUnmatchedDisabledToolEntries(cliConfig); } /**