@@ -146,7 +146,7 @@ impl AgentBuilder {
146146 LlmClient :: create_provider ( & config. llm_provider . provider , & config. llm_provider . env_vars )
147147 . map_err ( |e| AgentError :: LlmError ( e. to_string ( ) ) ) ?
148148 ) ;
149-
149+
150150 // Create brain with custom system prompt and temperature
151151 let brain = Box :: new ( CoderBrain :: with_custom_prompt (
152152 llm_client. clone ( ) ,
@@ -275,43 +275,57 @@ impl AgentBuilder {
275275 /// Handle OAuth flow for MCP connections if needed
276276 async fn mcp_check_oauth ( mcp_name : & str , mcp_config : & mut McpConfig ) -> Result < bool , AgentError > {
277277 use crate :: tools:: mcp:: McpConfig ;
278-
279278 let mut config_changed = false ;
280-
279+
281280 // Only handle HTTP configs that might need OAuth
282- if let McpConfig :: Http { url, bearer_token } = mcp_config {
283- // Test connection with current config
284- let test_config = McpConfig :: Http {
285- url : url. clone ( ) ,
286- bearer_token : bearer_token. clone ( )
287- } ;
288- let mut test_client = create_mcp_client ( test_config) ;
289- match test_client. connect ( ) . await {
290- Ok ( _) => {
291- if bearer_token. is_some ( ) {
281+ if let McpConfig :: Http { url, auth } = mcp_config {
282+ let needs_new_token = match auth {
283+ Some ( token) if token. is_expired ( ) => {
284+ eprintln ! ( "\x1b [2m░ MCP '{}' token expired, refreshing...\x1b [0m" , mcp_name) ;
285+ true
286+ }
287+ Some ( _) => {
288+ // Test connection with existing token
289+ let test_config = McpConfig :: Http { url : url. clone ( ) , auth : auth. clone ( ) } ;
290+ let mut test_client = create_mcp_client ( test_config) ;
291+ if test_client. connect ( ) . await . is_ok ( ) {
292292 eprintln ! ( "\x1b [2m░ MCP '{}' connected (authenticated)\x1b [0m" , mcp_name) ;
293+ false
293294 } else {
294- eprintln ! ( "\x1b [2m░ MCP '{}' connected (no auth)\x1b [0m" , mcp_name) ;
295+ eprintln ! ( "\x1b [2m░ MCP '{}' authentication failed, refreshing token...\x1b [0m" , mcp_name) ;
296+ true
295297 }
296298 }
297- Err ( _) => {
298- eprintln ! ( "\x1b [2m░ MCP '{}' connection failed, starting OAuth flow...\x1b [0m" , mcp_name) ;
299- let url_clone = url. clone ( ) ;
300- match signin_oauth ( & url_clone) . await {
301- Ok ( token) => {
302- eprintln ! ( "\x1b [2m░ MCP '{}' connected (OAuth successful)\x1b [0m" , mcp_name) ;
303- * bearer_token = Some ( token) ;
304- config_changed = true ;
305- }
306- Err ( e) => {
307- return Err ( AgentError :: ConfigurationError ( format ! ( "OAuth failed for MCP '{}': {}" , mcp_name, e) ) ) ;
308- }
299+ None => {
300+ // Test connection without auth
301+ let test_config = McpConfig :: Http { url : url. clone ( ) , auth : None } ;
302+ let mut test_client = create_mcp_client ( test_config) ;
303+ if test_client. connect ( ) . await . is_ok ( ) {
304+ eprintln ! ( "\x1b [2m░ MCP '{}' connected (no auth required)\x1b [0m" , mcp_name) ;
305+ false
306+ } else {
307+ eprintln ! ( "\x1b [2m░ MCP '{}' requires authentication, starting OAuth flow...\x1b [0m" , mcp_name) ;
308+ true
309+ }
310+ }
311+ } ;
312+
313+ if needs_new_token {
314+ let url_clone = url. clone ( ) ;
315+ match signin_oauth ( & url_clone) . await {
316+ Ok ( token) => {
317+ eprintln ! ( "\x1b [2m░ MCP '{}' OAuth successful\x1b [0m" , mcp_name) ;
318+ * auth = Some ( token) ;
319+ config_changed = true ;
320+ }
321+ Err ( e) => {
322+ return Err ( AgentError :: ConfigurationError ( format ! ( "OAuth failed for MCP '{}': {}" , mcp_name, e) ) ) ;
309323 }
310324 }
311325 }
312326 }
313327 // SSE and Stdio don't need OAuth handling for now
314-
328+
315329 Ok ( config_changed)
316330 }
317331}
0 commit comments