当前位置: 首页 > java >正文

MCP 通信机制:stdio vs SSE

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, 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:怎么选?

维度STDIOSSE
🚀 部署复杂度最低:可执行文件即可需 Web 服务器 & CORS
🔄 流式能力❌ (一问一答)
🌐 网络穿透本机公网 / VPC
🔐 安全范围继承父进程TLS / Token / WAF
🗄️ 日志观测STDERR 即可需集中日志系统

口诀

“本地脚本 → STDIO;远程多人 → SSE;要流式 → SSE”


5 安全注意事项

风险STDIOSSE典型防护
权限滥用低(同机)中 (需 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])
http://www.xdnf.cn/news/5466.html

相关文章:

  • 项目过程中使用vant组件使用踩坑记录
  • 【Bootstrap V4系列】学习入门教程之 组件-媒体对象(Media object)
  • Nginx的增强与可视化!OpenResty Manager - 现代化UI+高性能反向代理+安全防护
  • 无人甘蔗小车履带式底盘行走系统的研究
  • 语音合成之十三 中文文本归一化在现代语音合成系统中的应用与实践
  • 【Java学习笔记】instanceof操作符
  • 隐式/显式类型转换?编程语言的类型转换?其它类型转换成数值类型?其它类型转换成字符串?类型转换?
  • 【和春笋一起学C++】数组名作为函数参数实例
  • STM32f103 标准库 零基础学习之按键点灯(不涉及中断)
  • vim配置代码文档格式化
  • Http2多路复用的静态表和动态表
  • CSS专题之自定义属性
  • 记录学习《手动学习深度学习》这本书的笔记(十一)
  • Docker:安装配置教程(最新版本)
  • 元组类型的特性与应用场景:深入理解元组在 TypeScript 中的使用
  • Python训练营打卡DAY22
  • LVGL(lv_label实战)
  • 《设计模式之禅》笔记
  • 使用PHP对接印度股票市场API
  • AARRR用户增长模型(海盗指标)详解
  • C/C++跳动的爱心
  • 云计算-容器云-KubeVirt 运维
  • 【Tools】Visual Studio使用经验介绍(包括基本功能、远程调试、引入第三方库等等)
  • 深入理解 Pinia:状态管理的利器
  • [思维模式-29]:《本质思考力》-9- 两种相反的构建与解构系统的思维模式:①自顶向下的规划、分解、牵引;②自底向上的堆叠、聚合。
  • 【stata代码】地方政府驱动企业参与乡村振兴的机制——乡村振兴注意力视角的分析
  • 数据可视化大屏——智慧社区内网比对平台
  • 基于SpringBoot的抽奖系统测试报告
  • 49.EFT测试与静电测试环境和干扰特征分析
  • 2025御网杯wp(web,misc,crypto)