MCP 伺服器傳輸
MCP 支援多種傳輸機制,用於 Bob Shell 與 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 執行個體)
- 命令列工具和指令碼
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 端點發送請求
- 伺服器處理請求並發送回應
- 伺服器可以選擇性地透過相同連線使用 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"
}
}
}有關伺服器端實作,請參閱 StreamableHTTPClientTransport 的 MCP SDK 文件。
與 HTTP+SSE 的向後相容性
用戶端和伺服器可以維持與已棄用的 HTTP+SSE 傳輸的向後相容性。
希望支援舊版用戶端的伺服器應繼續同時託管舊傳輸的 SSE(/events)和 POST(/message)端點,以及為 Streamable HTTP 傳輸定義的新 MCP 端點。
SSE 傳輸(舊版)
Server-Sent Events (SSE) 傳輸在遠端伺服器上執行,並透過 HTTP/HTTPS 進行通訊。對於新的遠端伺服器,請改用 Streamable HTTP 傳輸。
SSE 傳輸的運作方式
- Bob 透過 HTTP GET 請求連線到伺服器的 SSE 端點
- 這會建立持久連線,讓伺服器可以向 Bob 推送事件
- 對於用戶端到伺服器的通訊,Bob 向獨立端點發出 HTTP POST 請求
- 通訊透過兩個通道進行:
- 事件串流(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)可以部署到遠端伺服器並透過網路存取:
- 安裝:在伺服器上安裝一次,供多位使用者存取
- 發布:單一部署服務多個用戶端
- 更新:集中更新立即影響所有使用者
- 資源:使用伺服器資源,而非本機機器資源
- 存取控制:透過驗證和授權系統管理
- 整合:與使用者特定資源的整合更為複雜
- 執行:作為獨立服務執行(通常持續運作)
- 相依性:在伺服器上管理,而非在使用者機器上
使用案例範例:
使用遠端傳輸的資料庫查詢工具會:
- 在中央伺服器上執行
- 使用伺服器端憑證連線到資料庫
- 持續供多位使用者使用
- 需要適當的網路安全設定
- 使用容器或雲端技術部署
混合方法
某些情境受益於混合方法:
- 具有網路存取的 STDIO:作為遠端服務代理的本機 STDIO 伺服器
- 具有本機指令的遠端:可以透過回呼在用戶端機器上觸發操作的遠端伺服器
- 閘道模式:用於本機操作的 STDIO 伺服器連線到用於特定功能的遠端伺服器
傳輸比較
| 考量因素 | STDIO | Streamable HTTP / SSE |
|---|---|---|
| 位置 | 僅限本機機器 | 本機或遠端 |
| 用戶端 | 單一用戶端 | 多個用戶端 |
| 效能 | 較低延遲 | 較高延遲(網路開銷) |
| 設定複雜度 | 較簡單 | 較複雜(需要 HTTP 伺服器) |
| 安全性 | 本質上安全 | 需要明確的安全措施 |
| 網路存取 | 不需要 | 必要 |
| 可擴展性 | 限於本機機器 | 可跨網路分散 |
| 部署 | 每位使用者安裝 | 集中安裝 |
| 更新 | 分散更新 | 集中更新 |
| 資源使用 | 使用用戶端資源 | 使用伺服器資源 |
| 相依性 | 用戶端端相依性 | 伺服器端相依性 |
在 Bob Shell 中設定傳輸
有關在 Bob Shell 中設定傳輸的詳細資訊(包括設定範例),請參閱 Bob Shell 中的 MCP。