무상태 다음에 남은 숙제

2026-07-28 MCP 사양은 5월 21일 락된 릴리스 후보(RC)로 먼저 공개됐고 정식 발행은 7월 28일로 예정돼 있습니다. 지난달 무상태 전환이 세션을 걷어냈다면, 이번 조항은 툴 카탈로그를 어떻게 캐시하고 공유하며 언제 폐기할지를 규정합니다. 세션을 없앤 서버가 매 요청마다 tools/list를 새로 계산하면 무상태의 이점이 비용으로 돌아오므로, 캐시 안전성과 수명주기 운영이 실전 과제로 남습니다.

ttlMs와 cacheScope가 여는 공유 캐시

list와 read 결과는 이제 HTTP Cache-Control을 본뜬 두 필드를 함께 실어 보냅니다. ttlMs는 응답의 신선도 힌트를 밀리초 단위로 알려 클라이언트가 tools/list를 언제까지 재사용해도 되는지 판단하게 하고, SEP-2549가 도입한 cacheScope는 'public'과 'private' 중 하나로 그 응답을 사용자 간에 공유해도 되는지를 명시합니다. 사용자마다 노출 툴이 갈리는 카탈로그는 private, 전원이 동일한 목록을 받는 카탈로그만 public이어야 합니다.

Active에서 Removed까지, 12개월 수명주기

이번 릴리스는 기능 수명주기 정책도 함께 못 박았습니다. 모든 기능은 Active→Deprecated→Removed 단계를 거치고, 폐기 선언과 최단 제거 시점 사이에 최소 12개월이 보장됩니다. 2026-07-28은 제거 0건에 폐기 3건으로, tasks/list는 이번에 제거됐고 Roots·Sampling·Logging은 대체 문서와 함께 폐기됐으며 'resource not found' 오류코드는 -32002에서 -32602로 이동합니다.

게이트웨이와 서버에 캐시·폐기 정책을 심는 법

먼저 목표 수치를 세웁니다. tools/list 캐시 적중률 70% 이상, 사용자 간 캐시 오염 사고 0건, 헤더 기반 라우팅 성공률 99.9% 이상, 폐기 기능 잔량은 12개월 카운트다운이 0에 닿기 전 소진을 기준선으로 잡습니다. 이 네 숫자가 없으면 캐시는 "빠른 것 같다"는 인상으로, 폐기는 "언젠가 고친다"는 미정으로 방치됩니다.

실패 패턴은 네 갈래로 갈립니다. 첫째, 사용자별로 다른 툴 목록을 cacheScope=public으로 내보내 권한이 없는 사용자가 남의 툴을 보게 되는 권한 유출입니다. 둘째, ttlMs를 무시하고 매 호출마다 폴링해 비용과 지연이 함께 뛰는 경우입니다. 셋째, 폐기 알림을 모니터링하지 않아 12개월 뒤 tasks/list나 Sampling 위에 얹은 코드가 조용히 파손되는 경우입니다. 넷째, 무상태로 넘어갔는데도 게이트웨이가 세션 헤더 기준 라우팅을 유지해 요청이 엉뚱한 인스턴스로 흘러 라우팅이 깨지는 경우입니다.

복구 분기는 실패 지점마다 다릅니다. 캐시 오염이 감지되면 해당 응답의 cacheScope를 private으로 강제 강등하고 공유 캐시를 즉시 무효화합니다. 클라이언트는 Streamable HTTP POST에 Mcp-Method와 Mcp-Name 헤더를 실으므로, 게이트웨이는 세션 어피니티가 아니라 이 두 헤더로 라우팅해야 하며 서버는 _meta에서 프로토콜 버전과 capabilities를 읽고 server/discover를 구현해 능력 협상을 세션 없이 마쳐야 합니다.

운영 체크리스트는 배포 전에 고정합니다. 캐시 응답에는 cacheScope 판정 근거(사용자 종속 여부)를 로그로 남기고, tools/list 캐시에 사용자 식별자가 섞여 들어가지 않는지 배포 전 시나리오로 확인하며, 폐기된 tasks/list·Roots·Sampling·Logging 호출 건수를 별도 카운터로 집계합니다. -32002를 하드코딩한 오류 처리기는 -32602를 함께 받도록 갱신하고, 헤더 없는 레거시 클라이언트 요청 비율도 대시보드에 노출합니다.

지속 개선 루프는 폐기 카운트다운을 축으로 돕니다. 주간으로 폐기 기능 잔여 호출량과 캐시 오염 사고 건수를 집계하고, 12개월 시한을 4분기로 쪼개 분기마다 잔량을 25%씩 줄이는 마이그레이션 목표를 두면 제거일 직전의 벼락치기를 피할 수 있습니다. 잔량이 줄지 않는다면 폐기 정책을 코드가 아니라 회의록에만 반영해 둔 상태라는 신호입니다.

바로 쓰는 적용 포인트

2026-07-28에서 살아남는 핵심은 캐시를 켜되 경계를 지키고, 폐기를 달력이 아니라 카운터로 관리하는 것입니다. 사용자 종속 목록은 private·전원 공통 목록만 public으로 나누고, ttlMs를 존중해 적중률 70%를 확보하며, 게이트웨이 라우팅을 Mcp-Method·Mcp-Name 헤더 기준으로 옮기고 server/discover를 구현한 뒤, 폐기 3건의 12개월 잔량을 분기별로 소진하면 다음 사양이 와도 같은 운영 틀이 그대로 돌아갑니다.

참고 링크

The 2026-07-28 MCP Specification Release Candidate — Model Context Protocol

MCP 2026-07-28 spec: what changed, what breaks — stacktr.ee