1. 什么是基础协议? #
基础协议是 MCP 的核心层,定义客户端与服务器之间消息的格式和类型。所有 MCP 实现都必须支持基础协议和生命周期管理。
协议修订版:2025-11-25
| 通俗理解 | 说明 |
|---|---|
| 像 HTTP 之于 Web | 基础协议规定「怎么说」,传输层规定「怎么传」 |
| 基于 JSON-RPC | 所有消息遵循 JSON-RPC 2.0 规范 |
| 模块化 | 基础协议 + 生命周期为必选;授权、工具、采样等可按需实现 |
2. 本章你将学到 #
- MCP 协议由哪些组件组成
- 请求、响应、通知三种消息类型
- JSON Schema 的用法与
_meta、icons等通用字段 - 授权与模式的简要说明
3. 协议组件一览 #
| 组件 | 说明 | 是否必须 |
|---|---|---|
| 基础协议 | 核心 JSON-RPC 消息类型 | 必须 |
| 生命周期管理 | 连接初始化、能力协商、会话控制 | 必须 |
| 授权 | 基于 HTTP 传输的身份验证与授权 | 可选(HTTP 传输建议支持) |
| 服务器功能 | 资源、提示、工具 | 可选 |
| 客户端功能 | 采样、根目录列表 | 可选 |
| 工具 | 日志、参数补全等跨领域关注点 | 可选 |
4. 消息类型 #
MCP 客户端与服务器之间的所有消息必须遵循 JSON-RPC 2.0。协议定义三种消息类型:
| 类型 | 方向 | 是否需要响应 | 通俗理解 |
|---|---|---|---|
| 请求 | 双向 | 是 | 发起操作,等待结果 |
| 响应 | 双向 | — | 回复请求(成功或失败) |
| 通知 | 双向 | 否 | 单向发送,不期待回复 |
4.1 请求 (Request) #
请求用于发起操作,由客户端发往服务器或反之。
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_forecast",
"arguments": { "latitude": 37.5, "longitude": -122 }
}
}| 字段 | 要求 |
|---|---|
jsonrpc |
必须为 "2.0" |
id |
必须为字符串或整数,不得为 null;同一会话内不得重复使用 |
method |
方法名(如 tools/call、resources/read) |
params |
可选,方法参数 |
4.2 响应 (Response) #
响应用于回复请求,分为结果响应和错误响应。
结果响应(成功) #
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [{"type": "text", "text": "Sunny, 22°C"}]
}
}| 字段 | 要求 |
|---|---|
id |
必须与对应请求的 id 相同 |
result |
必须包含,可为任意 JSON 对象 |
错误响应(失败) #
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32602,
"message": "Invalid params",
"data": { "details": "latitude must be between -90 and 90" }
}
}| 字段 | 要求 |
|---|---|
id |
通常与请求相同;若请求畸形无法读取 ID,可省略 |
error |
必须包含 code(整数)和 message(字符串);data 可选 |
4.3 通知 (Notification) #
通知为单向消息,接收方不得发送响应。
{
"jsonrpc": "2.0",
"method": "notifications/resources/updated",
"params": {
"uri": "file:///path/to/file.txt"
}
}| 字段 | 要求 |
|---|---|
method |
方法名 |
params |
可选 |
id |
不得包含(通知无响应) |
5. 授权 #
MCP 为 HTTP 传输提供 授权 框架:
| 传输方式 | 授权建议 |
|---|---|
| HTTP | 应当符合 MCP 授权规范(OAuth 2.1 等) |
| STDIO | 不应使用 HTTP 授权,应从环境变量等获取凭据 |
| 其他 | 遵循其协议既定的安全最佳实践 |
详见 理解 MCP 中的授权。
6. JSON Schema 用法 #
MCP 使用 JSON Schema 进行参数和结构的验证。
6.1 方言规则 #
| 规则 | 说明 |
|---|---|
| 默认方言 | 未指定 $schema 时,默认为 JSON Schema 2020-12 |
| 显式方言 | 可通过 $schema 指定其他方言 |
| 实现要求 | 必须至少支持 2020-12;应记录支持的其他方言 |
6.2 示例 #
默认方言(2020-12):
{
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "integer", "minimum": 0 }
},
"required": ["name"]
}显式方言(draft-07):
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "integer", "minimum": 0 }
},
"required": ["name"]
}6.3 实现要求 #
- 客户端和服务器必须对无
$schema的模式支持 JSON Schema 2020-12 - 必须按声明或默认方言验证;对不支持的方言返回适当错误
- 应当记录支持的 schema 方言
7. 通用字段 #
7.1 _meta #
_meta 用于在消息中附加额外元数据,由 MCP 保留。
| 规则 | 说明 |
|---|---|
| 键名格式 | 可选前缀 + 名称;前缀如 com.example/,建议用反向 DNS |
| 保留前缀 | 第二段为 modelcontextprotocol 或 mcp 的前缀保留给 MCP(如 io.modelcontextprotocol/、dev.mcp/) |
| 名称 | 非空时须以字母数字开头和结尾;中间可含 -、_、. |
7.2 icons #
icons 为服务器暴露视觉标识(图标)提供标准化方式,可附加到 Implementation、Tool、Prompt、Resource。
| 字段 | 说明 |
|---|---|
src |
必需,图标 URI(HTTP/HTTPS URL 或 data URI) |
mimeType |
可选,MIME 类型 |
sizes |
可选,如 ["48x48"]、["any"](SVG) |
theme |
可选,light 或 dark |
客户端必须支持的 MIME 类型:image/png、image/jpeg(及 image/jpg)
安全要点:
- 将图标视为不可信输入,防范解析与资源耗尽
- 仅接受 HTTPS 或
data:URI,拒绝javascript:、file:等 - 获取图标时不携带凭据(cookie、Authorization)
- 验证 URI 与服务器同源;渲染前验证 MIME 与内容
8. 模式与规范来源 #
协议的权威定义见 TypeScript 模式,另有自动生成的 JSON Schema 供工具使用。