5454from mcp .shared .exceptions import NoBackChannelError
5555from mcp .shared .memory import MessageStream , create_client_server_memory_streams
5656from mcp .shared .message import SessionMessage
57+ from tests ._stamp import Unstamp
58+ from tests ._stamp import unstamped as strip_stamp
5759from tests .interaction ._connect import BASE_URL , Connect , base_headers , mounted_app
5860from tests .interaction ._helpers import RecordingTransport
5961from tests .interaction ._requirements import requirement
@@ -106,7 +108,9 @@ async def call_tool(
106108
107109
108110@requirement ("mrtr:tools-call:write-once-roundtrip" )
109- async def test_input_required_tool_call_is_auto_fulfilled_and_retried_to_completion (connect : Connect ) -> None :
111+ async def test_input_required_tool_call_is_auto_fulfilled_and_retried_to_completion (
112+ connect : Connect , unstamped : Unstamp
113+ ) -> None :
110114 """An input_required tools/call is auto-fulfilled by the client driver and retried to completion.
111115
112116 The byte-exact requestState echo (spec MUST) is the only observable proxy for the MUST NOT
@@ -125,13 +129,15 @@ async def answer_login(context: ClientRequestContext, params: types.ElicitReques
125129 async with connect (server , elicitation_callback = answer_login ) as client :
126130 result = await client .call_tool ("login" , {})
127131
128- assert result == snapshot (CallToolResult (content = [TextContent (text = "hello octocat" )]))
132+ assert unstamped ( result ) == snapshot (CallToolResult (content = [TextContent (text = "hello octocat" )]))
129133 assert prompts == ["Provide your GitHub username" ]
130134 assert request_states == [None , OPAQUE_STATE ]
131135
132136
133137@requirement ("mrtr:request-state-only:retry" )
134- async def test_state_only_input_required_is_retried_with_no_responses_and_echoed_state (connect : Connect ) -> None :
138+ async def test_state_only_input_required_is_retried_with_no_responses_and_echoed_state (
139+ connect : Connect , unstamped : Unstamp
140+ ) -> None :
135141 """A state-only input_required result is retried with no inputResponses and the state echoed.
136142
137143 No callbacks are registered: a driver that wrongly dispatched here would error the call.
@@ -161,12 +167,14 @@ async def call_tool(
161167 async with connect (server ) as client :
162168 result = await client .call_tool ("resume" , {})
163169
164- assert result == snapshot (CallToolResult (content = [TextContent (text = "done" )]))
170+ assert unstamped ( result ) == snapshot (CallToolResult (content = [TextContent (text = "done" )]))
165171 assert request_states == [None , resume_token ]
166172
167173
168174@requirement ("mrtr:multi-round:complete" )
169- async def test_server_reprompts_across_two_productive_rounds_then_completes (connect : Connect ) -> None :
175+ async def test_server_reprompts_across_two_productive_rounds_then_completes (
176+ connect : Connect , unstamped : Unstamp
177+ ) -> None :
170178 """A server re-prompting with input_required across two productive rounds completes normally.
171179
172180 Round 1's answer rides forward inside request_state (the spec's stateless-server pattern). Each
@@ -216,7 +224,7 @@ async def answer_by_prompt(context: ClientRequestContext, params: types.ElicitRe
216224 async with connect (server , elicitation_callback = answer_by_prompt ) as client :
217225 result = await client .call_tool ("enroll" , {})
218226
219- assert result == snapshot (CallToolResult (content = [TextContent (text = "one+two" )]))
227+ assert unstamped ( result ) == snapshot (CallToolResult (content = [TextContent (text = "one+two" )]))
220228 assert prompts == ["first question" , "second question" ]
221229 assert request_states == [None , "s1" , "s2:one" ]
222230
@@ -314,7 +322,9 @@ async def call_tool(ctx: ServerRequestContext, params: types.CallToolRequestPara
314322
315323
316324@requirement ("mrtr:input-responses:key-correspondence" )
317- async def test_multi_request_input_responses_are_keyed_by_the_input_request_keys (connect : Connect ) -> None :
325+ async def test_multi_request_input_responses_are_keyed_by_the_input_request_keys (
326+ connect : Connect , unstamped : Unstamp
327+ ) -> None :
318328 """inputResponses on the retry are keyed by the inputRequests keys, each value that key's typed result.
319329
320330 ElicitResult and ListRootsResult prove the map contract; sampling fidelity belongs to the sampling entries.
@@ -354,11 +364,11 @@ async def answer_roots(context: ClientRequestContext) -> ListRootsResult:
354364 async with connect (server , elicitation_callback = answer_login , list_roots_callback = answer_roots ) as client :
355365 result = await client .call_tool ("profile" , {})
356366
357- assert result == snapshot (CallToolResult (content = [TextContent (text = "octocat@file:///workspace" )]))
367+ assert unstamped ( result ) == snapshot (CallToolResult (content = [TextContent (text = "octocat@file:///workspace" )]))
358368
359369
360370@requirement ("mrtr:input-responses:missing-reprompted" )
361- async def test_retry_missing_a_requested_key_is_reprompted_not_errored (connect : Connect ) -> None :
371+ async def test_retry_missing_a_requested_key_is_reprompted_not_errored (connect : Connect , unstamped : Unstamp ) -> None :
362372 """A retry omitting a requested inputResponses key is re-prompted, not errored (spec SHOULD).
363373
364374 The re-prompt decision belongs to the test's handler; the SDK obligation pinned is that the partial
@@ -423,13 +433,15 @@ async def call_tool(
423433 allow_input_required = True ,
424434 )
425435
426- assert result == snapshot (CallToolResult (content = [TextContent (text = "one+two" )]))
436+ assert unstamped ( result ) == snapshot (CallToolResult (content = [TextContent (text = "one+two" )]))
427437 # The partial map reached the handler as sent, not filtered or rejected.
428438 assert seen == [None , {"first" }, {"second" }]
429439
430440
431441@requirement ("mrtr:input-responses:unknown-ignored" )
432- async def test_retry_with_an_unrequested_extra_key_is_tolerated_and_the_call_completes (connect : Connect ) -> None :
442+ async def test_retry_with_an_unrequested_extra_key_is_tolerated_and_the_call_completes (
443+ connect : Connect , unstamped : Unstamp
444+ ) -> None :
433445 """A retry carrying an unrequested inputResponses key completes normally (spec SHOULD: ignore).
434446
435447 The ignoring happens in the test's handler; the SDK half pinned is that the stray entry is
@@ -472,12 +484,14 @@ async def call_tool(
472484 allow_input_required = True ,
473485 )
474486
475- assert result == snapshot (CallToolResult (content = [TextContent (text = "hello ada" )]))
487+ assert unstamped ( result ) == snapshot (CallToolResult (content = [TextContent (text = "hello ada" )]))
476488 assert seen == [None , {"name" , "stray" }]
477489
478490
479491@requirement ("mrtr:push-api:loud-fail-2026" )
480- async def test_push_elicit_on_2026_raises_typed_local_error_and_call_still_completes (connect : Connect ) -> None :
492+ async def test_push_elicit_on_2026_raises_typed_local_error_and_call_still_completes (
493+ connect : Connect , unstamped : Unstamp
494+ ) -> None :
481495 """A push API call on a 2026 connection raises a typed local error and the call still completes.
482496
483497 Spec-mandated outcome, era-routed enforcement: every modern dispatch path installs a
@@ -510,7 +524,7 @@ async def never_deliverable(context: ClientRequestContext, params: types.ElicitR
510524 result = await client .call_tool ("ask" , {})
511525
512526 # The failed push did not poison the request: the call completes with the handler's fallback.
513- assert result == snapshot (CallToolResult (content = [TextContent (text = "fallback" )]))
527+ assert unstamped ( result ) == snapshot (CallToolResult (content = [TextContent (text = "fallback" )]))
514528 assert len (caught ) == 1
515529 assert caught [0 ].method == "elicitation/create"
516530 assert caught [0 ].error == snapshot (
@@ -562,7 +576,7 @@ async def never_deliverable(context: ClientRequestContext, params: types.ElicitR
562576 result = await client .call_tool ("ask" , {})
563577
564578 # The failed push did not poison the request: the call completes with the handler's fallback.
565- assert result == snapshot (CallToolResult (content = [TextContent (text = "fallback" )]))
579+ assert strip_stamp ( result ) == snapshot (CallToolResult (content = [TextContent (text = "fallback" )]))
566580 assert len (caught ) == 1
567581 assert caught [0 ].method == "elicitation/create"
568582 assert caught [0 ].error == snapshot (
@@ -819,7 +833,7 @@ async def answer(context: ClientRequestContext, params: types.ElicitRequestParam
819833 ):
820834
821835 async def call (name : str ) -> None :
822- results [name ] = await client .call_tool (name , {})
836+ results [name ] = strip_stamp ( await client .call_tool (name , {}) )
823837
824838 task_group .start_soon (call , "alpha" )
825839 task_group .start_soon (call , "beta" )
@@ -879,7 +893,7 @@ async def answer(context: ClientRequestContext, params: types.ElicitRequestParam
879893 result = await client .call_tool ("ask" , {})
880894
881895 # Non-vacuity: the elicitation genuinely happened and the round trip completed through it.
882- assert result == snapshot (CallToolResult (content = [TextContent (text = "done:Berlin:s1" )]))
896+ assert strip_stamp ( result ) == snapshot (CallToolResult (content = [TextContent (text = "done:Berlin:s1" )]))
883897 assert elicited == ["Need a name" ]
884898 # Prove the received log holds only messages before narrowing: a filtered-out transport exception would fake it.
885899 received_messages = [message for message in recording .received if isinstance (message , SessionMessage )]
@@ -1030,7 +1044,7 @@ def respond(request_id: types.RequestId, result: dict[str, object]) -> SessionMe
10301044
10311045@requirement ("protocol:result-type:unrecognized-invalid" )
10321046async def test_an_unrecognized_result_type_value_is_surfaced_unchanged_instead_of_treated_as_invalid (
1033- connect : Connect ,
1047+ connect : Connect , unstamped : Unstamp
10341048) -> None :
10351049 """PINS A KNOWN GAP: an unrecognized resultType round-trips instead of being treated as invalid (spec MUST).
10361050
@@ -1061,4 +1075,4 @@ def probe() -> CallToolResult:
10611075
10621076 # The divergent observable: the unrecognized discriminator survives unchanged, never a rejection.
10631077 assert result .result_type == "bogus"
1064- assert result == snapshot (CallToolResult (content = [TextContent (text = "still here" )], result_type = "bogus" ))
1078+ assert unstamped ( result ) == snapshot (CallToolResult (content = [TextContent (text = "still here" )], result_type = "bogus" ))
0 commit comments