MCP(Model Context Protocol)模型上下文协议 进阶篇3 - 传输
MCP 目前定义了两种标准的客户端-服务端通信传输机制:
- stdio(标准输入输出通信)
- HTTP with Server-Sent Events (SSE)(HTTP 服务端发送事件)
客户端应尽可能支持 stdio。此外,客户端和服务端也可以以插件方式实现自定义传输机制。
1. stdio 传输
在 stdio 传输中:
- 客户端将 MCP 服务端作为子进程启动。
- 服务端通过标准输入(stdin)接收 JSON-RPC 消息,并通过标准输出(stdout)写入响应。
- 消息以换行符分隔,且不得包含嵌入的换行符。
- 服务端可以将 UTF-8 字符串写入标准错误(stderr)以用于日志记录。客户端可以选择捕获、转发或忽略这些日志。
- 服务端不得向 stdout 写入任何非法的 MCP 消息。
- 客户端不得向服务端的 stdin 写入任何非法的 MCP 消息。
2. HTTP with SSE 传输
在 SSE 传输中,服务端作为独立进程运行,可以处理多个客户端连接。
服务端必须提供两个端点:
- SSE 端点:用于客户端建立连接并接收服务端消息。
- HTTP POST 端点:用于客户端向服务端发送消息。
当客户端连接时,服务端必须发送一个包含 URI 的 endpoint 事件,客户端使用该 URI 发送消息。所有后续客户端消息必须通过 HTTP POST 请求发送到此端点。
服务端消息以 SSE 消息事件的形式发送,消息内容以 JSON 编码在事件数据中。
3. 自定义传输 (Custom Transports)
客户端和服务端可以根据需要实现额外的自定义传输机制。MCP 协议与传输方式无关,可以在任何支持双向消息交换的通信通道上实现。
选择支持自定义传输的实现者必须确保其符合 MCP 定义的 JSON-RPC 消息格式和生命周期要求。自定义传输应记录其特定的连接建立和消息交换模式,以促进互操作性。
4. 补充说明:远程 MCP 连接的支持
官方文档中关于传输方式的描述可能会让部分开发者误解,认为 Remote MCP Connections(远程 MCP 连接)已经实现。实际上,当前的客户端和服务端都是在本地运行的。(当前如果需要连接远程服务器,需要在客户端-服务端连接后,由本地服务端再次向远程服务器发起连接)
这一点在官方的 2025 年路线图中有所提及:
实现 Remote MCP Connections是当前MCP项目组的最高优先级,允许客户端通过互联网安全地连接到 MCP 服务端。关键举措包括:
- 认证与授权 (Authentication & Authorization):增加标准化的认证能力,特别是专注于 OAuth 2.0 支持。
- 服务发现 (Service Discovery):定义客户端如何发现并连接到远程 MCP 服务器。
- 无状态操作 (Stateless Operations):探讨 MCP 是否可以支持无服务器环境(serverless environments),在这种环境中,操作需要尽可能无状态。
总结
MCP 目前支持两种标准传输方式:stdio 和 HTTP with SSE,同时也允许自定义传输机制。每种传输方式都有其特定的消息交换模式和实现要求。需要注意的是,当前 MCP 客户端-服务端通信传输机制的实现仅限于本地通信,远程连接的支持计划在 2025 年的路线图中逐步实现,包括认证授权、服务发现和无状态操作等关键功能。开发者可以根据需求选择合适的传输方式,并关注未来的MCP远程连接支持进展。