MCP 服务器传输
MCP 支持 Bob 和 MCP 服务器之间通信的传输机制。
概述
MCP 提供三种传输选项,每种都适合不同的部署场景:
- STDIO 传输(本地服务器)
- Streamable HTTP 传输(远程服务器的现代标准)
- SSE 传输(已移除)
每种传输都有不同的特征、优势和用例。
STDIO 传输
STDIO 传输在您的机器上本地运行,并通过标准输入/输出流进行通信。
STDIO 传输的工作原理
- Bob 将 MCP 服务器作为子进程生成
- 通信通过进程流进行:Bob 写入服务器的 STDIN,服务器响应 STDOUT
- 每条消息由换行符分隔
- 消息格式化为 JSON-RPC 2.0
客户端 服务器
| |
|---- JSON 消息 ------>| (通过 STDIN)
| | (处理请求)
|<---- JSON 消息 ------| (通过 STDOUT)
| |STDIO 特征
- 本地性:在与 Bob 相同的机器上运行
- 性能:非常低的延迟和开销(不涉及网络堆栈)
- 简单性:无需网络配置的直接进程通信
- 关系:客户端和服务器之间的一对一关系
- 安全性:由于没有网络暴露,因此本质上更安全
何时使用 STDIO
STDIO 传输非常适合:
- 在同一台机器上运行的本地集成和工具
- 安全敏感操作
- 低延迟要求
- 单客户端场景(每个服务器一个 Bob 实例)
- 命令行工具或 IDE 扩展
STDIO 实现示例
const server = new Server({name: 'local-server', version: '1.0.0'});
// 注册工具...
// 使用 STDIO 传输
const transport = new StdioServerTransport(server);
transport.listen();Streamable HTTP 传输
Streamable HTTP 传输是远程 MCP 服务器通信的现代标准,取代了较旧的 HTTP+SSE 传输。它通过 HTTP/HTTPS 运行,并允许更灵活的服务器实现。
Streamable HTTP 传输的工作原理
- 服务器提供一个支持 POST 和 GET 方法的单个 HTTP 端点(MCP 端点)
- Bob 使用 HTTP POST 向此 MCP 端点发送请求
- 服务器处理请求并发送回响应
- 可选地,服务器可以使用服务器发送事件(SSE)通过同一连接向 Bob 流式传输多条消息或通知
这允许基本的请求-响应交互以及更高级的流式传输和服务器发起的通信。
客户端 服务器
| |
|---- HTTP POST /mcp_endpoint ---->| (客户端请求)
| | (处理请求)
|<--- HTTP 响应 / SSE 流 --| (服务器响应 / 流)
| |Streamable HTTP 特征
- 现代标准:新远程 MCP 服务器实现的首选方法
- 远程访问:可以托管在与 Bob 不同的机器上
- 可扩展性:可以同时处理多个客户端连接
- 协议:通过标准 HTTP/HTTPS 工作
- 灵活性:支持简单的请求-响应和高级流式传输
- 单个端点:对所有 MCP 通信使用单个 URL 路径
- 身份验证:可以使用标准 HTTP 身份验证机制
- 向后兼容性:服务器可以保持与较旧的 HTTP+SSE 客户端的兼容性
何时使用 Streamable HTTP
Streamable HTTP 传输非常适合:
- 所有新的远程 MCP 服务器开发
- 需要强大、可扩展和灵活通信的服务器
- 可能涉及流式数据或服务器发送通知的集成
- 公共服务或集中式工具
- 替换旧版 SSE 传输实现
协议协商
Bob 连接到 Streamable HTTP 服务器时,会使用 protocolNegotiation 选项来确定如何协商协议版本。HTTP 服务器默认为 "auto"。
| 值 | 描述 |
|---|---|
"auto" | Bob 在 initialize 之前发送 server/discover 探测,以协商双方共同支持的最高协议版本。HTTP 服务器的默认值。 |
"legacy" | Bob 跳过探测,直接使用 initialize 握手连接,兼容所有 MCP 服务器。 |
{ "pin": "<version>" } | Bob 使用指定的协议版本连接(例如 { "pin": "2024-11-05" })。 |
如果 HTTP 服务器超时并显示 MCP connection timed out after 10000ms,说明该服务器可能不响应 server/discover 探测。设置 "protocolNegotiation": "legacy" 可跳过探测:
{
"mcpServers": {
"my-server": {
"url": "https://your-server-url.com/mcp",
"protocolNegotiation": "legacy"
}
}
}有关更多详情,请参阅"在 Bob 中使用 MCP"中的协议协商。
Streamable HTTP 实现示例
settings.json 中的配置:
{
"mcpServers": {
"StreamableHTTPMCPName": {
"type": "streamable-http",
"url": "http://localhost:8080/mcp"
}
}
}有关服务器端实现,请参阅 MCP SDK 文档中的 StreamableHTTPClientTransport。
与 HTTP+SSE 的向后兼容性
Bob 的 MCP 客户端不会回退到 HTTP+SSE 传输。以下说明适用于希望其 Streamable HTTP 服务器对尚不支持 Streamable HTTP 的旧版客户端保持可用的_服务器作者_。
需要支持旧版客户端的服务器应继续托管旧传输的 SSE(/events)和 POST(/message)端点,同时提供为 Streamable HTTP 传输定义的新 MCP 端点。
SSE 传输(已移除)
Bob 的 MCP 客户端不再支持独立的 HTTP+SSE 传输(MCP 规范 2024-11-05)。仅使用 HTTP+SSE 传输的服务器无法连接到 Bob。
SSE 作为 Streamable HTTP 连接中的响应通道仍受支持。Bob 可以从 Streamable HTTP 服务器接收 SSE 流。仅独立的 HTTP+SSE 传输(具有独立的 /events 和 /message 端点)已被移除。
从 SSE 传输迁移
如果你有使用 HTTP+SSE 传输的现有服务器,请将其迁移到 Streamable HTTP 传输或 STDIO 传输:
- Streamable HTTP:提供一个接受 HTTP POST 请求的单一 MCP 端点。这是远程服务器的推荐路径。请参阅 Streamable HTTP 传输。
- STDIO:如果服务器在与 Bob 相同的机器上本地运行,请将其转换为 STDIO 服务器。请参阅 STDIO 传输。
部署注意事项
STDIO 和 Streamable HTTP 传输之间的选择直接影响您如何部署和管理 MCP 服务器。
STDIO:本地部署
STDIO 服务器在与 Bob 相同的机器上本地运行:
- 安装:服务器可执行文件必须安装在每个用户的机器上
- 分发:您需要为不同的操作系统提供安装包
- 更新:每个实例必须单独更新
- 资源:使用本地机器的 CPU、内存和磁盘
- 访问控制:依赖于本地机器的文件系统权限
- 集成:与本地系统资源(文件、进程)轻松集成
- 执行:随 Bob 启动和停止(子进程生命周期)
- 依赖项:任何依赖项都必须安装在用户的机器上
示例用例:
使用 STDIO 的本地文件搜索工具将:
- 在用户的机器上运行
- 直接访问本地文件系统
- 在 Bob 需要时启动
- 不需要网络配置
- 需要与 Bob 一起安装或通过包管理器安装
远程:托管部署
远程服务器(Streamable HTTP)可以部署到远程服务器并通过网络访问:
- 安装:在服务器上安装一次,由许多用户访问
- 分发:单个部署为多个客户端提供服务
- 更新:集中更新立即影响所有用户
- 资源:使用服务器资源,而不是本地机器资源
- 访问控制:通过身份验证和授权系统管理
- 集成:与用户特定资源的集成更复杂
- 执行:作为独立服务运行(通常持续运行)
- 依赖项:在服务器上管理,而不是在用户机器上
示例用例:
使用远程传输的数据库查询工具将:
- 在中央服务器上运行
- 使用服务器端凭据连接到数据库
- 持续可供多个用户使用
- 需要适当的网络安全配置
- 使用容器或云技术部署
混合方法
某些场景受益于混合方法:
- 具有网络访问的 STDIO:充当远程服务代理的本地 STDIO 服务器
- 具有本地命令的远程:可以通过回调在客户端机器上触发操作的远程服务器
- 网关模式:用于本地操作的 STDIO 服务器,连接到远程服务器以获取专门功能
传输比较
| 考虑因素 | STDIO | Streamable HTTP |
|---|---|---|
| 位置 | 仅本地机器 | 本地或远程 |
| 客户端 | 单个客户端 | 多个客户端 |
| 性能 | 更低的延迟 | 更高的延迟(网络开销) |
| 设置复杂性 | 更简单 | 更复杂(需要 HTTP 服务器) |
| 安全性 | 本质上安全 | 需要明确的安全措施 |
| 网络访问 | 不需要 | 必需 |
| 可扩展性 | 限于本地机器 | 可以跨网络分布 |
| 部署 | 每用户安装 | 集中安装 |
| 更新 | 分布式更新 | 集中更新 |
| 资源使用 | 使用客户端资源 | 使用服务器资源 |
| 依赖项 | 客户端依赖项 | 服务器端依赖项 |
在 Bob 中配置传输
有关在 Bob 中配置传输的详细信息,包括示例配置,请参阅 Bob 中的 MCP。