MCP 通信机制:stdio vs SSE

发布于:2025-05-12 ⋅ 阅读:(21) ⋅ 点赞:(0)

MCP 通信机制:stdio vs SSE

1 为什么 MCP 同时支持 STDIOSSE

目标 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 工作原理
  1. 客户端启动 MCP 服务器可执行文件。
  2. 一行 JSON‑RPC 请求到 stdin
  3. 服务器 回写一行 JSON‑RPC 响应到 stdout
  4. \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, json

for line in sys.stdin:                       # ① 监听 STDIN
    req = json.loads(line)
    method = req.get("method")
    if method == "getManifest":              # ② 处理 Manifest
        result = { "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])

网站公告

今日签到

点亮在社区的每一天
去签到