Model Context Protocol(MCP)是 Anthropic 推出的开放标准协议,旨在标准化 AI 应用与外部工具、数据源和系统之间的连接方式。就像 USB 标准统一了计算机外设接口一样,MCP 试图解决 AI 集成中的"M×N 问题"——将 M 个不同的 AI 应用与 N 个不同工具的集成从 M×N 个独立实现简化为 M+N 个标准化实现。
在 MCP 架构中,传输层(Transport)是实现客户端与服务器通信的基础。本文将深入探讨 MCP 的四种主要传输类型及其应用场景。
STDIO 传输使用标准输入(stdin)和标准输出(stdout)流进行进程间通信。这是最基础且最简单的传输方式。
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 传输基于 HTTP 协议,使用服务器发送事件(Server-Sent Events)技术实现服务器到客户端的单向持久连接。
双端点架构:
通信流程:
endpoint 事件,提供消息发送的相对 URIpython展开代码# 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}!"
✅ 支持网络访问和远程部署
✅ 可处理多个客户端连接
✅ 支持身份验证和授权
✅ 更好的可扩展性
❌ 需要维护两个独立端点,架构复杂
❌ 需要长时间保持连接,资源消耗大
❌ 连接断开可能丢失消息
❌ 单向推送机制限制了交互灵活性
重要说明:SSE 传输已在 2025 年 3 月的规范更新(版本 2025-03-26)中被标记为过时,建议使用更先进的 Streamable HTTP 传输。
Streamable HTTP 是 MCP 协议的最新传输机制,于 2025 年 3 月 26 日引入规范(版本 2025-03-26),取代了之前的 HTTP+SSE 传输。它通过单一 HTTP 端点支持双向通信和可选的流式响应。
统一端点架构:
https://example.com/mcp)通信生命周期:
初始化阶段(POST 请求)
http展开代码POST /mcp HTTP/1.1 Content-Type: application/json { "jsonrpc": "2.0", "method": "initialize", "params": {...} }
服务器响应中包含 Mcp-Session-Id 头,建立会话
建立公告通道(GET 请求,可选)
http展开代码GET /mcp HTTP/1.1 Accept: text/event-stream Mcp-Session-Id: session-a4b1-c8d3-e5f6
建立持久 SSE 连接,用于服务器主动推送消息
命令通道(POST 请求)
终止阶段(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 头维护有状态会话连接恢复(规划中):
Last-Event-ID 头恢复连接取消机制(规划中):
✅ 简化架构:单一端点,减少复杂性
✅ 双向通信:服务器可主动发送请求和通知
✅ 灵活响应模式:支持单次响应和流式响应
✅ 无状态友好:支持 serverless 部署和自动扩缩容
✅ 连接弹性:不依赖长连接,支持断线重连
✅ 现代化设计:符合 REST 和现代 Web 架构最佳实践
✅ 向后兼容:可与 SSE 传输共存
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:
服务器端:
type: "sse" 改为 type: "http-stream"Mcp-Session-Id 头)客户端端:
StreamableHTTPClientTransport 替代 SseClientTransportInMemory 传输是一种内存内的直接通信方式,主要用于测试、开发和单进程应用场景。虽然在官方文档中提及较少,但它是某些特定场景下的有效选择。
✅ 极低延迟,性能最优
✅ 无需网络或进程配置
✅ 简化测试和调试
✅ 零外部依赖
❌ 仅限单进程应用
❌ 无法用于分布式系统
❌ 不适合生产环境
❌ 缺乏真实环境的完整性测试
| 特性 | STDIO | SSE(已弃用) | Streamable HTTP | InMemory |
|---|---|---|---|---|
| 部署方式 | 本地进程 | 远程 HTTP 服务 | 远程 HTTP 服务 | 同进程内 |
| 通信方式 | stdin/stdout | HTTP + SSE | 单一 HTTP 端点 | 内存直接访问 |
| 网络访问 | ❌ 否 | ✅ 是 | ✅ 是 | ❌ 否 |
| 多客户端 | ❌ 否 | ✅ 是 | ✅ 是 | ❌ 否 |
| 双向通信 | ✅ 是 | ⚠️ 有限 | ✅ 完整支持 | ✅ 是 |
| 流式响应 | ✅ 是 | ✅ 是 | ✅ 可选 | ✅ 是 |
| 会话管理 | ❌ 无 | ⚠️ 有限 | ✅ 完整支持 | ❌ 无需 |
| 实现复杂度 | 🟢 简单 | 🟡 中等 | 🟡 中等 | 🟢 简单 |
| 扩展性 | 🔴 差 | 🟡 中等 | 🟢 优秀 | 🔴 不适用 |
| 适用环境 | 开发/测试 | 生产(过渡期) | 生产(推荐) | 测试/原型 |
| 状态 | ✅ 活跃 | ⚠️ 已弃用 | ✅ 推荐 | ✅ 活跃 |
本地桌面应用:选择 STDIO
Web 应用和远程服务:选择 Streamable HTTP
测试和开发:选择 InMemory
MCP Inspector:测试和调试 MCP 服务器
bash展开代码npx @modelcontextprotocol/inspector
mcp-remote:适配器工具,让不支持远程连接的客户端(如 Claude Desktop)可以连接远程服务器
MCP 生态系统正在快速演进,Streamable HTTP 传输的引入标志着协议走向成熟。预计未来将看到:
Model Context Protocol 通过提供多种传输类型,为不同应用场景提供了灵活的选择:
对于新项目,强烈建议:
随着 MCP 生态系统的不断发展,标准化的传输机制将使 AI 应用与外部工具的集成变得更加简单、可靠和高效,为构建下一代智能应用奠定坚实基础。


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