JSON-RPC 2.0 协议
别名:
JSON-RPC
一种无状态、轻量的远程过程调用协议,MCP 的每一种消息都建立在它之上。三种消息形态:request(有 id)、notification(无 id 无响应)、response(id + result 或 error 二选一),id 是响应与在途请求的唯一配对键。见[第 21 章](/chapters/21-mcp-v08/)。
它是什么
JSON-RPC 2.0 是一种无状态、轻量的远程过程调用协议:用 JSON 表达「调用对方的方法」,不绑定传输层(HTTP、WebSocket、stdio 都行)。MCP 的每一种消息都建立在它之上,所以「手写 MCP」的第一步就是手写 JSON-RPC。三种消息形态:
| 形态 | 形状 | 语义 |
|---|---|---|
| request | { jsonrpc: '2.0', id, method, params? } |
请求对方做事,期望响应 |
| notification | { jsonrpc: '2.0', method, params? } |
单向通知,没有 id、没有响应 |
| response | { jsonrpc: '2.0', id, result } 或 { jsonrpc: '2.0', id, error } |
回应请求;result 与 error 二选一 |
三条规则
- id 是配对键。客户端发出多个请求(握手、列工具、调工具),响应可以乱序到达——
id是唯一能把响应与「在途请求」重新配对的钥匙。实现上的标准形态是一个pendingMap:key 是 id,value 是等响应的 promise;未知 id 的响应按协议违规处理(记日志,别崩溃); - notification 永远没有响应。MCP 的
notifications/initialized是典型例子——服务端绝不能回(回了就是一条没人等、没人认领的孤儿响应); - 错误是响应的一种。失败时响应带
error: { code, message, data? };标准错误码是整数:-32700解析错误、-32600非法请求、-32601方法不存在、-32602参数非法、-32603内部错误,-32000到-32099留给实现自定义。
在本教程的位置
第 21 章把编解码写成纯函数(encode 四种、decode 一个、分类三个、responseTo 配对),校验规则是形状约束:jsonrpc 必须是 "2.0"、必须「有 id 或有 method」、id 不能是 null、response 必须带 result 或 error 之一。纯函数不进 I/O,浏览器里也能测——这是配套练习第一关的内容。