Skip to content

[Major-1] Dual-stack stateless core protocol #5679

Description

@Lang-Akshay

Part of #5677

Spec link: https://modelcontextprotocol.io/specification/2026-07-28/changelog
Comprised of: Major change 2 (remove initialize handshake) + Major change 3 (server/discover) — SEP-2575

What the spec says

  • The initialize/notifications/initialized handshake is removed entirely.
  • Every request now carries its protocol version and client capabilities in _meta under the keys io.modelcontextprotocol/protocolVersion and io.modelcontextprotocol/clientCapabilities.
  • Clients SHOULD identify themselves on each request via io.modelcontextprotocol/clientInfo; servers SHOULD identify themselves in each result's _meta via io.modelcontextprotocol/serverInfo.
  • Version mismatches return UnsupportedProtocolVersionError (renumbered to -32022 — see [Minor-3] Error code alignment #5686).
  • Servers MUST implement the new server/discover RPC to advertise their supported protocol versions, capabilities, and identity. Clients MAY call it before any other request for up-front version selection, or use it as a backward-compatibility probe on STDIO.

Gateway work (dual-stack)

  • Dialect detection on the client-facing side: first request initialize → legacy path (respond with InitializeResult, mint facade session); request carrying _meta protocol version or server/discover → modern stateless path.
  • Upstream probing: call server/discover on connect; success → modern upstream (cache versions/capabilities in registry with a dialect field and re-probe on errors); method-not-found → legacy upstream, run the handshake with a gateway-owned session.
  • Translation core: modern client → legacy upstream (strip _meta protocol fields, map per-request capabilities onto the connect-time session); legacy client → modern upstream (fabricate InitializeResult from cached server/discover data, inject the three _meta client keys on every forwarded request, return serverInfo mapping).
  • Capability reconciliation layer between server/discover and InitializeResult shapes; filter capabilities that cannot be bridged across dialects.
  • Implement server/discover (MUST) on the gateway's server side, advertising both dialects.

Acceptance criteria

  • All four dialect combinations (legacy/modern client × legacy/modern upstream) pass integration tests.
  • server/discover returns correct versions, capabilities, and identity.
  • _meta validated on every modern-path request; -32022 returned on unsupported versions.
  • No behavioral change for existing legacy clients.

Activity

  1. added
    rustRust programming
    CF-EXTERNAL-DATAPLANEExternal dataplane which can extend ContextForge functionality.
    mcp-2026-07-28Issues related to compliance with MCP 2026-07-28
    on Jul 17, 2026
  2. self-assigned this
    on Jul 30, 2026
  3. cafalchio commented on Aug 10, 2026

    @cafalchio
    Collaborator

    @Lang-Akshay
    Server/discover will return the list of resources, which in our case, are the configured resources configured in the virtual server. It is not mandatory anymore for server/client communication and it should be implemented only in control plane.

  4. added
    2.0CF1.5 with the bolt on external data plane + Redis as a communication channel
    and removed
    triageIssues / Features awaiting triage
    on Aug 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    2.0CF1.5 with the bolt on external data plane + Redis as a communication channelCF-EXTERNAL-DATAPLANEExternal dataplane which can extend ContextForge functionality.mcp-2026-07-28Issues related to compliance with MCP 2026-07-28rustRust programming

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions