配置MCP

MCP 伺服器傳輸

MCP 支援 Bob 和 MCP 伺服器之間通訊的傳輸機制。

概述

MCP 提供三種傳輸選項,每種都適合不同的部署場景:

每種傳輸都有不同的特性、優勢和使用案例。

STDIO 傳輸

STDIO 傳輸在您的機器上本地執行,並透過標準輸入/輸出串流進行通訊。

STDIO 傳輸如何運作

  1. Bob 將 MCP 伺服器作為子程序生成
  2. 通訊透過程序串流進行:Bob 寫入伺服器的 STDIN,伺服器回應到 STDOUT
  3. 每個訊息由換行字元分隔
  4. 訊息格式為 JSON-RPC 2.0
Client                    Server
  |                         |
  |---- JSON message ------>| (via STDIN)
  |                         | (processes request)
  |<---- JSON message ------| (via STDOUT)
  |                         |

STDIO 特性

  • 本地性:在與 Bob 相同的機器上執行
  • 效能:非常低的延遲和開銷(不涉及網路堆疊)
  • 簡單性:直接程序通訊,無需網路配置
  • 關係:客戶端和伺服器之間的一對一關係
  • 安全性:本質上更安全,無網路暴露

何時使用 STDIO

STDIO 傳輸非常適合:

  • 在同一機器上執行的本地整合和工具
  • 安全敏感操作
  • 低延遲需求
  • 單客戶端場景(每個伺服器一個 Bob 實例)
  • 命令列工具或 IDE 擴充功能

STDIO 實作範例


const server = new Server({name: 'local-server', version: '1.0.0'});
// Register tools...

// Use STDIO transport
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. 可選地,伺服器可以透過相同連接使用伺服器發送事件(SSE)向 Bob 串流多個訊息或通知

這允許基本的請求-回應互動以及更進階的串流和伺服器發起的通訊。

Client                             Server
  |                                  |
  |---- HTTP POST /mcp_endpoint ---->| (client request)
  |                                  | (processes request)
  |<--- HTTP Response / SSE Stream --| (server response / stream)
  |                                  |

Streamable HTTP 特性

  • 現代標準:新遠端 MCP 伺服器實作的首選方法
  • 遠端存取:可以託管在與 Bob 不同的機器上
  • 可擴展性:可以同時處理多個客戶端連接
  • 協定:透過標準 HTTP/HTTPS 運作
  • 靈活性:支援簡單的請求-回應和進階串流
  • 單一端點:對所有 MCP 通訊使用單一 URL 路徑
  • 驗證:可以使用標準 HTTP 驗證機制
  • 向後相容性:伺服器可以維持與較舊 HTTP+SSE 客戶端的相容性

何時使用 Streamable HTTP

Streamable HTTP 傳輸非常適合:

  • 所有新的遠端 MCP 伺服器開發
  • 需要強大、可擴展和靈活通訊的伺服器
  • 可能涉及串流資料或伺服器發送通知的整合
  • 公共服務或集中式工具
  • 取代舊版 SSE 傳輸實作

Streamable HTTP 實作範例

settings.json 中的配置:

{
  "mcpServers": {
    "StreamableHTTPMCPName": {
      "type": "streamable-http",
      "url": "http://localhost:8080/mcp"
    }
  }
}

對於伺服器端實作,請參閱 MCP SDK 文件中的 StreamableHTTPClientTransport

與 HTTP+SSE 的向後相容性

客戶端和伺服器可以維持與已棄用的 HTTP+SSE 傳輸的向後相容性。

想要支援較舊客戶端的伺服器應繼續託管舊傳輸的 SSE(/events)和 POST(/message)端點,以及為 Streamable HTTP 傳輸定義的新 MCP 端點。

SSE 傳輸(舊版)

伺服器發送事件(SSE)傳輸在遠端伺服器上執行,並透過 HTTP/HTTPS 進行通訊。對於新的遠端伺服器,請改用 Streamable HTTP 傳輸。

SSE 傳輸如何運作

  1. Bob 透過 HTTP GET 請求連接到伺服器的 SSE 端點
  2. 這建立了一個持久連接,伺服器可以向 Bob 推送事件
  3. 對於客戶端到伺服器的通訊,Bob 向單獨的端點發出 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 特性

  • 遠端存取:可以託管在與 Bob 不同的機器上
  • 可擴展性:可以同時處理多個客戶端連接
  • 協定:透過標準 HTTP 運作(不需要特殊協定)
  • 持久性:維持伺服器到客戶端訊息的持久連接
  • 驗證:可以使用標準 HTTP 驗證機制

何時使用 SSE

SSE 傳輸適合:

  • 跨網路的遠端存取
  • 多客戶端場景
  • 公共服務
  • 許多使用者需要存取的集中式工具
  • 與網頁服務的整合

SSE 實作範例

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 和遠端傳輸(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 中配置傳輸

如需在 Bob 中配置傳輸的詳細資訊,包括範例配置,請參閱 Bob 中的 MCP

這個主題如何?