mcp: aim at the draft spec #414

Open
opened 2026-08-17 15:47:58 +00:00 by hexajon · 2 comments
Owner
latest draft changes here: https://modelcontextprotocol.io/specification/draft/changelog
Author
Owner

Digest of the draft changelog as of 2026-07-14 (changes since 2025-11-25). It is a large, breaking revision. Several planned madtea features aim at surfaces the draft removes or replaces. Impact per issue:

Directly re-aims open issues

  • #6 (elicitation): server-initiated elicitation/create is replaced by the Multi Round-Trip Requests (MRTR) pattern (SEP-2322). The server returns an InputRequiredResult (resultType: "input_required") whose inputRequests carries what it needs, and the client retries the original request with inputResponses. notifications/elicitation/complete and elicitationId (both added 2025-11-25) are already removed again. Design confirmation flows MRTR-shaped, not against old elicitation.
  • #7 (list_changed on madt_enable): the notification transport changes. resources/subscribe/unsubscribe and the HTTP GET stream are replaced by a single subscriptions/listen stream with per-type opt-in (toolsListChanged, ...). For stdio today the old notification still matters, but the guarantee we build should isolate the "announce tool-list change" seam, so the transport swap stays contained.
  • #412 epic: scope should note the draft's headline: stateless MCP. No initialize handshake (version, identity, and capabilities ride in _meta per request), a new mandatory server/discover RPC, protocol-level sessions and Mcp-Session-Id removed, SSE resumability removed.
  • #411 (icons): unaffected by this changeset. Icons (2025-11-25) carry forward.

Deprecations that constrain design (SEP-2577)

