- stdio:通过客户端启动的子进程的标准流的、以换行符分隔的消息。
- Streamable HTTP:每条消息是对单个 MCP 端点的一个 HTTP POST;回复以一个 JSON 对象或一个请求范围的 SSE 流的形式到达。
消息
MCP 使用 JSON-RPC 编码消息。JSON-RPC 消息**必须(MUST)**是 UTF-8 编码的。 一个绑定**必须(MUST)**将客户端发送的_请求_和_通知_投递给服务器,并将服务器发送的_响应_和_通知_投递给客户端。不存在其他消息方向:根据消息模式,服务器不发起 JSON-RPC 请求,客户端也不发送 JSON-RPC 响应。请求元数据
所有协议元数据都在消息体中传递:每个请求都在_meta.io.modelcontextprotocol/* 字段中携带其协议版本和客户端能力。
一个绑定**可以(MAY)**额外地将选定的消息体字段镜像到信封元数据中。Streamable HTTP 传输将它们镜像到 HTTP header 中,以便中间方可以在不解析消息体的情况下路由和检查请求。消息体仍然是真实来源;镜像元数据的绑定定义如何拒绝不匹配。
取消
每种绑定定义客户端如何放弃一个执行中的请求:在 stdio 上客户端发送一个notifications/cancelled 通知;在 Streamable HTTP 上它关闭该请求的响应流。协议级别的规则在各处都相同;参见取消。
自定义传输
客户端和服务器**可以(MAY)**实现额外的自定义传输机制以适应它们的特定需求。协议与传输无关,可以在任何支持双向消息交换的通信信道上实现。 选择支持自定义传输的实现者**必须(MUST)保留 JSON-RPC 消息格式、消息模式,以及每请求元数据模型。自定义传输应当(SHOULD)**记录它们的连接建立、消息分帧和取消模式,以助于互操作性。 在可靠的双向字节流(例如 Unix 域套接字或 TCP)上运行的自定义传输**应当(SHOULD)**重用 stdio 分帧,而不是定义一个新的:stdio 绑定只是字节流上以换行符分隔的 JSON-RPC,只有它的进程生命周期规则特定于标准流。向后兼容
早期的协议修订版通过initialize 握手建立一个连接范围的会话,并允许服务器发起 JSON-RPC 请求。与那些修订版互操作的客户端和服务器检测对方的时代并回退,如版本管理:向后兼容中所述,其中包括一个供实现者使用的兼容性矩阵。每个绑定页面描述其特定于传输的检测机制。