前言
在之前的文章中,我们介绍了MCP的整体架构。今天我们来深入MCP的核心——**传输层(Transport Layer)**实现。
MCP定义了两种标准传输机制:
- stdio:本地进程通信
- Streamable HTTP:远程服务器通信(替代了旧版HTTP+SSE)
本文将从协议规范到完整代码,手把手带你实现MCP传输层。
MCP协议基础
JSON-RPC 2.0消息格式
MCP基于JSON-RPC 2.0,所有消息都是UTF-8编码的JSON:
1 | // Request |
消息类型
| 类型 | 说明 | 是否需要响应 |
|---|---|---|
| Request | 请求,包含method和params | ✅ 是 |
| Response | 响应,包含result或error | ❌ 否 |
| Notification | 通知,没有id | ❌ 否 |
传输层一:stdio实现
架构原理
1 | ┌─────────────────────────────────────────────────┐ |
核心规则
- 消息分隔:使用换行符
\n分隔 - 禁止内嵌换行:消息内部不能有换行
- stdout纯净:服务器只能输出有效的MCP消息
- stderr日志:日志输出到stderr,客户端可捕获或忽略
Golang完整实现
Server端
1 | package main |
Client端
1 | package main |
测试运行
1 | # Terminal 1: Run server directly to see logs |
传输层二:Streamable HTTP实现
架构原理
1 | ┌─────────────────────────────────────────────────┐ |
核心特性
- POST发送请求:每个JSON-RPC消息一个新的POST请求
- SSE流式响应:服务器通过SSE流返回响应
- 会话管理:使用
Mcp-Session-Id头维护会话 - 协议版本头:
MCP-Protocol-Version
Golang完整实现
Server端(Gin + SSE)
1 | package main |
Client端
1 | package main |
测试运行
1 | # Terminal 1: Start server |
传输层对比
| 特性 | stdio | Streamable HTTP |
|---|---|---|
| 适用场景 | 本地进程 | 远程服务器 |
| 连接方式 | 子进程 | HTTP POST/GET |
| 响应模式 | 直接stdout | SSE流 |
| 会话管理 | 进程生命周期 | Mcp-Session-Id |
| 认证 | 无(本地信任) | OAuth/API Key |
| 多客户端 | ❌ 单客户端 | ✅ 多客户端 |
| 防火墙穿透 | ❌ 不可用 | ✅ 可用 |
| 性能 | ⭐⭐⭐⭐⭐ 最优 | ⭐⭐⭐ 网络开销 |
旧版HTTP+SSE vs 新版Streamable HTTP
旧版(2024-11-05)
1 | Client Server |
新版(2025-06-18)
1 | Client Server |
主要改进:
- 单端点:统一使用
/mcp,简化配置 - 会话管理:标准的
Mcp-Session-Id头 - 协议版本头:
MCP-Protocol-Version - DELETE终止:显式会话终止
安全考量
DNS重绑定防护
1 | # Server必须验证Origin头 |
认证实现
1 | # Bearer Token认证 |
总结
MCP传输层设计精妙:
- stdio:本地最优,零网络开销
- Streamable HTTP:远程标准,支持多客户端
- SSE流式:实时推送,低延迟
- 会话管理:状态维护,安全可控
理解并实现这些传输协议,是构建MCP生态的基础。
相关链接: