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를 포함한다고 도구 작업까지 성공했다는 뜻은 아니다.1
전송과의 분리
JSON-RPC는 메시지의 형식만 정한다. 그 메시지를 무엇에 실어 나를지는 전송 계층이 정하며 stdio든 HTTP든 같은 JSON-RPC가 오간다. 전송 선택은 MCP 전송은 stdio와 Streamable HTTP 중에 고른다를 참조한다.
버전 주의
MCP 2026-07-28도 tools/call 같은 JSON-RPC 메서드 호출을 그대로 유지한다. initialize 핸드셰이크와 프로토콜 세션은 제거됐다. 버전·능력 같은 문맥을 세션 대신 요청별 _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
댓글은 승인 후 공개됩니다.