MCP 四种服务传输类型详解:STDIO、SSE、Streamable HTTP 与 InMemory
2025-10-24
深度学习
00

目录

MCP 四种服务传输类型详解:STDIO、SSE、Streamable HTTP 与 InMemory
引言
一、STDIO(标准输入输出)传输
什么是 STDIO 传输?
工作原理
技术特点
适用场景
优势
局限性
二、SSE(Server-Sent Events)传输
什么是 SSE 传输?
工作原理
技术特点
适用场景
优势
局限性
三、Streamable HTTP 传输(推荐)
什么是 Streamable HTTP 传输?
核心创新
工作原理
技术特点
高级特性
适用场景
优势
Python 实现示例
迁移指南
四、InMemory 传输
什么是 InMemory 传输?
工作原理
适用场景
优势
局限性
五、传输类型对比总结
六、选择建议
新项目建议
现有项目迁移
七、实践建议
安全性考虑
性能优化
开发工具
八、未来展望
结论
参考资源

MCP 四种服务传输类型详解:STDIO、SSE、Streamable HTTP 与 InMemory

引言

Model Context Protocol(MCP)是 Anthropic 推出的开放标准协议,旨在标准化 AI 应用与外部工具、数据源和系统之间的连接方式。就像 USB 标准统一了计算机外设接口一样,MCP 试图解决 AI 集成中的"M×N 问题"——将 M 个不同的 AI 应用与 N 个不同工具的集成从 M×N 个独立实现简化为 M+N 个标准化实现。

在 MCP 架构中,传输层(Transport)是实现客户端与服务器通信的基础。本文将深入探讨 MCP 的四种主要传输类型及其应用场景。


一、STDIO(标准输入输出)传输

什么是 STDIO 传输?

STDIO 传输使用标准输入(stdin)和标准输出(stdout)流进行进程间通信。这是最基础且最简单的传输方式。

工作原理

  • 进程模型:客户端将 MCP 服务器作为子进程启动
  • 通信方式
    • 服务器从标准输入(stdin)读取 JSON-RPC 消息
    • 服务器向标准输出(stdout)写入响应消息
    • 消息以换行符分隔,不能包含嵌入的换行符
    • 服务器可以向标准错误(stderr)写入日志信息

技术特点

javascript
展开代码
// STDIO 客户端示例 const client = new Client({ name: "example-client", version: "1.0.0" }, { capabilities: {} }); const transport = new StdioClientTransport({ command: "./server", args: ["--option", "value"] }); await client.connect(transport);

适用场景

  • 本地工具集成:需要访问本地文件系统、运行本地脚本
  • 命令行应用:已有的命令行工具和可执行文件
  • 开发测试:快速原型开发和本地调试
  • 个人使用:单用户环境下的简单工具集成

优势

✅ 实现简单,开发门槛低
✅ 无需网络配置,适合本地环境
✅ 进程隔离,安全性高
✅ 资源占用少

局限性

❌ 仅限本机通信,无法远程访问
❌ 不支持多客户端连接
❌ 扩展性有限
❌ 需要启动独立进程


二、SSE(Server-Sent Events)传输

什么是 SSE 传输?

SSE 传输基于 HTTP 协议,使用服务器发送事件(Server-Sent Events)技术实现服务器到客户端的单向持久连接。

工作原理

双端点架构

  • SSE 端点(GET 请求):客户端连接以接收服务器消息
  • HTTP POST 端点:客户端发送消息到服务器

通信流程

  1. 客户端向连接端点发送 GET 请求
  2. 服务器响应包含 endpoint 事件,提供消息发送的相对 URI
  3. 客户端和服务器通过两个端点双向交换消息
  4. 连接关闭时通信结束

技术特点

python
展开代码
# SSE 服务器示例 from mcp.server.fastmcp import FastMCP from mcp.server.sse import SseServerTransport mcp = FastMCP("SSE Example Server") @mcp.tool() def greet(name: str) -> str: return f"Hello, {name}!"

适用场景

  • 远程服务访问:需要通过网络访问 MCP 服务器
  • 多客户端支持:多个客户端需要连接同一服务器
  • Web 应用集成:基于浏览器的应用程序
  • 跨机器通信:不同机器之间的工具共享

优势

✅ 支持网络访问和远程部署
✅ 可处理多个客户端连接
✅ 支持身份验证和授权
✅ 更好的可扩展性

局限性

