Build1 distinct publisher3 min readUpdated
The 2026-07-28 spec removes protocol-level sessions and the Mcp-Session-Id header, and the TypeScript SDK has split into separate packages. Horizontal scaling is the stated reason.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
The Model Context Protocol's 2026-07-28 specification significantly changed the behavior of Streamable HTTP, removing protocol-level sessions, the `Mcp-Session-Id` header, and the standalone GET stream endpoint [1][2]. At the same time the TypeScript SDK has been split into separate packages, including `@modelcontextprotocol/server`, which means anyone already running a remote MCP server in production is looking at a code change, not just a config flag [3].
The reason is deployment shape. Under the old model, Streamable HTTP could maintain a protocol-level session: the client POSTed an `initialize` request, the server issued an `Mcp-Session-Id`, and subsequent requests carried that identifier so the server could associate them with the session established earlier [4][5][6]. That is fine on one box. Put three instances behind a load balancer and it stops being fine: if initialization lands on Server A, the session belongs to Server A, and a follow-up request routed to Server B does not necessarily know anything about it [7][8].
The workarounds are the familiar ones, and they are all deployment tax: sticky sessions, shared session storage, session replication, distributed coordination [9]. Developer Dilum Darshana, writing about migrating his own currency converter MCP server, frames the change as removing that protocol-level session dependency so that MCP servers can behave like ordinary horizontally scalable HTTP services [10][8]. He cites the MCP team's stated goal as allowing requests to reach any server instance without sticky routing or a shared protocol session store [11].
Mechanically, the new transport model is narrower. The server exposes a single MCP endpoint that accepts POST requests, each JSON-RPC request is sent as its own HTTP request, and the server responds with either `application/json` or an SSE stream associated with that request [12][13][14]. Requests one, two and three can land on Server A, Server C and Server B respectively with no requirement that they hit the same instance [15].
The part worth reading carefully before anyone rewrites a service: stateless MCP does not mean the application must be stateless [16]. Darshana's example is a `create_cart()` tool that returns a `cart_id`, which the next tool call then passes explicitly alongside its own arguments [17][18]. The state still exists; it is now represented as explicit application data rather than hidden inside a protocol session [19]. He says the MCP team explicitly recommends this application-level pattern when state needs to persist between calls [20].
That is the migration in one line: whatever your server was inferring from the session identifier, the client now has to send you. For a currency converter, which Darshana describes as intentionally simple and exposing a single `convert_currency` tool, that is close to free [21][22][23]. For anything that accumulated context across an initialized connection, it is a redesign of the tool signatures, because the arguments have to carry the continuity.
What to watch: whether existing clients and hosts follow the spec onto the POST-only endpoint, since a server that has dropped `Mcp-Session-Id` and the GET stream is no longer speaking the older shape [2][12]. Watch the package split too. `@modelcontextprotocol/server` being a distinct install means dependency pins and build steps move, and the migration is coupled to the spec change rather than sequenced after it [3]. If you run MCP servers behind a load balancer today, the honest read is that you were paying for sticky routing to hold up an abstraction the protocol has now dropped [9][11].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
The 2026-07-28 MCP specification changed the behavior of Streamable HTTP significantly.
The new model removes protocol-level sessions, the Mcp-Session-Id, and the standalone GET stream endpoint.
The TypeScript SDK has been split into separate packages, particularly @modelcontextprotocol/server, and the author updated his server to work with the newer stateless behavior and the new split packages.
Before the stateless changes, Streamable HTTP could maintain a protocol-level session.
In the old flow the client POSTs an initialize request to /mcp and the server returns an Mcp-Session-Id; subsequent POSTs carry that session identifier.
The server creates a session during initialization, subsequent requests contain the session identifier, and the server can therefore associate requests with the session established earlier.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Single secondhand walkthrough, no primary documents
Every protocol and SDK assertion traces to one dev.to article that paraphrases the specification, the MCP blog and GitHub without quoting or excerpting them; the supplied body is also truncated mid-section. The author's own migration and code patterns are first-hand and internally consistent, which keeps the floor off zero, but nothing in the cluster independently corroborates the 2026-07-28 changes.
One example server migrated; upstream releases reported at second hand
Observed adoption is a spec revision and a split SDK reported by one author plus that author's migration of a single, deliberately simple personal server with no conversational state. There is no evidence of production deployments, client-side support, download figures, or migrations by any other party.
Breakage framing outruns the evidence supplied
The underlying article is measured and hedged, but the story's operative implication -- that session-bound servers break and everyone must migrate -- is demonstrated only on a stateless currency converter, the easiest possible case. Claims about the spec's intent are attributed rather than shown, and no deprecation window, client compatibility data, or account of losing the GET stream endpoint is offered, so the confidence conveyed exceeds what the single source establishes.
Mild self-promotion, no disclosed commercial interest
The piece is a first-person developer-platform post showcasing the author's own MCP currency converter project, which gives a modest visibility incentive to frame the migration as a clean architectural improvement. No vendor sponsorship, employer relationship to the MCP maintainers, or commercial product is disclosed or implied, so distortion pressure is limited.
Low: plausible and coherent, but single-sourced
The technical narrative is coherent and the code-level details are specific enough to be checkable, which supports moderate belief in the direction of travel. But with one secondhand publisher, no primary spec or SDK text, a truncated body, and adoption limited to one example server, confidence in the specifics -- particularly the exact removals and the attributed maintainer rationale -- stays low.
build
MCP 2026-07-28 drops the `result` wrapper, and your unit tests will not notice1 distinct publisher
build
Rate limit your MCP servers, because a retrying agent turns one error into a billing incident1 distinct publisher
build
The only way to prove a contract test can fail is to ship a server that lies1 distinct publisher
build
The MCP transport your search results teach has been deprecated since March1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 16, 2026