MCP(Model Context Protocol)는 클라이언트와 서버 간의 통신을 처리하기 위해 JSON 메시지를 사용합니다. 이러한 메시지 유형을 이해하는 것은 MCP로 작업할 때, 특히 streamable HTTP transport와 같은 다양한 전송 방식을 다룰 때 매우 중요합니다.
메시지 형식
모든 MCP 통신은 JSON 메시지를 통해 이루어집니다. 각 메시지 유형은 도구를 호출하거나, 사용 가능한 리소스를 나열하거나, 시스템 이벤트에 대한 알림을 보내는 등 특정한 목적을 수행합니다.

다음은 일반적인 예시입니다: Claude가 MCP 서버가 제공하는 도구를 호출해야 할 때, 클라이언트는 "Call Tool Request" 메시지를 보냅니다. 서버는 이 요청을 처리하고, 도구를 실행한 다음, 출력을 포함한 "Call Tool Result" 메시지로 응답합니다.

MCP 명세
전체 메시지 유형 목록은 GitHub의 공식 MCP 명세 저장소에 정의되어 있습니다. 이 명세는 다양한 SDK 저장소(Python 또는 TypeScript SDK 등)와는 별개이며, MCP가 어떻게 작동해야 하는지에 대한 권위 있는 출처로 사용됩니다.
메시지 유형은 편의를 위해 TypeScript로 작성되어 있습니다 - TypeScript 코드로 실행되기 때문이 아니라, TypeScript가 데이터 구조와 유형을 명확하게 설명하는 방법을 제공하기 때문입니다.
메시지 범주
MCP 메시지는 두 가지 주요 범주로 나뉩니다:

요청-결과 메시지
이러한 메시지는 항상 쌍으로 제공됩니다. 요청을 보내고 결과를 받을 것으로 예상합니다:
- Call Tool Request → Call Tool Result
- List Prompts Request → List Prompts Result
- Read Resource Request → Read Resource Result
- Initialize Request → Initialize Result
알림 메시지
이는 이벤트에 대해 알려주지만 응답을 요구하지 않는 단방향 메시지입니다:
- Progress Notification - 장시간 실행되는 작업에 대한 업데이트
- Logging Message Notification - 시스템 로그 메시지
- Tool List Changed Notification - 사용 가능한 도구가 변경될 때
- Resource Updated Notification - 리소스가 수정될 때
클라이언트 메시지 vs 서버 메시지
MCP 명세는 누가 메시지를 보내는지에 따라 메시지를 구성합니다:
클라이언트 메시지에는 클라이언트가 서버로 보내는 요청(도구 호출 등)과 클라이언트가 보낼 수 있는 알림이 포함됩니다.
서버 메시지에는 서버가 클라이언트로 보내는 요청과 서버가 브로드캐스트하는 알림이 포함됩니다.
이것이 중요한 이유
서버가 클라이언트로 메시지를 보낼 수 있다는 점을 이해하는 것은 다양한 전송 방식으로 작업할 때 특히 중요합니다. streamable HTTP transport와 같은 일부 전송 방식은 어떤 방향으로 어떤 유형의 메시지가 흐를 수 있는지에 제한이 있습니다.
핵심은 MCP가 양방향 프로토콜로 설계되었다는 것입니다 - 클라이언트와 서버 모두 통신을 시작할 수 있습니다. 이는 특정 사용 사례에 맞는 올바른 전송 방식을 선택해야 할 때 매우 중요해집니다.