@@ -108,3 +108,122 @@ def get_supported_clients(self) -> List[str]:
108108 # We'll import here to avoid circular imports
109109 from mcpm .utils .client_registry import ClientRegistry
110110 return ClientRegistry .get_supported_clients ()
111+
112+ def stash_server (self , client_name : str , server_name : str , server_config : Any ) -> bool :
113+ """Store a disabled server configuration in the global config
114+
115+ Args:
116+ client_name: Name of the client the server belongs to
117+ server_name: Name of the server to stash
118+ server_config: Server configuration to stash (ServerConfig object or dict)
119+
120+ Returns:
121+ bool: Success or failure
122+ """
123+ # Ensure stashed_servers section exists
124+ if "stashed_servers" not in self ._config :
125+ self ._config ["stashed_servers" ] = {}
126+
127+ # Ensure client section exists
128+ if client_name not in self ._config ["stashed_servers" ]:
129+ self ._config ["stashed_servers" ][client_name ] = {}
130+
131+ # Convert ServerConfig to dict if needed
132+ try :
133+ # If it's a ServerConfig object with to_dict method
134+ if hasattr (server_config , 'to_dict' ) and callable (server_config .to_dict ):
135+ server_dict = server_config .to_dict ()
136+ else :
137+ # Assume it's already a dict or JSON serializable
138+ server_dict = server_config
139+
140+ # Add the server configuration
141+ self ._config ["stashed_servers" ][client_name ][server_name ] = server_dict
142+
143+ # Save the config
144+ self ._save_config ()
145+ return True
146+ except Exception as e :
147+ logger .error (f"Failed to save stashed server: { e } " )
148+ return False
149+
150+ def pop_server (self , client_name : str , server_name : str ) -> Optional [Dict [str , Any ]]:
151+ """Retrieve a stashed server configuration from the global config
152+
153+ Args:
154+ client_name: Name of the client the server belongs to
155+ server_name: Name of the server to retrieve
156+
157+ Returns:
158+ Dict: Server configuration or None if not found
159+ """
160+ # Check if stashed_servers section exists
161+ if "stashed_servers" not in self ._config :
162+ return None
163+
164+ # Check if client section exists
165+ if client_name not in self ._config ["stashed_servers" ]:
166+ return None
167+
168+ # Check if server exists
169+ if server_name not in self ._config ["stashed_servers" ][client_name ]:
170+ return None
171+
172+ # Get the server configuration
173+ server_config = self ._config ["stashed_servers" ][client_name ][server_name ]
174+
175+ # Remove the server from stashed servers
176+ del self ._config ["stashed_servers" ][client_name ][server_name ]
177+
178+ # Clean up empty client section if needed
179+ if not self ._config ["stashed_servers" ][client_name ]:
180+ del self ._config ["stashed_servers" ][client_name ]
181+
182+ # Clean up empty stashed_servers section if needed
183+ if not self ._config ["stashed_servers" ]:
184+ del self ._config ["stashed_servers" ]
185+
186+ # Save the config
187+ self ._save_config ()
188+
189+ return server_config
190+
191+ def is_server_stashed (self , client_name : str , server_name : str ) -> bool :
192+ """Check if a server is stashed in the global config
193+
194+ Args:
195+ client_name: Name of the client the server belongs to
196+ server_name: Name of the server to check
197+
198+ Returns:
199+ bool: True if server is stashed, False otherwise
200+ """
201+ # Check if stashed_servers section exists
202+ if "stashed_servers" not in self ._config :
203+ return False
204+
205+ # Check if client section exists
206+ if client_name not in self ._config ["stashed_servers" ]:
207+ return False
208+
209+ # Check if server exists
210+ return server_name in self ._config ["stashed_servers" ][client_name ]
211+
212+ def get_stashed_servers (self , client_name : str ) -> Dict [str , Dict [str , Any ]]:
213+ """Get all stashed servers for a client
214+
215+ Args:
216+ client_name: Name of the client to get stashed servers for
217+
218+ Returns:
219+ Dict: Dictionary of server configurations by name
220+ """
221+ # Check if stashed_servers section exists
222+ if "stashed_servers" not in self ._config :
223+ return {}
224+
225+ # Check if client section exists
226+ if client_name not in self ._config ["stashed_servers" ]:
227+ return {}
228+
229+ return self ._config ["stashed_servers" ][client_name ]
0 commit comments