@@ -39,7 +39,8 @@ const StdioConfigSchema = z.object({
3939 command : z . string ( ) ,
4040 args : z . array ( z . string ( ) ) . optional ( ) ,
4141 env : z . record ( z . string ( ) ) . optional ( ) ,
42- alwaysAllow : AlwaysAllowSchema . optional ( )
42+ alwaysAllow : AlwaysAllowSchema . optional ( ) ,
43+ disabled : z . boolean ( ) . optional ( )
4344} )
4445
4546const McpSettingsSchema = z . object ( {
@@ -61,7 +62,10 @@ export class McpHub {
6162 }
6263
6364 getServers ( ) : McpServer [ ] {
64- return this . connections . map ( ( conn ) => conn . server )
65+ // Only return enabled servers
66+ return this . connections
67+ . filter ( ( conn ) => ! conn . server . disabled )
68+ . map ( ( conn ) => conn . server )
6569 }
6670
6771 async getMcpServersPath ( ) : Promise < string > {
@@ -117,9 +121,7 @@ export class McpHub {
117121 return
118122 }
119123 try {
120- vscode . window . showInformationMessage ( "Updating MCP servers..." )
121124 await this . updateServerConnections ( result . data . mcpServers || { } )
122- vscode . window . showInformationMessage ( "MCP servers updated" )
123125 } catch ( error ) {
124126 console . error ( "Failed to process MCP settings change:" , error )
125127 }
@@ -202,11 +204,13 @@ export class McpHub {
202204 }
203205
204206 // valid schema
207+ const parsedConfig = StdioConfigSchema . parse ( config )
205208 const connection : McpConnection = {
206209 server : {
207210 name,
208211 config : JSON . stringify ( config ) ,
209212 status : "connecting" ,
213+ disabled : parsedConfig . disabled ,
210214 } ,
211215 client,
212216 transport,
@@ -466,13 +470,89 @@ export class McpHub {
466470 } )
467471 }
468472
469- // Using server
473+ // Public methods for server management
474+
475+ public async toggleServerDisabled ( serverName : string , disabled : boolean ) : Promise < void > {
476+ let settingsPath : string
477+ try {
478+ settingsPath = await this . getMcpSettingsFilePath ( )
479+
480+ // Ensure the settings file exists and is accessible
481+ try {
482+ await fs . access ( settingsPath )
483+ } catch ( error ) {
484+ console . error ( 'Settings file not accessible:' , error )
485+ throw new Error ( 'Settings file not accessible' )
486+ }
487+ const content = await fs . readFile ( settingsPath , "utf-8" )
488+ const config = JSON . parse ( content )
489+
490+ // Validate the config structure
491+ if ( ! config || typeof config !== 'object' ) {
492+ throw new Error ( 'Invalid config structure' )
493+ }
494+
495+ if ( ! config . mcpServers || typeof config . mcpServers !== 'object' ) {
496+ config . mcpServers = { }
497+ }
498+
499+ if ( config . mcpServers [ serverName ] ) {
500+ // Create a new server config object to ensure clean structure
501+ const serverConfig = {
502+ ...config . mcpServers [ serverName ] ,
503+ disabled
504+ }
505+
506+ // Ensure required fields exist
507+ if ( ! serverConfig . alwaysAllow ) {
508+ serverConfig . alwaysAllow = [ ]
509+ }
510+
511+ config . mcpServers [ serverName ] = serverConfig
512+
513+ // Write the entire config back
514+ const updatedConfig = {
515+ mcpServers : config . mcpServers
516+ }
517+
518+ await fs . writeFile ( settingsPath , JSON . stringify ( updatedConfig , null , 2 ) )
519+
520+ const connection = this . connections . find ( conn => conn . server . name === serverName )
521+ if ( connection ) {
522+ try {
523+ connection . server . disabled = disabled
524+
525+ // Only refresh capabilities if connected
526+ if ( connection . server . status === "connected" ) {
527+ connection . server . tools = await this . fetchToolsList ( serverName )
528+ connection . server . resources = await this . fetchResourcesList ( serverName )
529+ connection . server . resourceTemplates = await this . fetchResourceTemplatesList ( serverName )
530+ }
531+ } catch ( error ) {
532+ console . error ( `Failed to refresh capabilities for ${ serverName } :` , error )
533+ }
534+ }
535+
536+ await this . notifyWebviewOfServerChanges ( )
537+ }
538+ } catch ( error ) {
539+ console . error ( "Failed to update server disabled state:" , error )
540+ if ( error instanceof Error ) {
541+ console . error ( "Error details:" , error . message , error . stack )
542+ }
543+ vscode . window . showErrorMessage ( `Failed to update server state: ${ error instanceof Error ? error . message : String ( error ) } ` )
544+ throw error
545+ }
546+ }
470547
471548 async readResource ( serverName : string , uri : string ) : Promise < McpResourceResponse > {
472549 const connection = this . connections . find ( ( conn ) => conn . server . name === serverName )
473550 if ( ! connection ) {
474551 throw new Error ( `No connection found for server: ${ serverName } ` )
475552 }
553+ if ( connection . server . disabled ) {
554+ throw new Error ( `Server "${ serverName } " is disabled` )
555+ }
476556 return await connection . client . request (
477557 {
478558 method : "resources/read" ,
@@ -495,6 +575,9 @@ export class McpHub {
495575 `No connection found for server: ${ serverName } . Please make sure to use MCP servers available under 'Connected MCP Servers'.` ,
496576 )
497577 }
578+ if ( connection . server . disabled ) {
579+ throw new Error ( `Server "${ serverName } " is disabled and cannot be used` )
580+ }
498581
499582 return await connection . client . request (
500583 {
0 commit comments