MCP가 핸드셰이크(Handshake)를 끝냈습니다 (당신의 서버가 다음 차례입니다)
요약
Anthropic의 Model Context Protocol(MCP) 스펙이 확정됨에 따라 기존의 initialize 핸드셰이크와 세션 ID 방식이 폐지됩니다. 이를 통해 MCP는 상태를 유지하지 않는(stateless) 일반적인 웹 서비스와 유사한 구조로 진화하며 확장성이 크게 향상됩니다.
핵심 포인트
- MCP 스펙 확정으로 기존 핸드셰이크 및 세션 관리 방식 폐지 예정
- 상태(State) 제거를 통해 로드 밸런싱 및 대규모 환경 확장성 확보
- Tasks API가 Tasks 확장 기능(tasks/get, update, cancel)으로 대체
- 프로토콜 상태를 모델이 관리하는 방식으로 전환하여 인프라 복잡도 감소
당신은 MCP 서버를 올바른 방식으로 구축해 왔습니다: 핸드셰이크(handshakes), 그리고 어쩌면 샘플링(sampling)까지도 말이죠. 7월 28일 월요일, 스펙이 확정되면서 이 "올바른 방식"의 상당 부분이 레거시(legacy)가 됩니다. 폭발적인 변화가 일어나지는 않겠지만, 시계는 돌아가기 시작했습니다.
MCP 입문 (이미 알고 있다면 건너뛰세요)
Model Context Protocol (MCP)는 Anthropic(2024년 말)에서 발표한 오픈 표준으로, AI 앱이 외부 도구 및 데이터와 연결되는 방식을 정의합니다. 이는 로컬 stdio에서 실행되거나, 원격 도구의 경우 더 일반적으로 스트리밍 가능한 HTTP에서 실행됩니다. 세 가지 역할이 있습니다: 호스트 (host, 예: Claude Code 또는 Cursor와 같은 앱), 클라이언트 (client, 호스트 내부에서 실행되며 연결을 관리), 그리고 서버 (server, GitHub 또는 Postgres와 같은 도구의 기능을 래핑함).
서버는 세 가지 프리미티브(primitives)를 노출합니다: 도구 (Tools, 함수, JSON 입력), 리소스 (Resources, URI로 인덱싱된 데이터), 그리고 프롬프트 (Prompts, 예: 슬래시 명령어). 클라이언트 측 프리미티브는 서버가 클라이언트에게 무언가를 요청할 수 있게 합니다: 샘플링 (Sampling, 클라이언트 측의 LLM 완성), 루트 (Roots, 범위 내에 있는 디렉토리), 그리고 엘리시테이션 (Elicitation, 작업 중간에 더 많은 정보를 요청함). 이 중 두 가지는 사형 선고를 받았습니다.
지금까지 클라이언트와 서버는 초기화 핸드셰이크(initialize handshake)를 수행했으며, 원격 서버는 세션 내의 모든 후속 요청에 대해 Mcp-Session-Id 헤더를 발행했습니다.
핸드셰이크는 끝났습니다
우리는 initialize와 Mcp-Session-Id를 폐지할 예정이므로, 대규모 환경에서 더 이상 스티키 라우트(sticky routes)와 공유 상태 저장소(shared state store)를 관리할 필요가 없습니다. 연결은 더 이상 특정 서버 인스턴스에 종속되지 않습니다. 요청은 Mcp-Method 헤더를 기반으로 라우팅되며 로드 밸런서(load balancer) 뒤에 있는 어떤 인스턴스로도 도달할 수 있습니다. 본질적으로, MCP는 이제 다른 일반적인 웹 서비스와 같아졌습니다.
상태(State)는 부채이며, 이제 우리는 이를 상환하고 있습니다
세션(Sessions)은 스티키니스(stickiness)를 강제하기 위해, 공유 데이터 저장소(shared data stores)를 위해, 그리고 게이트웨이 패킷 검사(gateway packet inspection)를 위해 사용되었습니다. 이제 그것들은 사라졌습니다. 그것들은 의미 있는 것을 아무것도 추가하지 못하는 상태(state)를 위한 인프라 세금(infrastructure tax)이었습니다. 상태(State)는 부채입니다. 컨텍스트 엔지니어링 (context engineering)과 평행한 지점이 있습니다: 중복된 토큰은 자산이 아니라 부채(liabilities)입니다. 프로토콜 상태(Protocol state) 또한 마찬가지였습니다. 아이러니하게도, 상태 유지(statefulness)의 일부는 모델로 다시 밀려나고 있으며, 이제 모델이 서버 대신 호출 체인(chain of calls)을 저장합니다. 이것이 더 우월한 접근 방식인데, 왜냐하면 모델이 버스를 운전하고 있기 때문입니다.
실제로 깨지는 것 (그리고 그냥 냄새만 나는 것)
확실하게 깨지는 부분은 Tasks API이며, 이는 Tasks 확장 기능(extension)으로 대체됩니다: 태스크 호출(task calls)은 tasks/get, tasks/update, tasks/cancel로 마이그레이션됩니다. 사용 중단(Deprecated) 예정이지만 12개월의 유예 기간이 있는 항목은 Roots (대신 tool params/config를 사용하세요), Sampling (MCP가 귀하의 모델 API에 직접 도달함), 그리고 Logging (stderr 또는 OpenTelemetry)입니다. 인증(Auth)은 강화되고 있습니다: OAuth 2.1이 이제 필수입니다. 사소한 SDK 업데이트: Python은 FastMCP를 MCPServer로 이름을 변경하고, TypeScript는 ESM 전용으로 전환되며, Go와 C#은 프리뷰(preview) 단계로 등장합니다.
이번 주 귀하의 마이그레이션 패스
- 세션 가정(session assumptions)을 찾기 위해 grep을 실행하고 핸들러를 초기화하세요.
- Roots/Sampling/Logging 사용 방식을 업데이트하세요; 이제 각각에 대해 명명된 대체 수단이 있습니다.
- v2가 갑작스럽게 찾아오기 전에 중요한 SDK 버전을 고정(pin)하세요.
temrel-agentic-toolkit으로부터
또는 오늘 우리가 출시하는 도구를 사용하세요: mcp-spec-audit. 이 도구는 귀하의 리포지토리(repo)를 스캔하여 업데이트와 관련된 지뢰를 찾아내고 마이그레이션 체크리스트를 제공합니다. CLI에서 실행하거나 Claude Code 스킬로 채택하세요; 스킬을 사용하는 것이 가장 빠른 경로인데, Claude가 출력을 후속 조치하여 수정 사항을 완료할 것을 제안할 것이기 때문입니다.
오늘 바로 실행하세요
- 귀하가 소유한 모든 MCP 서버에 대해 mcp-spec-audit(또는 위의 수동 grep)을 실행하세요.
- 실험적인 Tasks API를 사용하는 모든 것을 지금 마이그레이션하세요: 이것이 유일한 확실한 변경 사항(hard break)입니다.
- 사용 중단(deprecated)되는 기능마다 명명된 대체 수단과 함께 12개월 유예 기간 내의 날짜를 기입하여 티켓을 생성하세요.
이것이 중요한 이유
프로토콜은 코드베이스와 마찬가지로 삭제를 통해 성숙해집니다. MCP가 상태(state)를 덜어내는 것은 그것이 지루한 인프라(infrastructure)가 되어가고 있음을 의미하며, 지루함이야말로 승리하는 요소입니다. 계속해서 질문하십시오: 어떻게 하면 상태를 더 많이 덜어내거나, 더 유용한 위치로 전달할 수 있을까?
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기