@@ -485,10 +485,6 @@ impl ExtensionManager {
485485 return Ok ( ( ) ) ;
486486 }
487487
488- // Resolve working_dir: explicit > current_dir
489- let effective_working_dir =
490- working_dir. unwrap_or_else ( || std:: env:: current_dir ( ) . unwrap_or_default ( ) ) ;
491-
492488 let mut temp_dir = None ;
493489
494490 let client: Box < dyn McpClientTrait > = match & config {
@@ -553,6 +549,9 @@ impl ExtensionManager {
553549 } )
554550 } ;
555551
552+ let effective_working_dir = working_dir
553+ . clone ( )
554+ . unwrap_or_else ( || std:: env:: current_dir ( ) . unwrap_or_default ( ) ) ;
556555 let client = child_process_client (
557556 command,
558557 timeout,
@@ -589,6 +588,9 @@ impl ExtensionManager {
589588 . arg ( & normalized_name) ;
590589 } ) ;
591590
591+ let effective_working_dir = working_dir
592+ . clone ( )
593+ . unwrap_or_else ( || std:: env:: current_dir ( ) . unwrap_or_default ( ) ) ;
592594 let client = child_process_client (
593595 command,
594596 timeout,
@@ -599,6 +601,8 @@ impl ExtensionManager {
599601 . await ?;
600602 Box :: new ( client)
601603 } else {
604+ // Non-containerized builtin runs in-process via duplex channels.
605+ // Working directory is passed per-request via call_tool metadata, not here.
602606 let ( server_read, client_write) = tokio:: io:: duplex ( 65536 ) ;
603607 let ( client_read, server_write) = tokio:: io:: duplex ( 65536 ) ;
604608 extension_fn ( server_read, server_write) ;
@@ -643,6 +647,10 @@ impl ExtensionManager {
643647 command. arg ( "python" ) . arg ( file_path. to_str ( ) . unwrap ( ) ) ;
644648 } ) ;
645649
650+ // Compute working_dir for InlinePython (runs as child process via uvx)
651+ let effective_working_dir = working_dir
652+ . clone ( )
653+ . unwrap_or_else ( || std:: env:: current_dir ( ) . unwrap_or_default ( ) ) ;
646654 let client = child_process_client (
647655 command,
648656 timeout,
0 commit comments