핸드셰이크가 사라진 이유
2026년 5월 21일 공개된 MCP 스펙 릴리스 후보(2026-07-28)는 initialize·initialized 핸드셰이크와 Mcp-Session-Id 헤더를 제거합니다. 클라이언트 메타데이터는 이제 모든 요청의 _meta 필드에 실려, 서버 인스턴스 하나가 상태를 붙들지 않아도 표준 라운드로빈 로드밸런서 뒤에서 트래픽을 받을 수 있습니다. Mcp-Method·Mcp-Name 헤더가 새로 추가돼 요청을 라우팅·캐싱·추적하는 경로도 HTTP 계층에서 바로 열립니다.
스티키 세션이나 공유 세션 저장소에 의존해 온 MCP 서버 구현은 이 변화의 직접 영향권입니다. 세션 ID로 상태를 찾던 프록시나 게이트웨이는 요청마다 다른 서버 인스턴스가 응답해도 동일하게 동작해야 하며, 그렇지 못하면 스케일아웃 직후 첫 요청부터 오류가 납니다.
Elicitation이 스트림 대신 재요청으로 바뀐 배경
기존에는 SSE 스트림을 열어 둔 채 사용자 입력을 기다리던 elicitation이, 무상태 코어와 함께 InputRequiredResult 응답 패턴으로 교체됩니다. 서버는 입력 요청 목록과 requestState를 담아 돌려주고, 클라이언트는 사용자 응답을 모아 inputResponses와 그 requestState를 그대로 되돌려 원래 호출을 재제출합니다. 재시도가 어느 서버 인스턴스에 도착해도 페이로드 안의 상태만으로 이어받을 수 있습니다.
서버가 먼저 보내는 요청도 클라이언트 요청을 처리하는 중에만 발행하도록 제한돼, 아무도 요청하지 않았는데 서버가 불쑥 프롬프트를 띄우는 경우를 스펙 차원에서 막습니다. 안전 규칙도 명시적입니다 — 비밀번호·API 키 같은 민감 정보는 폼 모드로 요청할 수 없고 URL 모드가 강제됩니다.
Tasks가 코어에서 확장 기능으로 내려간 자리
Tasks는 실험적 코어 기능에서 선택적 확장으로 지위가 바뀌며 생명주기도 재설계됩니다. tasks/list 대신 tasks/get·tasks/update·tasks/cancel로 클라이언트가 실행을 직접 이끌고, 태스크 생성 주체도 뒤집혀 클라이언트가 확장을 광고하면 서버가 그 호출을 태스크로 돌릴지 결정합니다. 기존 Tasks API를 그대로 호출하던 통합은 이 지점에서 호환이 끊깁니다.
설계에서 운영까지: MCP 무상태 전환 마이그레이션 가이드
릴리스 후보 창은 5월 21일부터 7월 28일까지이고, 오늘 기준 최종 스펙 확정까지 6일 남았습니다. 목표는 이 기간 안에 스테이징에서 레거시 initialize 핸드셰이크와 신규 무상태 discover 요청 두 경로를 모두 통과시키는 것으로 잡아야 합니다. Python·TypeScript·Go·C# 네 개 Tier 1 SDK가 베타로 나와 있어 실제 워크로드로 먼저 검증할 수 있습니다.
실패는 대체로 네 갈래로 반복됩니다. 스티키 세션에 의존하는 로드밸런서가 새 무상태 요청 분산과 충돌하는 경우, 오래된 SSE 기반 클라이언트가 InputRequiredResult 포맷을 못 읽어 elicitation이 멈추는 경우, tasks/list를 여전히 호출해 확장 미도입 서버에서 오류가 나는 경우, OAuth 클라이언트가 iss 파라미터를 검증하지 않아 발급자 스푸핑에 노출되는 경우입니다.
복구 경로는 v2 서버가 레거시 initialize와 신규 server/discover 요청 모두에 응답하도록 유지하는 데서 시작합니다. 공식 발표대로 v1.x는 v2 출시 이후 최소 6개월간 보안 패치를 받으므로, 카나리에서 오류율이 임계선을 넘으면 라우팅을 v1 경로로 되돌리고 배포 자체는 유지하는 분기를 코드로 미리 선언해 둡니다.
배포 전 체크리스트에는 세 가지를 필수로 넣습니다. elicitation 응답이 빈 배열로 돌아오는 시나리오, 서버가 unsolicited 요청을 보내지 않는지 확인하는 시나리오, 자격증명이 폼 모드 elicitation으로 새는지 정적 검사하는 시나리오입니다. 로그 필드는 프로토콜 버전(v1/v2)·핸드셰이크 종류·elicitation 왕복 횟수를 남겨야 두 버전의 지표를 같은 대시보드에서 비교할 수 있습니다.
RFC 9207에 따른 iss 파라미터 검증은 지금부터 넣어 두는 편이 안전합니다. 아직은 선택 사항이지만 최종 스펙에서는 필수로 바뀌므로, Dynamic Client Registration에 application_type을 선언하지 않은 클라이언트부터 마이그레이션 대상 목록에 올려 둡니다.
매주 v1 핸드셰이크로 들어오는 트래픽 비율을 추적해 100%에 못 미치면 원인 서버를 짚어냅니다. 8월 GA 이후에는 Go·C#처럼 옵트인 방식으로 남아 있는 스택부터 무상태 모드를 기본값으로 바꾸고, Tasks 확장을 아직 도입하지 않은 서버 목록은 별도 마이그레이션 백로그로 분리해 관리합니다.
바로 쓰는 체크리스트
무상태 전환의 성패는 벤치마크가 아니라 v1·v2 동시 대응 기간에서 갈립니다. iss 검증과 elicitation 안전 규칙을 먼저 넣고 SDK 베타 버전을 정확히 고정해 스테이징에서 검증한 뒤, 카나리 오류율 기준의 자동 롤백 경로까지 갖추면 7월 28일 GA가 지나가도 같은 절차가 그대로 돌아갑니다.
참고 링크
The 2026-07-28 MCP Specification Release Candidate — Model Context Protocol Blog
Beta SDKs for the 2026-07-28 MCP Spec Release Candidate — Model Context Protocol Blog