@@ -287,7 +287,22 @@ impl ToolManagerBuilder {
287
287
let regex = regex:: Regex :: new ( VALID_TOOL_NAME ) ?;
288
288
let mut hasher = DefaultHasher :: new ( ) ;
289
289
let is_interactive = self . is_interactive ;
290
- let pre_initialized = mcp_servers
290
+
291
+ // Separate enabled and disabled servers
292
+ let ( enabled_servers, disabled_servers) : ( Vec < _ > , Vec < _ > ) = mcp_servers
293
+ . into_iter ( )
294
+ . partition ( |( _, server_config) | !server_config. disabled ) ;
295
+
296
+ // Prepare disabled servers for display
297
+ let disabled_servers_display: Vec < String > = disabled_servers
298
+ . iter ( )
299
+ . map ( |( server_name, _) | {
300
+ let snaked_cased_name = server_name. to_case ( convert_case:: Case :: Snake ) ;
301
+ sanitize_name ( snaked_cased_name, & regex, & mut hasher)
302
+ } )
303
+ . collect ( ) ;
304
+
305
+ let pre_initialized = enabled_servers
291
306
. into_iter ( )
292
307
. map ( |( server_name, server_config) | {
293
308
let snaked_cased_name = server_name. to_case ( convert_case:: Case :: Snake ) ;
@@ -296,6 +311,7 @@ impl ToolManagerBuilder {
296
311
( sanitized_server_name, custom_tool_client)
297
312
} )
298
313
. collect :: < Vec < ( String , _ ) > > ( ) ;
314
+
299
315
let mut loading_servers = HashMap :: < String , Instant > :: new ( ) ;
300
316
for ( server_name, _) in & pre_initialized {
301
317
let init_time = std:: time:: Instant :: now ( ) ;
@@ -306,14 +322,26 @@ impl ToolManagerBuilder {
306
322
// Spawn a task for displaying the mcp loading statuses.
307
323
// This is only necessary when we are in interactive mode AND there are servers to load.
308
324
// Otherwise we do not need to be spawning this.
309
- let ( _loading_display_task, loading_status_sender) = if is_interactive && total > 0 {
325
+ let ( _loading_display_task, loading_status_sender) = if is_interactive
326
+ && ( total > 0 || !disabled_servers_display. is_empty ( ) )
327
+ {
310
328
let ( tx, mut rx) = tokio:: sync:: mpsc:: channel :: < LoadingMsg > ( 50 ) ;
329
+ let disabled_servers_display_clone = disabled_servers_display. clone ( ) ;
311
330
(
312
331
Some ( tokio:: task:: spawn ( async move {
313
332
let mut spinner_logo_idx: usize = 0 ;
314
333
let mut complete: usize = 0 ;
315
334
let mut failed: usize = 0 ;
316
- queue_init_message ( spinner_logo_idx, complete, failed, total, & mut output) ?;
335
+
336
+ // Show disabled servers immediately
337
+ for server_name in & disabled_servers_display_clone {
338
+ queue_disabled_message ( server_name, & mut output) ?;
339
+ }
340
+
341
+ if total > 0 {
342
+ queue_init_message ( spinner_logo_idx, complete, failed, total, & mut output) ?;
343
+ }
344
+
317
345
loop {
318
346
match tokio:: time:: timeout ( Duration :: from_millis ( 50 ) , rx. recv ( ) ) . await {
319
347
Ok ( Some ( recv_result) ) => match recv_result {
@@ -352,7 +380,7 @@ impl ToolManagerBuilder {
352
380
queue_init_message ( spinner_logo_idx, complete, failed, total, & mut output) ?;
353
381
} ,
354
382
LoadingMsg :: Terminate { still_loading } => {
355
- if !still_loading. is_empty ( ) {
383
+ if !still_loading. is_empty ( ) && total > 0 {
356
384
execute ! (
357
385
output,
358
386
cursor:: MoveToColumn ( 0 ) ,
@@ -365,6 +393,14 @@ impl ToolManagerBuilder {
365
393
} ) ;
366
394
let msg = eyre:: eyre!( msg) ;
367
395
queue_incomplete_load_message ( complete, total, & msg, & mut output) ?;
396
+ } else if total > 0 {
397
+ // Clear the loading line if we have enabled servers
398
+ execute ! (
399
+ output,
400
+ cursor:: MoveToColumn ( 0 ) ,
401
+ cursor:: MoveUp ( 1 ) ,
402
+ terminal:: Clear ( terminal:: ClearType :: CurrentLine ) ,
403
+ ) ?;
368
404
}
369
405
execute ! ( output, style:: Print ( "\n " ) , ) ?;
370
406
break ;
@@ -687,6 +723,7 @@ impl ToolManagerBuilder {
687
723
has_new_stuff,
688
724
is_interactive,
689
725
mcp_load_record : load_record,
726
+ disabled_servers : disabled_servers_display,
690
727
..Default :: default ( )
691
728
} )
692
729
}
@@ -776,6 +813,9 @@ pub struct ToolManager {
776
813
/// invalid characters).
777
814
/// The value is the load message (i.e. load time, warnings, and errors)
778
815
pub mcp_load_record : Arc < Mutex < HashMap < String , Vec < LoadingRecord > > > > ,
816
+
817
+ /// List of disabled MCP server names for display purposes
818
+ disabled_servers : Vec < String > ,
779
819
}
780
820
781
821
impl Clone for ToolManager {
@@ -790,6 +830,7 @@ impl Clone for ToolManager {
790
830
schema : self . schema . clone ( ) ,
791
831
is_interactive : self . is_interactive ,
792
832
mcp_load_record : self . mcp_load_record . clone ( ) ,
833
+ disabled_servers : self . disabled_servers . clone ( ) ,
793
834
..Default :: default ( )
794
835
}
795
836
}
@@ -1473,6 +1514,19 @@ fn queue_warn_message(name: &str, msg: &eyre::Report, time: &str, output: &mut i
1473
1514
) ?)
1474
1515
}
1475
1516
1517
+ fn queue_disabled_message ( name : & str , output : & mut impl Write ) -> eyre:: Result < ( ) > {
1518
+ Ok ( queue ! (
1519
+ output,
1520
+ style:: SetForegroundColor ( style:: Color :: DarkGrey ) ,
1521
+ style:: Print ( "○ " ) ,
1522
+ style:: SetForegroundColor ( style:: Color :: Blue ) ,
1523
+ style:: Print ( name) ,
1524
+ style:: ResetColor ,
1525
+ style:: Print ( " is disabled\n " ) ,
1526
+ style:: ResetColor ,
1527
+ ) ?)
1528
+ }
1529
+
1476
1530
fn queue_incomplete_load_message (
1477
1531
complete : usize ,
1478
1532
total : usize ,
0 commit comments