Lzh on GitHub

MCP 服务器传输方式:STDIO、可流式 HTTP 和 SSE

Roo Code 的模型上下文协议 (MCP) 支持三种主要的传输机制,用于 Roo Code 和 MCP 服务器之间的通信:标准输入/输出 (STDIO)、可流式 HTTP(现代标准)和服务器发送事件 (SSE)(用于传统用途)。每种机制都有其独特的特点、优点和用例。

Roo Code 的模型上下文协议 (MCP) 支持三种主要的传输机制,用于 Roo Code 和 MCP 服务器之间的通信:标准输入/输出 (STDIO)可流式 HTTP(现代标准)和服务器发送事件 (SSE)(用于传统用途)。每种机制都有其独特的特点、优点和用例。

STDIO 传输

STDIO 传输在你的本地机器上运行,并通过标准输入/输出流进行通信。

STDIO 传输的工作原理

  1. 客户端 (Roo Code) 启动一个 MCP 服务器作为子进程。
  2. 通信通过进程流进行:客户端写入服务器的 STDIN,服务器响应到 STDOUT。
  3. 每条消息都由换行符分隔。
  4. 消息格式为 JSON-RPC 2.0。
Client                    Server
  |                         |
  |---- JSON message ------>| (via STDIN)
  |                         | (processes request)
  |<---- JSON message ------| (via STDOUT)
  |                         |

STDIO 特点

  • 本地性: 在与 Roo Code 相同的机器上运行。
  • 性能: 延迟和开销非常低(不涉及网络栈)。
  • 简单性: 直接的进程通信,无需网络配置。
  • 关系: 客户端和服务器之间的一对一关系。
  • 安全性: 由于没有网络暴露,因此天生更安全。

何时使用 STDIO

STDIO 传输非常适合:

  • 在同一台机器上运行的本地集成和工具。
  • 对安全性敏感的操作。
  • 对低延迟有要求的场景。
  • 单客户端场景(每个服务器一个 Roo Code 实例)。
  • 命令行工具或 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'});
// Register tools...

// Use STDIO transport
const transport = new StdioServerTransport(server);
transport.listen();

可流式 HTTP 传输

可流式 HTTP 传输是用于远程 MCP 服务器通信的现代标准,取代了旧的 HTTP+SSE 传输。它通过 HTTP/HTTPS 运行,并允许更灵活的服务器实现。

可流式 HTTP 传输的工作原理

  1. 服务器提供一个支持 POST 和 GET 方法的单个 HTTP 端点(MCP 端点)。
  2. 客户端 (Roo Code) 使用 HTTP POST 向此 MCP 端点发送请求。
  3. 服务器处理请求并发送回响应。
  4. 可选地,服务器可以通过同一连接使用服务器发送事件 (SSE) 向客户端流式传输多条消息或通知。这允许基本的请求-响应交互以及更高级的流式传输和服务器发起的通信。
Client                             Server
  |                                  |
  |---- HTTP POST /mcp_endpoint ---->| (client request)
  |                                  | (processes request)
  |<--- HTTP Response / SSE Stream --| (server response / stream)
  |                                  |

可流式 HTTP 特点

  • 现代标准: 新的远程 MCP 服务器实现的首选方法。
  • 远程访问: 可以在与 Roo Code 不同的机器上托管。
  • 可扩展性: 可以同时处理多个客户端连接。
  • 协议: 通过标准 HTTP/HTTPS 工作。
  • 灵活性: 支持简单的请求-响应和高级流式传输。
  • 单个端点: 使用单个 URL 路径进行所有 MCP 通信。
  • 身份验证: 可以使用标准的 HTTP 身份验证机制。
  • 向后兼容性: 服务器可以保持与旧的 HTTP+SSE 客户端的兼容性。

何时使用可流式 HTTP

可流式 HTTP 传输非常适合:

  • 所有新的远程 MCP 服务器开发。
  • 需要健壮、可扩展和灵活通信的服务器。
  • 可能涉及流式数据或服务器发送通知的集成。
  • 公共服务或集中式工具。
  • 替换传统的 SSE 传输实现。

可流式 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) 端点,以及为可流式 HTTP 传输定义的新“MCP 端点”。

SSE 传输(传统)

服务器发送事件 (SSE) 传输是用于远程服务器通过 HTTP/HTTPS 进行通信的一种传统方法。对于新的实现,推荐使用可流式 HTTP 传输。SSE 仍可用于与旧的 MCP 服务器兼容。

