Haoxin Yang
69c17de411
mcp: don't mutate caller params on multi-round-trip retries ( #1145 )
...
Fixes #1144 .
`clientMultiRoundTripMiddleware` calls
`setMultiRoundTripRetryParams(req, ...)`, which writes `InputResponses`
and `RequestState` through the caller's params pointer and never clears
them. A `*CallToolParams` (or `GetPromptParams` / `ReadResourceParams`)
struct reused across calls then carries the first call's answers into
the next call: a server gating on `len(req.Params.InputResponses) == 0`
— the idiom in this repo's own tests and examples — treats the fresh
call as already answered, so the client's `ElicitationHandler` never
fires and an elicitation-gated (e.g. destructive) tool runs without
confirmation.
This change makes the retry loop carry the fulfilled responses and
echoed state on a shallow copy of the params
(`multiRoundTripRetryRequest`) instead of mutating the original request.
Caller-owned params are now left untouched by `CallTool`, `GetPrompt`,
and `ReadResource`. The server-side shim
(`serverMultiRoundTripMiddleware`) is unchanged: the params it mutates
are SDK-owned, decoded from the wire.
Tests: `TestMultiRoundTrip_AutoRetryDoesNotMutateCallerParams`
(CallTool: params unchanged after the call, and reusing the same struct
fulfills the input requests again instead of silently replaying the
first call's answers — it failed with `elicitations after reuse = 1,
want 2` before the fix), plus GetPrompt/ReadResource analogues asserting
params are left clean. All three fail on main and pass with this change;
`go test ./...` and `go vet ./...` are clean.
Note on observable behavior: callers can no longer read the fulfilled
responses off their own params struct after a call returns. That side
effect was undocumented, and relying on it is exactly what makes the
replay hazard above possible.
---------
Co-authored-by: Guglielmo Colombo <guglielmoc@google.com>
2026-08-31 13:53:34 +02:00
..
testdata
mcp: update return meta in DiscoverResult (SEP-2575) ( #1097 )
2026-07-16 16:10:12 +02:00
cache.go
mcp: do not enforce TTL on cached tool ( #1053 )
2026-07-07 13:43:10 +02:00
capabilities_test.go
mcp: add 2026-07-28 to the supported protocol versions ( #1020 )
2026-06-24 12:02:56 +02:00
client.go
mcp: avoid Client.Connect leaks ( #1158 )
2026-08-10 08:52:50 +00:00
client_example_test.go
mcp: add docs for tier 1 assessment ( #1195 )
2026-08-24 12:00:59 +02:00
client_list_test.go
mcp: allow any value for schemas ( #517 )
2025-09-26 11:55:54 -04:00
client_test.go
mcp: export ClientSessionOptions.ProtocolVersion ( #1127 )
2026-08-03 15:29:52 +02:00
cmd.go
mcp: speed up TestCommandTransportDuration
2025-09-12 12:00:29 -04:00
cmd_export_test.go
mcp: speed up TestCommandTransportDuration
2025-09-12 12:00:29 -04:00
cmd_test.go
all: modernize code ( #868 )
2026-03-31 10:58:02 +02:00
conformance_test.go
mcp: add 2026-07-28 to the supported protocol versions ( #1020 )
2026-06-24 12:02:56 +02:00
content.go
mcp: Deprecate roots, sampling and logging (SEP-2577) ( #1017 )
2026-06-23 11:11:08 +02:00
content_nil_test.go
mcp: update return meta in DiscoverResult (SEP-2575) ( #1097 )
2026-07-16 16:10:12 +02:00
content_test.go
mcp: switch icon theme to named string type ( #733 )
2025-12-19 16:44:10 -05:00
elicitation_test.go
mcp: add ServerSession.NotifyElicitationComplete ( #1194 )
2026-08-24 10:14:28 +02:00
error_test.go
mcp: add ServerSession.NotifyElicitationComplete ( #1194 )
2026-08-24 10:14:28 +02:00
event.go
mcp: prevent MemoryEventStore.After panic on index past the end ( #1132 )
2026-08-21 10:53:36 +02:00
event_test.go
mcp: prevent MemoryEventStore.After panic on index past the end ( #1132 )
2026-08-21 10:53:36 +02:00
features.go
mcp: minor cleanup of some TODOs ( #332 )
2025-08-20 12:55:19 -04:00
features_test.go
mcp: change tool handler design ( #325 )
2025-08-20 19:36:34 -04:00
logging.go
mcp: keep request log levels scoped to each request ( #1168 )
2026-08-17 14:00:41 +02:00
mcp.go
mcp: fix inaccurate package doc ( #534 )
2025-09-26 14:16:10 -04:00
mcp_example_test.go
mcp: add 2026-07-28 to the supported protocol versions ( #1020 )
2026-06-24 12:02:56 +02:00
mcp_test.go
mcp: prune completed listen request IDs from the session ( #1190 )
2026-08-25 17:15:09 +02:00
mrtr.go
mcp: don't mutate caller params on multi-round-trip retries ( #1145 )
2026-08-31 13:53:34 +02:00
mrtr_test.go
mcp: don't mutate caller params on multi-round-trip retries ( #1145 )
2026-08-31 13:53:34 +02:00
prompt.go
mcp: align PromptHandler args with other handlers ( #348 )
2025-08-22 10:44:05 -04:00
protocol.go
mcp: update return meta in DiscoverResult (SEP-2575) ( #1097 )
2026-07-16 16:10:12 +02:00
protocol_test.go
mcp: include resultType on new-protocol responses ( #1060 )
2026-07-13 11:51:19 +00:00
requests.go
mcp: Implement subscriptions/listen rpc (SEP-2575) ( #1007 )
2026-06-22 18:57:36 +02:00
resource.go
mcp: align resource not found error code with sep-2164 ( #931 )
2026-05-05 16:20:02 +02:00
resource_test.go
mcp/Resource: Refactor URI Template Matching with uritemplate Library ( #100 )
2025-07-08 15:52:54 -04:00
sampling_test.go
mcp: export ClientSessionOptions.ProtocolVersion ( #1127 )
2026-08-03 15:29:52 +02:00
schema_cache.go
perf: add schema caching to avoid repeated reflection ( #685 )
2026-01-20 20:16:46 -05:00
schema_cache_test.go
all: modernize code ( #868 )
2026-03-31 10:58:02 +02:00
server.go
mcp: allow restricting the protocol versions a server supports ( #1199 )
2026-08-28 16:06:10 +02:00
server_example_test.go
mcp: add docs for tier 1 assessment ( #1195 )
2026-08-24 12:00:59 +02:00
server_test.go
mcp: allow restricting the protocol versions a server supports ( #1199 )
2026-08-28 16:06:10 +02:00
session.go
mcp: allow restricting the protocol versions a server supports ( #1199 )
2026-08-28 16:06:10 +02:00
shared.go
mcp: allow restricting the protocol versions a server supports ( #1199 )
2026-08-28 16:06:10 +02:00
shared_test.go
mcp: update return meta in DiscoverResult (SEP-2575) ( #1097 )
2026-07-16 16:10:12 +02:00
sse.go
mcp: limit SSE discover supportedVersions to SSE-defined revisions ( #1121 )
2026-08-05 15:36:22 +02:00
sse_example_test.go
mcp: add docs for tier 1 assessment ( #1195 )
2026-08-24 12:00:59 +02:00
sse_test.go
mcp: allow restricting the protocol versions a server supports ( #1199 )
2026-08-28 16:06:10 +02:00
streamable.go
mcp: preserve single-request batch responses ( #1214 )
2026-08-31 12:00:32 +02:00
streamable_bench_test.go
all: modernize code ( #868 )
2026-03-31 10:58:02 +02:00
streamable_client.go
mcp: do not call DELETE for sessionless & doc adjustments ( #960 )
2026-05-15 21:47:34 +02:00
streamable_client_test.go
mcp: tolerate 404 on subscriptions/listen in stateless mode ( #1193 )
2026-08-25 14:27:37 +02:00
streamable_example_test.go
mcp: add 2026-07-28 to the supported protocol versions ( #1020 )
2026-06-24 12:02:56 +02:00
streamable_headers.go
mcp: fix ListTools panic and null normalization on malformed tools ( #1120 )
2026-07-30 10:06:14 +02:00
streamable_headers_test.go
mcp: fix ListTools panic and null normalization on malformed tools ( #1120 )
2026-07-30 10:06:14 +02:00
streamable_server.go
mcp: simplify stream state management in streamable transport
2025-12-10 13:28:25 -05:00
streamable_test.go
mcp: preserve single-request batch responses ( #1214 )
2026-08-31 12:00:32 +02:00
tool.go
mcp: add docs for tier 1 assessment ( #1195 )
2026-08-24 12:00:59 +02:00
tool_example_test.go
mcp: add docs for tier 1 assessment ( #1195 )
2026-08-24 12:00:59 +02:00
tool_test.go
mcp: tool.InputSchema and tool.OutputSchema validation (SEP-2106) ( #1009 )
2026-06-16 13:55:47 +02:00
transport.go
mcp: allow restricting the protocol versions a server supports ( #1199 )
2026-08-28 16:06:10 +02:00
transport_example_test.go
mcp: update return meta in DiscoverResult (SEP-2575) ( #1097 )
2026-07-16 16:10:12 +02:00
transport_test.go
mcp: allow restricting the protocol versions a server supports ( #1199 )
2026-08-28 16:06:10 +02:00
util.go
all: use case-sensitive JSON unmarshaling ( #807 )
2026-02-18 16:38:36 +01:00