@@ -59,14 +59,17 @@ def _default_config(self) -> Dict[str, Any]:
5959 "clients" : {
6060 "claude-desktop" : {
6161 "enabled_servers" : [],
62+ "disabled_servers" : {},
6263 "installed" : installed_clients .get ("claude-desktop" , False )
6364 },
6465 "cursor" : {
6566 "enabled_servers" : [],
67+ "disabled_servers" : {},
6668 "installed" : installed_clients .get ("cursor" , False )
6769 },
6870 "windsurf" : {
6971 "enabled_servers" : [],
72+ "disabled_servers" : {},
7073 "installed" : installed_clients .get ("windsurf" , False )
7174 }
7275 }
@@ -111,7 +114,11 @@ def unregister_server(self, server_name: str) -> None:
111114 self ._save_config ()
112115
113116 def enable_server_for_client (self , server_name : str , client_name : str ) -> bool :
114- """Enable a server for a specific client"""
117+ """Enable a server for a specific client
118+
119+ If the server was previously disabled for this client, its configuration
120+ will be restored from the disabled_servers section.
121+ """
115122 if server_name not in self ._config .get ("servers" , {}):
116123 logger .error (f"Server not installed: { server_name } " )
117124 return False
@@ -120,22 +127,90 @@ def enable_server_for_client(self, server_name: str, client_name: str) -> bool:
120127 logger .error (f"Unknown client: { client_name } " )
121128 return False
122129
123- enabled_servers = self ._config ["clients" ][client_name ].setdefault ("enabled_servers" , [])
130+ client_config = self ._config ["clients" ][client_name ]
131+ enabled_servers = client_config .setdefault ("enabled_servers" , [])
132+ disabled_servers = client_config .setdefault ("disabled_servers" , {})
133+
134+ # Check if we have the server in disabled servers and can restore its config
135+ if server_name in disabled_servers :
136+ # Find the appropriate client manager to update config
137+ if client_name == "claude-desktop" :
138+ from mcp .clients .claude_desktop import ClaudeDesktopManager
139+ client_manager = ClaudeDesktopManager ()
140+ elif client_name == "windsurf" :
141+ from mcp .clients .windsurf import WindsurfManager
142+ client_manager = WindsurfManager ()
143+ elif client_name == "cursor" :
144+ from mcp .clients .cursor import CursorManager
145+ client_manager = CursorManager ()
146+ else :
147+ # Unknown client type, but we'll still track in our config
148+ pass
149+
150+ # If we have a client manager, update its config
151+ if 'client_manager' in locals ():
152+ server_config = disabled_servers [server_name ]
153+ server_list = [server_config ]
154+ client_manager .sync_mcp_servers (server_list )
155+
156+ # Remove from disabled list
157+ del disabled_servers [server_name ]
158+
124159 if server_name not in enabled_servers :
125160 enabled_servers .append (server_name )
126161 self ._save_config ()
127162
128163 return True
129164
130165 def disable_server_for_client (self , server_name : str , client_name : str ) -> bool :
131- """Disable a server for a specific client"""
166+ """Disable a server for a specific client
167+
168+ This saves the server's configuration to the disabled_servers section
169+ so it can be restored later if re-enabled.
170+ """
132171 if client_name not in self ._config .get ("clients" , {}):
133172 logger .error (f"Unknown client: { client_name } " )
134173 return False
135174
136- enabled_servers = self ._config ["clients" ][client_name ].get ("enabled_servers" , [])
175+ client_config = self ._config ["clients" ][client_name ]
176+ enabled_servers = client_config .get ("enabled_servers" , [])
177+ disabled_servers = client_config .setdefault ("disabled_servers" , {})
178+
179+ # Only proceed if the server is currently enabled
137180 if server_name in enabled_servers :
181+ # Save the server configuration to disabled_servers
182+ server_info = self ._config .get ("servers" , {}).get (server_name , {})
183+ if server_info :
184+ disabled_servers [server_name ] = server_info .copy ()
185+
186+ # Remove from enabled list
138187 enabled_servers .remove (server_name )
188+
189+ # Find the appropriate client manager to update config
190+ if client_name == "claude-desktop" :
191+ from mcp .clients .claude_desktop import ClaudeDesktopManager
192+ client_manager = ClaudeDesktopManager ()
193+ elif client_name == "windsurf" :
194+ from mcp .clients .windsurf import WindsurfManager
195+ client_manager = WindsurfManager ()
196+ elif client_name == "cursor" :
197+ from mcp .clients .cursor import CursorManager
198+ client_manager = CursorManager ()
199+ else :
200+ # Unknown client type, but we'll still track in our config
201+ pass
202+
203+ # If we have a client manager, update its config to remove the server
204+ if 'client_manager' in locals ():
205+ # Get current client config
206+ client_config = client_manager .read_config () or {}
207+
208+ # For cursor, the structure is slightly different
209+ if client_name == "cursor" and "mcpServers" in client_config :
210+ if server_name in client_config ["mcpServers" ]:
211+ del client_config ["mcpServers" ][server_name ]
212+ client_manager .write_config (client_config )
213+
139214 self ._save_config ()
140215
141216 return True
0 commit comments