Why
In March 2026 "MCP is dead" was a defensible position, and the reason it is worth revisiting is that the complaints were not wrong. Tool schemas were loaded into the context window before the user typed anything. The security model leaked in ways that had names and proofs of concept. And a protocol you could replace with a shell script did not look like infrastructure. Anthropic shipped Agent Skills, people noticed an agent with a terminal could do most of what MCP did more flexibly and for a fraction of the tokens, and the obituaries wrote themselves.
On 2026-07-28 the protocol answered by deleting things. initialize and the Mcp-Session-Id header are gone, so any request lands on any instance behind plain round-robin. Method and tool names travel as HTTP headers, so gateways and WAFs route without parsing a JSON body. Server-initiated elicitation, which needed a held-open stream, became a plain retry: the server answers input_required, the client comes back with the answer attached. Roots, Sampling, Logging, Dynamic Client Registration and the legacy HTTP+SSE transport were all deprecated under a formal twelve-month policy. The lead maintainer's own summary was that a lot of the things that made MCP are gone.
The evidence that it worked is structural rather than promotional, which is what makes it worth reading. Cloudflare retired its own McpAgent primitive — a differentiated product surface that existed only because MCP needed stateful hosting — on the grounds that servers now run as ordinary Workers. Vendors do not delete their own moat unless the standard genuinely got simpler. A Sentry co-founder who had published pieces saying MCP was not good yet reported going live on the new spec before it was finalised without breaking production. The March skeptics split the difference and were right to: a local CLI is still correct for local unauthenticated work, and MCP wins wherever you need auth, org access control, telemetry or scale — because at that point it is just HTTP, and every tool you already own for securing, observing and load-balancing HTTP applies unchanged.
And that is the sentence to keep, because it is a general one. The CLI argument was right that a shell is more powerful and wrong that more power was the point. What an agent needs at the boundary of someone else's system is not reach, it is a surface small enough to be reviewed, authorized, logged and rate-limited — and the reviewable surface is the product. The teams who made this work had already found it empirically and from the other end: GitHub cut Copilot's default toolset from 40 tools to 13 and success rates went up; Block is reported to have rebuilt its Linear server three times and finished at two tools. the-boundary-is-the-unit makes the same claim about architecture in general, and this is the cleanest natural experiment for it — a protocol that got adopted by removing capability, measured by people with no stake in the conclusion.
What the rewrite did not touch is the part that decides whether any of this is safe. The stateless redesign hardened the transport, and the transport was never where the interesting attack lived. Invariant Labs demonstrated tool poisoning in April 2025 — instructions hidden in a tool description, visible to the model and invisible to the user, exfiltrating SSH keys through a tool that added two numbers — and then showed a malicious GitHub issue steering an agent into leaking a private repository through a public pull request, noting that no MCP tool had been compromised. In April 2026 researchers hijacked Claude Code, Gemini CLI and GitHub Copilot by putting instructions in pull request titles and walked out with CI secrets. None of that is a transport bug and none of it is closed by a roadmap item.
The asymmetry is precise and worth stating in one line: a tool description is reviewed once, at connect time; a tool result enters the context on every call, at runtime, with no equivalent check. Registries, .well-known discovery and allowlists are all controls on the first one. There is no deployed control on the second, and the second is the one that carries attacker-authored text by construction. A firewall can block a connection. It cannot block a sentence. That is architectural, not incidental — which is why the honest reading of 2026 is neither the obituary nor the victory lap: the protocol became boring infrastructure, and the unsolved problem was never the protocol's to solve.
How it works
The three complaints, and which one the rewrite actually answered
| Wall | The March 2026 complaint | What 2026-07-28 did | Still open? |
|---|---|---|---|
| Context | Schemas load before the user types; raw responses round-trip through the model even when it needed three fields out of sixty | Cacheable, deterministically ordered tool catalogs, so clients cache and upstream prompt caches stay stable | Partly. Caching is not the same as fewer tools — the cut is still yours to make |
| Trust — connection | Session state, bespoke auth, local-only servers | Handshake and session deleted; plain HTTP with a familiar OAuth model | Closed, and this is the one OAuth quietly unlocked for enterprises with compliance teams |
| Trust — content | Descriptions and results enter the model's context as trusted text | Nothing | Open. Architectural. |
| Substance | Mostly wrappers around existing APIs; a large share abandoned | Nothing — this is a market fact, not a spec fact | Open, and no spec revision can close it |
What was deleted on 2026-07-28
| Before | After | |
|---|---|---|
| Session | initialize handshake + Mcp-Session-Id |
Every request self-contained — any request lands on any instance behind round-robin |
| Routing | Parse the JSON body to know what was called | Method and tool names as HTTP headers — gateways and WAFs route without parsing |
| Elicitation | Server-initiated, needing a held-open stream | Server returns input_required; the client retries with the answer attached |
| Catalogs | Re-fetched, order not guaranteed | Cacheable and deterministically ordered |
| Deprecated | Roots, Sampling, Logging, Dynamic Client Registration, legacy HTTP+SSE | Formal lifecycle policy, twelve-month minimum, removal no earlier than July 2027 |
Two entry points into the context. One of them is reviewed.
| Tool description | Tool result | |
|---|---|---|
| Enters the context | At connect time | On every call, at runtime |
| Reviewed by | A human, once — maybe | Nobody |
| Can change after review | Yes, the server controls it | Different every call by definition |
| Controls that exist today | Registries, .well-known metadata, pinning, allowlists |
None deployed |
| Who authors the text | The server operator | Whoever wrote the data the server read |
The last row is the whole problem. A pull request title, a GitHub issue body, a row in someone else's database — none of them are the server operator, and all of them reach the model as ordinary result text.
Reading the roadmap by confidence, not by date
| Confidence | Item | What it changes |
|---|---|---|
| Near-certain | .well-known server metadata for discovery |
Registries can learn what a server does without connecting — turns a directory of dubious entries into something rankable |
| Near-certain | Enterprise-Managed Authorization extension, now stable | Identity consolidates; adoption reported from Anthropic, Microsoft and Okta |
| Contested | Skill distribution — SEP-2640 would serve skills over MCP as ordinary resources | Today teams sync skills by hand-downloading text files, which is roughly hand-downloading HTML to run a web app. Whoever solves this owns a large piece of the agent stack |
| A bet, not a trend | WebMCP, Chrome origin trial through Chrome 156 | Near-zero real deployment and no mainstream agent calling the tools as of July |
| Unsolved, no item | Runtime checking of tool results | — |
Where this sits against the rest of the catalogue
mcp-three-sidesis the build card — three seats on the same protocol, and it should be done first because it is hands on keyboard. This one is the verdict card: why the deletion was the win, and what it left behind.agentic-intent-vetoandthird-party-blast-radiusare the two halves of the answer to the content gap — separate the reading capability from the acting capability, and assume the text you read is hostile.the-boundary-is-the-unitclaims the reviewable surface is the design unit; this is its natural experiment.agents-computer-useasks the same question one layer up — a shell is more powerful than a tool list, and that is exactly the property that makes it harder to secure.
Where it lands in Jayverse
- Rabbit: separate reading from acting in the agent harness. Any step where the agentic AA agent reads untrusted text (a PR body, a mandate description, a fetched page) must not sit in the same capability as signing or submitting a transaction — add that boundary to the harness design, not to a prompt.
- CI: treat PR titles and issue text as attacker-authored by default. Since instructions hidden in a PR title can steer an agent into leaking secrets, any CI bot with repo write or secret access must not also read untrusted PR/issue text in the same run.
- gitboard/Devnet: measure the context tax before adding another MCP server. Dump the tool-list JSON for every server a Jayverse agent connects to, tokenise it, and compare success rate with the full set trimmed to the tools actually called — track that number on gitboard rather than assuming more tools help.
Key expressions
| Expression | 뜻 · 쓰이는 자리 |
|---|---|
| retracted | 철회했다 · 비판했던 사람들이 주장을 거둬들일 때. "and the critics retracted" |
| cherry-picked | 엄선한, 골라낸 · 여러 개 중 필요한 것만 뽑았을 때. "three to ten cherry-picked tools" |
| stand up (a server) | (서버 등을) 띄우다, 구축하다 · 테스트용으로 뭔가를 새로 세울 때. "Stand up a local server with one benign tool" |
| weight it accordingly | 그에 맞게 감안해서 보다 · 출처의 신뢰도가 낮을 때 평가에 반영하라는 뜻. "so weight it accordingly" |
| delete their own moat | 자신의 경쟁우위(해자)를 스스로 없애다 · 회사가 자기 이익에 반하는 결정을 내릴 때. "Vendors do not delete their own moat" |
| split the difference | 절충하다, 중간을 취하다 · 두 입장 사이에서 타협점을 찾을 때. "The March skeptics split the difference" |
| at the boundary of | ~의 경계에서 · 시스템/조직 간 접점을 말할 때. "at the boundary of someone else's system" |
| held-open stream | 계속 열어 둔 채로 유지되는 통신 스트림 · 서버가 응답을 기다리며 연결을 안 끊을 때. "which needed a held-open stream" |
| walked out with | (몰래) ~을 챙겨서 빠져나가다 · 공격자가 정보를 탈취해 갈 때. "walked out with CI secrets" |
| victory lap | 승리를 자축하는 행위 · 논쟁에서 한쪽이 과하게 이겼다고 자랑할 때. "neither the obituary nor the victory lap" |
| obituaries wrote themselves | 부고가 저절로 써지다 · 망했다는 게 너무 뻔해서 누구나 그렇게 말할 때. "the obituaries wrote themselves" |
| natural experiment | 자연 실험 · 통제된 실험이 아니라 현실에서 저절로 벌어진 검증 사례. "the cleanest natural experiment for it" |
| MCP | AI 에이전트-도구 연결 프로토콜(Model Context Protocol) · 본문 전체가 다루는 핵심 프로토콜, 풀네임 없이 약어로만 쓰임. "MCP spent early 2026 being declared dead" |
| WAF | 웹 방화벽(Web Application Firewall) · 메서드·도구명이 헤더로 노출돼 파싱 없이 라우팅되는 문맥. "gateways and WAFs route without parsing a JSON body" |
| OAuth | 개방형 인증 표준(Open Authorization) · 세션·핸드셰이크 삭제 후 남은 익숙한 인증 방식, 기업 도입을 여는 요인. "plain HTTP with a familiar OAuth model" |
| SSE | 서버 전송 이벤트(Server-Sent Events) · HTTP+SSE 방식의 구식 전송 계층, 새 스펙에서 폐기 대상. "the legacy HTTP+SSE transport were all deprecated" |
| GitGuardian | 시크릿 유출 실태를 조사하는 보안 회사(GitGuardian) · 인용된 통계 보고서의 출처. "GitGuardian's State of Secrets Sprawl 2026" |
| McpAgent | 클라우드플레어의 MCP 상태유지 호스팅 제품(McpAgent) · 이제 일반 Worker로 대체돼 스스로 폐기된 사례. "Cloudflare retired its own McpAgent primitive" |
| WebMCP | 브라우저에 MCP 도구를 노출하는 크롬 오리진 트라이얼(WebMCP) · 아직 거의 채택되지 않은 로드맵 항목. "WebMCP, Chrome origin trial through Chrome 156" |