SSE 传输的工作原理

  1. 客户端 (Roo Code) 通过 HTTP GET 请求连接到服务器的 SSE 端点。
  2. 这建立了一个持久连接,服务器可以通过该连接向客户端推送事件。
  3. 对于客户端到服务器的通信,客户端向一个单独的端点发出 HTTP POST 请求。
  4. 通信通过两个通道进行:
  • 事件流 (GET): 服务器到客户端的更新。
  • 消息端点 (POST): 客户端到服务器的请求。
Client                             Server
  |                                  |
  |---- HTTP GET /events ----------->| (establish SSE connection)
  |<---- SSE event stream -----------| (persistent connection)
  |                                  |
  |---- HTTP POST /message --------->| (client request)
  |<---- SSE event with response ----| (server response)
  |                                  |

SSE 特点

  • 远程访问: 可以在与 Roo Code 不同的机器上托管。
  • 可扩展性: 可以同时处理多个客户端连接。
  • 协议: 通过标准 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'});
// Register tools...

// Use SSE transport
const transport = new SSEServerTransport(server);
app.use('/mcp', transport.requestHandler());
app.listen(3000, () => {
  console.log('MCP server listening on port 3000');
});

本地与托管:部署方面

STDIO 和 SSE 传输之间的选择直接影响你如何部署和管理你的 MCP 服务器。

STDIO:本地部署模型

STDIO 服务器在与 Roo Code 相同的机器上本地运行,这有几个重要影响:

  • 安装: 服务器可执行文件必须安装在每个用户的机器上。
  • 分发: 你需要为不同的操作系统提供安装包。
  • 更新: 每个实例必须单独更新。
  • 资源: 使用本地机器的 CPU、内存和磁盘。
  • 访问控制: 依赖于本地机器的文件系统权限。
  • 集成: 易于与本地系统资源(文件、进程)集成。
  • 执行: 随 Roo Code 启动和停止(子进程生命周期)。
  • 依赖项: 任何依赖项都必须安装在用户的机器上。

实际示例

一个使用 STDIO 的本地文件搜索工具将:

  • 在用户的机器上运行。
  • 直接访问本地文件系统。
  • 在 Roo Code 需要时启动。
  • 不需要网络配置。
  • 需要与 Roo Code 或通过包管理器一起安装。

可流式 HTTP / SSE (传统):托管部署模型

可流式 HTTP(推荐)和传统的 SSE 服务器可以部署到远程服务器并通过网络访问:

  • 安装: 在一个服务器上安装一次,由许多用户访问。
  • 分发: 单一部署服务于多个客户端。
  • 更新: 集中式更新会立即影响所有用户。
  • 资源: 使用服务器资源,而不是本地机器资源。
  • 访问控制: 通过身份验证和授权系统进行管理。
  • 集成: 与用户特定资源的集成更复杂。
  • 执行: 作为独立服务运行(通常是持续的)。
  • 依赖项: 在服务器上管理,而不是在用户机器上。

实际示例

一个使用 SSE 的数据库查询工具将:

  • 在中央服务器上运行。
  • 使用服务器端凭据连接到数据库。
  • 为多个用户持续可用。
  • 需要适当的网络安全配置。
  • 使用容器或云技术进行部署。

混合方法

某些场景受益于混合方法:

  1. 带网络访问的 STDIO: 一个本地 STDIO 服务器,充当远程服务的代理。
  2. 带本地命令的 SSE: 一个远程 SSE 服务器,可以通过回调在客户端机器上触发操作。
  3. 网关模式: STDIO 服务器用于本地操作,连接到 SSE 服务器以获取专业功能。

在传输之间进行选择

考虑事项STDIO可流式 HTTPSSE(传统)
位置仅限本地机器本地或远程本地或远程
客户端单个客户端多个客户端多个客户端
性能延迟更低延迟更高(网络开销)延迟更高(网络开销)
设置复杂性更简单更复杂(需要 HTTP 服务器)更复杂(需要 HTTP 服务器,可能需要两个端点)
安全性天生安全需要明确的安全措施需要明确的安全措施
网络访问不需要需要需要
可扩展性局限于本地机器可跨网络分发可跨网络分发
部署按用户安装集中式安装集中式安装
更新分布式更新集中式更新集中式更新
资源使用使用客户端资源使用服务器资源使用服务器资源
推荐适用于本地、安全、单客户端工具所有新远程服务器的现代标准传统,用于现有的旧服务器

在 Roo Code 中配置传输

有关在 Roo Code 中配置 STDIO、可流式 HTTP 和 SSE(传统)传输的详细信息,包括配置示例,请参阅在 Roo Code 中使用 MCP 指南中的 了解传输类型 部分。