Recoordinate
2732839dba
mcp: prune completed listen request IDs from the session ( #1190 )
...
### Problem
`ServerSession` tracks the request IDs of in-flight
`subscriptions/listen` streams so `Close` can cancel the parked handlers
and avoid the jsonrpc2 drain deadlock. The ID is appended when the
listen starts, but it is never removed when the listen handler returns.
Every completed listen stream (peer cancel, unsubscribe, stream break)
therefore leaves one stale entry in the session for its entire lifetime.
On a long-lived session where a client repeatedly subscribes and
unsubscribes, the slice grows without bound: one leaked entry per cycle.
`Close` calls `jsonrpc2.Connection.Cancel` on each recorded ID, and a
stale ID is a no-op there today, but the bookkeeping is meant to hold
only in-flight listens and currently never shrinks.
### Change
Drop the request ID from the session's bookkeeping when the listen
handler returns, matching the lifecycle of the in-flight handler that
owns it.
### Tests
Three tests reproduce the leak, failing on `main` and passing here:
- `TestListenPrunedAfterSingleCompletion`
- `TestListenIDsDoNotAccumulate`
- `TestListenIDsLeakViaPublicSubscribeUnsubscribe`
The third exercises the leak through the public
`Subscribe`/`Unsubscribe` API. `go test ./mcp/` passes.
---------
Co-authored-by: Guglielmo Colombo <guglielmoc@google.com>
2026-08-25 17:15:09 +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: bump protocol version from 2026-06-30 to 2026-07-28 ( #1015 )
2026-06-22 09:53:04 +02:00
mrtr_test.go
mcp: export ClientSessionOptions.ProtocolVersion ( #1127 )
2026-08-03 15:29:52 +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: prune completed listen request IDs from the session ( #1190 )
2026-08-25 17:15:09 +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: export ClientSessionOptions.ProtocolVersion ( #1127 )
2026-08-03 15:29:52 +02:00
session.go
mcp: support stateless streamable sessions ( #277 )
2025-08-11 16:43:46 -04:00
shared.go
mcp: update return meta in DiscoverResult (SEP-2575) ( #1097 )
2026-07-16 16:10:12 +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: limit SSE discover supportedVersions to SSE-defined revisions ( #1121 )
2026-08-05 15:36:22 +02:00
streamable.go
mcp: tolerate 404 on subscriptions/listen in stateless mode ( #1193 )
2026-08-25 14:27:37 +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: allow asynchronous cancel notification ( #1151 )
2026-08-07 10:43:17 +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 asynchronous cancel notification ( #1151 )
2026-08-07 10:43:17 +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
fix(jsonrpc2): decode requests when method key is present ( #1000 )
2026-06-16 09:57:18 +02:00
util.go
all: use case-sensitive JSON unmarshaling ( #807 )
2026-02-18 16:38:36 +01:00