You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: client subscriptions/listen; ADR-025 shim cut; final release-prep reconciliation
- Client-side subscriptions/listen: McpClient::subscriptions_listen(filter)
on 2026 connections, via the new additive
Transport::send_request_streaming (Streamable HTTP implements it; default
is unsupported for non-HTTP transports). Consumes/validates the mandatory
acknowledgement first; SubscriptionStream exposes the honored filter +
subscription id and yields notifications; drop = close = cancellation.
e2e: real client <-> real server, cross-request broadcast, only the
opted-in type arrives, stamped with the subscription id.
- ADR-025 framework shim cut: the four non-frozen framework crates (+ the
2026-default middleware-auth-lambda example) depend on turul-rpc directly
(146 path swaps; shim mirrors turul-rpc paths 1:1, identical types — no
public API change; cargo tree confirms turul-mcp-server is shim-free).
Shim stays in-workspace for the frozen 2025 snapshots and 2025-pinned
test/example crates only, manifest repinned to the terminal 0.3.47
(the 0.4.0 sweep value was never publishable). ADR-025 revision log
records the cut; ADR-027 records the 2025 regression lane as the
per-crate matrix (workspace-wide flag sweeps trip the spec mutex by
design — closure by revision with rationale).
- Release-readiness review: final status banner with the true remaining
exceptions only (audit-journal P2 lows, requestState integrity =
tool-author concern, cyclic/non-local $ref = documented rejections,
client-side CIMD = future OAuth client flow, final disposition =
maintainer's call per the Branch Lock).
Copy file name to clipboardExpand all lines: CHANGELOG.md
+3Lines changed: 3 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -37,6 +37,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
37
37
38
38
### Added (2026-06-10, release-prep sweep)
39
39
40
+
-**Client-side `subscriptions/listen`** — `McpClient::subscriptions_listen(filter)` (2026 connections only) opens the long-lived stream via a new additive `Transport::send_request_streaming` (Streamable HTTP implements it; other transports default to unsupported). The client consumes and validates the mandatory acknowledgement first and returns a `SubscriptionStream` exposing the honored filter subset and the subscription id, then yields each notification; dropping the stream closes it (= cancellation per Streamable HTTP). e2e: real client ↔ real server — open stream, trigger server-wide broadcasts from a second request, receive only the opted-in type stamped with the subscription id.
41
+
-**ADR-025 framework shim cut landed** — `turul-mcp-server`/`turul-http-mcp-server`/`turul-mcp-builders`/`turul-mcp-aws-lambda` now depend on `turul-rpc` directly (146 path swaps; the shim mirrors `turul-rpc` paths 1:1 and re-exports the same types, so no public API changed). The shim remains in-workspace solely for the frozen 2025 protocol snapshots and 2025-pinned test/example crates, with its manifest restored to the terminal `0.3.47` (the mechanical 0.4.0 sweep value was never publishable). ADR-025/ADR-027 revision logs updated; the 2025 regression lane is recorded as the per-crate matrix (a workspace-wide flag sweep trips the spec mutex by design).
42
+
40
43
-**MRTR on `resources/read` and `prompts/get`** — completes the SEP-2322 triple (the only methods permitted to return `input_required`). The conversion + client-capability gate is now one shared helper (`handlers::input_required_to_result`, also adopted by `tools/call`). Resources surface the retry's `inputResponses`/`requestState` via the session extensions (same as tools); prompts receive them in the render args under reserved `io.modelcontextprotocol/*` keys, because `McpPrompt::render` has no session parameter and changing it would break the public trait (documented on the trait; reserved-namespace keys cannot collide with wire prompt arguments, which are plain strings). Tests: two-leg round trips for both methods + a `-32003`/400 capability-gate case on `resources/read` (all real-HTTP; the handlers previously leaked the sentinel to `-32603`).
41
44
-**`resources.subscribe` capability truthfulness** — with `subscriptions/listen` serving per-URI `resources/updated`, both capability-construction sites now advertise `subscribe: true` on the 2026 lane (still `false` on 2025, which has no `resources/subscribe` handler). Wire test asserts the `server/discover` advertisement.
42
45
-**`completion/complete` e2e coverage** — sessionless dispatch + `CompleteResult` wire shape (`completion.values`) + capability advertisement, closing the last zero-e2e core method on the 2026 path.
0 commit comments