Skip to content

Commit 87e1203

Browse files
committed
fix: prevent duplicate MCP server instances on refresh
- Add proper cleanup delays in restartConnection and refreshAllConnections - Ensure transport and client are properly closed before creating new connections - Fix race condition where new connections were created before old ones were fully cleaned up - Maintain backward compatibility with existing tests Fixes issue where refreshing MCP servers or individual server refresh was causing duplicate instances without cleaning up the old ones.
1 parent 3ee6072 commit 87e1203

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

src/services/mcp/McpHub.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,8 +1007,13 @@ export class McpHub {
10071007
for (const connection of connections) {
10081008
try {
10091009
if (connection.type === "connected") {
1010-
await connection.transport.close()
1011-
await connection.client.close()
1010+
// Close transport first, then client
1011+
if (connection.transport) {
1012+
await connection.transport.close()
1013+
}
1014+
if (connection.client) {
1015+
await connection.client.close()
1016+
}
10121017
}
10131018
} catch (error) {
10141019
console.error(`Failed to close transport for ${name}:`, error)
@@ -1188,15 +1193,21 @@ export class McpHub {
11881193
await this.notifyWebviewOfServerChanges()
11891194
await delay(500) // artificial delay to show user that server is restarting
11901195
try {
1191-
await this.deleteConnection(serverName, connection.server.source)
1196+
// Ensure complete cleanup before restarting
1197+
const serverSource = connection.server.source || "global"
1198+
await this.deleteConnection(serverName, serverSource)
1199+
1200+
// Add small delay to ensure cleanup is complete
1201+
await delay(100)
1202+
11921203
// Parse the config to validate it
11931204
const parsedConfig = JSON.parse(config)
11941205
try {
11951206
// Validate the config
11961207
const validatedConfig = this.validateServerConfig(parsedConfig, serverName)
11971208

11981209
// Try to connect again using validated config
1199-
await this.connectToServer(serverName, validatedConfig, connection.server.source || "global")
1210+
await this.connectToServer(serverName, validatedConfig, serverSource)
12001211
vscode.window.showInformationMessage(t("mcp:info.server_connected", { serverName }))
12011212
} catch (validationError) {
12021213
this.showErrorMessage(`Invalid configuration for MCP server "${serverName}"`, validationError)
@@ -1265,6 +1276,9 @@ export class McpHub {
12651276
await this.deleteConnection(conn.server.name, conn.server.source)
12661277
}
12671278

1279+
// Add small delay to ensure cleanup is complete
1280+
await delay(100)
1281+
12681282
// Re-initialize all servers from scratch
12691283
// This ensures proper initialization including fetching tools, resources, etc.
12701284
await this.initializeMcpServers("global")

0 commit comments

Comments
 (0)