MCP服务器传输:STDIO、Streamable HTTP和SSE
模型上下文协议(MCP)支持三种主要的传输机制用于itBuilder和MCP服务器之间的通信:标准输入/输出(STDIO)、Streamable HTTP(现代标准)和服务器发送事件(SSE)(用于传统用途)。每种都有独特的特征、优势和使用场景。
STDIO传输
STDIO传输在您的机器上本地运行,通过标准输入/输出流进行通信。
STDIO传输的工作原理
- 客户端(itBuilder)将MCP服务器作为子进程启动
- 通信通过进程流进行:客户端写入服务器的STDIN,服务器响应到STDOUT
- 每条消息由换行符分隔
- 消息格式为JSON-RPC 2.0
客户端 服务器
| |
|---- JSON消息 ---------->| (通过STDIN)
| | (处理请求)
|<---- JSON消息 ----------| (通过STDOUT)
| |
STDIO特征
- 本地性:在与itBuilder相同的机器上运行
- 性能:非常低的延迟和开销(不涉及网络栈)
- 简单性:直接进程通信,无需网络配置
- 关系:客户端和服务器之间的一对一关系
- 安全性:本质上更安全,因为不暴露网络
何时使用STDIO
STDIO传输适用于:
- 本地集成和在同一机器上运行的工具
- 安全敏感的操作
- 低延迟要求
- 单客户端场景(每个服务器一个itBuilder实例)
- 命令行工具或IDE扩展
STDIO实现示例
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const server = new Server({name: 'local-server', version: '1.0.0'});
// 注册工具...
// 使用STDIO传输
const transport = new StdioServerTransport(server);
transport.listen();
Streamable HTTP传输
Streamable HTTP传输是现代标准,用于通过HTTP/HTTPS访问远程MCP服务器,为新的实现提供更多灵活性并替代旧的HTTP+SSE传输。
Streamable HTTP传输的工作原理
- 服务器提供支持POST和GET方法的单个HTTP端点(MCP端点)
- 客户端(itBuilder)使用HTTP POST向此MCP端点发送请求
- 服务器处理请求并发送回响应
- 可选地,服务器可以在同一连接上使用服务器发送事件(SSE)向客户端流式传输多条消息或通知。这允许基本的请求-响应交互以及更高级的流式传输和服务器发起的通信。
客户端 服务器
| |
|---- HTTP POST /mcp_endpoint ---->| (客户端请求)
| | (处理请求)
|<--- HTTP响应 / SSE流 ------------| (服务器响应/流)
| |
Streamable HTTP特征
- 现代标准:新远程MCP服务器实现的首选方法
- 远程访问:可以托管在与itBuilder不同的机器上
- 可扩展性:可以并发处理多个客户端连接
- 协议:通过标准HTTP/HTTPS工作
- 灵活性:支持简单请求-响应和高级流式传输
- 单一端点:使用单个URL路径进行所有MCP通信
- 身份验证:可以使用标准HTTP身份验证机制
- 向后兼容性:服务器可以保持与旧HTTP+SSE客户端的兼容性
何时使用Streamable HTTP
Streamable HTTP传输适用于:
- 所有新的远程MCP服务器开发
- 需要健壮、可扩展和灵活通信的服务器
- 可能涉及流式数据或服务器发送通知的集成
- 公共服务或集中化工具
- 替代传统SSE传输实现
Streamable HTTP实现示例
在settings.json
中的配置:
"mcp.servers": {
"StreamableHTTPMCPName": {
"type": "streamable-http",
"url": "http://localhost:8080/mcp"
}
}
对于服务器端实现,请参考MCP SDK文档中的StreamableHTTPClientTransport
。
与HTTP+SSE的向后兼容性
客户端和服务器可以保持与已弃用的HTTP+SSE传输(来自协议版本2024-11-05)的向后兼容性。
想要支持旧客户端的服务器应该:
- 继续托管旧传输的SSE(
/events
)和POST(/message
)端点,以及为Streamable HTTP传输定义的新"MCP端点"。
SSE传输(传统)
服务器发送事件(SSE)传输是通过HTTP/HTTPS进行远程服务器通信的传统方法。对于新实现,推荐使用Streamable HTTP传输。SSE仍然可用于与旧MCP服务器的兼容性。
SSE传输的工作原理
- 客户端(itBuilder)通过HTTP GET请求连接到服务器的SSE端点
- 这建立了一个持久连接,服务器可以向客户端推送事件
- 对于客户端到服务器的通信,客户端向单独的端点发送HTTP POST请求
- 通信通过两个通道进行:
- 事件流(GET):服务器到客户端更新
- 消息端点(POST):客户端到服务器请求
客户端 服务器
| |
|---- HTTP GET /events ----------->| (建立SSE连接)
|<---- SSE事件流 ------------------| (持久连接)
| |
|---- HTTP POST /message --------->| (客户端请求)
|<---- 带响应的SSE事件 ------------| (服务器响应)
| |
SSE特征
- 远程访问:可以托管在与itBuilder不同的机器上
- 可扩展性:可以并发处理多个客户端连接
- 协议:通过标准HTTP工作(不需要特殊协议)
- 持久性:维护服务器到客户端消息的持久连接
- 身份验证:可以使用标准HTTP身份验证机制
何时使用SSE
SSE传输更适合:
- 跨网络的远程访问
- 多客户端场景
- 公共服务
- 许多用户需要访问的集中化工具
- 与Web服务的集成
SSE实现示例
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
import express from 'express';
const app = express();
const server = new Server({name: 'remote-server', version: '1.0.0'});
// 注册工具...
// 使用SSE传输
const transport = new SSEServerTransport(server);
app.use('/mcp', transport.requestHandler());
app.listen(3000, () => {
console.log('MCP服务器监听端口3000');
});
本地vs托管:部署方面
STDIO和SSE传输之间的选择直接影响您部署和管理MCP服务器的方式。
STDIO:本地部署模型
STDIO服务器在与itBuilder相同的机器上本地运行,这有几个重要影响:
- 安装:服务器可执行文件必须安装在每个用户的机器上
- 分发:您需要为不同操作系统提供安装包
- 更新:每个实例必须单独更新
- 资源:使用本地机器的CPU、内存和磁盘
- 访问控制:依赖本地机器的文件系统权限
- 集成:与本地系统资源(文件、进程)的简单集成
- 执行:随itBuilder启动和停止(子进程生命周期)
- 依赖项:任何依赖项必须安装在用户的机器上
实际示例
使用STDIO的本地文件搜索工具将:
- 在用户的机器上运行
- 直接访问本地文件系统
- 在itBuilder需要时启动
- 不需要网络配置
- 需要与itBuilder一起安装或通过包管理器安装
Streamable HTTP / SSE(传统):托管部署模型
Streamable HTTP(推荐)和传统SSE服务器可以部署到远程服务器并通过网络访问:
- 安装:在服务器上安装一次,由多个用户访问
- 分发:单一部署为多个客户端服务
- 更新:集中更新立即影响所有用户
- 资源:使用服务器资源,而不是本地机器资源
- 访问控制:通过身份验证和授权系统管理
- 集成:与用户特定资源的更复杂集成
- 执行:作为独立服务运行(通常持续运行)
- 依赖项:在服务器上管理,而不是在用户机器上
实际示例
使用SSE的数据库查询工具将:
- 在中央服务器上运行
- 使用服务器端凭据连接到数据库
- 为多个用户持续可用
- 需要适当的网络安全配置
- 使用容器或云技术部署
混合方法
某些场景受益于混合方法:
- 带网络访问的STDIO:作为远程服务代理的本地STDIO服务器
- 带本地命令的SSE:可以通过回调在客户端机器上触发操作的远程SSE服务器
- 网关模式:用于本地操作的STDIO服务器连接到用于专门功能的SSE服务器
传输方式选择
考虑因素 | STDIO | Streamable HTTP | SSE(传统) |
---|---|---|---|
位置 | 仅本地机器 | 本地或远程 | 本地或远程 |
客户端 | 单客户端 | 多客户端 | 多客户端 |
性能 | 较低延迟 | 较高延迟(网络开销) | 较高延迟(网络开销) |
设置复杂性 | 更简单 | 更复杂(需要HTTP服务器) | 更复杂(需要HTTP服务器,可能两个端点) |
安全性 | 本质上安全 | 需要明确的安全措施 | 需要明确的安全措施 |
网络访问 | 不需要 | 必需 | 必需 |
可扩展性 | 限于本地机器 | 可以分布在网络上 | 可以分布在网络上 |
部署 | 每用户安装 | 集中安装 | 集中安装 |
更新 | 分布式更新 | 集中更新 | 集中更新 |
资源使用 | 使用客户端资源 | 使用服务器资源 | 使用服务器资源 |
依赖项 | 客户端依赖项 | 服务器端依赖项 | 服务器端依赖项 |
推荐 | 适用于本地、安全、单客户端工具 | 所有新远程服务器的现代标准 | 传统,适用于现有旧服务器 |
在itBuilder中配置传输
有关在itBuilder中配置STDIO、Streamable HTTP和SSE(传统)传输的详细信息,包括示例配置,请参阅itBuilder使用指南中的理解传输类型部分。