Skip to content

Commit a2a8bfc

Browse files
committed
fix: prevent disabled MCP servers from starting processes and show correct status
- Backend: Skip connecting to disabled servers in connectToServer() - Backend: Handle enable/disable state changes properly in toggleServerDisabled() - Backend: Only setup file watchers for enabled servers - Frontend: Show grey status indicator for disabled servers - Frontend: Hide error messages and retry buttons for disabled servers - Frontend: Prevent expansion of disabled server rows Fixes #6036
1 parent 2b8228e commit a2a8bfc

File tree

2 files changed

+225
-162
lines changed

2 files changed

+225
-162
lines changed

src/services/mcp/McpHub.ts

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,7 @@ export class McpHub {
497497
const result = McpSettingsSchema.safeParse(config)
498498

499499
if (result.success) {
500+
// Pass all servers including disabled ones - they'll be handled in updateServerConnections
500501
await this.updateServerConnections(result.data.mcpServers || {}, source, false)
501502
} else {
502503
const errorMessages = result.error.errors
@@ -560,6 +561,26 @@ export class McpHub {
560561
// Remove existing connection if it exists with the same source
561562
await this.deleteConnection(name, source)
562563

564+
// Skip connecting to disabled servers
565+
if (config.disabled) {
566+
// Still create a connection object to track the server, but don't actually connect
567+
const connection: McpConnection = {
568+
server: {
569+
name,
570+
config: JSON.stringify(config),
571+
status: "disconnected",
572+
disabled: true,
573+
source,
574+
projectPath: source === "project" ? vscode.workspace.workspaceFolders?.[0]?.uri.fsPath : undefined,
575+
errorHistory: [],
576+
},
577+
client: null as any, // We won't actually create a client for disabled servers
578+
transport: null as any, // We won't actually create a transport for disabled servers
579+
}
580+
this.connections.push(connection)
581+
return
582+
}
583+
563584
try {
564585
const client = new Client(
565586
{
@@ -975,15 +996,21 @@ export class McpHub {
975996
if (!currentConnection) {
976997
// New server
977998
try {
978-
this.setupFileWatcher(name, validatedConfig, source)
999+
// Only setup file watcher for enabled servers
1000+
if (!validatedConfig.disabled) {
1001+
this.setupFileWatcher(name, validatedConfig, source)
1002+
}
9791003
await this.connectToServer(name, validatedConfig, source)
9801004
} catch (error) {
9811005
this.showErrorMessage(`Failed to connect to new MCP server ${name}`, error)
9821006
}
9831007
} else if (!deepEqual(JSON.parse(currentConnection.server.config), config)) {
9841008
// Existing server with changed config
9851009
try {
986-
this.setupFileWatcher(name, validatedConfig, source)
1010+
// Only setup file watcher for enabled servers
1011+
if (!validatedConfig.disabled) {
1012+
this.setupFileWatcher(name, validatedConfig, source)
1013+
}
9871014
await this.deleteConnection(name, source)
9881015
await this.connectToServer(name, validatedConfig, source)
9891016
} catch (error) {
@@ -1257,8 +1284,18 @@ export class McpHub {
12571284
try {
12581285
connection.server.disabled = disabled
12591286

1260-
// Only refresh capabilities if connected
1261-
if (connection.server.status === "connected") {
1287+
// If disabling a connected server, disconnect it
1288+
if (disabled && connection.server.status === "connected") {
1289+
await this.deleteConnection(serverName, serverSource)
1290+
// Re-add as a disabled connection
1291+
await this.connectToServer(serverName, JSON.parse(connection.server.config), serverSource)
1292+
} else if (!disabled && connection.server.status === "disconnected") {
1293+
// If enabling a disabled server, connect it
1294+
const config = JSON.parse(connection.server.config)
1295+
await this.deleteConnection(serverName, serverSource)
1296+
await this.connectToServer(serverName, config, serverSource)
1297+
} else if (connection.server.status === "connected") {
1298+
// Only refresh capabilities if connected
12621299
connection.server.tools = await this.fetchToolsList(serverName, serverSource)
12631300
connection.server.resources = await this.fetchResourcesList(serverName, serverSource)
12641301
connection.server.resourceTemplates = await this.fetchResourceTemplatesList(

0 commit comments

Comments
 (0)