From 15f3be27ce826f52e7c12a6017eaaa2a795b60a5 Mon Sep 17 00:00:00 2001 From: ProofOfConcept Date: Thu, 9 Apr 2026 22:45:11 -0400 Subject: [PATCH] Show MCP server failures in the UI instead of debug log MCP server spawn failures were going to dbglog where the user wouldn't see them. Route through the agent's notify so they appear on the status bar. Co-Authored-By: Proof of Concept --- src/agent/tools/mcp_client.rs | 20 +++++++++++++++----- src/agent/tools/mod.rs | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/agent/tools/mcp_client.rs b/src/agent/tools/mcp_client.rs index e245a91..acdb095 100644 --- a/src/agent/tools/mcp_client.rs +++ b/src/agent/tools/mcp_client.rs @@ -140,7 +140,7 @@ fn registry() -> &'static TokioMutex { }) } -async fn ensure_init() -> Result<()> { +async fn ensure_init(agent: Option<&std::sync::Arc>) -> Result<()> { let mut reg = registry().lock().await; if !reg.servers.is_empty() { return Ok(()); } let configs = crate::config::get().mcp_servers.clone(); @@ -148,14 +148,24 @@ async fn ensure_init() -> Result<()> { let args: Vec<&str> = cfg.args.iter().map(|s| s.as_str()).collect(); match McpServer::spawn(&cfg.name, &cfg.command, &args).await { Ok(server) => reg.servers.push(server), - Err(e) => dbglog!("warning: MCP server {} failed: {:#}", cfg.name, e), + Err(e) => { + let msg = format!("MCP server {} failed: {:#}", cfg.name, e); + dbglog!("{}", msg); + if let Some(a) = agent { + if let Ok(mut st) = a.state.try_lock() { + st.notify(msg); + } + } + } } } Ok(()) } -pub(super) async fn call_tool(name: &str, args: &serde_json::Value) -> Result { - ensure_init().await?; +pub(super) async fn call_tool(name: &str, args: &serde_json::Value, + agent: Option<&std::sync::Arc>, +) -> Result { + ensure_init(agent).await?; let mut reg = registry().lock().await; let server = reg.servers.iter_mut() .find(|s| s.tools.iter().any(|t| t.name == name)) @@ -178,7 +188,7 @@ pub(super) async fn call_tool(name: &str, args: &serde_json::Value) -> Result Vec { - let _ = ensure_init().await; + let _ = ensure_init(None).await; let reg = registry().lock().await; reg.servers.iter() .flat_map(|s| s.tools.iter()) diff --git a/src/agent/tools/mod.rs b/src/agent/tools/mod.rs index 55fe311..ce42c9e 100644 --- a/src/agent/tools/mod.rs +++ b/src/agent/tools/mod.rs @@ -164,7 +164,7 @@ pub async fn dispatch_with_agent( None => true, }; if allowed { - if let Ok(result) = mcp_client::call_tool(name, args).await { + if let Ok(result) = mcp_client::call_tool(name, args, agent.as_ref()).await { return result; } }