@@ -544,7 +544,7 @@ fn mcp_server_config_roundtrips_through_tagged_enum() {
544544 args : vec ! [ "server.js" . to_string( ) ] ,
545545 env : HashMap :: new ( ) ,
546546 cwd : None ,
547- tools : vec ! [ "*" . to_string( ) ] ,
547+ tools : Some ( vec ! [ "*" . to_string( ) ] ) ,
548548 timeout : None ,
549549 } ) ;
550550 let json = serde_json:: to_value ( & stdio) . unwrap ( ) ;
@@ -566,6 +566,109 @@ fn mcp_server_config_roundtrips_through_tagged_enum() {
566566 assert_eq ! ( cfg_json[ "github" ] [ "type" ] , "stdio" ) ;
567567}
568568
569+ #[ test]
570+ fn mcp_stdio_tools_tri_state_serializes_correctly ( ) {
571+ use github_copilot_sdk:: McpStdioServerConfig ;
572+
573+ // None → field omitted (= "expose all tools")
574+ let cfg = McpStdioServerConfig {
575+ command : "echo" . into ( ) ,
576+ tools : None ,
577+ ..Default :: default ( )
578+ } ;
579+ let json = serde_json:: to_value ( & cfg) . unwrap ( ) ;
580+ assert ! (
581+ json. get( "tools" ) . is_none( ) ,
582+ "tools=None must be omitted on the wire; got {json}"
583+ ) ;
584+
585+ // Some(empty) → field present as []
586+ let cfg = McpStdioServerConfig {
587+ command : "echo" . into ( ) ,
588+ tools : Some ( vec ! [ ] ) ,
589+ ..Default :: default ( )
590+ } ;
591+ let json = serde_json:: to_value ( & cfg) . unwrap ( ) ;
592+ assert_eq ! ( json[ "tools" ] , serde_json:: json!( [ ] ) ) ;
593+
594+ // Some(non-empty) → field present as the explicit list
595+ let cfg = McpStdioServerConfig {
596+ command : "echo" . into ( ) ,
597+ tools : Some ( vec ! [ "a" . into( ) , "b" . into( ) ] ) ,
598+ ..Default :: default ( )
599+ } ;
600+ let json = serde_json:: to_value ( & cfg) . unwrap ( ) ;
601+ assert_eq ! ( json[ "tools" ] , serde_json:: json!( [ "a" , "b" ] ) ) ;
602+ }
603+
604+ #[ test]
605+ fn mcp_stdio_tools_tri_state_deserializes_correctly ( ) {
606+ use github_copilot_sdk:: McpStdioServerConfig ;
607+
608+ // Missing field → None
609+ let cfg: McpStdioServerConfig =
610+ serde_json:: from_value ( serde_json:: json!( { "command" : "echo" } ) ) . unwrap ( ) ;
611+ assert_eq ! ( cfg. tools, None ) ;
612+
613+ // Empty list → Some(empty)
614+ let cfg: McpStdioServerConfig =
615+ serde_json:: from_value ( serde_json:: json!( { "command" : "echo" , "tools" : [ ] } ) ) . unwrap ( ) ;
616+ assert_eq ! ( cfg. tools, Some ( vec![ ] ) ) ;
617+
618+ // Non-empty list → Some(list)
619+ let cfg: McpStdioServerConfig =
620+ serde_json:: from_value ( serde_json:: json!( { "command" : "echo" , "tools" : [ "x" ] } ) ) . unwrap ( ) ;
621+ assert_eq ! ( cfg. tools, Some ( vec![ "x" . to_string( ) ] ) ) ;
622+ }
623+
624+ #[ test]
625+ fn mcp_http_tools_tri_state_serializes_correctly ( ) {
626+ use github_copilot_sdk:: McpHttpServerConfig ;
627+
628+ let cfg = McpHttpServerConfig {
629+ url : "https://example.com" . into ( ) ,
630+ tools : None ,
631+ ..Default :: default ( )
632+ } ;
633+ assert ! (
634+ serde_json:: to_value( & cfg) . unwrap( ) . get( "tools" ) . is_none( ) ,
635+ "tools=None must be omitted on the wire"
636+ ) ;
637+
638+ let cfg = McpHttpServerConfig {
639+ url : "https://example.com" . into ( ) ,
640+ tools : Some ( vec ! [ ] ) ,
641+ ..Default :: default ( )
642+ } ;
643+ assert_eq ! (
644+ serde_json:: to_value( & cfg) . unwrap( ) [ "tools" ] ,
645+ serde_json:: json!( [ ] )
646+ ) ;
647+
648+ let cfg = McpHttpServerConfig {
649+ url : "https://example.com" . into ( ) ,
650+ tools : Some ( vec ! [ "a" . into( ) ] ) ,
651+ ..Default :: default ( )
652+ } ;
653+ assert_eq ! (
654+ serde_json:: to_value( & cfg) . unwrap( ) [ "tools" ] ,
655+ serde_json:: json!( [ "a" ] )
656+ ) ;
657+ }
658+
659+ #[ test]
660+ fn mcp_http_tools_tri_state_deserializes_correctly ( ) {
661+ use github_copilot_sdk:: McpHttpServerConfig ;
662+
663+ let cfg: McpHttpServerConfig =
664+ serde_json:: from_value ( serde_json:: json!( { "url" : "https://e.com" } ) ) . unwrap ( ) ;
665+ assert_eq ! ( cfg. tools, None ) ;
666+
667+ let cfg: McpHttpServerConfig =
668+ serde_json:: from_value ( serde_json:: json!( { "url" : "https://e.com" , "tools" : [ ] } ) ) . unwrap ( ) ;
669+ assert_eq ! ( cfg. tools, Some ( vec![ ] ) ) ;
670+ }
671+
569672#[ test]
570673fn permission_request_data_extracts_typed_kind ( ) {
571674 use github_copilot_sdk:: { PermissionRequestData , PermissionRequestKind } ;
0 commit comments