消息格式
MCP 使用 JSON-RPC 2.0 作为其传输格式。传输层负责将 MCP 协议消息转换为 JSON-RPC 格式进行传输,并将接收到的 JSON-RPC 消息转换回 MCP 协议消息。 共使用三种类型的 JSON-RPC 消息:请求 (Requests)
响应 (Responses)
通知
内置传输类型
MCP 目前定义了两种标准传输机制标准输入/输出 (stdio)
stdio 传输通过标准输入和输出流实现通信。这对于本地集成和命令行工具特别有用。 在以下情况下使用 stdio:- 构建命令行工具
- 实现本地集成
- 需要简单的进程间通信
- 配合 Shell 脚本工作
服务器
客户端
可流式 HTTP (Streamable HTTP)
Streamable HTTP 传输使用 HTTP POST 请求进行客户端到服务器的通信,并可选地使用服务器发送事件 (SSE) 流进行服务器到客户端的通信。 在以下情况下使用 Streamable HTTP:- 构建基于 Web 的集成
- 需要通过 HTTP 进行客户端-服务器通信
- 需要有状态会话
- 支持多个并发客户端
- 实现可恢复连接
工作原理
- 客户端到服务器通信:来自客户端的每个 JSON-RPC 消息都会作为新的 HTTP POST 请求发送到 MCP 端点
- 服务器响应:服务器可以通过以下方式响应:
- 单个 JSON 响应 (
Content-Type: application/json) - 用于多条消息的 SSE 流 (
Content-Type: text/event-stream)
- 单个 JSON 响应 (
- 服务器到客户端通信:服务器可以通过以下方式向客户端发送请求/通知:
- 由客户端请求发起的 SSE 流
- 通过对 MCP 端点发起 HTTP GET 请求获得的 SSE 流
服务器
客户端
会话管理
Streamable HTTP 支持有状态会话,以便在多个请求之间保持上下文- 会话初始化:服务器可以在初始化期间通过在
Mcp-Session-Id标头中包含会话 ID 来分配它 - 会话持久化:客户端必须在随后所有的请求中使用
Mcp-Session-Id标头包含该会话 ID - 会话终止:可以通过发送带有会话 ID 的 HTTP DELETE 请求来显式终止会话
可恢复性与重新交付
为了支持恢复中断的连接,Streamable HTTP 提供了:- 事件 ID:服务器可以为 SSE 事件附加唯一 ID 以进行追踪
- 从最后一个事件恢复:客户端可以通过发送
Last-Event-ID标头来恢复 - 消息重播:服务器可以从断开连接点开始重播错过的消息
安全注意事项
在实现 Streamable HTTP 传输时,请遵循以下安全最佳实践- 验证 Origin 标头:始终验证所有传入连接的
Origin标头,以防止 DNS 重新绑定攻击 - 绑定到 Localhost:在本地运行时,仅绑定到 localhost (127.0.0.1),而不是所有网络接口 (0.0.0.0)
- 实现身份验证:为所有连接使用适当的身份验证
- 使用 HTTPS:在生产部署中始终使用 TLS/HTTPS
- 验证会话 ID:确保会话 ID 在加密上是安全的且经过正确验证
服务器发送事件 (SSE) - 已弃用
自 2024-11-05 协议版本起,作为独立传输方式的 SSE 已被弃用。它已被 Streamable HTTP 取代,后者将 SSE 作为可选的流式机制。有关向后兼容性的信息,请参阅下文的向后兼容性部分。
- 仅需要服务器到客户端流式传输的情况
- 在受限网络中工作
- 实现简单的更新
旧版安全性考量
已弃用的 SSE 传输具有与 Streamable HTTP 类似的安全性考量,特别是关于 DNS 重新绑定攻击。在 Streamable HTTP 传输中使用 SSE 流时,应应用同样的保护措施。服务器
客户端
自定义传输方式
MCP 使得为特定需求实现自定义传输方式变得容易。任何传输实现只需符合 Transport 接口即可: 您可以为以下场景实现自定义传输:- 自定义网络协议
- 专门的通信渠道
- 与现有系统集成
- 性能优化
错误处理
传输实现应处理各种错误场景- 连接错误
- 消息解析错误
- 协议错误
- 网络超时
- 资源清理
最佳实践
在实现或使用 MCP 传输时- 正确处理连接生命周期
- 实现适当的错误处理
- 在连接关闭时清理资源
- 使用适当的超时时间
- 在发送前验证消息
- 记录传输事件以便调试
- 在适当时实现重连逻辑
- 处理消息队列中的背压
- 监控连接健康状况
- 实施适当的安全措施
安全注意事项
在实现传输时身份验证与授权
- 实现适当的身份验证机制
- 验证客户端凭据
- 使用安全的令牌处理
- 实施授权检查
数据安全
- 为网络传输使用 TLS
- 加密敏感数据
- 验证消息完整性
- 实施消息大小限制
- 清理输入数据
网络安全
- 实施速率限制
- 使用适当的超时时间
- 处理拒绝服务 (DoS) 场景
- 监控异常模式
- 实施适当的防火墙规则
- 对于基于 HTTP 的传输(包括 Streamable HTTP),验证 Origin 标头以防止 DNS 重新绑定攻击
- 对于本地服务器,仅绑定到 localhost (127.0.0.1) 而不是所有接口 (0.0.0.0)
调试传输层
传输问题调试技巧- 启用调试日志
- 监控消息流
- 检查连接状态
- 验证消息格式
- 测试错误场景
- 使用网络分析工具
- 实现健康检查
- 监控资源使用情况
- 测试边缘情况
- 使用适当的错误追踪
向后兼容性
为了保持不同协议版本之间的兼容性针对支持旧版客户端的服务器
希望支持使用已弃用 HTTP+SSE 传输的客户端的服务器应:- 在新的 MCP 端点旁同时托管旧的 SSE 和 POST 端点
- 在两个端点上处理初始化请求
- 为每种传输类型维护独立的处理逻辑
针对支持旧版服务器的客户端
希望支持使用已弃用传输方式的服务器的客户端应:- 接受可能使用任一传输方式的服务器 URL
- 尝试发送带有正确
Accept标头的InitializeRequestPOST 请求- 如果成功,则使用 Streamable HTTP 传输
- 如果失败并返回 4xx 状态码,则回退到旧版 SSE 传输
- 针对旧版服务器,发起一个期望得到包含
endpoint事件的 SSE 流的 GET 请求