@@ -283,7 +283,7 @@ await Can_Handle_Requests(
283283 {
284284 var result = JsonSerializer . Deserialize < InitializeResult > ( response , McpJsonUtilities . DefaultOptions ) ;
285285 Assert . NotNull ( result ) ;
286- Assert . Equal ( "complete" , result . ResultType ) ;
286+ Assert . Null ( result . ResultType ) ;
287287 Assert . Equal ( expectedAssemblyName . Name , result . ServerInfo . Name ) ;
288288 Assert . Equal ( expectedAssemblyName . Version ? . ToString ( ) ?? "1.0.0" , result . ServerInfo . Version ) ;
289289 Assert . Equal ( "2024-11-05" , result . ProtocolVersion ) ;
@@ -386,7 +386,7 @@ await Can_Handle_Requests(
386386 {
387387 var result = JsonSerializer . Deserialize < InitializeResult > ( response , McpJsonUtilities . DefaultOptions ) ;
388388 Assert . NotNull ( result ) ;
389- Assert . Equal ( "complete" , result . ResultType ) ;
389+ Assert . Null ( result . ResultType ) ;
390390 Assert . NotNull ( result . Capabilities . Extensions ) ;
391391 Assert . True ( result . Capabilities . Extensions . ContainsKey ( "io.myext" ) ) ;
392392 } ) ;
@@ -406,7 +406,7 @@ await Can_Handle_Requests(
406406 {
407407 var result = JsonSerializer . Deserialize < InitializeResult > ( response , McpJsonUtilities . DefaultOptions ) ;
408408 Assert . NotNull ( result ) ;
409- Assert . Equal ( "complete" , result . ResultType ) ;
409+ Assert . Null ( result . ResultType ) ;
410410 Assert . NotNull ( result . Capabilities . Experimental ) ;
411411 Assert . True ( result . Capabilities . Experimental . ContainsKey ( "customFeature" ) ) ;
412412 } ) ;
@@ -438,7 +438,7 @@ await Can_Handle_Requests(
438438 {
439439 var result = JsonSerializer . Deserialize < InitializeResult > ( response , McpJsonUtilities . DefaultOptions ) ;
440440 Assert . NotNull ( result ) ;
441- Assert . Equal ( "complete" , result . ResultType ) ;
441+ Assert . Null ( result . ResultType ) ;
442442
443443 // Use reflection to verify every public property on ServerCapabilities is non-null.
444444 // This catches cases where new capability properties are added but not copied
@@ -485,7 +485,7 @@ await Can_Handle_Requests(
485485 {
486486 var result = JsonSerializer . Deserialize < CompleteResult > ( response , McpJsonUtilities . DefaultOptions ) ;
487487 Assert . NotNull ( result ? . Completion ) ;
488- Assert . Equal ( "complete" , result . ResultType ) ;
488+ Assert . Null ( result . ResultType ) ;
489489 Assert . Equal ( [ "test" ] , result . Completion . Values ) ;
490490 Assert . Equal ( 2 , result . Completion . Total ) ;
491491 Assert . True ( result . Completion . HasMore ) ;
@@ -529,7 +529,7 @@ await transport.SendMessageAsync(new JsonRpcRequest
529529 Assert . NotNull ( response ) ;
530530 var result = JsonSerializer . Deserialize < CompleteResult > ( response . Result , McpJsonUtilities . DefaultOptions ) ;
531531 Assert . NotNull ( result ? . Completion ) ;
532- Assert . Equal ( "complete" , result . ResultType ) ;
532+ Assert . Null ( result . ResultType ) ;
533533 Assert . Equal ( [ "cat" ] , result . Completion . Values ) ;
534534 Assert . Equal ( 1 , result . Completion . Total ) ;
535535
@@ -573,7 +573,7 @@ await transport.SendMessageAsync(new JsonRpcRequest
573573 Assert . NotNull ( response ) ;
574574 var result = JsonSerializer . Deserialize < CompleteResult > ( response . Result , McpJsonUtilities . DefaultOptions ) ;
575575 Assert . NotNull ( result ? . Completion ) ;
576- Assert . Equal ( "complete" , result . ResultType ) ;
576+ Assert . Null ( result . ResultType ) ;
577577 Assert . Empty ( result . Completion . Values ) ;
578578
579579 await transport . DisposeAsync ( ) ;
@@ -623,7 +623,7 @@ await transport.SendMessageAsync(new JsonRpcRequest
623623 Assert . NotNull ( response ) ;
624624 var result = JsonSerializer . Deserialize < CompleteResult > ( response . Result , McpJsonUtilities . DefaultOptions ) ;
625625 Assert . NotNull ( result ? . Completion ) ;
626- Assert . Equal ( "complete" , result . ResultType ) ;
626+ Assert . Null ( result . ResultType ) ;
627627 Assert . Equal ( [ "us-east-1" , "us-west-2" ] , result . Completion . Values ) ;
628628 Assert . Equal ( 2 , result . Completion . Total ) ;
629629
@@ -679,7 +679,7 @@ await transport.SendMessageAsync(new JsonRpcRequest
679679 Assert . NotNull ( response ) ;
680680 var result = JsonSerializer . Deserialize < CompleteResult > ( response . Result , McpJsonUtilities . DefaultOptions ) ;
681681 Assert . NotNull ( result ? . Completion ) ;
682- Assert . Equal ( "complete" , result . ResultType ) ;
682+ Assert . Null ( result . ResultType ) ;
683683 // Custom handler values + auto-populated values should be combined
684684 Assert . Equal ( [ "custom-value" , "dog" , "cat" ] , result . Completion . Values ) ;
685685 Assert . Equal ( 3 , result . Completion . Total ) ;
@@ -727,7 +727,7 @@ await transport.SendMessageAsync(new JsonRpcRequest
727727 Assert . NotNull ( response ) ;
728728 var result = JsonSerializer . Deserialize < CompleteResult > ( response . Result , McpJsonUtilities . DefaultOptions ) ;
729729 Assert . NotNull ( result ? . Completion ) ;
730- Assert . Equal ( "complete" , result . ResultType ) ;
730+ Assert . Null ( result . ResultType ) ;
731731 Assert . Equal ( [ "a" , "b" ] , result . Completion . Values ) ;
732732
733733 await transport . DisposeAsync ( ) ;
@@ -766,7 +766,7 @@ await Can_Handle_Requests(
766766 {
767767 var result = JsonSerializer . Deserialize < ListResourceTemplatesResult > ( response , McpJsonUtilities . DefaultOptions ) ;
768768 Assert . NotNull ( result ? . ResourceTemplates ) ;
769- Assert . Equal ( "complete" , result . ResultType ) ;
769+ Assert . Null ( result . ResultType ) ;
770770 Assert . NotEmpty ( result . ResourceTemplates ) ;
771771 Assert . Equal ( "test" , result . ResourceTemplates [ 0 ] . UriTemplate ) ;
772772 } ) ;
@@ -796,7 +796,7 @@ await Can_Handle_Requests(
796796 {
797797 var result = JsonSerializer . Deserialize < ListResourcesResult > ( response , McpJsonUtilities . DefaultOptions ) ;
798798 Assert . NotNull ( result ? . Resources ) ;
799- Assert . Equal ( "complete" , result . ResultType ) ;
799+ Assert . Null ( result . ResultType ) ;
800800 Assert . NotEmpty ( result . Resources ) ;
801801 Assert . Equal ( "test" , result . Resources [ 0 ] . Uri ) ;
802802 } ) ;
@@ -832,7 +832,7 @@ await Can_Handle_Requests(
832832 {
833833 var result = JsonSerializer . Deserialize < ReadResourceResult > ( response , McpJsonUtilities . DefaultOptions ) ;
834834 Assert . NotNull ( result ? . Contents ) ;
835- Assert . Equal ( "complete" , result . ResultType ) ;
835+ Assert . Null ( result . ResultType ) ;
836836 Assert . NotEmpty ( result . Contents ) ;
837837
838838 TextResourceContents textResource = Assert . IsType < TextResourceContents > ( result . Contents [ 0 ] ) ;
@@ -870,7 +870,7 @@ await Can_Handle_Requests(
870870 {
871871 var result = JsonSerializer . Deserialize < ListPromptsResult > ( response , McpJsonUtilities . DefaultOptions ) ;
872872 Assert . NotNull ( result ? . Prompts ) ;
873- Assert . Equal ( "complete" , result . ResultType ) ;
873+ Assert . Null ( result . ResultType ) ;
874874 Assert . NotEmpty ( result . Prompts ) ;
875875 Assert . Equal ( "test" , result . Prompts [ 0 ] . Name ) ;
876876 } ) ;
@@ -900,7 +900,7 @@ await Can_Handle_Requests(
900900 {
901901 var result = JsonSerializer . Deserialize < GetPromptResult > ( response , McpJsonUtilities . DefaultOptions ) ;
902902 Assert . NotNull ( result ) ;
903- Assert . Equal ( "complete" , result . ResultType ) ;
903+ Assert . Null ( result . ResultType ) ;
904904 Assert . Equal ( "test" , result . Description ) ;
905905 } ) ;
906906 }
@@ -935,7 +935,7 @@ await Can_Handle_Requests(
935935 {
936936 var result = JsonSerializer . Deserialize < ListToolsResult > ( response , McpJsonUtilities . DefaultOptions ) ;
937937 Assert . NotNull ( result ) ;
938- Assert . Equal ( "complete" , result . ResultType ) ;
938+ Assert . Null ( result . ResultType ) ;
939939 Assert . NotEmpty ( result . Tools ) ;
940940 Assert . Equal ( "test" , result . Tools [ 0 ] . Name ) ;
941941 } ) ;
@@ -971,7 +971,7 @@ await Can_Handle_Requests(
971971 {
972972 var result = JsonSerializer . Deserialize < CallToolResult > ( response , McpJsonUtilities . DefaultOptions ) ;
973973 Assert . NotNull ( result ) ;
974- Assert . Equal ( "complete" , result . ResultType ) ;
974+ Assert . Null ( result . ResultType ) ;
975975 Assert . NotEmpty ( result . Content ) ;
976976 Assert . Equal ( "test" , Assert . IsType < TextContentBlock > ( result . Content [ 0 ] ) . Text ) ;
977977 } ) ;
@@ -1011,6 +1011,31 @@ await Can_Handle_Requests(
10111011 } ) ;
10121012 }
10131013
1014+ [ Fact ]
1015+ public async Task Can_Handle_SetLoggingLevel_Requests_WithoutHandler_OmitsResultType ( )
1016+ {
1017+ // With no custom SetLoggingLevelHandler configured, the server uses its default logging/setLevel
1018+ // handler. logging/setLevel is a legacy (<= 2025-11-25) method, so the default handler must also
1019+ // serialize its result as an empty object {} without the 2026-07-28 resultType field (issue #1721).
1020+ await Can_Handle_Requests (
1021+ new ServerCapabilities
1022+ {
1023+ Logging = new ( )
1024+ } ,
1025+ method : RequestMethods . LoggingSetLevel ,
1026+ configureOptions : null ,
1027+ assertResult : ( _ , response ) =>
1028+ {
1029+ var result = JsonSerializer . Deserialize < EmptyResult > ( response , McpJsonUtilities . DefaultOptions ) ;
1030+ Assert . NotNull ( result ) ;
1031+ Assert . Null ( result . ResultType ) ;
1032+
1033+ // The wire response must be exactly {} with no additional properties.
1034+ var obj = Assert . IsType < JsonObject > ( response ) ;
1035+ Assert . Empty ( obj ) ;
1036+ } ) ;
1037+ }
1038+
10141039 [ Fact ]
10151040 public async Task Can_Handle_Call_Tool_Requests_With_McpException ( )
10161041 {
@@ -1033,7 +1058,7 @@ await Can_Handle_Requests(
10331058 {
10341059 var result = JsonSerializer . Deserialize < CallToolResult > ( response , McpJsonUtilities . DefaultOptions ) ;
10351060 Assert . NotNull ( result ) ;
1036- Assert . Equal ( "complete" , result . ResultType ) ;
1061+ Assert . Null ( result . ResultType ) ;
10371062 Assert . True ( result . IsError ) ;
10381063 Assert . NotEmpty ( result . Content ) ;
10391064 var textContent = Assert . IsType < TextContentBlock > ( result . Content [ 0 ] ) ;
@@ -1062,7 +1087,7 @@ await Can_Handle_Requests(
10621087 {
10631088 var result = JsonSerializer . Deserialize < CallToolResult > ( response , McpJsonUtilities . DefaultOptions ) ;
10641089 Assert . NotNull ( result ) ;
1065- Assert . Equal ( "complete" , result . ResultType ) ;
1090+ Assert . Null ( result . ResultType ) ;
10661091 Assert . True ( result . IsError ) ;
10671092 Assert . NotEmpty ( result . Content ) ;
10681093 var textContent = Assert . IsType < TextContentBlock > ( result . Content [ 0 ] ) ;
@@ -1098,7 +1123,7 @@ await Can_Handle_Requests(
10981123 {
10991124 var result = JsonSerializer . Deserialize < CallToolResult > ( response , McpJsonUtilities . DefaultOptions ) ;
11001125 Assert . NotNull ( result ) ;
1101- Assert . Equal ( "complete" , result . ResultType ) ;
1126+ Assert . Null ( result . ResultType ) ;
11021127 Assert . True ( result . IsError , "Input validation errors should be returned as tool execution errors (IsError=true), not protocol errors" ) ;
11031128 Assert . NotEmpty ( result . Content ) ;
11041129 var textContent = Assert . IsType < TextContentBlock > ( result . Content [ 0 ] ) ;
@@ -1359,7 +1384,7 @@ await transport.SendClientMessageAsync(new JsonRpcNotification
13591384 Assert . NotNull ( response . Result ) ;
13601385 var initResult = JsonSerializer . Deserialize < InitializeResult > ( response . Result , McpJsonUtilities . DefaultOptions ) ;
13611386 Assert . NotNull ( initResult ) ;
1362- Assert . Equal ( "complete" , initResult . ResultType ) ;
1387+ Assert . Null ( initResult . ResultType ) ;
13631388 Assert . NotNull ( initResult . ServerInfo ) ;
13641389
13651390 await transport . DisposeAsync ( ) ;
0 commit comments