@@ -153,6 +153,7 @@ private static async Task<string> MrtrMixed(McpServer server, RequestContext<Cal
153153
154154 [ Theory ]
155155 [ InlineData ( false ) ]
156+ [ InlineData ( true ) ]
156157 public async Task Mrtr_MixedExceptionAndAwaitStyle ( bool experimentalClient )
157158 {
158159 // The server always supports DRAFT-2026-v1 (it's in SupportedProtocolVersions). The
@@ -217,7 +218,10 @@ public async Task Mrtr_MixedExceptionAndAwaitStyle(bool experimentalClient)
217218
218219 if ( experimentalClient )
219220 {
220- messageTracker . AssertMrtrUsed ( ) ;
221+ // Rounds 1-2 use wire-format MRTR (InputRequiredResult), but round 3's await calls
222+ // still issue legacy elicitation/create + sampling/createMessage requests, so this
223+ // configuration is mixed-mode.
224+ messageTracker . AssertMrtrUsedAtLeastOnce ( ) ;
221225 }
222226 else
223227 {
@@ -228,75 +232,45 @@ public async Task Mrtr_MixedExceptionAndAwaitStyle(bool experimentalClient)
228232 [ McpServerTool ( Name = "mrtr-parallel-await" ) ]
229233 private static async Task < string > MrtrParallelAwait ( McpServer server , CancellationToken ct )
230234 {
231- // Start the first await — succeeds with MRTR (creates exchange)
232235 var elicitTask = server . ElicitAsync ( new ElicitRequestParams
233236 {
234237 Message = "Parallel elicit" ,
235238 RequestedSchema = new ( )
236239 } , ct ) ;
237240
238- // Start the second await. This path is only exercised for legacy clients now
239- // that draft clients must use InputRequiredException instead of await-style requests.
240- try
241+ var sampleTask = server . SampleAsync ( new CreateMessageRequestParams
241242 {
242- var sampleTask = server . SampleAsync ( new CreateMessageRequestParams
243- {
244- Messages = [ new SamplingMessage { Role = Role . User , Content = [ new TextContentBlock { Text = "Parallel sample" } ] } ] ,
245- MaxTokens = 100
246- } , ct ) ;
243+ Messages = [ new SamplingMessage { Role = Role . User , Content = [ new TextContentBlock { Text = "Parallel sample" } ] } ] ,
244+ MaxTokens = 100
245+ } , ct ) ;
247246
248- // If we get here, both calls succeeded (non-MRTR path)
249- var sampleResult = await sampleTask ;
250- var elicitResult = await elicitTask ;
251- return $ "parallel-ok:{ elicitResult . Action } :{ sampleResult . Content . OfType < TextContentBlock > ( ) . First ( ) . Text } ";
252- }
253- catch ( InvalidOperationException ex )
254- {
255- return ex . Message ;
256- }
247+ var sampleResult = await sampleTask ;
248+ var elicitResult = await elicitTask ;
249+ return $ "parallel-ok:{ elicitResult . Action } :{ sampleResult . Content . OfType < TextContentBlock > ( ) . First ( ) . Text } ";
257250 }
258251
259- [ Theory ]
260- [ InlineData ( false ) ]
261- public async Task Mrtr_ParallelAwaits ( bool experimentalClient )
252+ [ Fact ]
253+ public async Task Mrtr_ParallelAwaits ( )
262254 {
263- // Parallel awaits work with regular JSON-RPC for legacy clients.
264- Assert . SkipWhen ( Stateless , "Await-style API requires handler suspension (stateful only)." ) ;
255+ // Server-side parallel ElicitAsync + SampleAsync awaits use the legacy server-to-client
256+ // request path on stateful sessions, which works the same under either negotiated revision
257+ // (the spec only removes those request methods from Streamable HTTP under draft, which is
258+ // stateless-only territory). Stateless servers can't issue server-to-client requests at all.
259+ Assert . SkipWhen ( Stateless , "Server-side awaits require stateful server-to-client requests." ) ;
265260
266- var messageTracker = ConfigureServer ( MrtrParallelAwait ) ;
261+ ConfigureServer ( MrtrParallelAwait ) ;
267262 await using var app = Builder . Build ( ) ;
268263 app . MapMcp ( ) ;
269264 await app . StartAsync ( TestContext . Current . CancellationToken ) ;
270265
271- Action < McpClientOptions > configureClient = experimentalClient
272- ? options => { ConfigureMrtrHandlers ( options ) ; options . ProtocolVersion = "DRAFT-2026-v1" ; }
273- : ConfigureMrtrHandlers ;
274- await using var client = await ConnectAsync ( configureClient : configureClient ) ;
275-
276- if ( experimentalClient )
277- {
278- // Draft clients must use InputRequiredException instead of await-style requests.
279- Assert . Equal ( "DRAFT-2026-v1" , client . NegotiatedProtocolVersion ) ;
280-
281- var result = await client . CallToolAsync ( "mrtr-parallel-await" ,
282- cancellationToken : TestContext . Current . CancellationToken ) ;
266+ await using var client = await ConnectAsync ( configureClient : ConfigureMrtrHandlers ) ;
283267
284- var text = Assert . IsType < TextContentBlock > ( Assert . Single ( result . Content ) ) . Text ;
285- Assert . Contains ( "Concurrent server-to-client requests are not supported" , text ) ;
286- Assert . True ( result . IsError is not true ) ;
287- }
288- else
289- {
290- // Non-MRTR: awaits go through regular JSON-RPC — concurrent calls work.
291- Assert . Equal ( "2025-11-25" , client . NegotiatedProtocolVersion ) ;
292-
293- var result = await client . CallToolAsync ( "mrtr-parallel-await" ,
294- cancellationToken : TestContext . Current . CancellationToken ) ;
268+ var result = await client . CallToolAsync ( "mrtr-parallel-await" ,
269+ cancellationToken : TestContext . Current . CancellationToken ) ;
295270
296- var text = Assert . IsType < TextContentBlock > ( Assert . Single ( result . Content ) ) . Text ;
297- Assert . StartsWith ( "parallel-ok:" , text ) ;
298- Assert . True ( result . IsError is not true ) ;
299- }
271+ var text = Assert . IsType < TextContentBlock > ( Assert . Single ( result . Content ) ) . Text ;
272+ Assert . StartsWith ( "parallel-ok:" , text ) ;
273+ Assert . True ( result . IsError is not true ) ;
300274 }
301275
302276 [ McpServerTool ( Name = "mrtr-elicit" ) ]
@@ -321,7 +295,7 @@ private static string MrtrElicit(RequestContext<CallToolRequestParams> context)
321295 }
322296
323297 [ Fact ]
324- public async Task Mrtr_LowLevel_Roots_CompletesViaMrtr ( )
298+ public async Task Mrtr_Roots_CompletesViaMrtr ( )
325299 {
326300 var messageTracker = ConfigureServer (
327301 [ McpServerTool ( Name = "mrtr-roots" ) ] ( RequestContext < CallToolRequestParams > context ) =>
@@ -558,7 +532,7 @@ public async Task Mrtr_ConcurrentThreeInputs_ResolvedSimultaneously()
558532 }
559533
560534 [ Fact ]
561- public async Task Mrtr_Experimental_LoadShedding_RequestStateOnly_CompletesViaMrtr ( )
535+ public async Task Mrtr_LoadShedding_RequestStateOnly_CompletesViaMrtr ( )
562536 {
563537 var messageTracker = ConfigureServer (
564538 [ McpServerTool ( Name = "mrtr-loadshed" ) ] ( RequestContext < CallToolRequestParams > context ) =>
0 commit comments