From e07df4c953792bd84a758fe67e5ec9a181c5f170 Mon Sep 17 00:00:00 2001 From: Abhi Date: Sun, 15 Mar 2026 19:32:32 -0400 Subject: [PATCH] fix(core): remove stale MCP client from map on initialization failure --- packages/core/src/tools/mcp-client-manager.test.ts | 13 +++++++++++++ packages/core/src/tools/mcp-client-manager.ts | 2 ++ 2 files changed, 15 insertions(+) diff --git a/packages/core/src/tools/mcp-client-manager.test.ts b/packages/core/src/tools/mcp-client-manager.test.ts index c35ae2e084..56dc2047f3 100644 --- a/packages/core/src/tools/mcp-client-manager.test.ts +++ b/packages/core/src/tools/mcp-client-manager.test.ts @@ -751,6 +751,19 @@ describe('McpClientManager', () => { ); }); + it('should remove the client from the clients map if initialization fails', async () => { + const manager = new McpClientManager('0.0.1', toolRegistry, mockConfig); + const name = 'test-server'; + const config = { command: 'node', args: ['fail.js'] }; + + mockedMcpClient.connect.mockRejectedValue(new Error('Connection failed')); + + // maybeDiscoverMcpServer returns a promise that resolves when discovery is finished. + await manager.maybeDiscoverMcpServer(name, config); + + expect(manager.getClient(name)).toBeUndefined(); + }); + it('should show previously deduplicated errors after interaction clears state', () => { const manager = new McpClientManager('0.0.1', toolRegistry, mockConfig); diff --git a/packages/core/src/tools/mcp-client-manager.ts b/packages/core/src/tools/mcp-client-manager.ts index b2a022402e..bd94c6dee5 100644 --- a/packages/core/src/tools/mcp-client-manager.ts +++ b/packages/core/src/tools/mcp-client-manager.ts @@ -404,6 +404,7 @@ export class McpClientManager { await client.discover(this.cliConfig); this.eventEmitter?.emit('mcp-client-update', this.clients); } catch (error) { + this.clients.delete(name); this.eventEmitter?.emit('mcp-client-update', this.clients); // Check if this is a 401/auth error - if so, don't show as red error // (the info message was already shown in mcp-client.ts) @@ -418,6 +419,7 @@ export class McpClientManager { } } } catch (error) { + this.clients.delete(name); const errorMessage = getErrorMessage(error); this.emitDiagnostic( 'error',