Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 10 additions & 18 deletions src/services/mcp/McpHub.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
22 changes: 19 additions & 3 deletions src/services/mcp/__tests__/McpHub.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand Down Expand Up @@ -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",
}),
Expand Down Expand Up @@ -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()

Expand All @@ -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",
}),
Expand Down