
MCP의 새로운 전송 계층 - Streamable HTTP 프로토콜 상세 설명

양명
Model Context Protocol (MCP)는 AI 모델과 도구 간 통신을 위한 표준 프로토콜입니다. AI 애플리케이션이 점점 더 복잡해지고 광범위하게 배포됨에 따라 기존 통신 메커니즘은 일련의 도전 과제에 직면하고 있습니다. GitHub의 PR #206은 기존 HTTP+SSE 전송 메커니즘을 크게 개선한 새로운 Streamable HTTP
전송 계층을 도입했습니다. 이 글은 이 프로토콜의 설계 철학, 기술적 세부 사항 및 실제 적용에 대해 상세히 분석합니다.
기존 HTTP+SSE 전송 메커니즘과 한계
기존 MCP 구현에서 클라이언트와 서버는 두 가지 주요 채널을 통해 통신했습니다:
- HTTP 요청/응답: 클라이언트가 표준 HTTP 요청을 통해 서버에 메시지 전송
- 서버 전송 이벤트(SSE): 서버가 전용
/sse
엔드포인트를 통해 클라이언트에 메시지 푸시
주요 문제점
이 설계는 단순하고 직관적이지만 몇 가지 중요한 문제가 있었습니다:
연결 끊김 복구/재개 미지원
SSE 연결이 끊어지면 모든 세션 상태가 손실되며, 클라이언트는 연결을 다시 설정하고 전체 세션을 초기화해야 합니다. 예를 들어 대용량 파일 분석 작업이 진행 중일 때 WiFi가 불안정하면 전체 프로세스가 중단되어 사용자가 처음부터 다시 시작해야 합니다.
서버 장시간 연결 유지 필요
서버는 각 클라이언트마다 장시간 SSE 연결을 유지해야 하며, 많은 동시 사용자로 인해 리소스 소비가 급증합니다. 서버를 재시작하거나 확장해야 할 때 모든 연결이 끊어져 사용자 경험과 시스템 안정성이 저하됩니다.
서버 메시지 SSE 전송만 가능
간단한 요청-응답 상호작용도 SSE 채널을 통해 정보를 반환해야 하므로 불필요한 복잡성과 오버헤드가 발생합니다. 일부 환경(예: 클라우드 함수)에서는 장시간 SSE 연결 유지가 적합하지 않습니다.
인프라 호환성 제한
많은 기존 웹 인프라(CDN, 로드 밸런서, API 게이트웨이 등)가 장시간 SSE 연결을 올바르게 처리하지 못할 수 있으며, 기업 방화벽이 시간 초과 연결을 강제로 종료하여 서비스 신뢰성이 떨어질 수 있습니다.
Streamable HTTP: 설계와 원리
Streamable HTTP는 다음과 같은 핵심 개념에 기반하여 설계되었습니다:
- 최대 호환성: 기존 HTTP 생태계와 원활하게 통합
- 유연성: 상태 비저장 및 상태 저장 모드 동시 지원
- 리소스 효율성: 필요에 따라 리소스 할당, 불필요한 장시간 연결 방지
- 신뢰성: 연결 끊김 복구 및 세션 재개 지원
주요 개선 사항
기존 메커니즘과 비교하여 Streamable HTTP는 몇 가지 중요한 개선 사항을 도입했습니다:
- 통합 엔드포인트: 전용
/sse
엔드포인트 제거, 모든 통신은 단일 엔드포인트(예:/message
)를 통해 수행 - 주문형 스트리밍 전송: 서버는 일반 HTTP 응답 반환 또는 SSE 스트림으로 업그레이드 유연하게 선택 가능
- 세션 식별자: 세션 ID 메커니즘 도입, 상태 관리 및 복구 지원
- 유연한 초기화: 클라이언트가 빈 GET 요청으로 SSE 스트림을 능동적으로 초기화 가능
기술적 세부 사항
Streamable HTTP의 작동 흐름은 다음과 같습니다:
-
세션 초기화:
- 클라이언트가
/message
엔드포인트에 초기화 요청 전송 - 서버는 세션 ID 생성 후 클라이언트에 반환 가능
- 세션 ID는 이후 요청에서 세션 식별에 사용
- 클라이언트가
-
클라이언트-서버 통신:
- 모든 메시지는 HTTP POST 요청으로
/message
엔드포인트에 전송 - 세션 ID가 있으면 요청에 포함
- 모든 메시지는 HTTP POST 요청으로
-
서버 응답 방식:
- 일반 응답: 직접 HTTP 응답 반환, 간단한 상호작용에 적합
- 스트림 응답: 연결을 SSE로 업그레이드, 일련의 이벤트 전송 후 종료
- 장시간 연결: SSE 연결 유지, 지속적으로 이벤트 전송
-
능동적 SSE 스트림 생성:
- 클라이언트가
/message
엔드포인트에 GET 요청 전송하여 SSE 스트림 능동적으로 생성 가능 - 서버는 이 스트림을 통해 알림 또는 요청 푸시 가능
- 클라이언트가
-
연결 복구:
- 연결이 끊어지면 클라이언트는 이전 세션 ID 사용하여 재연결 가능
- 서버는 세션 상태 복구 후 이전 상호작용 계속 가능
실제 적용 시나리오
상태 비저장 서버 모드
시나리오: 수학 계산, 텍스트 처리 등 간단한 도구 API 서비스.
구현:
클라이언트 서버
| |
|-- POST /message (계산 요청) -------->|
| |-- 계산 실행
|<------- HTTP 200 (계산 결과) -------|
| |
장점: 최소한의 배포, 상태 관리 불필요, 서버리스 아키텍처 및 마이크로서비스에 적합.
스트리밍 진행 피드백 모드
시나리오: 대용량 파일 처리, 복잡한 AI 생성 등 장시간 실행 작업.
구현:
클라이언트 서버
| |
|-- POST /message (처리 요청) -------->|
| |-- 처리 작업 시작
|<------- HTTP 200 (SSE 시작) --------|
| |
|<------- SSE: 진행률 10% ---------------|
|<------- SSE: 진행률 30% ---------------|
|<------- SSE: 진행률 70% ---------------|
|<------- SSE: 완료 + 결과 ------------|
| |
장점: 실시간 피드백 제공, 영구 연결 상태 유지 불필요.
복잡한 AI 세션 모드
시나리오: 컨텍스트 유지가 필요한 다중 턴 대화형 AI 어시스턴트.
구현:
클라이언트 서버
| |
|-- POST /message (초기화) ---------->|
|<-- HTTP 200 (세션ID: abc123) ------|
| |
|-- GET /message (세션ID: abc123) --->|
|<------- SSE 스트림 생성 ------------|
| |
|-- POST /message (질문1, abc123) --->|
|<------- SSE: 생각 중... -------------|
|<------- SSE: 답변1 ----------------|
| |
|-- POST /message (질문2, abc123) --->|
|<------- SSE: 생각 중... -------------|
|<------- SSE: 답변2 ----------------|
장점: 세션 컨텍스트 유지, 복잡한 상호작용 지원, 수평 확장 가능.
연결 끊김 복구 모드
시나리오: 불안정한 네트워크 환경에서의 AI 애플리케이션 사용.
구현:
클라이언트 서버
| |
|-- POST /message (초기화) ---------->|
|<-- HTTP 200 (세션ID: xyz789) ------|
| |
|-- GET /message (세션ID: xyz789) --->|
|<------- SSE 스트림 생성 ------------|
| |
|-- POST /message (장시간 작업, xyz789) -->|
|<------- SSE: 진행률 30% ---------------|
| |
| [네트워크 중단] |
| |
|-- GET /message (세션ID: xyz789) --->|
|<------- SSE 스트림 재생성 -----------|
|<------- SSE: 진행률 60% ---------------|
|<------- SSE: 완료 ------------------|
장점: 약한 네트워크 환경에서 신뢰성 향상, 사용자 경험 개선.
Streamable HTTP의 주요 장점
기술적 장점
- 구현 단순화: 일반 HTTP 서버에서 구현 가능, 특별한 지원 불필요
- 리소스 효율성: 필요에 따라 리소스 할당, 클라이언트별 장시간 연결 유지 불필요
- 인프라 호환성: 기존 웹 인프라(CDN, 로드 밸런서, API 게이트웨이)와 잘 호환
- 수평 확장: 메시지 버스를 통해 요청을 다른 서버 노드로 라우팅 가능
- 점진적 도입: 서비스 제공자는 필요에 따라 구현 복잡도 선택 가능
- 연결 끊김 복구: 세션 복구 지원, 신뢰성 향상
비즈니스 장점
- 운영 비용 절감: 서버 리소스 소비 감소, 배포 아키텍처 단순화
- 사용자 경험 향상: 실시간 피드백과 신뢰할 수 있는 연결로 경험 개선
- 광범위한 적용성: 간단한 도구부터 복잡한 AI 상호작용까지 다양한 구현 방식 제공
- 확장 능력: 더 다양하고 풍부한 AI 애플리케이션 시나리오 지원
- 개발자 친화적: MCP 구현 기술 진입 장벽 낮춤
구현 참고 사항
서버 측 구현 핵심 사항
-
엔드포인트 설계:
- 모든 요청을 처리하는 단일
/message
엔드포인트 구현 - POST 및 GET 두 가지 HTTP 메서드 지원
- 모든 요청을 처리하는 단일
-
상태 관리:
- 세션 ID 생성 및 검증 메커니즘 설계
- 세션 상태 저장소 구현(메모리, Redis 등)
-
요청 처리:
- 요청에서 세션 ID 파싱
- 응답 유형 결정(일반 HTTP 또는 SSE)
- 스트림 응답의 콘텐츠 유형 및 형식 처리
-
연결 관리:
- SSE 스트림 초기화 및 유지 구현
- 연결 끊김 및 재연결 로직 처리
클라이언트 측 구현 핵심 사항
-
요청 구성:
- 프로토콜 준수 메시지 형식 구성
- 세션 ID(있는 경우) 올바르게 포함
-
응답 처리:
- 응답이 일반 HTTP인지 SSE인지 감지
- SSE 이벤트 파싱 및 처리
-
세션 관리:
- 세션 ID 저장 및 관리
- 연결 끊김 복구 로직 구현
-
오류 처리:
- 네트워크 오류 및 시간 초과 처리
- 지수 백오프 재시도 전략 구현
결론
Streamable HTTP 전송 계층은 MCP 프로토콜의 중요한 진화를 나타내며, HTTP와 SSE의 장점을 결합하고 한계를 극복하여 AI 애플리케이션 통신을 위한 더 유연하고 신뢰할 수 있는 솔루션을 제공합니다. 이는 기존 전송 메커니즘의 문제를 해결할 뿐만 아니라 미래의 더 복잡한 AI 상호작용 패턴을 위한 기반을 마련합니다.
이 프로토콜의 설계는 실용성 원칙을 충분히 반영하며, 기술적 선진성 요구 사항을 충족하는 동시에 기존 웹 인프라와의 호환성을 유지합니다. 그 유연성으로 인해 개발자는 자신의 요구에 가장 적합한 구현 방식을 선택할 수 있으며, 간단한 상태 비저장 API부터 복잡한 대화형 AI 애플리케이션까지 모두 적합한 솔루션을 찾을 수 있습니다.
이 PR이 병합됨에 따라 MCP 커뮤니티의 기술 생태계는 더욱 풍부해질 것이며, 더 많은 개발자가 MCP를 채택하는 데 편의를 제공할 것입니다. 가까운 미래에 Streamable HTTP 기반 MCP 구현이 다양한 AI 애플리케이션에서 광범위하게 적용되는 것을 볼 수 있을 것으로 기대합니다.