2026-07-28 명세에 들어간 MCP 구조로, 세션 없이 프로토콜 버전·클라이언트 정보·지원 기능을 요청마다 담아 보내서 요청 하나만 봐도 처리할 수 있다. 초기화 핸드셰이크로 세션을 먼저 만들던 이전 방식과 달리, 원격 MCP 서버를 일반 로드밸런서나 서버리스에 올려 여러 대로 늘릴 때 특히 도움이 된다.
| 항목 | 이전 (스테이트풀) | 이제 (스테이트리스) |
|---|---|---|
| 시작 절차 | initialize 핸드셰이크 | 없음, 바로 요청 |
| 세션 식별 | Mcp-Session-Id 헤더 | 없음 |
| 로드밸런서 | 스티키 라우팅 필요 | 일반 라운드로빈 |
| 서버 재시작 | 열린 세션이 모두 끊김 | 다른 인스턴스가 받음 |
예전에는 세션이 서버 프로세스 하나에 묶여 있었다. 그래서 같은 클라이언트를 늘 같은 인스턴스로 보내거나, 공유 세션 저장소를 따로 운영해야 했다. 이제는 어느 인스턴스든 어떤 요청이든 처리할 수 있어서, 보통 웹 앱처럼 배포하고 수평으로 늘리면 된다.
도구·프롬프트·리소스만 제공하는 서버라면 Cloudflare Worker나 Cloud Run 같은 서버리스에 바로 올릴 수 있다. 붙잡고 있을 연결이 없으니 쓰지 않을 때는 인스턴스가 0까지 줄어 비용이 준다. 클라이언트도 도구 정의를 안전하게 캐시할 수 있다.
스테이트리스라고 해서 서버가 아무것도 기억하지 못하는 건 아니다. 열린 브라우저 탭, 커밋 전 DB 트랜잭션, 장바구니처럼 도구가 다루는 상태는 계속 남아 있을 수 있다. 바뀐 건 클라이언트가 그 상태를 가리키는 방식이다. 숨은 세션에 기대지 않고 요청에 직접 적어 보내기 때문에, 어느 인스턴스가 받아도 해당 자원을 찾아갈 수 있다.
| 상황 | 처리 방법 |
|---|---|
| 조회·검색 같은 단순 도구 | 상태 없이 요청만 처리 |
| 브라우저 조작, 트랜잭션 | 자원 식별자를 요청에 담아 보냄 |
| 여러 요청이 상태를 함께 조율 | Durable Objects 같은 별도 저장소 사용 |
핸드셰이크와 세션 헤더가 없어졌으니 하위 호환이 깨지는 변경이다. TypeScript·Python·Go·C# 공식 SDK가 새 명세에 맞춰 바뀌었으므로, SDK를 올리고 세션에 기대던 코드를 걷어내면 된다. 옛 클라이언트가 아직 남아 있으면 두 가지 방법이 있다. 같은 경로에서 새 클라이언트와 옛 클라이언트를 함께 받거나, 두 버전을 모두 지원하는 MCP 게이트웨이를 앞에 둬서 전환 기간을 넘기면 된다.
가장 흔한 건 원격 도구 서버를 보통 웹 서비스처럼 배포하는 방식이다. 로컬에서 띄우던 MCP 서버를 인터넷에 올려 여러 사람과 여러 에이전트가 함께 쓰게 할 때, 세션 관리 부담 없이 늘리고 줄일 수 있다.
| 어디서 | 어떻게 쓰나 |
|---|---|
| 서버리스 도구 서버 | 조회·검색 도구를 Worker나 Cloud Run에 올리고, 요청이 없을 때는 0대로 줄여 비용을 아낀다 |
| 팀·사내 공용 MCP 서버 | 일반 로드밸런서 뒤에 여러 대를 두고 라운드로빈으로 나눠 받는다 |
| 브라우저·DB 같은 상태 있는 도구 | 탭이나 트랜잭션 식별자를 요청에 담아, 어느 인스턴스가 받아도 이어서 처리한다 |
| 버전 전환 기간 | 게이트웨이를 앞에 두고 옛 클라이언트와 새 클라이언트를 함께 받는다 |