LOTS-OResearch Notes

TL;DR

  • MCP의 클라이언트-서버 통신은 JSON-RPC 2.0 메시지로 이뤄진다.
  • 요청은 jsonrpc·method·id를 갖고(params는 선택), 응답은 같은 id로 result 또는 error를 돌려준다. id가 없는 요청은 응답을 받지 않는 notification이다.
  • 핵심 메서드는 도구 목록 조회(tools/list)와 도구 호출(tools/call)이다.
  • 오류는 표준 코드(-32600 Invalid Request, -32602 Invalid 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 표준 코드를 쓴다.

코드의미설명
-32700Parse errorJSON 파싱 실패
-32600Invalid Request요청 형식 오류
-32601Method not found없는 메서드
-32602Invalid paramsRPC 요청의 매개변수 오류 (예: 존재하지 않는 도구 이름)
-32603Internal 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

출처

  1. Model Context Protocol, Specification 2026-07-28: Tools, Error Handling ↩︎