diff --git a/src/config/mcp_factory.rs b/src/config/mcp_factory.rs index 3bc3508..8a05dc2 100644 --- a/src/config/mcp_factory.rs +++ b/src/config/mcp_factory.rs @@ -1,8 +1,9 @@ use crate::mcp::{ - ConnectedServer, JsonField, McpServer, McpTransportType, oauth, spawn_mcp_server, + ConnectedServer, JsonField, McpServer, McpTransportType, is_auth_required_error, oauth, + spawn_mcp_server, }; -use anyhow::Result; +use anyhow::{Result, anyhow}; use parking_lot::Mutex; use std::collections::HashMap; use std::path::Path; @@ -106,7 +107,18 @@ impl McpFactory { } else { None }; - let handle = spawn_mcp_server(spec, log_path, bearer_token).await?; + let handle = spawn_mcp_server(spec, log_path, bearer_token) + .await + .map_err(|e| { + if is_auth_required_error(&e) { + anyhow!( + "MCP server '{name}' requires OAuth authentication. \ + Run `coyote --auth-mcp {name}` or `.mcp auth {name}` in the REPL to authenticate." + ) + } else { + e + } + })?; self.insert_active(key, &handle); Ok(handle) } diff --git a/src/mcp/mod.rs b/src/mcp/mod.rs index f9aefca..710f641 100644 --- a/src/mcp/mod.rs +++ b/src/mcp/mod.rs @@ -287,8 +287,7 @@ impl McpRegistry { Err(e) if is_auth_required_error(&e) => { warn!( "MCP server '{id}' requires OAuth authentication. \ - Run `coyote --auth-mcp {id}` or `.mcp auth {id}` in the REPL to authenticate, \ - then restart Coyote." + Run `coyote --auth-mcp {id}` or `.mcp auth {id}` in the REPL to authenticate." ); return Ok(None); } @@ -409,7 +408,7 @@ fn merge_bearer_token( } } -fn is_auth_required_error(e: &Error) -> bool { +pub(crate) fn is_auth_required_error(e: &Error) -> bool { e.chain() .any(|cause| cause.to_string().contains("Auth required")) } diff --git a/src/repl/mod.rs b/src/repl/mod.rs index 28d762d..10ca56b 100644 --- a/src/repl/mod.rs +++ b/src/repl/mod.rs @@ -653,10 +653,7 @@ pub async fn run_repl_command( callback_port, ) .await?; - println!( - "Authentication saved. \ - Restart Coyote to connect to '{server_name}'." - ); + println!("Authentication saved."); } } }