MCP 通信消息格式之 JSON-RPC 2.0 协议
一、背景介绍
MCP 中 Client 与 Server 间使用 JSON-RPC 2.0 作为通信消息格式。JSON-RPC 是 RPC(远程过程调用)的一种具体实现,RPC 是一种通信范式,其核心目标是屏蔽网络细节,使远程调用如同本地调用般简单,并可基于多种底层网络协议(如 TCP/HTTP)实现。常见的 RPC 框架有 gRPC、Dubbo 和 Thrift。
JSON-RPC 2.0 是一种使用 JSON 格式的轻量级远程过程调用 (RPC) 协议,与 RPC 有以下区别:
| 特性 | RPC(通用) | JSON-RPC |
|---|---|---|
| 协议类型 | 抽象概念,有多种实现 | RPC 的一种具体实现 |
| 数据格式 | 二进制(如 Protobuf)、文本等 | 默认使用 JSON |
| 传输协议 | 任意(TCP/HTTP/UDP 等) | 通常基于 HTTP/HTTPS 或 WebSocket |
| 跨语言兼容性 | 依赖具体实现(如 gRPC) | 天然支持(JSON 是通用标准) |
| 性能 | 二进制协议通常更高 | 文本协议,性能较低 |
| 使用场景 | 高性能内部服务(如 gRPC) | Web API、前后端交互、脚本语言 |
二、消息类型
1. 请求(Request)
{
"jsonrpc": "2.0",
"method": "方法名",
"params": {"参数名": "值"} | ["值 1", "值 2"], // 对象或数组
"id": "唯一ID" // 可选(通知请求可省略)
}
jsonrpc : 必须为 "2.0"。
method: 调用的方法名(字符串)。
params: 参数(可省略),支持对象(命名参数)或数组(位置参数)。
id: 请求标识符。
2. 响应(Response)
成功响应:
{
"jsonrpc": "2.0",
"result": "返回值",
"id": "对应请求 ID"
}
错误响应:
{
"jsonrpc": "2.0",
"error": {
"code": -32601,
"message": "Method not found",
"data": "额外错误信息" // 可选
},
"id": "对应请求 ID" // 若请求无 ID,则为 null
}
标准错误码:
| Code | Message | 说明 |
|---|---|---|
| -32700 | Parse error | JSON 解析失败 |
| -32600 | Invalid Request | 请求格式不符合规范 |
| -32601 | Method not found | 方法不存在 |
| -32602 | Invalid params | 参数无效 |
| -32603 | Internal error | 服务端内部错误 |
| -32000 | Server error(自定义) | 业务级错误(范围:-32000 至 -32099) |
3. 通知(Notification)
无 id 的请求,客户端不返回响应:
{
"jsonrpc": "2.0",
"method": "log_event",
"params": {"event": "user_login"}
}
三、主要特点
(1)简单轻量:协议设计简洁,消息格式简单。
(2)语言无关:基于 JSON,几乎所有编程语言都支持。
(3)传输层无关:可在 HTTP、WebSocket、TCP 等多种传输协议上使用。
(4)支持通知(不需要响应的请求)。
(5)支持批量请求。
四、使用建议
1. 请求与响应设计
(1)严格校验 jsonrpc 字段:确保值为 "2.0",避免版本混淆。
(2)明确参数类型:在文档中声明 params 是对象还是数组。
(3)处理通知请求:无 id 的请求不返回响应,节省带宽。
2. 错误处理
(1)标准化错误信息:错误响应中,data 字段可酌情附加调试详情(如堆栈跟踪),但要注意信息安全。
(2)自定义错误码:业务错误使用 -32000 到 -32099 范围。
3. 安全性
(1)字段过滤:避免在响应中返回敏感数据(如密码)。
(2)传输加密:使用 HTTPS 防止中间人攻击。
(3)限流与鉴权:通过 HTTP Headers(如 Authorization)实现身份验证。
4. 性能优化
(1)批量请求(Batch):支持单次传输多个请求(减少 HTTP 开销):
[
{"jsonrpc": "2.0", "method": "sum", "params": [1, 2], "id": "1"},
{"jsonrpc": "2.0", "method": "notify", "params": ["event"]}
]
(2)压缩数据:启用 Gzip 压缩 JSON 内容。
五、常见问题
1. 批量请求是否必须按顺序返回响应?
规范未强制要求顺序,但建议保持请求与响应顺序一致。
2. JSON-RPC 是否可以作为 RESTful 通信消息格式?
JSON-RPC 和 RESTful 是两种不同的 API 设计风格,虽都可基于 HTTP,但设计理念与适用场景差异显著,具体如下:
| 特性 | JSON-RPC | RESTful |
|---|---|---|
| 设计哲学 | 基于动作(Action)的远程调用 | 基于资源(Resource)的状态操作 |
| HTTP 方法使用 | 通常只用 POST(所有请求发到同一端点) |
使用 GET/POST/PUT/DELETE 等 |
| URL 设计 | 单一端点(如 /api/jsonrpc) |
资源路径(如 /users/{id}) |
| 数据格式 | 固定 JSON 结构(含 method 和 params) |
灵活(JSON/XML,通常无固定结构约束) |
| 典型用例 | 复杂业务逻辑(如计算、事务) | CRUD 操作(如用户管理) |
以删除一个用户为例:
JSON-RPC 需向统一端点(URL)发送如下消息格式:
{
"jsonrpc": "2.0",
"method": "deleteUser",
"params": {"id": 123},
"id": 1
}
RESTful 则只需发起一个 DELETE /users/123 请求。
综上所述,笔者认为 JSON-RPC 不适合作为 RESTful 的通信消息格式,原因有二:其一,调用方式不同,JSON-RPC 通过 method 参数调用指定方法,RESTful API 则依赖 HTTP 方法(如 GET/POST)和 URL 路径标识调用方法;其二,支持的协议范围不同,REST API 仅适配 HTTP 协议,JSON-RPC 支持常见网络协议,如 HTTP、TCP 等。
MCP 通信消息格式之 JSON-RPC 2.0 协议的更多相关文章
- Solon rpc 之 SocketD 协议 - 消息鉴权模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- Solon rpc 之 SocketD 协议 - 消息上报模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- Solon rpc 之 SocketD 协议 - 消息应答模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- Solon rpc 之 SocketD 协议 - 消息订阅模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- Solon rpc 之 SocketD 协议 - 消息加密模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- Solon rpc 之 SocketD 协议 - RPC调用模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- Solon rpc 之 SocketD 协议 - 单链接双向RPC模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- Solon rpc 之 SocketD 协议 - RPC鉴权模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- 【转】[WCF REST] 帮助页面与自动消息格式(JSON/XML)选择
可以说WebHttpBinding和WebHttpBehavior是整个Web HTTP编程模型最为核心的两个类型,前者主要解决消息编码问题,而余下的工作基本上落在了终结点行为WebHttpBehav ...
- C# 将MSMQ消息转换成Json格式 【优化】
C# 将MSMQ消息转换成Json格式 [优化] 转换函数: private string ConvertToJSON(string label, string body) { //TODO: co ...
随机推荐
- 使用LLaMA-Factory训练LLM大模型并用ollama调用
环境搭建 系统环境 需要Nvidia显卡,至少8G显存,且专用显存与共享显存之和大于20G 建议将非安装版的环境文件都放到非系统盘,方便重装或移植 以Windows11为例,非安装环境文件都放在 E ...
- 本地部署overleaf服务帮助latex论文编写
是的,overleaf是一个很好的服务,提供了立刻上手就可以编写的latex文章的服务.但是,overleaf会面对latex超时,所以需要付钱的情况,这常出现在编写期刊的论文的情况. 因为时效性,所 ...
- [源码系列:手写spring] IOC第九节:应用上下文ApplicationContext
内容介绍 在Spring中应用上下文ApplicationContext是相较于BeanFacotry更为先进的IOC容器,BeanFacotry是Spring实现IOC最基础最核心的接口,使得Spr ...
- Debian 9 更换源
Debian 全球镜像站 # 先备份源列表文件 mv /etc/apt/sources.list /etc/apt/sources.list.bak # 生成新的源列表文件(用的国内源镜像) echo ...
- markdown常用命令行格式
Markdown 主要命令(语法)如下: 标题 使用 # 号表示标题,# 的个数决定标题的级别: 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 段落 & 换行 直接输入文字形成段 ...
- C 冒泡排序和选择排序
冒泡排序 理论概念: 从第一个数开始,将相邻的两个数比较,第一个数和第二个数比较,比如说是从小到大的排序,要是后面的数比前面的小则交换两个的位置,这样第一轮比较基数后最大的数就到了最后面,接着进行第二 ...
- Avalonia跨平台实战(二),Avalonia相比WPF的便利合集(一)
本话讲的是Avalonia中相比于WPF更方便的一些特性 布局 布局方面没什么好说的,和WPF没什么区别,Grid,StckPanel...这些,不熟悉的话可以B站上找一下教程 xml树 在WPF中我 ...
- SSL证书免费申请(阿里云)
简介 本文介绍SSL证书免费申请流程 注意: 免费单域名证书,可用于测试.个人试用等场景,org.jp等特殊域名存在无法申请的情况,正式环境建议使用付费证书. 每个实名主体个人/企业,一个自然年内可以 ...
- DPDI(Dispatch PDI)kettle调度管理平台升级预告
亲爱的DPDI用户们,久等了!Dispatch PDI全新升级,焕然一新的UI页面计划于2025.03.23正式上线.这一次,我们精心打磨每一个细节,只为给您带来前所未有的丝滑体验,让每一次浏览都成为 ...
- 【完结】【一本通提高】KMP做题记录
题目编号 标题 估分 正确 提交 Y 2076 Problem A [一本通提高篇KMP]剪花布条 --- 156 293 Y 2077 Problem B [一本通提高篇KMP]Radio Tr ...