Workspace IndexDev Notes › Constraint was the product — and no firewall blocks a sentence

#39PoC

Constraint was the product — and no firewall blocks a sentence

MCP spent early 2026 being declared dead by people whose complaints were correct, then shipped the most breaking release in its history — deleting the handshake, the session layer and three primitives — and the critics retracted. The lesson is not that the protocol won. It is that the thing being sold was never capability, and the one hole the deletion could not reach is the one that matters.

Two measurements on tooling this repo already runs, and neither needs a new server. The context half. Dump the tool-list JSON of every MCP server the agent here connects to and tokenise it — that byte count is the tax paid before anyone types a word, and almost nobody has looked at their own number. Then read a week of real transcripts and list the tools actually called. Trim the connected set to that list, re-measure, and — this is the step people skip — run the same fixed set of tasks against both configurations and compare success rate, not just tokens. GitHub reports 60–90% context reduction from loading three to ten cherry-picked tools instead of full default toolsets, and 2–5 percentage points of success-rate gain from cutting Copilot's defaults from 40 tools to 13. The exercise is not to confirm their number; it is to get yours, because if quality goes up when capability goes down, the argument in this card is reproduced locally in an afternoon. The trust half, which is a self-test and not an exploit. Stand up a local server with one benign tool whose return value — not its description — contains a plain imperative sentence addressed to the model. Call it and watch what happens. The point is to see with your own eyes that the review which covered the description at connect time never runs again on the result at call time, and then to write the one line of policy that follows: any agent that can both read an untrusted result and take a consequential action needs those two capabilities separated by something that is not a prompt. Figures above are from the linked write-up and its sources — GitHub's own engineering posts, Invariant Labs (April 2025), Astrix Research on 5,200+ servers, Endor Labs on 2,614, GitGuardian's State of Secrets Sprawl 2026 — and the "52% abandoned" audit came from a vendor selling managed hosting, so weight it accordingly.

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-sides is 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-veto and third-party-blast-radius are 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-unit claims the reviewable surface is the design unit; this is its natural experiment.
  • agents-computer-use asks 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.

← All Dev Notes · Workspace Index · Top ↑

제약이 곧 제품이었다 — 그리고 어떤 방화벽도 문장은 막지 못한다

MCP 는 2026 년 초 사망 선고를 받았고, 그 비판들은 대체로 옳았습니다. 그다음 역사상 가장 파괴적인 개정판을 냈습니다 — 핸드셰이크·세션 계층·원시 요소 셋을 삭제했고, 비판자들은 입장을 철회했습니다. 교훈은 "프로토콜이 이겼다"가 아닙니다. 팔리고 있던 것이 애초에 역량이 아니었다는 것, 그리고 삭제가 닿지 못한 구멍 하나가 하필 제일 중요한 구멍이라는 것입니다.

이미 이 저장소가 쓰고 있는 도구에 대한 측정 두 가지이고, 둘 다 새 서버가 필요 없습니다. 컨텍스트 절반. 여기 에이전트가 붙는 모든 MCP 서버의 툴 목록 JSON 을 덤프해 토큰화합니다 — 그 숫자가 사용자가 한 글자도 치기 전에 이미 내고 있는 세금이고, 자기 숫자를 실제로 본 사람은 거의 없습니다. 그다음 실제 대화 기록 일주일치를 읽고 정말 호출된 툴만 목록으로 만듭니다. 연결 집합을 그 목록으로 줄이고 다시 재고, 그리고 여기가 다들 건너뛰는 단계같은 과제 묶음을 두 설정에 각각 돌려 토큰이 아니라 성공률을 비교합니다. GitHub 은 기본 툴셋 전체 대신 310 개만 골라 싣는 것으로 컨텍스트 6090% 절감, Copilot 기본 툴을 40 개에서 13 개로 줄여 성공률 2~5%p 상승을 보고했습니다. 목적은 그 숫자를 확인하는 게 아니라 내 숫자를 얻는 것입니다 — 역량이 내려갈 때 품질이 올라간다면, 이 카드의 주장이 반나절 만에 로컬에서 재현된 것이니까요. 신뢰 절반 — 익스플로잇이 아니라 자기 점검입니다. 로컬에 툴 하나짜리 무해한 서버를 띄우되, 설명이 아니라 반환값모델을 향한 평범한 명령문 한 줄을 넣습니다. 호출하고 무슨 일이 벌어지는지 봅니다. 요점은 연결 시점에 설명을 훑었던 그 검토가 호출 시점의 결과에는 두 번 다시 실행되지 않는다는 것을 직접 눈으로 확인하는 것이고, 그다음 따라오는 정책 한 줄을 쓰는 것입니다 — 신뢰할 수 없는 결과를 읽는 능력과 결과를 낳는 행동을 할 능력을 동시에 가진 에이전트는, 그 둘 사이에 프롬프트가 아닌 무언가가 있어야 한다. 위 수치는 링크된 글과 그 출처에서 온 것입니다 — GitHub 엔지니어링 포스트, Invariant Labs(2025-04), Astrix Research 의 5,200+ 서버 분석, Endor Labs 의 2,614 건, GitGuardian State of Secrets Sprawl 2026. "52% 방치" 감사는 매니지드 호스팅을 파는 벤더가 낸 것이므로 그만큼 할인해서 읽으십시오.

2026 년 3 월에 "MCP 는 죽었다"는 방어 가능한 입장이었고, 지금 다시 볼 가치가 있는 이유는 그 비판들이 틀리지 않았기 때문입니다. 툴 스키마는 사용자가 한 글자도 치기 전에 컨텍스트 창에 실렸습니다. 보안 모델은 이름과 개념증명이 붙은 방식으로 샜습니다. 그리고 셸 스크립트로 대체 가능한 프로토콜은 인프라처럼 보이지 않았습니다. Anthropic 이 Agent Skills 를 냈고, 사람들은 터미널을 가진 에이전트가 MCP 가 하던 일 대부분을 더 유연하게, 토큰은 훨씬 덜 쓰며 해낸다는 것을 알아챘고, 부고는 저절로 쓰였습니다.

2026-07-28, 프로토콜은 삭제로 답했습니다. initializeMcp-Session-Id 헤더가 사라져 어떤 요청이든 평범한 라운드로빈 뒤 아무 인스턴스에나 떨어집니다. 메서드와 툴 이름이 HTTP 헤더로 실려 가서, 게이트웨이와 WAF 가 JSON 본문을 파싱하지 않고 라우팅합니다. 열린 스트림을 붙들어야 했던 서버 주도 elicitation 은 평범한 재시도가 됐습니다 — 서버가 input_required 를 답하고, 클라이언트가 답을 붙여 다시 옵니다. Roots·Sampling·Logging·동적 클라이언트 등록·레거시 HTTP+SSE 전송은 공식 12 개월 정책 아래 전부 폐기 예고됐습니다. 리드 메인테이너 본인의 요약이 "MCP 를 MCP 이게 했던 것들이 많이 사라졌다" 였습니다.

작동했다는 증거가 홍보가 아니라 구조적이라는 점이 읽을 값어치를 만듭니다. Cloudflare 는 자기 제품 표면인 McpAgent 원시 요소를 스스로 폐기했습니다 — MCP 가 상태 있는 호스팅을 필요로 했기 때문에만 존재하던 차별화 요소인데, 이제 서버가 평범한 Worker 로 돈다는 이유로요. 표준이 진짜로 단순해지지 않았다면 벤더가 자기 해자를 지우지 않습니다. "MCP 는 아직 별로다"라는 글을 냈던 Sentry 공동창업자는 스펙이 확정되기도 전에 새 스펙으로 프로덕션을 무중단 전환했다고 말했습니다. 3 월의 회의론자들은 절충했고 그게 옳았습니다 — 로컬·비인증 작업엔 로컬 CLI 가 여전히 정답이고, 인증·조직 접근제어·텔레메트리·스케일이 필요한 곳에서는 MCP 가 이깁니다. 그 지점에서 그것은 그냥 HTTP 이고, HTTP 를 지키고 관측하고 부하분산하려고 이미 가진 모든 도구가 그대로 적용되기 때문입니다.

