@@ -283,6 +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 ) ;
286287 Assert . Equal ( expectedAssemblyName . Name , result . ServerInfo . Name ) ;
287288 Assert . Equal ( expectedAssemblyName . Version ? . ToString ( ) ?? "1.0.0" , result . ServerInfo . Version ) ;
288289 Assert . Equal ( "2024-11-05" , result . ProtocolVersion ) ;
@@ -385,6 +386,7 @@ await Can_Handle_Requests(
385386 {
386387 var result = JsonSerializer . Deserialize < InitializeResult > ( response , McpJsonUtilities . DefaultOptions ) ;
387388 Assert . NotNull ( result ) ;
389+ Assert . Equal ( "complete" , result . ResultType ) ;
388390 Assert . NotNull ( result . Capabilities . Extensions ) ;
389391 Assert . True ( result . Capabilities . Extensions . ContainsKey ( "io.myext" ) ) ;
390392 } ) ;
@@ -404,6 +406,7 @@ await Can_Handle_Requests(
404406 {
405407 var result = JsonSerializer . Deserialize < InitializeResult > ( response , McpJsonUtilities . DefaultOptions ) ;
406408 Assert . NotNull ( result ) ;
409+ Assert . Equal ( "complete" , result . ResultType ) ;
407410 Assert . NotNull ( result . Capabilities . Experimental ) ;
408411 Assert . True ( result . Capabilities . Experimental . ContainsKey ( "customFeature" ) ) ;
409412 } ) ;
@@ -435,6 +438,7 @@ await Can_Handle_Requests(
435438 {
436439 var result = JsonSerializer . Deserialize < InitializeResult > ( response , McpJsonUtilities . DefaultOptions ) ;
437440 Assert . NotNull ( result ) ;
441+ Assert . Equal ( "complete" , result . ResultType ) ;
438442
439443 // Use reflection to verify every public property on ServerCapabilities is non-null.
440444 // This catches cases where new capability properties are added but not copied
@@ -481,6 +485,7 @@ await Can_Handle_Requests(
481485 {
482486 var result = JsonSerializer . Deserialize < CompleteResult > ( response , McpJsonUtilities . DefaultOptions ) ;
483487 Assert . NotNull ( result ? . Completion ) ;
488+ Assert . Equal ( "complete" , result . ResultType ) ;
484489 Assert . Equal ( [ "test" ] , result . Completion . Values ) ;
485490 Assert . Equal ( 2 , result . Completion . Total ) ;
486491 Assert . True ( result . Completion . HasMore ) ;
@@ -524,6 +529,7 @@ await transport.SendMessageAsync(new JsonRpcRequest
524529 Assert . NotNull ( response ) ;
525530 var result = JsonSerializer . Deserialize < CompleteResult > ( response . Result , McpJsonUtilities . DefaultOptions ) ;
526531 Assert . NotNull ( result ? . Completion ) ;
532+ Assert . Equal ( "complete" , result . ResultType ) ;
527533 Assert . Equal ( [ "cat" ] , result . Completion . Values ) ;
528534 Assert . Equal ( 1 , result . Completion . Total ) ;
529535
@@ -567,6 +573,7 @@ await transport.SendMessageAsync(new JsonRpcRequest
567573 Assert . NotNull ( response ) ;
568574 var result = JsonSerializer . Deserialize < CompleteResult > ( response . Result , McpJsonUtilities . DefaultOptions ) ;
569575 Assert . NotNull ( result ? . Completion ) ;
576+ Assert . Equal ( "complete" , result . ResultType ) ;
570577 Assert . Empty ( result . Completion . Values ) ;
571578
572579 await transport . DisposeAsync ( ) ;
@@ -616,6 +623,7 @@ await transport.SendMessageAsync(new JsonRpcRequest
616623 Assert . NotNull ( response ) ;
617624 var result = JsonSerializer . Deserialize < CompleteResult > ( response . Result , McpJsonUtilities . DefaultOptions ) ;
618625 Assert . NotNull ( result ? . Completion ) ;
626+ Assert . Equal ( "complete" , result . ResultType ) ;
619627 Assert . Equal ( [ "us-east-1" , "us-west-2" ] , result . Completion . Values ) ;
620628 Assert . Equal ( 2 , result . Completion . Total ) ;
621629
@@ -671,6 +679,7 @@ await transport.SendMessageAsync(new JsonRpcRequest
671679 Assert . NotNull ( response ) ;
672680 var result = JsonSerializer . Deserialize < CompleteResult > ( response . Result , McpJsonUtilities . DefaultOptions ) ;
673681 Assert . NotNull ( result ? . Completion ) ;
682+ Assert . Equal ( "complete" , result . ResultType ) ;
674683 // Custom handler values + auto-populated values should be combined
675684 Assert . Equal ( [ "custom-value" , "dog" , "cat" ] , result . Completion . Values ) ;
676685 Assert . Equal ( 3 , result . Completion . Total ) ;
@@ -718,6 +727,7 @@ await transport.SendMessageAsync(new JsonRpcRequest
718727 Assert . NotNull ( response ) ;
719728 var result = JsonSerializer . Deserialize < CompleteResult > ( response . Result , McpJsonUtilities . DefaultOptions ) ;
720729 Assert . NotNull ( result ? . Completion ) ;
730+ Assert . Equal ( "complete" , result . ResultType ) ;
721731 Assert . Equal ( [ "a" , "b" ] , result . Completion . Values ) ;
722732
723733 await transport . DisposeAsync ( ) ;
@@ -756,6 +766,7 @@ await Can_Handle_Requests(
756766 {
757767 var result = JsonSerializer . Deserialize < ListResourceTemplatesResult > ( response , McpJsonUtilities . DefaultOptions ) ;
758768 Assert . NotNull ( result ? . ResourceTemplates ) ;
769+ Assert . Equal ( "complete" , result . ResultType ) ;
759770 Assert . NotEmpty ( result . ResourceTemplates ) ;
760771 Assert . Equal ( "test" , result . ResourceTemplates [ 0 ] . UriTemplate ) ;
761772 } ) ;
@@ -785,6 +796,7 @@ await Can_Handle_Requests(
785796 {
786797 var result = JsonSerializer . Deserialize < ListResourcesResult > ( response , McpJsonUtilities . DefaultOptions ) ;
787798 Assert . NotNull ( result ? . Resources ) ;
799+ Assert . Equal ( "complete" , result . ResultType ) ;
788800 Assert . NotEmpty ( result . Resources ) ;
789801 Assert . Equal ( "test" , result . Resources [ 0 ] . Uri ) ;
790802 } ) ;
@@ -820,6 +832,7 @@ await Can_Handle_Requests(
820832 {
821833 var result = JsonSerializer . Deserialize < ReadResourceResult > ( response , McpJsonUtilities . DefaultOptions ) ;
822834 Assert . NotNull ( result ? . Contents ) ;
835+ Assert . Equal ( "complete" , result . ResultType ) ;
823836 Assert . NotEmpty ( result . Contents ) ;
824837
825838 TextResourceContents textResource = Assert . IsType < TextResourceContents > ( result . Contents [ 0 ] ) ;
@@ -857,6 +870,7 @@ await Can_Handle_Requests(
857870 {
858871 var result = JsonSerializer . Deserialize < ListPromptsResult > ( response , McpJsonUtilities . DefaultOptions ) ;
859872 Assert . NotNull ( result ? . Prompts ) ;
873+ Assert . Equal ( "complete" , result . ResultType ) ;
860874 Assert . NotEmpty ( result . Prompts ) ;
861875 Assert . Equal ( "test" , result . Prompts [ 0 ] . Name ) ;
862876 } ) ;
@@ -886,6 +900,7 @@ await Can_Handle_Requests(
886900 {
887901 var result = JsonSerializer . Deserialize < GetPromptResult > ( response , McpJsonUtilities . DefaultOptions ) ;
888902 Assert . NotNull ( result ) ;
903+ Assert . Equal ( "complete" , result . ResultType ) ;
889904 Assert . Equal ( "test" , result . Description ) ;
890905 } ) ;
891906 }
@@ -920,6 +935,7 @@ await Can_Handle_Requests(
920935 {
921936 var result = JsonSerializer . Deserialize < ListToolsResult > ( response , McpJsonUtilities . DefaultOptions ) ;
922937 Assert . NotNull ( result ) ;
938+ Assert . Equal ( "complete" , result . ResultType ) ;
923939 Assert . NotEmpty ( result . Tools ) ;
924940 Assert . Equal ( "test" , result . Tools [ 0 ] . Name ) ;
925941 } ) ;
@@ -955,6 +971,7 @@ await Can_Handle_Requests(
955971 {
956972 var result = JsonSerializer . Deserialize < CallToolResult > ( response , McpJsonUtilities . DefaultOptions ) ;
957973 Assert . NotNull ( result ) ;
974+ Assert . Equal ( "complete" , result . ResultType ) ;
958975 Assert . NotEmpty ( result . Content ) ;
959976 Assert . Equal ( "test" , Assert . IsType < TextContentBlock > ( result . Content [ 0 ] ) . Text ) ;
960977 } ) ;
@@ -966,6 +983,34 @@ public async Task Can_Handle_Call_Tool_Requests_Throws_Exception_If_No_Handler_A
966983 await Succeeds_Even_If_No_Handler_Assigned ( new ServerCapabilities { Tools = new ( ) } , RequestMethods . ToolsCall , "CallTool handler not configured" ) ;
967984 }
968985
986+ [ Fact ]
987+ public async Task Can_Handle_SetLoggingLevel_Requests ( )
988+ {
989+ await Can_Handle_Requests (
990+ new ServerCapabilities
991+ {
992+ Logging = new ( )
993+ } ,
994+ method : RequestMethods . LoggingSetLevel ,
995+ configureOptions : options =>
996+ {
997+ // logging/setLevel is a legacy (2025-06-18) method whose result must serialize as an
998+ // empty object {}. The custom handler returns a bare result and the server must not
999+ // add a resultType, otherwise the MCP conformance suite rejects the response.
1000+ options . Handlers . SetLoggingLevelHandler = async ( request , ct ) => new EmptyResult ( ) ;
1001+ } ,
1002+ assertResult : ( _ , response ) =>
1003+ {
1004+ var result = JsonSerializer . Deserialize < EmptyResult > ( response , McpJsonUtilities . DefaultOptions ) ;
1005+ Assert . NotNull ( result ) ;
1006+ Assert . Null ( result . ResultType ) ;
1007+
1008+ // The wire response must be exactly {} with no additional properties.
1009+ var obj = Assert . IsType < JsonObject > ( response ) ;
1010+ Assert . Empty ( obj ) ;
1011+ } ) ;
1012+ }
1013+
9691014 [ Fact ]
9701015 public async Task Can_Handle_Call_Tool_Requests_With_McpException ( )
9711016 {
@@ -988,6 +1033,7 @@ await Can_Handle_Requests(
9881033 {
9891034 var result = JsonSerializer . Deserialize < CallToolResult > ( response , McpJsonUtilities . DefaultOptions ) ;
9901035 Assert . NotNull ( result ) ;
1036+ Assert . Equal ( "complete" , result . ResultType ) ;
9911037 Assert . True ( result . IsError ) ;
9921038 Assert . NotEmpty ( result . Content ) ;
9931039 var textContent = Assert . IsType < TextContentBlock > ( result . Content [ 0 ] ) ;
@@ -1016,6 +1062,7 @@ await Can_Handle_Requests(
10161062 {
10171063 var result = JsonSerializer . Deserialize < CallToolResult > ( response , McpJsonUtilities . DefaultOptions ) ;
10181064 Assert . NotNull ( result ) ;
1065+ Assert . Equal ( "complete" , result . ResultType ) ;
10191066 Assert . True ( result . IsError ) ;
10201067 Assert . NotEmpty ( result . Content ) ;
10211068 var textContent = Assert . IsType < TextContentBlock > ( result . Content [ 0 ] ) ;
@@ -1051,6 +1098,7 @@ await Can_Handle_Requests(
10511098 {
10521099 var result = JsonSerializer . Deserialize < CallToolResult > ( response , McpJsonUtilities . DefaultOptions ) ;
10531100 Assert . NotNull ( result ) ;
1101+ Assert . Equal ( "complete" , result . ResultType ) ;
10541102 Assert . True ( result . IsError , "Input validation errors should be returned as tool execution errors (IsError=true), not protocol errors" ) ;
10551103 Assert . NotEmpty ( result . Content ) ;
10561104 var textContent = Assert . IsType < TextContentBlock > ( result . Content [ 0 ] ) ;
@@ -1311,6 +1359,7 @@ await transport.SendClientMessageAsync(new JsonRpcNotification
13111359 Assert . NotNull ( response . Result ) ;
13121360 var initResult = JsonSerializer . Deserialize < InitializeResult > ( response . Result , McpJsonUtilities . DefaultOptions ) ;
13131361 Assert . NotNull ( initResult ) ;
1362+ Assert . Equal ( "complete" , initResult . ResultType ) ;
13141363 Assert . NotNull ( initResult . ServerInfo ) ;
13151364
13161365 await transport . DisposeAsync ( ) ;
0 commit comments