@@ -184,12 +184,12 @@ public ValueTask<ListToolsResult> ListToolsAsync(
184184 {
185185 Throw . IfNull ( requestParams ) ;
186186
187- return SendRequestWithMrtrAsync (
187+ return SendRequestAsync (
188188 RequestMethods . ToolsList ,
189189 requestParams ,
190190 McpJsonUtilities . JsonContext . Default . ListToolsRequestParams ,
191191 McpJsonUtilities . JsonContext . Default . ListToolsResult ,
192- cancellationToken ) ;
192+ cancellationToken : cancellationToken ) ;
193193 }
194194
195195 /// <summary>
@@ -240,12 +240,12 @@ public ValueTask<ListPromptsResult> ListPromptsAsync(
240240 {
241241 Throw . IfNull ( requestParams ) ;
242242
243- return SendRequestWithMrtrAsync (
243+ return SendRequestAsync (
244244 RequestMethods . PromptsList ,
245245 requestParams ,
246246 McpJsonUtilities . JsonContext . Default . ListPromptsRequestParams ,
247247 McpJsonUtilities . JsonContext . Default . ListPromptsResult ,
248- cancellationToken ) ;
248+ cancellationToken : cancellationToken ) ;
249249 }
250250
251251 /// <summary>
@@ -294,12 +294,12 @@ public ValueTask<GetPromptResult> GetPromptAsync(
294294 {
295295 Throw . IfNull ( requestParams ) ;
296296
297- return SendRequestWithMrtrAsync (
297+ return SendRequestAsync (
298298 RequestMethods . PromptsGet ,
299299 requestParams ,
300300 McpJsonUtilities . JsonContext . Default . GetPromptRequestParams ,
301301 McpJsonUtilities . JsonContext . Default . GetPromptResult ,
302- cancellationToken ) ;
302+ cancellationToken : cancellationToken ) ;
303303 }
304304
305305 /// <summary>
@@ -350,12 +350,12 @@ public ValueTask<ListResourceTemplatesResult> ListResourceTemplatesAsync(
350350 {
351351 Throw . IfNull ( requestParams ) ;
352352
353- return SendRequestWithMrtrAsync (
353+ return SendRequestAsync (
354354 RequestMethods . ResourcesTemplatesList ,
355355 requestParams ,
356356 McpJsonUtilities . JsonContext . Default . ListResourceTemplatesRequestParams ,
357357 McpJsonUtilities . JsonContext . Default . ListResourceTemplatesResult ,
358- cancellationToken ) ;
358+ cancellationToken : cancellationToken ) ;
359359 }
360360
361361 /// <summary>
@@ -406,12 +406,12 @@ public ValueTask<ListResourcesResult> ListResourcesAsync(
406406 {
407407 Throw . IfNull ( requestParams ) ;
408408
409- return SendRequestWithMrtrAsync (
409+ return SendRequestAsync (
410410 RequestMethods . ResourcesList ,
411411 requestParams ,
412412 McpJsonUtilities . JsonContext . Default . ListResourcesRequestParams ,
413413 McpJsonUtilities . JsonContext . Default . ListResourcesResult ,
414- cancellationToken ) ;
414+ cancellationToken : cancellationToken ) ;
415415 }
416416
417417 /// <summary>
@@ -490,12 +490,12 @@ public ValueTask<ReadResourceResult> ReadResourceAsync(
490490 {
491491 Throw . IfNull ( requestParams ) ;
492492
493- return SendRequestWithMrtrAsync (
493+ return SendRequestAsync (
494494 RequestMethods . ResourcesRead ,
495495 requestParams ,
496496 McpJsonUtilities . JsonContext . Default . ReadResourceRequestParams ,
497497 McpJsonUtilities . JsonContext . Default . ReadResourceResult ,
498- cancellationToken ) ;
498+ cancellationToken : cancellationToken ) ;
499499 }
500500
501501 /// <summary>
@@ -541,12 +541,12 @@ public ValueTask<CompleteResult> CompleteAsync(
541541 {
542542 Throw . IfNull ( requestParams ) ;
543543
544- return SendRequestWithMrtrAsync (
544+ return SendRequestAsync (
545545 RequestMethods . CompletionComplete ,
546546 requestParams ,
547547 McpJsonUtilities . JsonContext . Default . CompleteRequestParams ,
548548 McpJsonUtilities . JsonContext . Default . CompleteResult ,
549- cancellationToken ) ;
549+ cancellationToken : cancellationToken ) ;
550550 }
551551
552552 /// <summary>
@@ -906,12 +906,12 @@ public ValueTask<CallToolResult> CallToolAsync(
906906 {
907907 Throw . IfNull ( requestParams ) ;
908908
909- return SendRequestWithMrtrAsync (
909+ return SendRequestAsync (
910910 RequestMethods . ToolsCall ,
911911 requestParams ,
912912 McpJsonUtilities . JsonContext . Default . CallToolRequestParams ,
913913 McpJsonUtilities . JsonContext . Default . CallToolResult ,
914- cancellationToken ) ;
914+ cancellationToken : cancellationToken ) ;
915915 }
916916
917917 /// <summary>
@@ -1290,91 +1290,6 @@ public Task SetLoggingLevelAsync(
12901290 cancellationToken : cancellationToken ) . AsTask ( ) ;
12911291 }
12921292
1293- /// <summary>
1294- /// Sends a request with MRTR (Multi Round-Trip Request) support. If the server returns an
1295- /// <see cref="IncompleteResult"/>, this method automatically resolves the input requests
1296- /// via the client's handlers and retries until a complete result is obtained.
1297- /// </summary>
1298- private async ValueTask < TResult > SendRequestWithMrtrAsync < TParams , TResult > (
1299- string method ,
1300- TParams parameters ,
1301- JsonTypeInfo < TParams > parametersTypeInfo ,
1302- JsonTypeInfo < TResult > resultTypeInfo ,
1303- CancellationToken cancellationToken )
1304- where TParams : RequestParams
1305- where TResult : Result
1306- {
1307- const int maxRetries = 10 ;
1308-
1309- for ( int attempt = 0 ; attempt <= maxRetries ; attempt ++ )
1310- {
1311- JsonRpcRequest jsonRpcRequest = new ( )
1312- {
1313- Method = method ,
1314- Params = JsonSerializer . SerializeToNode ( parameters , parametersTypeInfo ) ,
1315- } ;
1316-
1317- JsonRpcResponse response = await SendRequestAsync ( jsonRpcRequest , cancellationToken ) . ConfigureAwait ( false ) ;
1318-
1319- // Check if the result is an IncompleteResult by looking at result_type
1320- if ( response . Result is JsonObject resultObj &&
1321- resultObj . TryGetPropertyValue ( "result_type" , out var resultTypeNode ) &&
1322- resultTypeNode ? . GetValue < string > ( ) is "incomplete" )
1323- {
1324- var incompleteResult = JsonSerializer . Deserialize ( response . Result , McpJsonUtilities . JsonContext . Default . IncompleteResult )
1325- ?? throw new JsonException ( "Failed to deserialize IncompleteResult." ) ;
1326-
1327- if ( incompleteResult . InputRequests is { Count : > 0 } inputRequests )
1328- {
1329- IDictionary < string , InputResponse > inputResponses =
1330- await ResolveInputRequestsAsync ( inputRequests , cancellationToken ) . ConfigureAwait ( false ) ;
1331-
1332- // Serialize input responses into the parameters for the retry
1333- var paramsNode = JsonSerializer . SerializeToNode ( parameters , parametersTypeInfo ) as JsonObject
1334- ?? throw new JsonException ( "Failed to serialize request parameters as JsonObject." ) ;
1335-
1336- paramsNode [ "inputResponses" ] = JsonSerializer . SerializeToNode (
1337- inputResponses , McpJsonUtilities . JsonContext . Default . IDictionaryStringInputResponse ) ;
1338-
1339- if ( incompleteResult . RequestState is { } requestState )
1340- {
1341- paramsNode [ "requestState" ] = requestState ;
1342- }
1343-
1344- // Deserialize back to TParams to pick up the inputResponses and requestState
1345- parameters = JsonSerializer . Deserialize ( paramsNode , parametersTypeInfo )
1346- ?? throw new JsonException ( "Failed to deserialize retry parameters." ) ;
1347- }
1348- else if ( incompleteResult . RequestState is not null )
1349- {
1350- // No input requests but has requestState (e.g., load shedding) — just retry with state
1351- var paramsNode = JsonSerializer . SerializeToNode ( parameters , parametersTypeInfo ) as JsonObject
1352- ?? throw new JsonException ( "Failed to serialize request parameters as JsonObject." ) ;
1353-
1354- paramsNode [ "requestState" ] = incompleteResult . RequestState ;
1355-
1356- // Remove any old inputResponses from previous iteration
1357- paramsNode . Remove ( "inputResponses" ) ;
1358-
1359- parameters = JsonSerializer . Deserialize ( paramsNode , parametersTypeInfo )
1360- ?? throw new JsonException ( "Failed to deserialize retry parameters." ) ;
1361- }
1362- else
1363- {
1364- throw new McpException ( "Server returned an IncompleteResult without inputRequests or requestState." ) ;
1365- }
1366-
1367- continue ; // retry with the updated parameters
1368- }
1369-
1370- // Normal complete result
1371- return JsonSerializer . Deserialize ( response . Result , resultTypeInfo )
1372- ?? throw new JsonException ( "Unexpected JSON result in response." ) ;
1373- }
1374-
1375- throw new McpException ( $ "Server returned IncompleteResult more than { maxRetries } times.") ;
1376- }
1377-
13781293 /// <summary>Converts a dictionary with <see cref="object"/> values to a dictionary with <see cref="JsonElement"/> values.</summary>
13791294 private static Dictionary < string , JsonElement > ? ToArgumentsDictionary (
13801295 IReadOnlyDictionary < string , object ? > ? arguments , JsonSerializerOptions options )
0 commit comments