From e76d684210b89dc65191e00c77e6be49a828d15f Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 16 Mar 2026 17:14:35 +0000 Subject: [PATCH] fix(core): reuse connected MCP client in subagent invocations Subsequent subagent invocations attempt to connect to an already connected MCP client, throwing an error. This commit adds a status check before calling client.connect(), enabling client.discoverInto() to successfully populate the new subagent registry. --- packages/core/src/tools/mcp-client-manager.test.ts | 4 ++-- packages/core/src/tools/mcp-client-manager.ts | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/core/src/tools/mcp-client-manager.test.ts b/packages/core/src/tools/mcp-client-manager.test.ts index 4d91898077..dce8708628 100644 --- a/packages/core/src/tools/mcp-client-manager.test.ts +++ b/packages/core/src/tools/mcp-client-manager.test.ts @@ -14,7 +14,7 @@ import { type MockedObject, } from 'vitest'; import { McpClientManager } from './mcp-client-manager.js'; -import { McpClient, MCPDiscoveryState } from './mcp-client.js'; +import { McpClient, MCPDiscoveryState, MCPServerStatus } from './mcp-client.js'; import type { ToolRegistry } from './tool-registry.js'; import type { Config, GeminiCLIExtension } from '../config/config.js'; import type { PromptRegistry } from '../prompts/prompt-registry.js'; @@ -38,7 +38,7 @@ describe('McpClientManager', () => { connect: vi.fn(), discoverInto: vi.fn(), disconnect: vi.fn(), - getStatus: vi.fn(), + getStatus: vi.fn().mockReturnValue(MCPServerStatus.DISCONNECTED), getServerConfig: vi.fn(), getServerName: vi.fn().mockReturnValue('test-server'), } as unknown as McpClient); diff --git a/packages/core/src/tools/mcp-client-manager.ts b/packages/core/src/tools/mcp-client-manager.ts index c20dc9b408..2f208c70d7 100644 --- a/packages/core/src/tools/mcp-client-manager.ts +++ b/packages/core/src/tools/mcp-client-manager.ts @@ -13,6 +13,7 @@ import type { ToolRegistry } from './tool-registry.js'; import { McpClient, MCPDiscoveryState, + MCPServerStatus, populateMcpServerCommand, } from './mcp-client.js'; import { getErrorMessage, isAuthenticationError } from '../utils/errors.js'; @@ -458,7 +459,9 @@ export class McpClientManager { : undefined); try { - await client.connect(); + if (client.getStatus() === MCPServerStatus.DISCONNECTED) { + await client.connect(); + } if (targetRegistries) { await client.discoverInto(this.cliConfig, targetRegistries); }