11from typing import List
22
3+ from cecli .commands .utils .helpers import (
4+ is_server_globally_excluded ,
5+ update_server_registration ,
6+ )
37from cecli .tools .utils .base_tool import BaseTool
48
59
@@ -39,13 +43,13 @@ async def execute(cls, coder, servers: List[str]):
3943
4044 # Determine which servers to act on
4145 if servers == ["*" ]:
42- servers_to_action .extend (coder .mcp_manager .connected_servers . keys () )
46+ servers_to_action .extend (s . name for s in coder .mcp_manager .connected_servers )
4347 else :
4448 for server_name in servers :
4549 server = coder .mcp_manager .get_server (server_name )
4650 if not server :
4751 results .append (f"MCP server { server_name } does not exist." )
48- elif server .name not in coder .mcp_manager .connected_servers :
52+ elif server .name not in { s . name for s in coder .mcp_manager .connected_servers } :
4953 results .append (f"Server { server_name } is not currently connected." )
5054 else :
5155 servers_to_action .append (server .name )
@@ -58,20 +62,34 @@ async def execute(cls, coder, servers: List[str]):
5862 if not servers_to_action :
5963 return "No servers to remove."
6064
61- # Process the removal
65+ # Process the removal with server registration awareness
6266 for server_name in servers_to_action :
63- coder .interrupt_event .clear ()
64- did_disconnect , interrupted = await coder .coroutines .interruptible (
65- coder .mcp_manager .disconnect_server (server_name ),
66- coder .interrupt_event ,
67- )
68-
69- if interrupted :
70- results .append (f"Interrupted: { server_name } " )
67+ # Never remove the "local" server
68+ if server_name == "Local" :
69+ results .append ("Cannot remove 'Local' server" )
7170 continue
72- if did_disconnect :
73- results .append (f"Removed server: { server_name } " )
71+
72+ # Force-exclude on the primary (active) coder
73+ update_server_registration (coder , server_name , "exclude" , force = True )
74+
75+ # Check if all coders in the hierarchy have this server excluded
76+ all_excluded = is_server_globally_excluded (coder , server_name )
77+
78+ if all_excluded :
79+ coder .interrupt_event .clear ()
80+ did_disconnect , interrupted = await coder .coroutines .interruptible (
81+ coder .mcp_manager .disconnect_server (server_name ),
82+ coder .interrupt_event ,
83+ )
84+
85+ if interrupted :
86+ results .append (f"Interrupted: { server_name } " )
87+ continue
88+ if did_disconnect :
89+ results .append (f"Removed server: { server_name } " )
90+ else :
91+ results .append (f"Unable to remove server: { server_name } " )
7492 else :
75- results .append (f"Unable to remove server : { server_name } " )
93+ results .append (f"Removed from active coder, still active for others : { server_name } " )
7694
7795 return "\n " .join (results )
0 commit comments