# MCP 2026-07-28 spec: every breaking change, with fixes · Stacktree

Source: https://stacktr.ee/blog/mcp-2026-spec-changes

[Skip to content](#main) [Stacktree](/)[Developers](/developers)[Agents](/agents)[Docs](/docs)[Use cases](/use-cases)[Pricing](/pricing)[Blog](/blog)[Dashboard](https://app.stacktr.ee)[Sign in →](https://app.stacktr.ee)      By [ Steve Smith ](/about) · Founder, Stacktree  ·  Last updated July 28, 2026          blog · MCP

#  What changed in the 2026-07 MCP specification.

   The 2026-07-28 specification, final as of July 28, is the biggest MCP revision since launch: a stateless core, response caching, an extensions framework, MCP Apps, a redesigned Tasks extension, and a formal deprecation policy. Here is what each change means and why it matters.

  [ Get started free ](https://app.stacktr.ee/?join=1&from=seo_blog_mcp_2026_spec_changes)   install npx stacktree-install
Copy
     No card · 3 pages free · about a minute

##  What is the 2026-07-28 MCP specification?

The 2026-07-28 specification is the current version of the Model Context Protocol, published as final on July 28, 2026. It was locked as a release candidate on May 21, 2026 and validated for ten weeks by SDK maintainers and client implementers before publication. It replaces 2025-11-25. MCP versions are date-stamped to mark the last date backwards-incompatible changes were made.

## On this page

  -   01  [ A version, not a publish date ](#version-not-a-date)
-   02  [ What breaks and what stays compatible ](#breaks-vs-stays)
-   03  [ The stateless core ](#stateless-core)
-   04  [ Transport headers and routing ](#transport-headers)
-   05  [ Response caching ](#response-caching)
-   06  [ Extensions, MCP Apps, and Tasks ](#extensions)
-   07  [ Elicitation, sampling, and Multi Round-Trip ](#mrtr)
-   08  [ Authorization alignment ](#authorization)
-   09  [ The deprecation policy ](#deprecation)
-   10  [ What this means for builders ](#what-it-means)
       Update, 28 July 2026: the specification shipped as final on schedule. This post now describes the published text rather than the release candidate.

## A version, not a publish date

 The first thing to get right is the date itself. MCP uses string-based version identifiers in the format YYYY-MM-DD to indicate the last date backwards-incompatible changes were made. So 2026-07-28 is a version label, not the day a blog post went up.

 It is shipped now. The release candidate was locked on May 21, 2026, the roughly ten-week gap was a validation window for SDK maintainers and client implementers to test the changes against real workloads, and the final specification published on July 28, 2026, as scheduled. 2026-07-28 replaces 2025-11-25 as the current version. Everything below describes the published specification. One addition landed between the release candidate and this description: every result now carries a required `resultType` field, `"complete"` for ordinary results and `"input_required"` for Multi Round-Trip interim results, with results from earlier-protocol servers treated as complete (SEP-2322).

## What breaks and what stays compatible

 At a glance: what the 2026-07-28 specification breaks, what it only deprecates (so it stays in the spec for a year or more), and what stays compatible with a new field or two. Each row is explained in detail in the sections below.

     Change Status What to do     Sessions and the `Mcp-Session-Id` header (SEP-2567) Breaking Drop shared session stores; mint explicit handles and pass them as ordinary tool arguments.   The `initialize` handshake (SEP-2575) Breaking Read protocol version and capabilities from `_meta` on every request; implement `server/discover`.   Blocking `tasks/result` (SEP-2663) Breaking for Tasks users Move to the Tasks extension and poll via `tasks/get`.   `tools/list`, `resources/list`, `prompts/list` Compatible, new fields Endpoints no longer vary per connection; add `ttlMs` and `cacheScope` to enable caching.   Roots, Sampling, Logging (SEP-2577) Deprecated, not removed Stay in the spec at least twelve months; avoid building new hard dependencies on them.   HTTP+SSE transport (SEP-2596) Deprecated, not removed Migrate to Streamable HTTP within the deprecation window.

## The stateless core

 The headline change is that MCP becomes stateless at the protocol layer. The maintainers frame this as six Specification Enhancement Proposals (SEPs) working together to complete the plan laid out in late 2025.

 Two SEPs carry most of the weight:

  - Sessions removed (SEP-2567). Protocol-level sessions and the Mcp-Session-Id header are gone from the Streamable HTTP transport. The list endpoints (tools/list, resources/list, prompts/list) no longer vary per connection. Servers that need cross-call state now mint explicit, server-issued handles passed as ordinary tool arguments. The practical payoff: no more sticky routing or shared session stores for horizontal deployments.
 - Handshake removed (SEP-2575). The initialize and notifications/initialized exchange is gone. Every request now carries its protocol version, client identity, and client capabilities in _meta (under keys such as io.modelcontextprotocol/protocolVersion, /clientInfo, and /clientCapabilities). Version mismatches return an UnsupportedProtocolVersionError. A new server/discover RPC, which servers MUST implement, advertises supported protocol versions, capabilities, and identity. Clients MAY call it for up-front version selection or as a STDIO backwards-compatibility probe.

## Transport headers and routing

 Stateless servers still have to live behind load balancers, gateways, and rate-limiters. SEP-2243 makes that work cleanly by requiring two standard headers on Streamable HTTP POST requests: `Mcp-Method` and `Mcp-Name`. With the operation named in the headers, infrastructure can route and rate-limit on the operation without inspecting the request body. A server can run behind a plain round-robin load balancer instead of deep packet inspection. The same SEP adds support for custom headers from tool parameters via `x-mcp-header`.

## Response caching

 SEP-2549 introduces a new `CacheableResult` interface and requires two fields on the results of `tools/list`, `prompts/list`, `resources/list`, `resources/read`, and `resources/templates/list`:

  - ttlMs is a freshness hint in milliseconds. Clients can cache the response and reduce polling.
 - cacheScope is either "public" or "private" and controls whether shared intermediaries may cache the response.
  The model is borrowed from HTTP `Cache-Control`, and it complements the existing `listChanged` notifications rather than replacing them. For a stateless protocol where list endpoints are now connection-independent, caching is how clients avoid re-fetching the same tool catalogue on every call.

## Extensions, MCP Apps, and Tasks

 Extensions become a first-class capability. An `extensions` field is added to both `ClientCapabilities` and `ServerCapabilities`, and the two sides negotiate optional extensions beyond the core protocol through that map. Two notable features ship as extensions under this framework.

 MCP Apps (SEP-1865) lets servers ship interactive HTML interfaces that hosts render in a sandboxed iframe. Tools declare their UI templates ahead of time, so hosts can prefetch, cache, and security-review them before anything runs. UI-initiated actions go through the same JSON-RPC audit and consent path as a direct tool call, which keeps the security model intact. MCP Apps has been Final since January 26, 2026, when it shipped as the first official extension; we cover what it standardizes, and [where the HTML lives](/blog/mcp-apps-html-ui), separately. The published specification names Enterprise Managed Authorization (EMA) as a further extension in the same framework, alongside MCP Apps and Tasks.

 Tasks (`io.modelcontextprotocol/tasks`, SEP-2663) handles long-running work. Tasks first shipped as an experimental core feature in 2025-11-25, but production use led to moving it out of the core protocol and into an official extension. The redesign:

  - replaces the blocking tasks/result method with polling via tasks/get,
 - adds tasks/update for client-to-server input,
 - removes tasks/list, and
 - lets servers return task handles unsolicited, without per-request opt-in.

## Elicitation, sampling, and Multi Round-Trip

 In the released 2025-11-25 spec, a server can pause mid-operation to ask for input. Elicitation (`elicitation/create`) requests structured input from the user; its result carries an `action` of `accept`, `decline`, or `cancel`, plus a `content` object on accept. Elicitation supports a `form` mode and a `url` mode, with hard safety rules: servers MUST NOT use form mode for sensitive credentials such as passwords or API keys, and MUST use URL mode for those instead.

 Sampling (`sampling/createMessage`) lets a server request an LLM completion from the client, nesting LLM calls inside other server features to enable agentic behavior. Sampling is human-in-the-loop by design: the client controls model selection (the server never sees API keys), can review and edit the prompt, and can deny the request. Model selection uses an advisory preference system (`modelPreferences` with `hints` and `costPriority`, `speedPriority`, `intelligencePriority`).

 The 2026-07-28 specification changes how these server-initiated requests are delivered. Rather than the server opening a request channel back to the client (and holding a connection open), SEP-2322 introduces the Multi Round-Trip Requests (MRTR) pattern. The field names below come from the published 2026-07-28 schema:

  - A call to tools/call, prompts/get, or resources/read can return an InputRequiredResult (a new resultType of input_required) instead of completing.
 - That result carries inputRequests, a map of server-initiated requests the client must fulfill (each one a full elicitation or sampling request), plus an opaque requestState the client must echo back unmodified.
 - The client gathers the answers and re-issues the original call with inputResponses, keyed identically, and the echoed requestState.
  Because all the state rides in the payload, any stateless server instance can resume the work. One `InputRequiredResult` can batch an elicitation and a sampling request together in a single round-trip. This is the same load-shedding motivation behind the stateless core: nothing depends on a held connection.

## Authorization alignment

 The 2026-07-28 specification also hardens authorization, aligning it more closely with how OAuth 2.0 and OpenID Connect are deployed in practice, motivated by MCP's single-client, many-server deployment shape. The changes that landed in the published changelog: authorization servers SHOULD include the `iss` parameter in authorization responses, and clients MUST validate a present `iss` against the recorded issuer before redeeming the authorization code (SEP-2468); clients MUST specify an appropriate `application_type` during registration to avoid OpenID Connect redirect URI conflicts (SEP-837); and client credentials are bound to the authorization server that issued them, so clients MUST key persisted credentials by issuer and re-register when the authorization server changes (SEP-2352). Separately, OAuth 2.0 Dynamic Client Registration is formally deprecated as a registration mechanism in favour of Client ID Metadata Documents; it continues to work for backwards compatibility but is slated for removal in a future version.

## The deprecation policy

 For the first time, MCP adopts a formal feature lifecycle and deprecation policy (SEP-2596). It defines three states (Active, Deprecated, Removed) and a registry of deprecated features. The key guarantee is a minimum deprecation window: a feature must remain Deprecated for at least twelve months, measured from the release of the revision that first marks it Deprecated, before it is eligible for removal.

 There is one exception. An expedited removal (for example, a published security advisory or in-the-wild exploitation with no in-place mitigation) can shorten the window, but it must still provide at least ninety days between a feature becoming Deprecated and its earliest removal.

 Under this policy, the 2026-07-28 specification deprecates the Roots, Sampling, and Logging features (SEP-2577) and reclassifies the older HTTP+SSE transport as Deprecated (SEP-2596). Deprecated does not mean gone: these features remain in the specification for at least the twelve-month window.

## What this means for builders

 If you maintain an MCP server, including a publish primitive like Stacktree's [MCP publish tool](/mcp-publish-html), the stateless core is the change to plan for. A server that previously relied on the session header or the initialize handshake will need to read protocol version and capabilities from `_meta`, implement `server/discover`, and attach `ttlMs` and `cacheScope` to its list and read results. Clients now send the `Mcp-Method` and `Mcp-Name` headers on their Streamable HTTP POST requests, so make sure your gateway routes on those headers rather than on session affinity. If you used the experimental Tasks feature, you will move to the extension and switch from blocking `tasks/result` to polling.

 The specification is final, but July 28 is a publish date, not a switch-off: publication does not turn anything off for implementers on 2025-11-25, and the deprecation policy buys at least twelve months for anything being phased out. All four Tier 1 SDKs (TypeScript, Python, Go, and C#) speak 2026-07-28 as of publication day, with migration notes for the breaking parts, the session-identifier removal chief among them. The right move now is to read the final changelog, upgrade in a branch, and avoid new dependencies on anything the specification deprecates.

 Client adoption started the same day: Anthropic announced that support for 2026-07-28 is rolling out across Claude products, with MCP Apps and Tasks shipping under the versioned extensions framework and authorization aligning with enterprise identity systems such as Entra and Okta. Anthropic's connectors directory now counts over 950 connectors, so for server authors the upgrade path is concrete rather than theoretical.

     See it in one call, no account

```
`curl -X POST https://api.stacktr.ee/sites -F file=@index.html
# &rarr; a private URL, live for 24h. Claim it free to keep it.`
```

If your agents emit HTML, they need a durable publish target: publish once, then
`update_site`
on every revision keeps the same URL forever. MCP, REST, and skills all speak it:
        the map is at [agent.txt](https://stacktr.ee/agent.txt).

[
Get an API key free
](https://app.stacktr.ee/?join=1&from=bridge_blog_mcp_2026_spec_changes)   An MCP tool you can call today

 Stacktree is an MCP-native publish primitive: one tool call from Claude Code, Codex, or Cursor returns a private, unguessable link for the page your agent just built. No viewer login, and updates replace the page at the same URL.

  [ Try the publish tool →
](https://app.stacktr.ee/?from=blog_cta_mcp_2026_spec_changes&join=1) Free to try: 3 pages, each live for 7 days. Own domain from $19/mo.
FAQ

## Frequent questions

     Is the 2026-07-28 MCP spec released yet? +  Yes. The 2026-07-28 specification published as final on July 28, 2026, after a ten-week release-candidate validation window that began on May 21. It replaces 2025-11-25 as the current version. Publication is not a switch-off: servers and clients on 2025-11-25 keep working, and anything deprecated stays in the spec for at least twelve months.   What does it mean that MCP is now stateless? +  The 2026-07-28 specification removes protocol-level sessions and the Mcp-Session-Id header from Streamable HTTP. List endpoints no longer vary per connection, and servers that need cross-call state mint explicit handles passed as ordinary tool arguments. This removes the sticky routing and shared session stores that horizontal deployments previously needed.   What are MCP Apps? +  MCP Apps (SEP-1865) is a named extension that lets servers ship interactive HTML interfaces, which hosts render in a sandboxed iframe. Tools declare their UI templates ahead of time so hosts can prefetch, cache, and security-review them. UI actions go through the same audit and consent path as a direct tool call.   Why was the Tasks feature moved to an extension? +  Tasks shipped as an experimental core feature in 2025-11-25, but production use prompted moving it out of the core protocol into an official extension (SEP-2663). The redesign replaces blocking tasks/result with polling via tasks/get, adds tasks/update for client input, removes tasks/list, and lets servers return task handles unsolicited.   Are Roots, Sampling, and Logging being removed from MCP? +  They are deprecated as of the 2026-07-28 specification (SEP-2577), not removed. Under the new lifecycle policy (SEP-2596), a feature must stay Deprecated for at least twelve months from its deprecating revision before it is eligible for removal, so these features remain in the spec for now.   What is the Multi Round-Trip Requests pattern? +  Multi Round-Trip Requests (SEP-2322) replaces server-initiated calls like sampling and elicitation. A server returns an InputRequiredResult carrying inputRequests plus an opaque requestState; the client gathers answers and re-issues the original call with inputResponses. This fits the stateless model because all state lives in the payload, not a held connection.
Keep reading

## Related guides

   -  [ MCP Apps made HTML the official UI of agents The first official extension: what it standardizes, its lifecycle, and where the HTML lives after the session. ](/blog/mcp-apps-html-ui)
-  [ The MCP publish tool Stacktree's publish verbs over MCP, in detail. ](/mcp-publish-html)
-  [ Stacktree for developers The MCP server, CLI and API for publishing HTML from any agent. ](/developers)
-  [ Share an HTML file with a client When the page your agent built has to reach a client: private link, no login. ](/share-html-file-with-client)
-  [ MCP servers explained for developers What an MCP server is and how to build one. ](/blog/mcp-servers-explained-for-developers)
-  [ Stacktree on Claude.ai HTTP transport plus OAuth flow. ](/claude-ai-connector)
-  [ Stacktree for agents Where a publish primitive fits in an agent stack. ](/agents)

References

## Sources and further reading

   -  [ The 2026-07-28 Specification Is Generally Available ↗ The final-release announcement for the 2026-07-28 specification. ](https://blog.modelcontextprotocol.io/posts/2026-07-28-ga/)
-  [ Bringing MCP 2026-07-28 to Claude ↗ Anthropic's same-day adoption note: rollout across Claude products, Apps and Tasks as extensions, enterprise identity alignment. ](https://claude.com/blog/bringing-mcp-2026-07-28-to-claude)
-  [ The 2026-07-28 MCP Specification Release Candidate ↗ The release-candidate announcement: stateless core, six SEPs, the validation window. ](https://blog.modelcontextprotocol.io/posts/2026-07-28-release-candidate/)
-  [ Beta SDKs for the 2026-07-28 Release Candidate ↗ All four Tier 1 SDK betas, and the publish-date-not-a-switch-off framing. ](https://blog.modelcontextprotocol.io/posts/sdk-betas-2026-07-28/)
-  [ Key Changes (2026-07-28 changelog) ↗ Authoritative list of the 2026-07-28 changes and SEP numbers cited here. ](https://modelcontextprotocol.io/specification/2026-07-28/changelog)
-  [ Versioning, Model Context Protocol ↗ Confirms the YYYY-MM-DD version scheme and the current version, 2026-07-28. ](https://modelcontextprotocol.io/docs/learn/versioning)
-  [ Feature Lifecycle and Deprecation Policy ↗ The Active/Deprecated/Removed states and the twelve-month minimum window. ](https://modelcontextprotocol.io/community/feature-lifecycle)
-  [ MCP schema.ts, 2026-07-28 (SEP-2322) ↗ Source of truth for InputRequiredResult, inputRequests, and requestState. ](https://raw.githubusercontent.com/modelcontextprotocol/modelcontextprotocol/main/schema/2026-07-28/schema.ts)
-  [ Elicitation (MCP 2025-11-25) ↗ The prior elicitation behavior and its form/url safety rules. ](https://modelcontextprotocol.io/specification/2025-11-25/client/elicitation)
-  [ Sampling (MCP 2025-11-25) ↗ The prior sampling behavior and human-in-the-loop model. ](https://modelcontextprotocol.io/specification/2025-11-25/client/sampling)

##  Publish agent HTML over MCP.

 Stacktree is an MCP-native publish primitive. Install it in Claude Code, Codex, or Cursor and try the protocol in action.

 [ Sign up free → ](https://app.stacktr.ee/?join=1&from=cta_blog_mcp_2026_spec_changes)   install npx stacktree-install
Copy
       Private hosting for the HTML your agents make.

[](https://betalist.com/startups/stacktree?utm_campaign=badge-stacktree&utm_medium=badge&utm_source=badge-featured)[Featured on](https://devhunt.org/tool/stacktree)[](https://buildlist.io)[Get started free](https://app.stacktr.ee/?join=1)

## Product

- [Templates](/templates)
- [Example deliverables](/examples)
- [Custom domains](/custom-domains)
- [Client feedback](/client-feedback-loop)
- [One-time links](/one-time-view-links)
- [See how pages get read](/page-engagement)
- [Made with Stacktree](/made-with)
- [Security](/security)
- [Watch the demo](/demo)

## Agents

- [All integrations](/agents)
- [Claude Code](/claude-code)
- [OpenAI Codex](/codex)
- [Cursor](/cursor)
- [Claude.ai connector](/claude-ai-connector)
- [MCP server](/mcp-publish-html)
- [Deploy from Claude Code](/deploy-html-from-claude-code)
- [Skills](/skills)
- [Slack app](/slack)
- [n8n node](/n8n)
- [Agent payments (x402)](/x402)

## Alternatives

- [All comparisons](/alternatives)
- [Head-to-head comparisons](/compare)
- [Tiiny Host](/tiiny-host-alternative)
- [GitHub Pages (private)](/github-pages-private-alternative)
- [Vercel](/vercel-alternative-for-agents)
- [ngrok](/ngrok-alternative-for-html)
- [Display.dev](/display-dev-alternative)
- [Static.app](/static-app-alternative)
- [OpenAI Codex Sites](/openai-codex-sites-alternative)
- [here.now](/here-now-alternative)
- [Shippage](/shippage-ai-alternative)
- [Best private hosting](/best-private-html-hosting)

## Use cases

- [All use cases](/use-cases)
- [Share with clients](/share-with-clients)
- [Send a file to a client](/share-html-file-with-client)
- [Share Claude artifacts](/share-claude-artifacts)
- [Share Jupyter notebooks](/share-jupyter-notebook-html)
- [Host Storybook privately](/host-storybook-privately)
- [Architecture diagrams](/share-architecture-diagrams)
- [AI-generated reports](/host-ai-reports)
- [Internal HTML tools](/internal-tool-hosting)
- [Private HTML hosting](/private-html-hosting)
- [Vibe-coded page hosting](/vibe-coding-hosting)
- [Leave a website builder](/website-builder-migration)

## Learn

- [Blog](/blog)
- [Glossary](/glossary)
- [FAQ](/faq)
- [Agent-loop hosting](/agent-loop-hosting)
- [Why agents need a publish primitive](/blog/why-agents-need-a-publish-primitive)
- [MCP servers explained](/blog/mcp-servers-explained-for-developers)
- [What changed in the 2026-07 MCP spec](/blog/mcp-2026-spec-changes)
- [Sites in Codex explained](/blog/sites-in-codex-explained)
- [Private-by-default hosting](/blog/private-by-default-html-hosting)
- [An agent paid us $1 (x402)](/blog/agent-paid-to-provision-itself)
- [When a loop hits a paywall](/blog/loop-engineering-paywall)
- [Pricing](/pricing)
- [Self-host (new)](/self-host)
- [Changelog](/changelog)
- [Docs](https://stacktr.ee/docs)
- [About](/about)
© 2026 Stacktree · stacktr.ee

[Privacy](/privacy)[Terms](/terms)[Security](/security)[Dashboard](https://app.stacktr.ee)[npm](https://www.npmjs.com/package/stacktree-mcp)[Sitemap](/sitemap.xml)[llms.txt](/llms.txt)[API spec](/openapi.json)

---
Full markdown summary of the Stacktree marketing surface: https://stacktr.ee/llms-full.txt
