协议修订版本: 2025-03-26
MCP 使用 JSON-RPC 编码消息。JSON-RPC 消息 必须 使用 UTF-8 编码。
目前协议定义了两种标准的客户端-服务器通信传输机制:
客户端 应尽可能支持 stdio。
此外,客户端和服务器可以以可插拔的方式实现自定义传输机制。
在 stdio 传输机制中:
stdin
)读取 JSON-RPC 消息,并通过标准输出(stdout
)发送消息。stderr
)写入 UTF-8 字符串用于日志记录。客户端 可以 捕获、转发或忽略这些日志。stdout
写入任何非 MCP 消息的内容。stdin
写入任何非 MCP 消息的内容。 participant 客户端
participant 服务器进程
客户端->>+服务器进程: 启动子进程
loop 消息交换
客户端->>服务器进程: 写入 stdin
服务器进程->>客户端: 写入 stdout
服务器进程--)客户端: 可选日志输出到 stderr
end
客户端->>服务器进程: 关闭 stdin,终止子进程
deactivate 服务器进程
在 Streamable HTTP 传输机制中,服务器作为一个独立进程运行,可以处理多个客户端连接。该传输机制使用 HTTP POST 和 GET 请求。服务器可以可选地使用服务器发送事件(SSE)来流式传输多个服务器消息。这允许基本的 MCP 服务器以及支持流式传输和服务器到客户端通知和请求的更高级服务器。
服务器 必须 提供一个单一的 HTTP 端点路径(以下简称 MCP 端点),该端点支持 POST 和 GET 方法。例如,这可以是一个如 https://example.com/mcp
的 URL。
每个从客户端发送的 JSON-RPC 消息 必须 是一个新的 HTTP POST 请求,发送到 MCP 端点。
Accept
请求头,列出 application/json
和 text/event-stream
作为支持的内容类型。id
的 JSON-RPC 错误响应。Content-Type: text/event-stream
以启动 SSE 流,或者返回 Content-Type: application/json
以返回一个 JSON 对象。客户端 必须 支持这两种情况。CancelledNotification
。Accept
请求头,列出 text/event-stream
作为支持的内容类型。Content-Type: text/event-stream
,或者返回 HTTP 405 Method Not Allowed,表示该端点不提供 SSE 流。为了支持断开连接后的恢复,以及避免可能丢失的消息:
id
字段。
Last-Event-ID
请求头,以指示其收到的最后一个事件 ID。
换句话说,这些事件 ID 应由服务器按 每个流 的方式分配,作为该特定流中的游标。
MCP“会话”由客户端和服务器之间的逻辑相关交互组成,从初始化阶段开始。为了支持希望建立有状态会话的服务器:
InitializeResult
的 HTTP 响应中包含 Mcp-Session-Id
请求头。
Mcp-Session-Id
,使用 Streamable HTTP 传输的客户端 必须 在其后续的所有 HTTP 请求中包含此会话 ID。
Mcp-Session-Id
请求头的请求(初始化请求除外)返回 HTTP 400 Bad Request。Mcp-Session-Id
的请求的 HTTP 404 响应时,它 必须 通过发送一个新的 InitializeRequest
(不附加会话 ID)来开始一个新的会话。Mcp-Session-Id
请求头,以显式终止会话。
participant 客户端
participant 服务器note over 客户端, 服务器: 初始化
客户端->>+服务器: POST InitializeRequest
服务器->>-客户端: InitializeResponseMcp-Session-Id: 1868a90c...客户端->>+服务器: POST InitializedNotificationMcp-Session-Id: 1868a90c...
服务器->>-客户端: 202 Acceptednote over 客户端, 服务器: 客户端请求
客户端->>+服务器: POST ... 请求 ...Mcp-Session-Id: 1868a90c...alt 单个 HTTP 响应
服务器->>客户端: ... 响应 ...
else 服务器打开 SSE 流
loop 连接保持打开状态
服务器-)客户端: ... 服务器的 SSE 消息 ...
end
服务器-)客户端: SSE 事件: ... 响应 ...
end
deactivate 服务器
note over 客户端, 服务器: 客户端通知/响应
客户端->>+服务器: POST ... 通知/响应 ...Mcp-Session-Id: 1868a90c...
服务器->>-客户端: 202 Acceptednote over 客户端, 服务器: 服务器请求
客户端->>+服务器: GETMcp-Session-Id: 1868a90c...
loop 连接保持打开状态
服务器-)客户端: ... 服务器的 SSE 消息 ...
end
deactivate 服务器
客户端和服务器可以与已废弃的 HTTP+SSE 传输(协议版本 2024-11-05)保持向后兼容,如下所示:
InitializeRequest
POST 请求,包含如上定义的 Accept
请求头:
endpoint
事件作为第一个事件。endpoint
事件到达时,客户端可以假定这是一个运行旧 HTTP+SSE 传输的服务器,并应使用该传输进行所有后续通信。客户端和服务器 可以 实现额外的自定义传输机制以满足其特定需求。协议是传输无关的,可以在任何支持双向消息交换的通信通道上实现。
选择支持自定义传输的实现者 必须 确保它们保留 MCP 定义的 JSON-RPC 消息格式和生命周期要求。自定义传输 应 文档化其特定的连接建立和消息交换模式,以促进互操作性。