❌ 需要维护两个独立端点,架构复杂
❌ 需要长时间保持连接,资源消耗大
❌ 连接断开可能丢失消息
❌ 单向推送机制限制了交互灵活性

重要说明:SSE 传输已在 2025 年 3 月的规范更新(版本 2025-03-26)中被标记为过时,建议使用更先进的 Streamable HTTP 传输。


三、Streamable HTTP 传输(推荐)

什么是 Streamable HTTP 传输?

Streamable HTTP 是 MCP 协议的最新传输机制,于 2025 年 3 月 26 日引入规范(版本 2025-03-26),取代了之前的 HTTP+SSE 传输。它通过单一 HTTP 端点支持双向通信和可选的流式响应。

核心创新

统一端点架构

  • 服务器提供单一 HTTP 端点(如 https://example.com/mcp
  • 同一端点支持 POST 和 GET 方法
  • 可选的 SSE 支持用于流式多消息传输

工作原理

通信生命周期

  1. 初始化阶段(POST 请求)

    http
    展开代码
    POST /mcp HTTP/1.1 Content-Type: application/json { "jsonrpc": "2.0", "method": "initialize", "params": {...} }

    服务器响应中包含 Mcp-Session-Id 头,建立会话

  2. 建立公告通道(GET 请求,可选)

    http
    展开代码
    GET /mcp HTTP/1.1 Accept: text/event-stream Mcp-Session-Id: session-a4b1-c8d3-e5f6

    建立持久 SSE 连接,用于服务器主动推送消息

  3. 命令通道(POST 请求)

    • 客户端通过 POST 请求发送命令
    • 服务器可以返回单一 JSON 响应或 SSE 流
  4. 终止阶段(DELETE 请求)

    http
    展开代码
    DELETE /mcp HTTP/1.1 Mcp-Session-Id: session-a4b1-c8d3-e5f6

技术特点

javascript
展开代码
// Streamable HTTP 服务器示例 import express from 'express'; const app = express(); const server = new Server({ name: "example-server", version: "1.0.0" }, { capabilities: {} }); app.post("/mcp", async (req, res) => { const response = await server.handleRequest(req.body); if (needsStreaming) { res.setHeader("Content-Type", "text/event-stream"); // 发送 SSE 事件流 } else { res.json(response); } }); app.get("/mcp", (req, res) => { res.setHeader("Content-Type", "text/event-stream"); // 服务器主动推送通知/请求 });

高级特性

会话管理

  • 通过 Mcp-Session-Id 头维护有状态会话
  • 支持跨多个请求的上下文持久化

连接恢复(规划中):

  • 事件 ID:服务器为 SSE 事件附加唯一 ID
  • 断点续传:客户端通过 Last-Event-ID 头恢复连接
  • 消息重放:服务器重放断开期间的消息

取消机制(规划中):

  • 明确的操作取消机制
  • 更好的资源管理

适用场景

  • 生产环境部署:需要高可用性和可扩展性的企业级应用
  • Serverless 架构:支持按需资源分配和自动缩放
  • 微服务集成:作为标准 REST API 集成到现有系统
  • 跨平台服务:需要跨多个平台和设备访问
  • 长时间运行任务:需要流式进度更新的操作

优势

简化架构:单一端点,减少复杂性
双向通信:服务器可主动发送请求和通知
灵活响应模式:支持单次响应和流式响应
无状态友好:支持 serverless 部署和自动扩缩容
连接弹性:不依赖长连接,支持断线重连
现代化设计:符合 REST 和现代 Web 架构最佳实践
向后兼容:可与 SSE 传输共存

Python 实现示例

python
展开代码
from mcp.server.fastmcp import FastMCP mcp = FastMCP( name="production-server", description="Production-ready MCP server", host="0.0.0.0", port=8000 ) @mcp.tool( name="add_numbers", description="Add two numbers", structured_output=True ) def add(a: float, b: float) -> dict: return { "operation": "addition", "result": a + b, "success": True } if __name__ == "__main__": # 使用 Streamable HTTP 传输 mcp.run(transport="streamable-http", mount_path="/mcp")

迁移指南

从 SSE 迁移到 Streamable HTTP:

  1. 服务器端

    • type: "sse" 改为 type: "http-stream"
    • 统一到单一端点模式
    • 实现会话管理(使用 Mcp-Session-Id 头)
  2. 客户端端

    • 使用 StreamableHTTPClientTransport 替代 SseClientTransport
    • 更新端点配置
    • 保持 SSE 回退支持以兼容旧服务器

四、InMemory 传输

什么是 InMemory 传输?

InMemory 传输是一种内存内的直接通信方式,主要用于测试、开发和单进程应用场景。虽然在官方文档中提及较少,但它是某些特定场景下的有效选择。

工作原理

  • 同进程通信:客户端和服务器运行在同一进程内
  • 直接内存访问:通过内存中的数据结构进行消息传递
  • 无序列化开销:不需要 JSON 序列化/反序列化

适用场景

  • 单元测试:测试 MCP 组件而无需启动实际进程
  • 集成测试:快速验证客户端-服务器交互逻辑
  • 嵌入式应用:将 MCP 功能嵌入到单体应用中
  • 原型开发:快速实验和概念验证

优势

✅ 极低延迟,性能最优
✅ 无需网络或进程配置
✅ 简化测试和调试
✅ 零外部依赖

局限性

❌ 仅限单进程应用
❌ 无法用于分布式系统
❌ 不适合生产环境
❌ 缺乏真实环境的完整性测试


五、传输类型对比总结

特性STDIOSSE(已弃用)Streamable HTTPInMemory
部署方式本地进程远程 HTTP 服务远程 HTTP 服务同进程内
通信方式stdin/stdoutHTTP + SSE单一 HTTP 端点内存直接访问
网络访问❌ 否✅ 是✅ 是❌ 否
多客户端❌ 否✅ 是✅ 是❌ 否
双向通信✅ 是⚠️ 有限✅ 完整支持✅ 是
流式响应✅ 是✅ 是✅ 可选✅ 是
会话管理❌ 无⚠️ 有限✅ 完整支持❌ 无需
实现复杂度🟢 简单🟡 中等🟡 中等🟢 简单
扩展性🔴 差🟡 中等🟢 优秀🔴 不适用
适用环境开发/测试生产(过渡期)生产(推荐)测试/原型
状态✅ 活跃⚠️ 已弃用✅ 推荐✅ 活跃

六、选择建议

新项目建议

  1. 本地桌面应用:选择 STDIO

    • 如 VS Code 插件、Claude Desktop 集成
  2. Web 应用和远程服务:选择 Streamable HTTP

    • 生产环境首选
    • 支持云部署和 serverless
  3. 测试和开发:选择 InMemory

    • 单元测试和快速原型

现有项目迁移

  • 使用 SSE 的项目
    • 尽快迁移到 Streamable HTTP
    • 在过渡期保持双传输支持
    • 参考向后兼容指南

七、实践建议

安全性考虑

  • 验证 Origin 头:防止 DNS 重绑定攻击(HTTP 传输)
  • 使用 HTTPS:加密网络传输(生产环境必须)
  • 实现认证授权:保护远程 MCP 服务器
  • 会话管理:使用加密安全的会话 ID

性能优化

  • 连接复用:Streamable HTTP 支持连接池
  • 批量请求:减少网络往返次数
  • 流式传输:适用于大数据或长时间操作
  • Scale-to-Zero:利用 serverless 特性优化成本

开发工具

  • MCP Inspector:测试和调试 MCP 服务器

    bash
    展开代码
    npx @modelcontextprotocol/inspector
  • mcp-remote:适配器工具,让不支持远程连接的客户端(如 Claude Desktop)可以连接远程服务器


八、未来展望

MCP 生态系统正在快速演进,Streamable HTTP 传输的引入标志着协议走向成熟。预计未来将看到:

  • 更广泛的客户端支持:更多 AI 应用原生支持 Streamable HTTP
  • 增强的连接恢复能力:完整实现断点续传和消息重放
  • 标准化认证机制:更完善的安全和授权框架
  • 性能优化:更高效的协议实现和传输优化
  • 工具生态成熟:更多开发工具和社区支持

结论

Model Context Protocol 通过提供多种传输类型,为不同应用场景提供了灵活的选择:

  • STDIO 为本地集成提供了简单高效的方案
  • SSE(已弃用)完成了从本地到远程的过渡使命
  • Streamable HTTP 代表了现代化的生产级解决方案
  • InMemory 满足了测试和原型开发的特殊需求

对于新项目,强烈建议

  • 本地工具使用 STDIO
  • 远程服务使用 Streamable HTTP
  • 测试环境使用 InMemory

随着 MCP 生态系统的不断发展,标准化的传输机制将使 AI 应用与外部工具的集成变得更加简单、可靠和高效,为构建下一代智能应用奠定坚实基础。


参考资源

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!