Skip to content

mcp: the 2026-07-28 spec went stateless and added routing headers, which changes several open issues #148

Description

@blitzcrieg1

What changed upstream

MCP shipped a 2026-07-28 specification that moves the protocol from stateful to stateless and adds required headers on the Streamable HTTP transport.

  • MCP-Protocol-Version is required, and must match the value in the body's _meta
  • Mcp-Method is required on every request, for example Mcp-Method: tools/call
  • Mcp-Name is required for tools/call, resources/read and prompts/get, for example Mcp-Name: search
  • Servers reject requests where the headers and the body disagree
  • A server may annotate a tool parameter with x-mcp-header, and a conforming client then mirrors that argument's value into an Mcp-Param-{Name} header

The stated purpose is that a gateway can route without parsing the body. Cloudflare One already detects MCP traffic using exactly these headers.

What it means here

Nothing in this repository knows about protocolVersion. parse_initialize_result captures serverInfo.version and capabilities.tools.listChanged and stops there. #111 proposed keying baselines partly on protocolVersion without anything capturing it.

The stateless change undercuts an assumption in the proxy. mcp_audit_proxy correlates with a per-process session id:

_SESSION_ID = uuid.uuid4().hex   # ties every tool call in this MCP connection together

That is correct for stdio, where one process is one connection. It is not obviously correct for a stateless HTTP transport where requests are independent and routable. Correlation is the whole product, so this needs an answer before #112 lands rather than after.

Consequences for open issues

New surface worth its own thought

x-mcp-header lets a server cause a client to copy an argument value into an HTTP header. Two things follow:

  1. Argument values that this project deliberately hashes at the hook boundary may travel in cleartext headers on the wire, outside the hashing.
  2. A server choosing which arguments get mirrored into headers is a server influencing where data goes. That is a data-movement decision made by the least trusted party in the exchange.

Neither is a detection today. The second looks like the same family as the rug pull: a legitimate protocol feature that becomes an exfil channel when the server is hostile.

Not urgent, but not ignorable

Nothing breaks today. The proxy is stdio-only and the stdio transport is unaffected by the header rules. This matters at the moment #112 is picked up, and it should be read before that design is written rather than discovered during it.

Source

TL;DR sec #343, 2026-08-27, reporting Cloudflare One's MCP detection. Spec details verified against the MCP 2026-07-28 specification rather than taken from the newsletter.

Activity

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions