MCP 通信机制:stdio vs SSE
MCP 通信机制:stdio vs SSE
1 为什么 MCP 同时支持 STDIO 与 SSE?
目标 | STDIO (本地管道) | SSE (Server‑Sent Events) |
---|---|---|
典型部署 | 同机子进程 & CLI | 远程或云端 Web 服务 |
连接特性 | 一问一答、零网络 | 长连接、流式推送 |
规范地位 | 必须支持—客户端应“能用就用” | 推荐—远程场景首选 |
传输格式 | JSON‑RPC 2.0 ⏎ 换行分隔 | HTTP POST + text/event-stream |
官方把两者统称为 标准传输机制(Standard Transports)。([modelcontextprotocol.io][1], [modelcontextprotocol.io][2], [Cloudflare Docs][3])
2 STDIO Transport:像“管道”一样的本地对话
2.1 工作原理
- 客户端启动 MCP 服务器可执行文件。
- 写一行 JSON‑RPC 请求到 stdin。
- 服务器 回写一行 JSON‑RPC 响应到 stdout。
- 以
\n
为包界,简单可靠。([The New Stack][4])
2.2 两种常见请求
// ① Manifest 请求
{ "jsonrpc":"2.0", "method":"getManifest", "id":1 }/* ② Source 查询 */
{ "jsonrpc":"2.0", "method":"resolve","params":{ "source":"docs", "query":"Rust 所有权", "top_k":3 },"id":2 }
⚡ 优势:零端口、脚本友好;📦 局限:不能多路流式推送。
2.3 最小实现(Python,逐行注释)
#!/usr/bin/env python3
import sys, jsonfor line in sys.stdin: # ① 监听 STDINreq = json.loads(line)method = req.get("method")if method == "getManifest": # ② 处理 Manifestresult = { "name":"Demo", "version":"0.4", "sources":[] }elif method == "resolve":q = req["params"]["query"]result = { "type":"context_list","items":[{ "type":"document","content":f"你查的是:{q}", "metadata":{} }] }else:result = { "error":"Unknown method" }sys.stdout.write(json.dumps({ "id": req["id"], "result": result })+"\n")sys.stdout.flush()
3 SSE Transport:HTTP 上的实时广播
3.1 工作原理
-
客户端:先用
POST
提交请求体(可批量); -
服务器:立即返回
Content‑Type: text/event-stream
,随后用event: message data: {...JSON-RPC 响应...}
不断推流,直到任务结束。([modelcontextprotocol.io][1], [Medium][5])
3.2 伪代码(FastAPI)
@app.post("/resolve")
async def resolve():async def stream():for chunk in gen_chunks():yield {"data": json.dumps(chunk)}return EventSourceResponse(stream())
3.3 使用时机
适合用 SSE | 原因 |
---|---|
云端检索 / 多租户 | 需要公网访问 |
大模型长文本生成 | 边生成边推送,体验佳 |
前端网页集成 | 浏览器内置 EventSource |
与 WebSocket 相比,SSE 单向(服务器→客户端),实现更轻量。
4 STDIO vs SSE:怎么选?
维度 | STDIO | SSE |
---|---|---|
🚀 部署复杂度 | 最低:可执行文件即可 | 需 Web 服务器 & CORS |
🔄 流式能力 | ❌ (一问一答) | ✅ |
🌐 网络穿透 | 本机 | 公网 / VPC |
🔐 安全范围 | 继承父进程 | TLS / Token / WAF |
🗄️ 日志观测 | STDERR 即可 | 需集中日志系统 |
口诀:
“本地脚本 → STDIO;远程多人 → SSE;要流式 → SSE”
5 安全注意事项
风险 | STDIO | SSE | 典型防护 |
---|---|---|---|
权限滥用 | 低(同机) | 中 (需 Auth) | OAuth2 / RBAC |
数据泄漏 | 低 | 中‑高 | TLS + 脱敏 |
DoS | 低 | 高(长连接) | 速率限制 & 超时 |
协议本身与 REST API 在安全等级上相近;关键在于 认证、访问控制与速率限制。([GitHub][6], [diamantai.substack.com][7])
6 参考链接
- 官方“Transports”规格页 ([modelcontextprotocol.io][1])
- 规范附录(2025‑03‑26 版)([modelcontextprotocol.io][2])
- Cloudflare Agents MCP 文档 ([Cloudflare Docs][3])
- Cursor 开发者指南 ([docs.cursor.com][8])
- 社区深度解析 ([Medium][9])