MCP Fusion/Protocol and runtime/MCP 2.0 compliance
MCP 2.0 compliance
What the framework implements from protocol revision 2026-07-28: stateless transport, structured content, MRTR elicitation, list caching SEP-2549, request state sealing SEP-2322, header routing and the deprecation registry.
MCP Fusion targets protocol revision 2026-07-28 as its default and carries a written deprecation registry, because a protocol that changes under your server is an operational risk. This page is the compliance map: what is implemented, what was removed, and what the framework refuses to do.
Structured content
ToolResponse carries the MCP 2.0 structuredContent field alongside the text content. successStructured(data) sets both: the machine-readable object and a JSON text block for older clients. Pair it with .withOutputSchema(schema) to publish the output contract on the tool definition. Note that Presenters produce the text shape documented in Wire format; structuredContent is the parallel parsed channel, not a Presenter output.
Multi Round-Trip Requests
The 2025 server-initiated request model does not survive serverless. The 2026 answer is return-based: a handler returns that it needs input, the client fulfills it and re-enters. MCP Fusion exposes it as requireInput(), readInput(), the ask.* field descriptors and .interactive() on a tool, all documented in Streaming and cancellation. The driver supports both eras: on a 2026 connection the framework emits the input-required response as-is and the SDK drives the retry; on a persistent 2025 connection it fulfills the request itself over the live channel; with no channel the call degrades to ELICITATION_UNSUPPORTED, and the loop is capped.
List caching (SEP-2549)
List results can carry cache metadata for any proxy in front of your connector. Configure it once:
attachToServer(server, {
listCacheTtlMs: 300_000, // default: 5 minutes
listCacheScope: 'private', // or 'public' for shared data
});The metadata is placed at the result root, per this revision's layout, on tools/list, prompts/list, resources/list and resources/templates/list. Setting listCacheTtlMs to zero removes it with no overhead. This is protocol-level caching of the list; it is not the tool-level staleness signaling of State sync.
Request state sealing (SEP-2322)
When a server round-trips continuation state through a client, that state must not be forgeable. Provide a key at startup:
startServer(registry, {
transport: 'http',
requestStateKey: process.env.REQUEST_STATE_KEY, // 32 bytes or more
});sealRequestState(payload) then mints an HMAC-SHA256 sealed token with an expiry, and the server verifies every incoming sealed state before re-entering a handler. Without a key the framework falls back to plain JSON serialization and marks it untrusted in the docs: safe for a non-sensitive continuation, not for identity.
Header routing and x-mcp-header
The stateless transport routes requests by Mcp-Method and Mcp-Name headers instead of a session, which is what lets any instance behind a round-robin load balancer serve any call. A parameter can also be mirrored into an HTTP header: .withHeaderParam('tenant', 'X-Tenant') annotates the schema with x-mcp-header and the client sends it as Mcp-Param-X-Tenant, so infrastructure can route without parsing bodies. Parameters published this way must not be secrets; the framework throws on an empty header name and documents the RFC 9110 token constraint.
Change notifications
Four list and resource events are wired: notifications/tools/list_changed (FSM transitions, handoff, hot reload), notifications/prompts/list_changed, notifications/resources/updated and notifications/resources/list_changed. On MCP 2.0 the subscriptions/listen stream registers a filter and acknowledges it, so a client subscribes once and receives only the event classes it asked for.
The deprecation registry
| Feature | Status in MCP Fusion |
|---|---|
| Roots | never implemented (client-side feature); no flag exists |
| Sampling | accepted only in the YAML schema and marked deprecated with a validation warning; no first-class API |
Logging (notifications/message) | never implemented; superseded by the telemetry sinks and OpenTelemetry |
| Dynamic Client Registration | deferred to the SDK and the OAuth package; the documented path is Client ID Metadata Documents |
| HTTP + SSE transport | not selectable: the transport type is stdio, http or stateless |
includeContext | not exposed anywhere |
Imperative ask() | removed in v5; replaced by MRTR requireInput() |
Deprecation policy is honest about style: features with no server-side meaning are simply absent, discouraged features warn at validation, and removed features are gone rather than silently degraded. The published removal window for the deprecated set is 2027-07-28.
Discovery artifacts
On http and stateless, the server answers /.well-known/mcp/server-card.json with a server card: schema URL, version, protocol version, server info, transport (streamable-http with endpoint /mcp, or stdio), declared capabilities and the tool entries. It is compiled once at startup and served with a five-minute public cache header. Read the internals in Introspection.
Error codes handled by the SDK
The revision defines protocol-level codes for header mismatch, a missing required client capability and an unsupported protocol version. They are emitted by the SDK v2 server layer beneath the framework; the framework's own error contract is the <tool_error> envelope documented in Errors.
Next steps
- Runtime architecture: the transports in practice
- Introspection: server card and manifest
- Streaming and cancellation: MRTR in detail
