LOTS-OResearch Notes

TL;DR

  • MCP의 클라이언트-서버 통신은 JSON-RPC 2.0 메시지로 이뤄진다.
  • 요청은 jsonrpc·method·id를 갖고(params는 선택), 응답은 같은 idresult 또는 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은 resultresultType이 붙는다).

// 요청
{ "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를 포함한다고 도구 작업까지 성공했다는 뜻은 아니다. 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의 모든 성공 resultresultType(보통 "complete")을 포함한다. 위 예시는 이 필드가 없는 2025-11-25 형태다. 세부는 Model Context Protocol 2026-07-28 사양은 핸드셰이크와 프로토콜 세션을 없앤다를 참조한다.


Connections