From e488b6cd0b405b0c796ee3a26910f2bd9aaa8abb Mon Sep 17 00:00:00 2001 From: Finn Evers Date: Tue, 11 Nov 2025 00:25:27 +0100 Subject: [PATCH] agent_ui: Fix issue where MCP extension could not be uninstalled (#42384) Closes https://github.com/zed-industries/zed/issues/42312 The issue here was that we assumed that context servers provided by extensions would always need a config in the settings to be present when actually the opposite was the case - context servers provided by extensions are the only context servers that do not need a config to be in place in order to be available in the UI. Release Notes: - Fixed an issue where context servers provided by extensions could not be uninstalled if they were previously unconfigured. --- crates/agent_ui/src/agent_configuration.rs | 34 ++++++---------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/crates/agent_ui/src/agent_configuration.rs b/crates/agent_ui/src/agent_configuration.rs index 3cbc6e7145d2e3611cdb229447a8795ffb0301ca..8ace684234e90c5203528cae360a28b30798bea3 100644 --- a/crates/agent_ui/src/agent_configuration.rs +++ b/crates/agent_ui/src/agent_configuration.rs @@ -638,15 +638,13 @@ impl AgentConfiguration { let is_running = matches!(server_status, ContextServerStatus::Running); let item_id = SharedString::from(context_server_id.0.clone()); - let is_from_extension = server_configuration - .as_ref() - .map(|config| { - matches!( - config.as_ref(), - ContextServerConfiguration::Extension { .. } - ) - }) - .unwrap_or(false); + // Servers without a configuration can only be provided by extensions. + let provided_by_extension = server_configuration.is_none_or(|config| { + matches!( + config.as_ref(), + ContextServerConfiguration::Extension { .. } + ) + }); let error = if let ContextServerStatus::Error(error) = server_status.clone() { Some(error) @@ -660,7 +658,7 @@ impl AgentConfiguration { .tools_for_server(&context_server_id) .count(); - let (source_icon, source_tooltip) = if is_from_extension { + let (source_icon, source_tooltip) = if provided_by_extension { ( IconName::ZedSrcExtension, "This MCP server was installed from an extension.", @@ -710,7 +708,6 @@ impl AgentConfiguration { let fs = self.fs.clone(); let context_server_id = context_server_id.clone(); let language_registry = self.language_registry.clone(); - let context_server_store = self.context_server_store.clone(); let workspace = self.workspace.clone(); let context_server_registry = self.context_server_registry.clone(); @@ -752,23 +749,10 @@ impl AgentConfiguration { .entry("Uninstall", None, { let fs = fs.clone(); let context_server_id = context_server_id.clone(); - let context_server_store = context_server_store.clone(); let workspace = workspace.clone(); move |_, cx| { - let is_provided_by_extension = context_server_store - .read(cx) - .configuration_for_server(&context_server_id) - .as_ref() - .map(|config| { - matches!( - config.as_ref(), - ContextServerConfiguration::Extension { .. } - ) - }) - .unwrap_or(false); - let uninstall_extension_task = match ( - is_provided_by_extension, + provided_by_extension, resolve_extension_for_context_server(&context_server_id, cx), ) { (true, Some((id, manifest))) => {