From cdf848d5c785e67685550be71345b9e4f4d3a37d Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 16 Mar 2026 17:22:58 +0000 Subject: [PATCH] fix(core): remove isolated MCP registries upon subagent completion McpClient's registeredRegistries grows indefinitely during long sessions because isolated subagent registries were never removed. This commit introduces a cleanup mechanism invoked in LocalAgentExecutor's finally block to release these dead registries, preventing a memory leak. --- packages/core/src/agents/local-executor.ts | 9 +++++++++ packages/core/src/tools/mcp-client-manager.ts | 10 ++++++++++ packages/core/src/tools/mcp-client.ts | 8 ++++++++ 3 files changed, 27 insertions(+) diff --git a/packages/core/src/agents/local-executor.ts b/packages/core/src/agents/local-executor.ts index 2302e117f8..0c8e55ad65 100644 --- a/packages/core/src/agents/local-executor.ts +++ b/packages/core/src/agents/local-executor.ts @@ -625,6 +625,15 @@ export class LocalAgentExecutor { } } finally { this.config.userHintService.offUserHint(hintListener); + + const globalMcpManager = this.context.config.getMcpClientManager(); + if (globalMcpManager) { + globalMcpManager.removeRegistries({ + toolRegistry: this.toolRegistry, + promptRegistry: this.promptRegistry, + resourceRegistry: this.resourceRegistry, + }); + } } // === UNIFIED RECOVERY BLOCK === diff --git a/packages/core/src/tools/mcp-client-manager.ts b/packages/core/src/tools/mcp-client-manager.ts index 2f208c70d7..a607b19508 100644 --- a/packages/core/src/tools/mcp-client-manager.ts +++ b/packages/core/src/tools/mcp-client-manager.ts @@ -164,6 +164,16 @@ export class McpClientManager { return this.clients.get(serverName); } + removeRegistries(registries: { + toolRegistry: ToolRegistry; + promptRegistry: PromptRegistry; + resourceRegistry: ResourceRegistry; + }): void { + for (const client of this.clients.values()) { + client.removeRegistries(registries); + } + } + /** * For all the MCP servers associated with this extension: * diff --git a/packages/core/src/tools/mcp-client.ts b/packages/core/src/tools/mcp-client.ts index 23d83f494a..58b7b6c8e2 100644 --- a/packages/core/src/tools/mcp-client.ts +++ b/packages/core/src/tools/mcp-client.ts @@ -266,6 +266,14 @@ export class McpClient implements McpProgressReporter { } } + /** + * Unregisters registries so this client will no longer update them when it receives + * list_changed notifications from the server. + */ + removeRegistries(registries: RegistrySet): void { + this.registeredRegistries.delete(registries); + } + /** * Disconnects from the MCP server. */