Logging, Sampling, and Roots are deprecated. Migration guidance: stderr (stdio) or OpenTelemetry instead of Logging. Two consequences here: (a) never build features on notifications/message (relevant to #70's error-surfacing workaround, whose stderr choice is the spec-sanctioned one; this also validates the #410 serve.log/stderr instrumentation); (b) logging/setLevel is gone, so log level rides in _meta (io.modelcontextprotocol/logLevel), and servers MUST NOT emit log notifications for requests that did not set it.

Smaller items worth tracking

  • All results carry a required resultType field ("complete" / "input_required").
  • tools/list SHOULD return tools in deterministic order (client caching plus LLM prompt-cache hits). This is cheap to guarantee now, and worth a test.
  • New CacheableResult interface: ttlMs plus cacheScope required on tools/list, prompts/list, resources/list, and read results.
  • Error-code allocation policy: -32000..-32019 implementation-defined, -32020..-32099 reserved for the spec. Resource-not-found moved -32002 to -32602.
  • extensions field on capabilities. Tasks moved out of core into the io.modelcontextprotocol/tasks extension (polling tasks/get, no more blocking tasks/result).
  • OTel trace-context propagation conventions for _meta (traceparent/tracestate/baggage).

Caveat for sequencing: this is a DRAFT. The client I target speaks 2025-06-18/2025-11-25 today, and the go-sdk tracks released revisions. "Aim at draft" should mean: keep seams where the draft moves (elicitation to MRTR, notifications to subscriptions/listen, no new Logging/Sampling/Roots surface), pick up the free wins now (deterministic tool order), and avoid building anything the draft already deletes.

Digest of the draft changelog as of 2026-07-14 (changes since 2025-11-25). It is a **large, breaking revision**. Several planned madtea features aim at surfaces the draft removes or replaces. Impact per issue: ## Directly re-aims open issues - **#6 (elicitation)**: server-initiated `elicitation/create` is replaced by the **Multi Round-Trip Requests (MRTR)** pattern (SEP-2322). The server returns an `InputRequiredResult` (`resultType: "input_required"`) whose `inputRequests` carries what it needs, and the client retries the original request with `inputResponses`. `notifications/elicitation/complete` and `elicitationId` (both added 2025-11-25) are already removed again. Design confirmation flows MRTR-shaped, not against old elicitation. - **#7 (list_changed on madt_enable)**: the notification transport changes. `resources/subscribe`/`unsubscribe` and the HTTP GET stream are replaced by a single `subscriptions/listen` stream with per-type opt-in (`toolsListChanged`, ...). For stdio today the old notification still matters, but the guarantee we build should isolate the "announce tool-list change" seam, so the transport swap stays contained. - **#412 epic**: scope should note the draft's headline: **stateless MCP**. No `initialize` handshake (version, identity, and capabilities ride in `_meta` per request), a new mandatory `server/discover` RPC, protocol-level sessions and `Mcp-Session-Id` removed, SSE resumability removed. - **#411 (icons)**: unaffected by this changeset. Icons (2025-11-25) carry forward. ## Deprecations that constrain design (SEP-2577) **Logging, Sampling, and Roots are deprecated.** Migration guidance: stderr (stdio) or OpenTelemetry instead of Logging. Two consequences here: (a) never build features on `notifications/message` (relevant to #70's error-surfacing workaround, whose stderr choice is the spec-sanctioned one; this also validates the #410 serve.log/stderr instrumentation); (b) `logging/setLevel` is gone, so log level rides in `_meta` (`io.modelcontextprotocol/logLevel`), and servers MUST NOT emit log notifications for requests that did not set it. ## Smaller items worth tracking - All results carry a required `resultType` field (`"complete"` / `"input_required"`). - `tools/list` SHOULD return tools in **deterministic order** (client caching plus LLM prompt-cache hits). This is cheap to guarantee now, and worth a test. - New `CacheableResult` interface: `ttlMs` plus `cacheScope` required on tools/list, prompts/list, resources/list, and read results. - Error-code allocation policy: `-32000..-32019` implementation-defined, `-32020..-32099` reserved for the spec. Resource-not-found moved `-32002` to `-32602`. - `extensions` field on capabilities. Tasks moved out of core into the `io.modelcontextprotocol/tasks` extension (polling `tasks/get`, no more blocking `tasks/result`). - OTel trace-context propagation conventions for `_meta` (`traceparent`/`tracestate`/`baggage`). Caveat for sequencing: this is a DRAFT. The client I target speaks 2025-06-18/2025-11-25 today, and the go-sdk tracks released revisions. "Aim at draft" should mean: keep seams where the draft moves (elicitation to MRTR, notifications to `subscriptions/listen`, no new Logging/Sampling/Roots surface), pick up the free wins now (deterministic tool order), and avoid building anything the draft already deletes.
Author
Owner

Dependency check (2026-07-14): madtea builds against go-sdk v1.6.1, the latest stable (go list -m -u offers no upgrade). Upstream has v1.7.0-pre.1 and -pre.2 cut. Diffing the module payloads shows the pre-releases are the draft-spec vehicle: new mcp/mrtr.go (Multi Round-Trip Requests, SEP-2322, the surface #6's confirmations should target), new mcp/cache.go (CacheableResult ttlMs/cacheScope), SEP-2596 deprecation markers (Logging/Sampling/Roots), and broad churn across server, streamable, and protocol.

Plan: stay on stable for shipped binaries (pre-releases do not belong in release artifacts, and today's clients do not speak the draft revision anyway). Adopt v1.7.0 the moment it goes stable. That upgrade is the natural kickoff for #6 (MRTR-shaped confirmations) and for re-verifying #7's list_changed guarantee against the new subscription model.

Dependency check (2026-07-14): madtea builds against go-sdk **v1.6.1, the latest stable** (`go list -m -u` offers no upgrade). Upstream has `v1.7.0-pre.1` and `-pre.2` cut. Diffing the module payloads shows the pre-releases are the draft-spec vehicle: new `mcp/mrtr.go` (Multi Round-Trip Requests, SEP-2322, the surface #6's confirmations should target), new `mcp/cache.go` (`CacheableResult` ttlMs/cacheScope), SEP-2596 deprecation markers (Logging/Sampling/Roots), and broad churn across server, streamable, and protocol. Plan: stay on stable for shipped binaries (pre-releases do not belong in release artifacts, and today's clients do not speak the draft revision anyway). Adopt v1.7.0 the moment it goes stable. That upgrade is the natural kickoff for #6 (MRTR-shaped confirmations) and for re-verifying #7's list_changed guarantee against the new subscription model.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
sixfold-space/madtea#414
No description provided.