JSON-RPC

消息模型概览

MCP 采用 JSON-RPC 2.0(Remote Procedure Call, 远程过程调用)作为基础通信协议,定义三种核心消息类型。下表总结了各类型的用途与响应要求:

消息类型 是否需要响应 用途
Request 发起调用,期望获得响应
Response 否(仅作为回复) 返回请求执行结果
Notification 单向事件通知,不需应答

表 1: MCP 消息类型一览

下面分别给出三种消息类型的典型 JSON 示例:

// Request 示例
{ "jsonrpc": "2.0", "id": "123", "method": "tools/list", "params": {} }
// Response 示例
{ "jsonrpc": "2.0", "id": "123", "result": { "tools": [] } }
// Notification 示例
{ "jsonrpc": "2.0", "method": "progress", "params": { "progress": 50 } }

为了更直观地理解消息交互流程,下面用时序图展示 Request/Response 与 Notification 的典型过程:

【iframe defaul_iframe_type】https://assets.jimmysong.io/images/book/ai-handbook/mcp/json-rpc/94b1f499d5b5042ac98b2aa3b28a555d.svg

图 1: MCP 消息交互流程


能力协商机制(Capabilities)

在 MCP 会话初始化阶段,双方通过 initialize 请求进行能力交换。客户端声明自身支持的特性,服务端返回其可提供的能力,交集即为实际可用范围。

下表列举了能力协商相关字段及示例:

字段 说明 示例
protocolVersion 协议版本号 "2024-11-05"
capabilities 声明可用功能 {"sampling": {}, "roots": {"listChanged": true}}
clientInfo 客户端信息 {"name": "my-client", "version": "1.0.0"}

表 2: 能力协商字段说明

实践提示

在使用任意功能(如 resources.subscribe)前,需确认服务端 capabilities 中声明支持。


常见消息类型与示例

本节介绍 MCP 协议中最常用的消息类型及其典型用法。

生命周期消息(Lifecycle)

生命周期相关消息用于初始化会话、能力协商及健康检查。下表总结了主要方法及其作用:

方法 类型 作用
initialize 请求 初始化会话并协商能力
initialized 通知 客户端通知初始化完成
ping 请求/响应 健康检查

表 3: 生命周期消息方法


以下为典型生命周期消息的 JSON 示例:

// initialize
{ "jsonrpc": "2.0", "id": 1, "method": "initialize",  "params": {    "protocolVersion": "2024-11-05",    "capabilities": {"sampling": {}, "roots": {"listChanged": true}},    "clientInfo": {"name": "my-client", "version": "1.0.0"}  }}// ping
{ "jsonrpc": "2.0", "id": 2, "method": "ping", "params": {} }{ "jsonrpc": "2.0", "id": 2, "result": {"status": "ok"} }

工具调用消息(Tools)

工具相关消息用于查询和执行可用工具。下表说明了常用方法:

方法 类型 说明
tools/list 请求 获取工具列表及输入 schema
tools/call 请求 调用指定工具执行任务

表 4: 工具调用消息方法

下面是工具调用消息的典型 JSON 示例:

// tools/list
{ "jsonrpc": "2.0", "id": 3, "method": "tools/list" }
// 响应
{  "jsonrpc": "2.0",  "id": 3,  "result": {    "tools": [{ "name": "calculate", "inputSchema": {} }]  }}

资源消息(Resources)

资源相关消息支持对外部资源的订阅、变更监听与读取。下表列举了常用方法:

方法 类型 功能
resources/subscribe 请求 订阅资源更新
resources/updated 通知 资源更新通知

表 5: 资源消息方法


以下为资源消息的典型 JSON 示例:

// 订阅日志文件
{ "jsonrpc": "2.0", "id": 7, "method": "resources/subscribe",  "params": { "uri": "file:///logs/app.log" } }
{ "jsonrpc": "2.0", "method": "resources/updated",  "params": { "uri": "file:///logs/app.log" } }

提示模板消息(Prompts)

提示模板相关消息用于列出或获取可用的 Prompt 模板。响应中通常含 messages 字段,供采样或生成使用。

采样消息(Sampling)

采样消息用于服务端向客户端请求大语言模型(LLM, Large Language Model)生成文本。以下为典型 JSON 示例:

{ "jsonrpc": "2.0", "id": 11, "method": "sampling/createMessage",  "params": {    "messages": [      { "role": "user", "content": {"type": "text", "text": "What is the capital of France?"} }    ],    "maxTokens": 100  }}
{ "jsonrpc": "2.0", "id": 11,  "result": {    "role": "assistant",    "content": {"type": "text", "text": "The capital of France is Paris."}  }}

日志消息(Logging)

日志相关消息用于设置日志级别和输出日志内容。下表说明了主要方法:

方法 类型 功能
logging/setLevel 请求 设置日志级别
logging/message 通知 输出日志内容

表 6: 日志消息方法


错误与异常机制

MCP 的错误处理遵循 JSON-RPC 规范。下方 JSON 示例展示了标准错误响应结构:

{  "jsonrpc": "2.0",  "id": 13,  "error": {    "code": -32601,    "message": "Method not found",    "data": {"method": "unknown/method"}  }}

常见错误码及含义如下表所示:

错误码 含义
Parse error
Invalid request
Method not found
Invalid params
Internal error
-32000 ~ -32099 MCP 特定错误(Server error)

表 7: MCP 错误码说明


关键点

  • 响应必须带原始请求的 id
  • 通知不可带 id
  • 不支持的能力不应调用。

进度与取消机制

对于长任务,MCP 支持通过 progress 通知回报进度,取消则由 cancelled 通知触发。下方为典型 JSON 示例:

{ "jsonrpc": "2.0", "method": "progress",  "params": { "progressToken": "task-1", "progress": 40, "total": 100, "message": "Running" } }
{ "jsonrpc": "2.0", "method": "cancelled",  "params": { "requestId": 7, "reason": "user interrupt" } }

调试建议与实现要点

开发 MCP 协议时,需关注以下实现细节。下表总结了常见建议:

关注点 建议
能力声明 使用对象结构声明,避免布尔值错误
ID 保持一致 响应与请求必须 ID 对齐
批量请求 支持数组形式一次提交多请求
初始化 protocolVersion 为必填字段
命名空间 方法名应为如 tools/list、resources/subscribe 形式

表 8: MCP 实现建议与注意事项


TypeScript 实现示例(伪代码)

下面代码展示了 MCP 消息处理的典型 TypeScript 伪实现。该函数根据消息类型分别处理请求与通知,并严格遵循 JSON-RPC 错误返回规范。

async function handleMessage(message) {  if (message.id !== undefined) {    try {      const result = await processRequest(message);      return { jsonrpc: "2.0", id: message.id, result };    } catch (error) {      return {        jsonrpc: "2.0",        id: message.id,        error: { code: -32603, message: error.message },      };    }  }  await processNotification(message);}

总结

MCP 基于 JSON-RPC 的统一消息模型,通过严格的结构约定和能力协商机制,使得客户端与服务端之间的通信具备 可预测性、可扩展性与一致性。开发者应在实现时保持协议约束、能力声明与错误处理的严格对齐,从而让智能体生态在不同实现间实现真正的互操作。

技术落地

MCP 代码执行模式

2026-1-11 14:44:43

技术落地

MCP 案例研究

2026-1-11 14:44:46

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索