Streamable HTTP 가 stateful 과 stateless server 둘 다 지원. Protocol 이 골라주지 않음 — 디자인 시점에 고르고 Mcp-Session-Id header 로 신호.
Stateful server 는 initialize 때 session id 발급 (Mcp-Session-Id response 에). 이후 request 가 같은 id 를 request header 에 carry. Server 가 id 로 per-session state — open subscription, paginated cursor, in-flight long-running task — lookup. Tear-down 명시적: client 가 끝나면 endpoint 에 session id 담은 HTTP DELETE; server 가 state 정리.
Stateless server 는 session id 발급 안 함. 모든 request 독립; per-call 작업 in-process 로 하고 버림. Stateless server 는 — load balancer 뒤 어느 노드든 어느 request 든 처리 가능 — 조율 없이 horizontal scale; 그러나 subscription, call 간 cursor pagination, '이 client 한테 마지막에 뭐라 했지' 기억하는 어떤 feature 도 못 줌.
선택은 운영적. Stateful server 가 짜기 쉽지만 scale 어려움 (sticky routing 또는 공유 session storage 필요). Stateless 가 scale 쉽지만 — request payload 에 state push 해야 함 (e.g. cursor 를 opaque token 으로). 대부분 production 배포가 결국 stateless (CDN-처럼 edge) + Redis 같은 데 공유 state — stateless plumbing 의 단순함과 stateful semantic 의 capability 동시.