MCP 전송 계층

MCP 전송 계층 (Transport) 개요

MCP는 클라이언트와 서버가 메시지를 "어떻게 실어 보낼지"를 전송(Transport) 레이어가 담당해요. 이 페이지는 전송이 MCP 메시지를 운반하기 위해 반드시 제공해야 하는 것, 표준 전송 바인딩, 그리고 새 전송을 정의할 때 지켜야 할 요건을 설명합니다.

가장 먼저 기억할 핵심은 이것입니다. 프로토콜의 의미(semantics)는 어떤 전송 위에서든 동일해요. 전송은 메시지를 어떻게 프레이밍(framing)하고 전달할지, 요청 메타데이터를 어떻게 실어 나를지, 취소와 종료를 어떻게 알릴지를 정의하는 일종의 **바인딩(binding)**입니다. 메시지가 무슨 뜻인지는 전송이 정의하지 않아요 — 메시지 패턴은 코어 프로토콜의 일부로, 어떤 바인딩에서도 똑같이 적용됩니다.

표준 전송은 두 가지예요:

  1. stdio: 클라이언트가 띄운 서브프로세스의 표준 스트림 위에서 줄바꿈(newline)으로 구분된 메시지를 주고받습니다.
  2. Streamable HTTP: 각 메시지를 단일 MCP 엔드포인트로 보내는 HTTP POST로 보내고, 응답은 JSON 객체 또는 요청에 한정된 SSE 스트림으로 받습니다.

클라이언트와 서버가 커스텀 전송을 구현하는 것도 가능해요.

출처: MCP 공식 문서 — Transports Overview

메시지 (Messages)

MCP는 메시지를 JSON-RPC로 인코딩합니다. JSON-RPC 메시지는 반드시(MUST) UTF-8로 인코딩해야 해요.

바인딩은 클라이언트가 보낸 *요청(request)*과 *알림(notification)*을 서버에 전달하고, 서버가 보낸 *응답(response)*과 알림을 클라이언트에 전달해야 합니다(MUST). 그 외의 방향은 존재하지 않아요 — 메시지 패턴에 따라 서버는 JSON-RPC 요청을 시작하지 않고, 클라이언트는 JSON-RPC 응답을 보내지 않습니다.

요청 메타데이터 (Request Metadata)

모든 프로토콜 메타데이터는 메시지 본문에 실립니다. 모든 요청은 프로토콜 버전과 클라이언트 역량을 _meta.io.modelcontextprotocol/* 필드에 담아 보내요.

바인딩은 선택적으로(MAY) 본문 필드 일부를 엔벨로프 메타데이터로 미러링할 수 있습니다. Streamable HTTP 전송은 이를 HTTP 헤더로 미러링해서, 중간 장비(intermediary)가 본문을 파싱하지 않고도 요청을 라우팅하고 검사할 수 있게 해줘요. 본문이 진실 원천(source of truth)이며, 메타데이터를 미러링하는 바인딩은 값이 어긋날 때 어떻게 거부할지를 정의합니다.

취소 (Cancellation)

각 바인딩은 클라이언트가 진행 중인 요청을 포기하는 방법을 정의합니다. stdio에서는 클라이언트가 notifications/cancelled 알림을 보내고, Streamable HTTP에서는 요청의 응답 스트림을 닫아요. 프로토콜 수준의 규칙은 어디서나 동일하며, 자세한 내용은 Cancellation에서 확인할 수 있어요.

커스텀 전송 (Custom Transports)

클라이언트와 서버는 필요에 맞게 추가적인 커스텀 전송 메커니즘을 구현할 수 있습니다(MAY). 프로토콜은 전송에 무관(transport-agnostic)하며, 양방향 메시지 교환을 지원하는 어떤 통신 채널 위에서든 구현 가능해요.

커스텀 전송을 지원하는 구현은 JSON-RPC 메시지 형식, 메시지 패턴, 요청별 메타데이터 모델을 반드시(MUST) 보존해야 합니다. 커스텀 전송은 상호운용성을 돕기 위해 연결 수립, 메시지 프레이밍, 취소 패턴을 문서화해야 하며(SHOULD), 신뢰할 수 있는 양방향 바이트 스트림(예: Unix 도메인 소켓이나 TCP) 위에서 도는 커스텀 전송은 새 프레이밍을 정의하기보다 stdio 프레이밍을 재사용하는 것을 권장합니다(SHOULD). stdio 바인딩은 바이트 스트림 위의 줄바꿈 구분 JSON-RPC일 뿐이고, 프로세스 수명주기 규칙만 표준 스트림에 특화돼 있기 때문이에요.

하위 호환성 (Backward Compatibility)

이전 프로토콜 개정판은 initialize 핸드셰이크로 연결 범위 세션(connection-scoped session)을 수립했고, 서버가 JSON-RPC 요청을 시작하는 것을 허용했어요. 이런 개정판과 상호운용하는 클라이언트·서버는 상대방의 시대(era)를 감지해서 Versioning: Backward Compatibility에 설명된 대로 폴백합니다. 구현자를 위한 호환성 매트릭스도 그 페이지에 포함돼 있어요. 각 바인딩 페이지는 전송별 감지 메커니즘을 설명합니다.

더 알아보기 (Learn more)