TL;DR
- MCP의 클라이언트-서버 통신은 JSON-RPC 2.0 메시지로 이뤄진다.
- 요청은
jsonrpc·method·id를 갖고(params는 선택), 응답은 같은id로result또는error를 돌려준다.id가 없는 요청은 응답을 받지 않는 notification이다.- 핵심 메서드는 도구 목록 조회(
tools/list)와 도구 호출(tools/call)이다.- 오류는 표준 코드(
-32600Invalid Request,-32602Invalid params 등)로 구분된다.
MCP는 JSON-RPC 2.0 요청-응답으로 도구를 호출한다
JSON-RPC 2.0은 원격 프로시저 호출을 JSON 객체로 표현하는 경량 프로토콜이다. MCP는 클라이언트와 서버가 주고받는 메시지 형식으로 이것을 채택한다. 요청마다 id를 붙이고 응답이 같은 id를 돌려주므로 비동기로 여러 요청이 섞여도 짝을 맞출 수 있다.
메시지 형태
요청 객체는 다음 필드로 구성된다.
jsonrpc: 버전 문자열, 항상"2.0"method: 호출할 메서드 이름 (예:tools/call)params: 메서드 인자 (선택)id: 요청 식별자 (응답 매칭용).id가 없으면 응답을 받지 않는 notification이다.
도구 호출 요청과 성공 응답의 예시는 다음과 같다(2025-11-25 형태; 2026-07-28은 result에 resultType이 붙는다).
// 요청
{ "jsonrpc": "2.0", "id": 2, "method": "tools/call",
"params": { "name": "demo_calculate", "arguments": { "a": 10, "b": 5, "operation": "add" } } }
// 응답
{ "jsonrpc": "2.0", "id": 2,
"result": { "content": [ { "type": "text", "text": "15.0" } ] } }전체 메시지 전문(tools/list 스키마 포함)과 서버·클라이언트 구현 코드는 2025-11-30-[MCP-Study]-MCP 서버·클라이언트 구현 코드 레퍼런스 참조.
핵심 메서드
tools/list: 서버가 제공하는 도구 목록과 각 도구의 입력 스키마를 반환한다.tools/call: 도구 이름과 인자를 넘겨 실제로 실행한다.
tools/list로 무엇이 있는지 알고 tools/call로 부르는 흐름의 주체가 누구인지는 MCP에서 도구 발견은 코드가 하고 선택은 LLM이 한다에서 다룬다. (도구 외에 리소스·프롬프트 같은 다른 원시 요소도 같은 JSON-RPC 위에서 각자의 메서드로 오간다.)
표준 에러 코드
실패는 result 대신 error 객체로 오며, JSON-RPC 표준 코드를 쓴다.
| 코드 | 의미 | 설명 |
|---|---|---|
-32700 | Parse error | JSON 파싱 실패 |
-32600 | Invalid Request | 요청 형식 오류 |
-32601 | Method not found | 없는 메서드 |
-32602 | Invalid params | RPC 요청의 매개변수 오류 (예: 존재하지 않는 도구 이름) |
-32603 | Internal error | 서버 내부 오류 |
위 코드는 RPC 요청 형식·메서드·서버 처리 등의 오류를 나타낸다. 반면 도구가 받은 입력값의 검증 실패(enum·범위 등)는 Tool Execution Error로 구분해 result 안에 isError: true와 오류 content를 반환한다. JSON-RPC 응답이 result를 포함한다고 도구 작업까지 성공했다는 뜻은 아니다. MCP Error Handling.
전송과의 분리
JSON-RPC는 메시지의 형식만 정한다. 그 메시지를 무엇에 실어 나를지는 전송 계층이 정하며 stdio든 HTTP든 같은 JSON-RPC가 오간다. 전송 선택은 MCP 전송은 stdio와 Streamable HTTP 중에 고른다를 참조한다.
버전 주의
MCP 2026-07-28도 JSON-RPC 메서드 호출은 그대로 유지한다. 해당 개정이 없앤 것은 initialize 핸드셰이크와 프로토콜 세션이지 tools/call 같은 호출 자체가 아니다. 버전·능력 같은 문맥을 세션 대신 요청별 _meta에 담는 방식으로 바뀌었다. 또한 2026-07-28의 모든 성공 result는 resultType(보통 "complete")을 포함한다. 위 예시는 이 필드가 없는 2025-11-25 형태다. 세부는 Model Context Protocol 2026-07-28 사양은 핸드셰이크와 프로토콜 세션을 없앤다를 참조한다.
Connections
- MCP는 Host·Client·Server·외부 서비스로 역할을 나눈다 — 이 메시지를 주고받는 Client와 Server의 역할
- MCP에서 도구 발견은 코드가 하고 선택은 LLM이 한다 —
tools/list·tools/call을 누가 언제 부르는가 - MCP 전송은 stdio와 Streamable HTTP 중에 고른다 — 같은 JSON-RPC를 실어 나르는 전송 계층
- Model Context Protocol 2026-07-28 사양은 핸드셰이크와 프로토콜 세션을 없앤다 — JSON-RPC는 두고 세션만 걷어낸 개정
- SSE (Server-Sent Events) — HTTP 전송에서 응답 스트리밍에 쓰는 방식
Discussion
Comments
댓글은 승인 후 공개됩니다.