JSON-RPC
3 秒看懂
JSON-RPC 是一种用 JSON 编码的远程过程调用(RPC)协议,设计极简——一个请求只需 method + params + id 三个字段,一个响应只需 result 或 error + id。传输层无关,可跑在 HTTP、WebSocket、TCP、Unix Socket 乃至 stdio 上。2.0 版(2010 年定稿)是当前事实标准。
一句话定位:AI 时代的”毛细血管协议”——Anthropic MCP、LSP、Ethereum JSON-RPC、多数 Agent 框架的底层通信层都选了它。
3 分钟产业解释
为什么 AI 行业突然关心一个 2005 年就诞生的协议?
三个关键事件把 JSON-RPC 推到 AI 基础设施台前:
| 时间线 | 事件 | 为什么重要 |
|---|---|---|
| 2016 | Microsoft 发布 LSP(Language Server Protocol),底层通信选 JSON-RPC 2.0 over stdio/ TCP | 所有现代 IDE(VS Code、Neovim、JetBrains)的代码智能都走这条路;AI 编程助手(Copilot、Cursor)依赖 LSP |
| 2022-2024 | Ethereum 生态持续扩展,执行层客户端(Geth、Erigon 等)标准 API 为 JSON-RPC | 链上 AI Agent 与智能合约交互的桥梁 |
| 2024-2025 | Anthropic 发布 MCP(Model Context Protocol),显式基于 JSON-RPC 2.0 | LLM 与外部工具/数据源连接的事实标准开始成型 |
产业意义:
- AI Agent 通信的最低公约数:当多个 Agent 框架(LangChain、AutoGPT、CrewAI 等)需要互操作时,JSON-RPC 提供了最轻量、最无依赖的调用约定。
- MCP 生态的承载协议:Anthropic MCP 定义了
tools/list、tools/call、resources/list、prompts/list等标准 method,底层就是 JSON-RPC 2.0 的 request/response/notification 三种消息类型。 - LLM 训练/推理基础设施的胶水层:部分推理服务编排系统(如 vLLM 的某些部署模式、Ray Serve 的 HTTP adapter)也暴露 JSON-RPC 接口用于内部调度。
一句话:JSON-RPC 不性感,但它是 AI 工具链连接层的”USB-C”——简单、通用、到处都有现成实现。
15 分钟专家深入
核心架构
JSON-RPC 的设计哲学可概括为 “最小可行 RPC”:
- 编码层:纯 JSON(UTF-8)
- 调用层:Request 对象包含
jsonrpc(版本标识"2.0")、method(字符串)、params(数组或对象,可选)、id(字符串/数字/null) - 响应层:Response 对象包含
result或error(二选一,互斥)、id(与 Request 对应) - 通知:Request 中省略
id字段即为 Notification,服务端不返回响应[JSON-RPC 2.0 Spec] - 批量调用:可将多个 Request 打包为 JSON 数组发送,服务端返回对应数量的 Response 数组[JSON-RPC 2.0 Spec]
- 传输无关:Spec 本身不绑定任何传输协议——这是它能适配 stdio(LSP)、HTTP(Ethereum)、WebSocket(实时 Agent)、TCP 的根本原因
与 gRPC/REST 的本质差异
┌──────────────┬─────────────────┬─────────────────┬──────────────────┐
│ │ JSON-RPC 2.0 │ REST/HTTP │ gRPC │
├──────────────┼─────────────────┼─────────────────┼──────────────────┤
│ 编码格式 │ JSON │ JSON/XML/... │ Protobuf (二进制) │
│ 通信模式 │ 请求-响应 + │ 请求-响应 │ 四种流模式 │
│ │ 通知 + 批量 │ │ (Unary/Stream) │
│ 接口定义 │ 无强制 schema │ OpenAPI (可选) │ .proto 文件 │
│ 传输层 │ 无关(任意) │ HTTP/HTTPS │ HTTP/2 │
│ 浏览器原生 │ ✅ (JSON+HTTP) │ ✅ │ ⚠️ 需 grpc-web │
│ 依赖轻重 │ 极轻 │ 轻 │ 重(需Protobuf+HTTP2)│
│ 二进制效率 │ 低(JSON文本) │ 低 │ 高 │
│ AI生态采用 │ MCP/LSP/Ethereum│ 通用API │ TensorFlow Serving│
└──────────────┴─────────────────┴─────────────────┴──────────────────┘
选型逻辑:JSON-RPC 胜在”零门槛 + 传输无关 + JSON 天然可读”,在人类可调试性和跨语言兼容性上碾压 gRPC;在性能和强类型上远不如 gRPC。
JSON-RPC 2.0 消息格式详解
Request 对象 [JSON-RPC 2.0 Spec]:
{
"jsonrpc": "2.0", // 必填,固定值 "2.0"
"method": "tools/call", // 必填,字符串,以 "rpc." 开头的为保留方法名
"params": { // 可选,By-Name 对象或 By-Position 数组
"name": "read_file",
"arguments": {"path": "/tmp/foo.txt"}
},
"id": 42 // 可选;省略则为 Notification
}
Response 对象 [JSON-RPC 2.0 Spec]:
// 成功
{"jsonrpc": "2.0", "result": {"content": "..."}, "id": 42}
// 失败
{"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": 42}
标准错误码 [JSON-RPC 2.0 Spec]:
| Code | Meaning | 说明 |
|---|---|---|
| -32700 | Parse error | JSON 解析失败 |
| -32600 | Invalid Request | 不是合法的 Request 对象 |
| -32601 | Method not found | 方法不存在 |
| -32602 | Invalid params | 参数无效 |
| -32603 | Internal error | 内部错误 |
| -32000 to -32099 | Server error (保留区间) | 服务端自定义 |
在 MCP 中的映射
Anthropic MCP 对 JSON-RPC 2.0 的使用方式:
Client → Server: {"jsonrpc":"2.0","method":"initialize","params":{...},"id":1}
Server → Client: {"jsonrpc":"2.0","result":{...},"id":1}
Client → Server: {"jsonrpc":"2.0","method":"notifications/initialized"}
(Notification, 无 id, 无响应)
Client → Server: {"jsonrpc":"2.0","method":"tools/call",
"params":{"name":"web_search","arguments":{"query":"..."}},"id":7}
Server → Client: {"jsonrpc":"2.0","result":{"content":[...]},"id":7}
MCP 还利用了 JSON-RPC 2.0 的双向通信能力——Client 和 Server 都可以发起请求和通知,这是在 HTTP 之上用 Streamable HTTP 传输层实现的(MCP 2024-11 spec 之后的方案)。
技术原理
协议状态机
┌─────────────┐
│ Client │
└──────┬──────┘
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
┌──────────┐ ┌────────────┐ ┌──────────────┐
│ Request │ │Notification│ │ Batch Request│
│(有 id) │ │(无 id) │ │(JSON Array) │
└─────┬────┘ └─────┬──────┘ └──────┬───────┘
│ │ │
▼ ▼ ▼
┌──────────┐ ┌────────────┐ ┌──────────────┐
│ Response │ │ 无响应返回 │ │ Response Array│
│(对应 id) │ │(Fire&Forget)│ │(可能含Error) │
└──────────┘ └────────────┘ └──────────────┘
关键设计决策与技术权衡
| 设计决策 | 原因 | 代价 |
|---|---|---|
| JSON 文本编码 | 可读、零依赖、全语言支持 | 性能开销(解析慢、体积大),不适合高频 RPC |
| 无 schema 强制 | 降低接入门槛 | 接口契约需外部文档维护(MCP 用 JSON Schema 补充) |
| 传输无关 | 最大灵活性 | 需要各传输层自行解决连接管理、分帧、重连 |
| id 类型允许 string/number/null | 兼容不同场景 | 增加了实现的边界情况处理 |
| 批量调用中允许混合 Request/Notification | 灵活性 | 部分实现未完整支持批量中的 Notification |
关键参数与性能特征
以下为行业经验性数据,非 Spec 定义,标 [估算]。
| 指标 | 典型值 | 备注 |
|---|---|---|
| 单条消息编码开销 | JSON 文本,典型 Request 100-500 字节 | 取决于 method 名和 params 复杂度 [估算] |
| 序列化/反序列化延迟 | 10-100μs(单条) | 取决于 JSON 库和 payload 大小 [估算] |
| 与 gRPC Protobuf 对比 | 体积 2-10x,编码/解码延迟 3-10x | JSON vs Protobuf 的固有差距 [估算] |
| 最大批量请求大小 | Spec 未定义,由传输层/实现决定 | MCP 典型实现限制各异 [未充分披露] |
技术演进史
| 时间 | 里程碑 | 关键变化 |
|---|---|---|
| 2005 | JSON-RPC 1.0 草案 | 最初由 JSON 之父 Douglas Crockford 推动;仅支持 Request、Response、Notification 三种消息;params 只支持数组(By-Position) |
| 2006 | JSON-RPC 1.1 社区发布 | 非正式规范,引入类型化参数改进;未经过 W3C 标准化流程 |
| 2010-2013 | JSON-RPC 2.0 草案迭代 | 社区(json-rpc@googlegroups)长期讨论;引入 jsonrpc: "2.0" 版本标识、By-Name params、批量调用、标准错误码 |
| 2010-03-26 | JSON-RPC 2.0 Specification 发布 | 成为事实标准至今 |
| 2016 | Microsoft LSP 1.0 发布 | JSON-RPC 2.0 被选为 LSP 的基础协议,运行在 stdio/TCP 上;大幅提升了 JSON-RPC 在 IDE 生态的采用率 |
| 2020-2023 | Ethereum JSON-RPC API 持续扩展 | eth_getBalance、eth_call、eth_sendRawTransaction 等成为链上交互事实标准 |
| 2024-11 | Anthropic MCP 正式发布 | JSON-RPC 2.0 成为 LLM 工具调用标准协议层;传输层支持 stdio + Streamable HTTP |
| 2025 Q1-Q2 | MCP 生态爆发 | OpenAI、Google、Microsoft 相继宣布支持 MCP;JSON-RPC 在 AI Agent 基础设施中地位确立 |
技术路线对比
RPC 协议选型矩阵(面向 AI 场景)
维度评分: ★★★★★ 最优 ★ 最低 — 不适用
┌─────────────────┬──────────┬──────────┬──────────┬──────────┐
│ 协议 │JSON-RPC 2│ REST/HTTP│ gRPC │ SOAP │
│ │ │ │ │(已边缘化)│
├─────────────────┼──────────┼──────────┼──────────┼──────────┤
│ 轻量级/易接入 │ ★★★★★ │ ★★★★ │ ★★ │ ★ │
│ 人类可读/可调试 │ ★★★★★ │ ★★★★★ │ ★★ │ ★★★ │
│ 传输层灵活性 │ ★★★★★ │ ★★★ │ ★★ │ ★ │
│ 强类型/Schema │ ★★ │ ★★★ │ ★★★★★ │ ★★★★★ │
│ 高性能/低延迟 │ ★★ │ ★★ │ ★★★★★ │ ★★ │
│ 双向流式通信 │ ★★★(依赖传输)│ ★(SSE有限)│ ★★★★★ │ ★ │
│ 浏览器原生支持 │ ★★★★★ │ ★★★★★ │ ★★(需grpc-web)│ ★★★ │
│ AI生态采用度 │ ★★★★(MCP)│ ★★★★★ │ ★★★★ │ ★ │
│ 区块链生态采用度 │ ★★★★★ │ ★★★ │ ★★ │ — │
│ 学习曲线(低=好) │ ★★★★★ │ ★★★★ │ ★★ │ ★ │
└─────────────────┴──────────┴──────────┴──────────┴──────────┘
JSON-RPC 1.0 vs 2.0
| 特性 | 1.0 | 2.0 |
|---|---|---|
| 版本标识字段 | 无 | "jsonrpc": "2.0" 必填 |
| params 支持 | 仅数组 (By-Position) | 数组 + 对象 (By-Position + By-Name) |
| 批量调用 | 不支持 | 支持(JSON 数组) |
| 错误码规范 | 无标准 | 定义 -32700 到 -32099 标准码 |
| Notification | 有 | 有(明确语义:无 id 则无响应) |
| id 为 null | 不合法 | 可用于错误响应(解析失败时无法关联 id) |
上下游
上游依赖(JSON-RPC 消费什么)
┌─────────────────────────────────────────────────┐
│ JSON-RPC 2.0 协议层 │
├─────────────────────────────────────────────────┤
│ 依赖层 │ 说明 │
├───────────────────────┼─────────────────────────┤
│ JSON 规范 (RFC 8259) │ 消息编码格式 │
│ 传输层 │ HTTP / WebSocket / │
│ │ TCP / stdio / Unix Socket│
│ UTF-8 (RFC 3629) │ 字符编码 │
└───────────────────────┴─────────────────────────┘
下游影响(谁依赖 JSON-RPC)
┌─────────────────────────────────────────────────────────┐
│ JSON-RPC 2.0 消费者 │
├──────────────────┬──────────────────────────────────────┤
│ 领域 │ 具体消费者 │
├──────────────────┼──────────────────────────────────────┤
│ AI Agent/工具 │ MCP (Anthropic), LangChain 工具层, │
│ │ CrewAI, AutoGPT 部分通信层 │
│ IDE/开发工具 │ LSP (Language Server Protocol), │
│ │ VS Code, Neovim, JetBrains │
│ 区块链 │ Ethereum (Geth/Erigon/Nethermind), │
│ │ Bitcoin Core, Solana (部分API), │
│ │ EVM-compatible chains │
│ 桌面应用 │ Electron IPC (部分插件架构) │
│ 嵌入式/IoT │ 轻量设备管理 API [估算] │
└──────────────────┴──────────────────────────────────────┘
关键指标
评估 JSON-RPC 实现质量的维度
| 指标 | 说明 | 行业基准参考 |
|---|---|---|
| Spec 合规度 | 是否完整支持 2.0 的 Request/Response/Notification/Batch/Error | 多数主流库合规 [估算] |
| 批量调用深度 | 单次 Batch 最大支持多少条 Request | Spec 未限,由实现决定 |
| 传输层适配数 | 支持几种传输层(HTTP/WS/TCP/stdio…) | 多数库 2-3 种 [估算] |
| 双向调用能力 | Client/Server 是否都能发起 Request | MCP 要求双向;基础库多数仅 Client→Server |
| 序列化性能 | 单条消息编解码吞吐 | JSON 库性能差异显著(simdjson > rapidjson > 标准库)[估算] |
| 并发模型 | 单连接复用 / 多路复用 / 连接池 | Spec 不涉及,由传输层决定 |
| 错误处理完备性 | 是否实现全部标准错误码 + Server Error 区间 | [未充分披露] |
供需与市场数据
JSON-RPC 直接市场规模
JSON-RPC 是开放协议,本身不产生直接收入。其产业价值体现在上层生态的市场规模。
| 生态 | 相关市场规模 | 数据来源 |
|---|---|---|
| MCP 生态 | MCP 服务器/工具市场尚处早期,无独立市场数据 | [未充分披露] |
| LSP 生态 | 全球 IDE 与开发者工具市场 2024 年约 $XXB(JSON-RPC 是底层协议之一) | [行业报告-待确认] |
| Ethereum JSON-RPC | Ethereum 生态 TVL、RPC 节点服务(Infura/Alchemy/QuickNode)收入规模与 JSON-RPC 使用量直接挂钩 | [厂商财报] Alchemy 2021 估值 $3.5B; Infura 独立收入未披露 |
| AI Agent 通信 | 全球 AI Agent 市场 2025 年预估数十亿美元,JSON-RPC (via MCP) 为主要通信协议之一 | [行业报告-待确认] |
开源实现生态
| 语言 | 主流 JSON-RPC 库 | GitHub Stars (近似) |
|---|---|---|
| Python | json-rpc, python-jsonrpc | 数百至数千 [估算] |
| JavaScript/TS | jayson, json-rpc-2.0 | 数百至千级 [估算] |
| Go | go-ethereum/rpc (Geth 内置), gorilla/rpc | Geth 极高,独立库数百 [估算] |
| Rust | jsonrpsee (Parity 出品) | 数百级 [估算] |
| Java | jsonrpc4j | 数百级 [估算] |
| C# | StreamJsonRpc (Microsoft 出品, LSP 使用) | 数千级 [估算] |
代表公司与资本映射
| 公司/组织 | 与 JSON-RPC 的关系 | 资本关注度 |
|---|---|---|
| Anthropic | MCP 协议的定义者和推动者,MCP 基于 JSON-RPC 2.0 | $60B+ 估值 (2025) |
| Microsoft | LSP 的创始者(底层为 JSON-RPC 2.0);StreamJsonRpc 库维护者;VS Code 核心架构 | 万亿市值 |
| Ethereum Foundation / Consensys | Ethereum JSON-RPC API 标准维护 | Consensys 估值约 $7B (2022) |
| Alchemy / Infura (Consensys) / QuickNode | 提供 JSON-RPC 节点即服务(Blockchain RPC Provider) | Alchemy ~$10.2B (2022), QuickNode ~$800M (2024) |
| Geth 核心团队 | Go-Ethereum 客户端,其 rpc 包是最广泛使用的 JSON-RPC 实现之一 | 开源社区 |
| Parity (now part of Polkadot) | jsonrpsee Rust 库,用于 Substrate 区块链节点 | Polkadot 生态 |
投资逻辑
核心观点
JSON-RPC 本身不是投资标的,但它是 三个高增长叙事的通信底层:
-
AI Agent 工具连接层:MCP 生态正在快速扩张,JSON-RPC 2.0 是其指定协议。投资逻辑是”MCP 协议栈”——类比 2015 年投资 REST API 生态。
- 产业观察方向:MCP 服务器聚合平台、MCP 工具市场、MCP 网关安全产品
-
链上基础设施:Ethereum L1/L2 的 RPC 节点服务是区块链基础设施中最稳定的收入来源之一(按请求量计费)。
- 产业观察方向:RPC Provider(Alchemy、QuickNode)、去中心化 RPC 网络(Pocket Network、Lava Network)
-
开发者工具链:LSP 让 AI 编程助手(Copilot、Cursor、Devin 等)能理解代码语义,JSON-RPC 是其中的通信骨干。
- 产业观察方向:AI-native IDE、AI 编程 Agent
风险因素
- 性能瓶颈:JSON 文本编码在超高频 RPC 场景下可能被二进制协议(gRPC、FlatBuffers)替代
- 协议演进不确定性:MCP 规范仍在快速迭代,传输层从 stdio 向 Streamable HTTP 迁移中可能出现不兼容变更
- 安全暴露面:JSON-RPC over HTTP 天然暴露在网络攻击面下,注入/伪造请求是持续风险
常见误读纠偏
❌ 误读 1:“JSON-RPC 只能跑在 HTTP 上”
纠偏:JSON-RPC 2.0 Spec 明确声明传输无关(transport agnostic)。实际上:
- LSP 跑在 stdio 上(进程间通信)
- MCP 支持 stdio 和 Streamable HTTP(2024-11 spec 之后的方案)
- Ethereum 跑在 HTTP/HTTPS 和 WebSocket 上(ws 支持订阅)
- 部分嵌入式场景 跑在 Unix Socket 或 TCP 上
HTTP 只是最常见的暴露方式,不是唯一选择。
❌ 误读 2:“JSON-RPC 是 REST 的替代品”
纠偏:两者根本不是同一层面的东西。
- REST 是一种架构风格(面向资源、利用 HTTP 动词语义、无状态)
- JSON-RPC 是一种RPC 协议(面向方法调用,传输无关)
实际上两者可以共存:同一个服务可以同时暴露 RESTful API(面向 CRUD)和 JSON-RPC API(面向复杂操作)。Ethereum 就是典型——大部分 API 走 JSON-RPC,但部分场景(如 EIP-4844 blob 交易)需要不同的接口模式。
❌ 误读 3:“JSON-RPC 2.0 比 1.0 只多了版本号”
纠偏:2.0 是重大升级。关键差异包括:
- 新增 By-Name params(1.0 仅支持 By-Position 数组)
- 新增 批量调用(Batch)
- 新增 标准错误码(-32700 到 -32099)
- Notification 语义更明确(无 id = 不期望响应)
- 新增
jsonrpc: "2.0"版本标识,允许 1.0/2.0 协议共存
❌ 误读 4:“JSON-RPC 性能太差,不适合生产环境”
纠偏:需要分场景看。
- 对于工具调用频率在每秒数十到数百次的 AI Agent 场景,JSON-RPC 的性能完全足够
- 对于高频交易、实时数据推送等场景,JSON 文本编码确实是瓶颈
- Ethereum 全网 JSON-RPC 请求量级为每天数十亿次(仅 Infura 一家,据 Consensys 公开信息),证明在有合理基础设施支撑下可扩展性不是问题
❌ 误读 5:“MCP 只是包装了一层 JSON-RPC,没有技术含量”
纠偏:JSON-RPC 只是传输层约定,MCP 的核心价值在于:
- 标准化的 能力协商(
initialize握手,动态发现 server 支持的 tools/resources/prompts) - 工具描述的 JSON Schema 标准
- 采样(sampling) 能力——Server 可以反向请求 Client 端的 LLM 完成推理
- 根目录(roots)、资源订阅(resource subscriptions) 等生命周期管理
把 MCP 等同于 JSON-RPC,就像把 HTTP 等同于 TCP——忽略了上层协议的设计。
学习路径
入门(1-2 小时)
- 阅读 JSON-RPC 2.0 Specification(短,约 30 分钟可读完)