Skip to content

Spec coverage

Protocol revision 2026-07-28.

  • Streamable HTTP via @modelcontextprotocol/server createMcpHandler (stateless, no Mcp-Session-Id). Opt in to legacy 2025 handling explicitly; strict reject is the default. Note that the SDK client 2.0.0 still sends the initialize handshake 2026-07-28 removed, so reaching today’s clients means setting legacy: 'stateless'.
  • Standard routing headers are validated against the body before scope selection. Missing or dishonest Mcp-Method / Mcp-Name is HTTP 400 before any tool is chosen.
  • RFC 9728 Protected Resource Metadata, plus Bearer on every request.
  • RFC 8707 resource indicators. The audience is your public MCP URL.
  • Declarative per-capability scopes with HTTP 403 insufficient_scope step-up (SEP-2243). Base64 sentinel names are decoded before lookup.
  • Prefer an AS that supports CIMD. DCR is deprecated in this revision, and it still works if you publish registration_endpoint.

The Python package runs the same policy and routing fixtures. Per-capability scope step-up is npm-only, because the official Python SDK exposes only global HTTP scope requirements. See Scopes and step-up.

CI covers Node 24 and 26, and Python 3.10, 3.12 and 3.13.

MIT, for both packages.