MCP 服务器传输方式

MCP 支持多种传输机制,用于 Bob Shell 与 MCP 服务器之间的通信。

概述

MCP 提供三种传输选项,分别适用于不同的部署场景:

  • STDIO 传输(本地服务器)
  • Streamable HTTP 传输(远程服务器的现代标准)
  • [SSE 传输](#sse-传输(旧版))(旧版远程选项)

每种传输方式都有各自的特性、优势和使用场景。

STDIO 传输

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

STDIO 传输的工作原理

  1. Bob 以子进程形式启动 MCP 服务器
  2. 通信通过进程流进行:Bob 向服务器的 STDIN 写入数据,服务器通过 STDOUT 响应
  3. 每条消息以换行符分隔
  4. 消息格式为 JSON-RPC 2.0
客户端                    服务器
  |                         |
  |---- JSON 消息 -------->| (通过 STDIN)
  |                         | (处理请求)
  |<---- JSON 消息 ---------| (通过 STDOUT)
  |                         |

STDIO 传输特性

  • 本地性:与 Bob 运行在同一台机器上
  • 性能:延迟极低,开销极小(无网络栈)
  • 简单性:直接进程通信,无需网络配置
  • 关系:客户端与服务器一对一关系
  • 安全性:无网络暴露,本质上更安全

何时使用 STDIO

STDIO 传输适合以下场景:

  • 在同一台机器上运行的本地集成和工具
  • 安全敏感操作
  • 低延迟需求
  • 单客户端场景(每个服务器对应一个 Bob 实例)
  • 命令行工具和脚本

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 传输的工作原理

  1. 服务器提供单一 HTTP 端点(MCP 端点),同时支持 POST 和 GET 方法
  2. Bob 使用 HTTP POST 向该 MCP 端点发送请求
  3. 服务器处理请求并返回响应
  4. 可选地,服务器可以通过同一连接使用 Server-Sent Events(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 传输实现

Streamable HTTP 实现示例

~/.bob/mcp_settings.json(全局)或 .bob/mcp.json(项目)中进行配置:

{
  "mcpServers": {
    "StreamableHTTPMCPName": {
      "httpURL": "http://localhost:8080/mcp"
    }
  }
}

有关服务器端实现,请参阅 MCP SDK 文档中的 StreamableHTTPClientTransport

与 HTTP+SSE 的向后兼容性

客户端和服务器可以与已废弃的 HTTP+SSE 传输保持向后兼容性。

希望支持旧版客户端的服务器应继续托管旧版传输的 SSE(/events)和 POST(/message)端点,同时提供为 Streamable HTTP 传输定义的新 MCP 端点。

SSE 传输(旧版)

Server-Sent Events(SSE)传输在远程服务器上运行,通过 HTTP/HTTPS 进行通信。对于新的远程服务器,请改用 Streamable HTTP 传输。

SSE 传输的工作原理

  1. Bob 通过 HTTP GET 请求连接到服务器的 SSE 端点
  2. 这建立了一个持久连接,服务器可以向 Bob 推送事件
  3. 对于客户端到服务器的通信,Bob 向单独的端点发送 HTTP POST 请求
  4. 通信通过两个通道进行:
    • 事件流(GET):服务器到客户端的更新
    • 消息端点(POST):客户端到服务器的请求
客户端                             服务器
  |                                  |
  |---- HTTP GET /events ----------->| (建立 SSE 连接)
  |<---- SSE 事件流 -----------------| (持久连接)
  |                                  |
  |---- HTTP POST /message --------->| (客户端请求)
  |<---- 带响应的 SSE 事件 ----------| (服务器响应)
  |                                  |

SSE 传输特性

  • 远程访问:可托管在与 Bob 不同的机器上
  • 可扩展性:可并发处理多个客户端连接
  • 协议:基于标准 HTTP 运行(无需特殊协议)
  • 持久性:维持持久连接以接收服务器到客户端的消息
  • 认证:可使用标准 HTTP 认证机制

何时使用 SSE

SSE 传输适合以下场景:

  • 跨网络远程访问
  • 多客户端场景
  • 公共服务
  • 多用户需要访问的集中式工具
  • 与 Web 服务集成

SSE 实现示例

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 server listening on port 3000');
});

部署注意事项

STDIO 与远程传输(Streamable HTTP 或 SSE)之间的选择会直接影响 MCP 服务器的部署和管理方式。

STDIO:本地部署

STDIO 服务器在与 Bob 相同的本地机器上运行:

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

使用场景示例:

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

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

远程:托管部署

远程服务器(Streamable HTTP 或 SSE)可以部署到远程服务器并通过网络访问:

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

使用场景示例:

使用远程传输的数据库查询工具:

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

混合方式

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

  1. 具有网络访问能力的 STDIO:充当远程服务代理的本地 STDIO 服务器
  2. 具有本地命令的远程:通过回调在客户端机器上触发操作的远程服务器
  3. 网关模式:用于本地操作的 STDIO 服务器,连接到提供专项功能的远程服务器

传输方式对比

考量因素STDIOStreamable HTTP / SSE
位置仅限本地机器本地或远程
客户端单客户端多客户端
性能延迟更低延迟更高(网络开销)
配置复杂度更简单更复杂(需要 HTTP 服务器)
安全性本质上安全需要明确的安全措施
网络访问不需要必需
可扩展性限于本地机器可跨网络分布
部署按用户安装集中安装
更新分布式更新集中式更新
资源使用使用客户端资源使用服务器资源
依赖客户端侧依赖服务器侧依赖

在 Bob Shell 中配置传输方式

有关在 Bob Shell 中配置传输方式的详细信息(包括配置示例),请参阅 Bob Shell 中的 MCP

这个主题怎么样?