协议修订: 2025-11-25
- 基础协议:核心 JSON-RPC 消息类型
- 生命周期管理:连接初始化、能力协商和会话控制
- 授权:针对基于 HTTP 传输的身份验证和授权框架
- 服务器功能:由服务器公开的资源、提示词 (Prompts) 和工具
- 客户端功能:由客户端提供的采样 (Sampling) 和根目录列表
- 工具函数:横向关注点,如日志记录和参数补全
消息
MCP 客户端和服务器之间的所有消息必须遵循 JSON-RPC 2.0 规范。该协议定义了以下类型的消息:请求 (Requests)
请求由客户端发送给服务器,或反之,用于发起一项操作。- 请求必须包含一个字符串或整数类型的 ID。
- 与基础 JSON-RPC 不同,ID 不得为
null。 - 请求 ID 在同一会话内不得被请求者重复使用。
响应 (Responses)
响应作为对请求的回应发送,包含操作的结果或错误。结果响应 (Result Responses)
结果响应在操作成功完成时发送。- 结果响应必须包含与其对应的请求相同的 ID。
- 结果响应必须包含一个
result字段。 result可以遵循任何 JSON 对象结构。
错误响应 (Error Responses)
错误响应在操作失败或遇到错误时发送。- 错误响应必须包含与其对应的请求相同的 ID(除非在由于请求格式错误而无法读取 ID 的错误情况下)。
- 错误响应必须包含一个带有
code和message的error字段。 - 错误代码必须为整数。
通知
通知作为单向消息从客户端发送到服务器,或反之。接收者不得发送响应。- 通知不得包含 ID。
认证 (Auth)
MCP 为 HTTP 使用提供了一个授权框架。使用基于 HTTP 传输的实现应当符合此规范,而使用 STDIO 传输的实现不应当遵循此规范,而应从环境中检索凭据。 此外,客户端和服务器可以协商自定义的身份验证和授权策略。 有关 MCP 认证机制演变的进一步讨论和贡献,请加入我们的 GitHub Discussions 以帮助塑造协议的未来!架构 (Schema)
协议的完整规范定义为 TypeScript Schema。这是所有协议消息和结构的单一事实来源。 还有一个 JSON Schema,它是从 TypeScript 事实来源自动生成的,用于各种自动化工具。JSON Schema 使用
模型上下文协议在整个协议中使用 JSON Schema 进行验证。本节阐明了在 MCP 消息中应如何使用 JSON Schema。Schema 方言 (Dialect)
MCP 支持遵循以下规则的 JSON Schema:- 默认方言:当架构不包含
$schema字段时,默认为 JSON Schema 2020-12 - 显式方言:架构可以包含
$schema字段以指定不同的方言 - 支持的方言:实现必须至少支持 2020-12,并且应当记录它们支持哪些额外的方言
- 建议:建议实现者使用 JSON Schema 2020-12。
使用示例
默认方言 (2020-12)
显式方言 (draft-07)
实现要求
- 对于没有显式
$schema字段的架构,客户端和服务器必须支持 JSON Schema 2020-12 - 客户端和服务器必须根据其声明或默认的方言来验证架构。它们必须优雅地处理不支持的方言,通过返回一个指示不支持该方言的适当错误。
- 客户端和服务器应当记录它们支持哪些架构方言
Schema 验证
- 架构必须根据其声明或默认的方言有效
通用字段
_meta
_meta 属性/参数由 MCP 保留,以允许客户端和服务器在其交互中附加额外的元数据。 某些键名由 MCP 保留用于协议级元数据,如下所述;实现不得对这些键处的值做出假设。 此外,架构中的定义可能会为特定用途的元数据保留特定名称。 键名格式:有效的 _meta 键名包含两个部分:一个可选的前缀和一个名称。 前缀:- 如果指定,必须是以点号 (
.) 分隔的一系列标签,后跟一个斜杠 (/)。- 标签必须以字母开头,以字母或数字结尾;中间字符可以是字母、数字或连字符 (
-)。 - 实现应当使用反向域名表示法(例如
com.example/而不是example.com/)。
- 标签必须以字母开头,以字母或数字结尾;中间字符可以是字母、数字或连字符 (
- 任何第二个标签为
modelcontextprotocol或mcp的前缀均为 MCP 保留使用。- 例如:
io.modelcontextprotocol/、dev.mcp/、org.modelcontextprotocol.api/和com.mcp.tools/均被保留。 - 然而,
com.example.mcp/未被保留,因为第二个标签是example。
- 例如:
- 除非为空,否则必须以字母数字字符 (
[a-z0-9A-Z]) 开头和结尾。 - 中间可以包含连字符 (
-)、下划线 (_)、点号 (.) 和字母数字。
图标 (icons)
icons 属性为服务器公开其资源、工具、提示词和实现的视觉标识符提供了一种标准化方式。图标通过提供视觉上下文和提高可用功能的发现能力来增强用户界面。 图标表示为 Icon 对象数组,其中每个图标包括:src:指向图标资源的 URI(必需)。这可以是:- 指向图像文件的 HTTP/HTTPS URL
- 带有 base64 编码图像数据的 data URI
mimeType:可选的 MIME 类型(如果服务器提供的类型缺失或过于宽泛)sizes:可选的尺寸规范数组(例如["48x48"],对于像 SVG 这样的可伸缩格式使用["any"],或用于多种尺寸的["48x48", "96x96"])theme:图标背景的可选主题偏好(light或dark)
image/png- PNG 图像(安全,通用兼容性)image/jpeg(以及image/jpg) - JPEG 图像(安全,通用兼容性)
image/svg+xml- SVG 图像(可伸缩,但需要如下文所述的安全预防措施)image/webp- WebP 图像(现代、高效的格式)
- 将图标元数据和图标字节视为不可信输入,并防范网络、隐私和解析风险。
- 确保图标 URI 是 HTTPS 或
data:URI。客户端必须拒绝使用不安全方案和重定向的图标 URI,例如javascript:、file:、ftp:、ws:或本地应用 URI 方案。- 禁止方案更改以及重定向到不同源的主机。
- 防御源自超大图像、大尺寸或过多帧(例如在 GIF 中)的资源耗尽攻击。
- 使用者可以为图像和内容大小设置限制。
- 获取图标时不带凭据。不要发送 cookie、
Authorization标头或客户端凭据。 - 验证图标 URI 是否与服务器来自同一源。这最大限度地减少了向第三方泄露数据或跟踪信息的风险。
- 获取和渲染图标时要格外小心,因为载荷可能包含可执行内容(例如带有 嵌入式 JavaScript 或 扩展功能 的 SVG)。
- 使用者可以选择禁止特定文件类型,或在渲染前对图标文件进行清理。
- 在渲染前验证 MIME 类型和文件内容。将 MIME 类型信息视为参考。通过魔数 (magic bytes) 检测内容类型;在不匹配或类型未知时予以拒绝。
- 维护一份严格的图像类型允许列表。
Implementation:MCP 服务器/客户端实现的视觉标识符Tool:工具功能的视觉表示Prompt:显示在提示词模板旁边的图标Resource:不同资源类型的视觉指示器