diff --git a/src/services/mcp/McpHub.ts b/src/services/mcp/McpHub.ts index caca5ddb392e..97053897ae70 100644 --- a/src/services/mcp/McpHub.ts +++ b/src/services/mcp/McpHub.ts @@ -1319,27 +1319,19 @@ export class McpHub { return aIsGlobal ? 1 : -1 }) - // Send sorted servers to webview - const targetProvider: ClineProvider | undefined = this.providerRef.deref() + // Send sorted servers to all registered providers (all open tabs) + const serversToSend = sortedConnections.map((connection) => connection.server) - if (targetProvider) { - const serversToSend = sortedConnections.map((connection) => connection.server) + const message = { + type: "mcpServers" as const, + mcpServers: serversToSend, + } - const message = { - type: "mcpServers" as const, - mcpServers: serversToSend, - } + // Import McpServerManager dynamically to avoid circular dependency + const { McpServerManager } = await import("./McpServerManager") - try { - await targetProvider.postMessageToWebview(message) - } catch (error) { - console.error("[McpHub] Error calling targetProvider.postMessageToWebview:", error) - } - } else { - console.error( - "[McpHub] No target provider available (neither from getInstance nor providerRef) - cannot send mcpServers message to webview", - ) - } + // Notify all registered providers to ensure all tabs are synchronized + McpServerManager.notifyProviders(message) } public async toggleServerDisabled( diff --git a/src/services/mcp/__tests__/McpHub.spec.ts b/src/services/mcp/__tests__/McpHub.spec.ts index 1db924ed6cc8..e107986cfb06 100644 --- a/src/services/mcp/__tests__/McpHub.spec.ts +++ b/src/services/mcp/__tests__/McpHub.spec.ts @@ -49,6 +49,16 @@ vi.mock("../../../utils/safeWriteJson", () => ({ }), })) +// Mock McpServerManager +vi.mock("../McpServerManager", () => ({ + McpServerManager: { + notifyProviders: vi.fn(), + getInstance: vi.fn(), + unregisterProvider: vi.fn(), + cleanup: vi.fn(), + }, +})) + vi.mock("vscode", () => ({ workspace: { createFileSystemWatcher: vi.fn().mockReturnValue({ @@ -1502,9 +1512,12 @@ describe("McpHub", () => { } mcpHub.connections = [mockConnection] + // Get the mock McpServerManager + const { McpServerManager } = await import("../McpServerManager") + await mcpHub.updateServerTimeout("test-server", 120) - expect(mockProvider.postMessageToWebview).toHaveBeenCalledWith( + expect(McpServerManager.notifyProviders).toHaveBeenCalledWith( expect.objectContaining({ type: "mcpServers", }), @@ -1733,6 +1746,9 @@ describe("McpHub", () => { const mcpHub = new McpHub(disabledMockProvider as unknown as ClineProvider) await new Promise((resolve) => setTimeout(resolve, 100)) + // Get the mock McpServerManager + const { McpServerManager } = await import("../McpServerManager") + // Clear previous calls vi.clearAllMocks() @@ -1746,8 +1762,8 @@ describe("McpHub", () => { expect(server!.client).toBeNull() expect(server!.transport).toBeNull() - // Verify postMessageToWebview was called to update the UI - expect(disabledMockProvider.postMessageToWebview).toHaveBeenCalledWith( + // Verify McpServerManager.notifyProviders was called to update the UI + expect(McpServerManager.notifyProviders).toHaveBeenCalledWith( expect.objectContaining({ type: "mcpServers", }),