그리고 그것이 챙겨 갈 문장인데, 일반론이기 때문입니다. CLI 진영은 셸이 더 강력하다는 점에서 옳았고, 더 강한 것이 요점이라는 점에서 틀렸습니다. 에이전트가 남의 시스템 경계에서 필요로 하는 것은 도달 범위가 아니라 검토·인가·기록·속도제한이 가능할 만큼 작은 표면이고, 그 검토 가능한 표면이 곧 제품입니다. 이걸 되게 만든 팀들은 이미 반대편에서 경험적으로 같은 결론에 닿아 있었습니다 — GitHub 은 Copilot 기본 툴셋을 40 개에서 13 개로 줄였고 성공률이 올라갔습니다. Block 은 Linear 서버를 세 번 다시 만들어 툴 두 개로 끝냈다고 전해집니다. the-boundary-is-the-unit 이 아키텍처 일반에 대해 같은 주장을 하고, 이 사건이 그 주장에 대한 가장 깨끗한 자연 실험입니다 — 역량을 덜어내서 채택된 프로토콜을, 결론에 이해관계가 없는 사람들이 측정한 것.

개정판이 건드리지 않은 부분이 하필 이 전부가 안전한지를 결정합니다. 무상태 재설계는 전송 계층을 단단하게 했고, 전송 계층은 애초에 흥미로운 공격이 살던 곳이 아니었습니다. Invariant Labs 는 2025 년 4 월 툴 포이즈닝을 보였습니다 — 툴 설명에 숨긴 지시모델에는 보이고 사용자에게는 보이지 않으며, 두 수를 더하는 툴로 SSH 키를 빼냈습니다. 이어서 악성 GitHub 이슈가 에이전트를 조종해 공개 PR 을 통해 비공개 저장소를 유출시키는 것을 보이며, 어떤 MCP 툴도 침해되지 않았다고 못 박았습니다. 2026 년 4 월에는 연구자들이 PR 제목에 지시를 넣어 Claude Code·Gemini CLI·GitHub Copilot 을 탈취하고 CI 시크릿을 들고 나갔습니다. 어느 것도 전송 버그가 아니고, 어느 것도 로드맵 항목으로 닫히지 않습니다.

비대칭은 정확하고, 한 줄로 적을 값어치가 있습니다: 툴 설명은 연결 시점에 한 번 검토되고, 툴 결과는 매 호출마다 런타임에 컨텍스트로 들어오는데 이에 상응하는 검사가 없습니다. 레지스트리·.well-known 디스커버리·허용목록은 전부 앞의 것에 대한 통제입니다. 뒤의 것에는 배포된 통제가 없고, 하필 뒤의 것이 구조적으로 공격자가 쓴 텍스트를 나릅니다. 방화벽은 연결을 막을 수 있습니다. 문장은 막지 못합니다. 이건 우발이 아니라 구조입니다 — 그래서 2026 년에 대한 정직한 독법은 부고도 승리 선언도 아닙니다: 프로토콜은 지루한 인프라가 되었고, 남은 문제는 애초에 프로토콜이 풀 문제가 아니었다.

동작 방식

세 가지 비판, 그리고 개정판이 실제로 답한 것

2026 년 3 월의 비판 2026-07-28 이 한 것 여전히 열려 있나
컨텍스트 사용자가 치기 전에 스키마가 실린다; 60 개 필드 중 3 개만 필요해도 원본 응답이 모델을 통과한다 결정론적 순서의 캐시 가능한 툴 카탈로그 — 클라이언트가 캐시하고 상위 프롬프트 캐시가 안정된다 부분적. 캐싱은 툴을 줄이는 것과 다릅니다 — 잘라내는 일은 여전히 내 몫
신뢰 — 연결 세션 상태, 제각각인 인증, 로컬 전용 서버 핸드셰이크·세션 삭제, 익숙한 OAuth 모델의 평범한 HTTP 닫힘. 컴플라이언스 팀이 있는 기업에 문을 연 건 조용히 OAuth 였습니다
신뢰 — 내용 설명과 결과가 신뢰된 텍스트로 모델 컨텍스트에 들어온다 없음 열려 있음. 구조적.
실체 대부분 기존 API 래퍼, 상당수 방치 없음 — 이건 스펙의 사실이 아니라 시장의 사실 열려 있고, 어떤 스펙 개정도 닫을 수 없음

