JSON-RPC 2.0 协议详解

什么是 JSON-RPC 2.0?

JSON-RPC 2.0 就是一个简单的通信协议 ,用 JSON 格式让两个程序相互调用函数。简单点说就是JSON的一种特殊规则。

基本格式

请求(调用函数)

TypeScript 复制代码
{
  "jsonrpc": "2.0",    // 固定写法
  "id": 1,             // 请求编号,用来匹配响应
  "method": "sum",     // 要调用的函数名
  "params": {          // 函数参数
    "a": 10,
    "b": 20
  }
}

响应(返回结果)

TypeScript 复制代码
{
  "jsonrpc": "2.0",
  "id": 1,             // 与请求的 id 一致
  "result": 30         // 函数执行结果
}

错误(调用失败)

TypeScript 复制代码
{
  "jsonrpc": "2.0",
  "id": 1,
  "error": {
    "code": -32602,    // 错误码
    "message": "参数错误"
  }
}

关键规则

1. 三种消息类型

  • 请求 :有 id,需要响应

  • 通知 :没有 id,不需要响应

  • 响应 :必须有对应的 id

2. 参数传递方式

TypeScript 复制代码
// 方式1:按位置(数组)
{"method": "sum", "params": [10, 20]}

// 方式2:按名称(对象)
{"method": "sum", "params": {"a": 10, "b": 20}}

完整协议规范

请求对象规范

字段 类型 必填 描述
jsonrpc string 必须为 "2.0"
method string 要调用的方法名
params array/object 方法参数(按位置或按名称)
id string/number/null 请求标识符(null 表示通知)

响应对象规范

字段 类型 必填 描述
jsonrpc string 必须为 "2.0"
id string/number 必须与请求中的 id 相同
result any 条件 成功时返回的结果
error object 条件 失败时返回的错误信息

标准错误码

错误码 含义 描述
-32700 Parse error JSON 解析错误
-32600 Invalid Request 不是有效的 JSON-RPC 2.0 请求
-32601 Method not found 请求的方法不存在
-32602 Invalid params 参数无效或不正确
-32603 Internal error 服务器内部错误
-32000 to -32099 Server error 服务器定义的错误(保留范围)

MCP 如何使用 JSON-RPC

MCP 的 JSON-RPC 消息流

TypeScript 复制代码
Client                              Server
  │                                    │
  │  { "jsonrpc":"2.0",                │
  │    "id":1,                         │
  │    "method":"initialize",          │
  │    "params":{...} }                │
  │ ──────────────────────────────────>│
  │                                    │
  │  { "jsonrpc":"2.0",                │
  │    "id":1,                         │
  │    "result":{...} }                │
  │ <──────────────────────────────────│
  │                                    │
  │  { "jsonrpc":"2.0",                │
  │    "id":2,                         │
  │    "method":"tools/list",          │
  │    "params":{} }                   │
  │ ──────────────────────────────────>│
  │                                    │
  │  { "jsonrpc":"2.0",                │
  │    "id":2,                         │
  │    "result":{...} }                │
  │ <──────────────────────────────────│

MCP 就是用 JSON-RPC 2.0 来做三件事:

TypeScript 复制代码
// 1. 打招呼(初始化)
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{...}}

// 2. 问有什么工具
{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}

// 3. 使用工具
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{
  "name": "sum",
  "arguments": {"a": 5, "b": 3}
}}
方法 用途 请求示例
initialize 初始化连接 {"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05",...}}
tools/list 获取可用工具 {"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}
tools/call 调用工具 {"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"sum","arguments":{"a":10,"b":20}}}

总结要点

  1. 协议简单:就是 JSON 格式的函数调用

  2. 双向通信:可以请求,也可以通知

  3. 错误处理:有标准错误码

  4. 批量支持:一次发多个请求

  5. 传输灵活:可以用 HTTP、WebSocket、标准输入输出等

JSON-RPC 2.0 是一个实用 而不是复杂的协议。MCP 基于它,让 AI 工具可以和外部程序安全地对话。

相关推荐
LCMICRO-133108477461 小时前
长芯微LD9689完全P2P替代AD9689,是一款双通道、14位、2.0 GSPS/2.6 GSPS模数转换器(ADC)
网络·单片机·嵌入式硬件·网络协议·fpga开发·硬件工程·高速adc
皙然10 小时前
深入理解TCP流量控制
网络·网络协议·tcp/ip
长安110812 小时前
web后端----HTTP协议与浏览器F12
前端·网络协议·http
茶杯梦轩14 小时前
面试常问:DNS,CDN,Cookie,Session和Token详解及实战避坑指南
后端·网络协议·面试
Java成神之路-14 小时前
HTTP 协议进化史:从 1.0 到 3.0
网络·网络协议·http
2501_9160074715 小时前
HTTPS 抓包的流程,代理抓包、设备数据线直连抓包、TCP 数据分析
网络协议·tcp/ip·ios·小程序·https·uni-app·iphone
奔跑的呱呱牛15 小时前
arcgis-to-geojson双向转换工具库
arcgis·json
IpdataCloud16 小时前
资源受限设备上轻量级IP查询模块的部署方法
网络·数据库·网络协议·tcp/ip
eleven409617 小时前
穿透内容审查与阻断:基于 DNS TXT 记录的动态服务发现与客户端安全加固实践
网络协议·ios·app
武超杰18 小时前
SpringMVC核心功能详解:从RESTful到JSON数据处理
后端·json·restful