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; } }