2026-07-28 에 삭제된 것

이전 이후
세션 initialize 핸드셰이크 + Mcp-Session-Id 모든 요청이 자기완결적 — 라운드로빈 뒤 아무 인스턴스에나 떨어져도 된다
라우팅 무엇이 호출됐는지 알려면 JSON 본문 파싱 메서드·툴 이름이 HTTP 헤더 — 게이트웨이·WAF 가 파싱 없이 라우팅
Elicitation 서버 주도, 열린 스트림을 붙들어야 서버가 input_required 반환, 클라이언트가 답을 붙여 재시도
카탈로그 매번 재요청, 순서 보장 없음 캐시 가능 + 결정론적 순서
폐기 예고 Roots, Sampling, Logging, 동적 클라이언트 등록, 레거시 HTTP+SSE 공식 수명주기 정책, 최소 12 개월, 제거는 2027 년 7 월 이후

컨텍스트로 들어오는 입구는 둘, 검토되는 건 하나

툴 설명 툴 결과
컨텍스트 진입 시점 연결 시점 매 호출, 런타임
누가 검토하나 사람이, 한 번 — 그나마 하면 아무도
검토 후 바뀔 수 있나 네, 서버가 통제 정의상 매번 다름
오늘 존재하는 통제 레지스트리, .well-known 메타데이터, 핀 고정, 허용목록 배포된 것 없음
그 텍스트를 쓴 사람 서버 운영자 서버가 읽은 데이터를 쓴 사람, 누구든

마지막 행이 문제의 전부입니다. PR 제목, GitHub 이슈 본문, 남의 데이터베이스의 한 행 — 어느 것도 서버 운영자가 아니고, 전부 평범한 결과 텍스트로 모델에 닿습니다.

로드맵을 날짜가 아니라 확신도로 읽기

확신도 항목 무엇이 바뀌나
거의 확정 디스커버리용 .well-known 서버 메타데이터 레지스트리가 접속하지 않고 서버가 뭘 하는지 알 수 있게 됨 — 미심쩍은 목록을 순위 매길 수 있는 것으로 바꾼다
거의 확정 이제 안정화된 Enterprise-Managed Authorization 확장 신원 체계가 수렴; Anthropic·Microsoft·Okta 채택 보고
논쟁 중 스킬 배포 — SEP-2640 이 스킬을 MCP 의 평범한 리소스로 서빙 지금은 팀들이 텍스트 파일을 손으로 받아 동기화합니다. 웹앱 돌리려고 HTML 을 손으로 내려받는 격. 이걸 푸는 쪽이 에이전트 스택의 큰 조각을 가집니다
추세가 아니라 베팅 WebMCP, Chrome 156 까지의 오리진 트라이얼 7 월 기준 실배포 거의 0, 툴을 호출하는 주요 에이전트 없음
미해결, 항목 없음 결과에 대한 런타임 검사

이 카탈로그 안에서의 자리

  • mcp-three-sides만드는 카드입니다 — 같은 프로토콜의 세 자리이고, 손이 키보드에 올라가므로 그쪽을 먼저 합니다. 이 카드는 판정 카드입니다: 왜 삭제가 승리였고, 무엇이 남았는가.
  • agentic-intent-vetothird-party-blast-radius 가 내용 공백에 대한 답의 두 절반입니다 — 읽는 능력과 행동하는 능력을 분리하고, 읽는 텍스트는 적대적이라고 가정하라.
  • the-boundary-is-the-unit검토 가능한 표면이 곧 설계 단위라고 주장하고, 이 사건이 그 주장의 자연 실험입니다.
  • agents-computer-use 는 한 층 위에서 같은 질문을 합니다 — 셸은 툴 목록보다 강력하고, 바로 그 성질 때문에 지키기가 더 어렵습니다.

← 전체 개발 노트 · 워크스페이스 인덱스 · 맨 위 ↑