StreamableHTTP 심층 분석

Anthropic
Claude에서 열기
이 강좌에 대해 질문하기
노트 복사
LLM용 전체 강좌 노트 복사

StreamableHTTP는 근본적인 문제에 대한 MCP의 해결책입니다: 일부 MCP 기능은 서버가 클라이언트에 요청을 보내야 하지만, HTTP는 이를 어렵게 만듭니다. StreamableHTTP가 이 제한을 어떻게 해결하는지, 그리고 언제 그 우회 방법을 무효화해야 하는지 살펴보겠습니다.

핵심 문제

샘플링, 알림, 로깅과 같은 일부 MCP 기능은 서버가 클라이언트에 요청을 시작하는 것에 의존합니다. 그러나 HTTP는 클라이언트가 서버에 요청을 보내도록 설계되었지, 그 반대는 아닙니다. StreamableHTTP는 Server-Sent Events(SSE)를 사용한 똑똑한 우회 방법으로 이를 해결합니다.

StreamableHTTP 작동 방식

클라이언트와 서버 간에 영구 연결을 설정하는 다단계 프로세스를 통해 작동합니다.

초기 연결 설정

프로세스는 일반적인 MCP 연결과 같이 시작됩니다:

  • 클라이언트가 서버에 Initialize Request를 보냅니다
  • 서버가 특별한 mcp-session-id 헤더를 포함한 Initialize Result로 응답합니다
  • 클라이언트가 세션 ID와 함께 Initialized Notification을 보냅니다

이 세션 ID는 매우 중요합니다 - 클라이언트를 고유하게 식별하며 모든 향후 요청에 포함되어야 합니다.

SSE 우회 방법

초기화 후, 클라이언트는 GET 요청을 통해 Server-Sent Events 연결을 설정할 수 있습니다. 이는 서버가 언제든지 클라이언트에 메시지를 스트리밍할 수 있는 장기 HTTP 응답을 생성합니다.

이 SSE 연결은 서버에서 클라이언트로의 통신을 가능하게 하는 핵심입니다. 서버는 이제 이 영구 채널을 통해 요청, 알림 및 기타 메시지를 보낼 수 있습니다.

도구 호출과 이중 SSE 연결

클라이언트가 도구를 호출하면 상황이 더 복잡해집니다. 시스템은 두 개의 별도 SSE 연결을 생성합니다:

  • 기본 SSE 연결: 서버 시작 요청에 사용되며 무기한 열린 상태로 유지됩니다
  • 도구 전용 SSE 연결: 각 도구 호출마다 생성되며 도구 결과가 전송되면 자동으로 닫힙니다

메시지 라우팅

다른 유형의 메시지는 다른 연결을 통해 라우팅됩니다:

  • 진행 상황 알림: 기본 SSE 연결을 통해 전송
  • 로깅 메시지 및 도구 결과: 도구 전용 SSE 연결을 통해 전송

우회 방법을 무효화하는 설정 플래그

StreamableHTTP에는 두 가지 중요한 설정 옵션이 있습니다:

  • stateless_http
  • json_response

이들을 True로 설정하면 SSE 우회 메커니즘이 망가질 수 있습니다. 특정 시나리오에서 이 플래그를 활성화할 수 있지만, 서버에서 클라이언트로의 통신에 의존하는 전체 MCP 기능이 제한됩니다.

핵심 요약

StreamableHTTP는 HTTP의 제한을 우회해야 하기 때문에 다른 MCP 전송 방식보다 복잡합니다. SSE 기반 우회 방법은 HTTP를 통한 전체 MCP 기능을 가능하게 하지만, 디버깅과 최적화를 위해 이중 연결 모델을 이해하는 것이 중요합니다.

StreamableHTTP로 MCP 애플리케이션을 구축할 때, 초기화 후 모든 요청에 세션 ID가 필요하며, 시스템이 다양한 유형의 서버-클라이언트 통신을 처리하기 위해 여러 SSE 연결을 자동으로 관리한다는 점을 기억하세요.