Channel 是一個 MCP 伺服器,將事件推送到 Claude Code 工作階段,以便 Claude 可以對終端機外發生的事情做出反應。
您可以建立單向或雙向 channel。單向 channel 轉發警報、webhooks 或監控事件供 Claude 處理。雙向 channel(如聊天橋接)也會公開回覆工具,以便 Claude 可以傳送訊息回去。具有受信任寄件者路徑的 channel 也可以選擇加入中繼權限提示,以便您可以遠端批准或拒絕工具使用。
本頁涵蓋:
- 概述:channels 如何運作
- 您需要什麼:要求和一般步驟
- 範例:建立 webhook 接收器:最小單向逐步解說
- 伺服器選項:建構函式欄位
- 通知格式:事件承載
- 公開回覆工具:讓 Claude 傳送訊息回去
- 閘道入站訊息:寄件者檢查以防止提示注入
- 中繼權限提示:將工具批准提示轉發到遠端 channels
概述
Channel 是在與 Claude Code 相同的機器上執行的 MCP 伺服器。Claude Code 將其作為子程序生成並透過 stdio 進行通訊。您的 channel 伺服器是外部系統和 Claude Code 工作階段之間的橋接:- 聊天平台(Telegram、Discord):您的外掛程式在本機執行並輪詢平台的 API 以取得新訊息。當有人傳送 DM 給您的機器人時,外掛程式會接收訊息並將其轉發給 Claude。無需公開 URL。
- Webhooks(CI、監控):您的伺服器在本機 HTTP 連接埠上監聽。外部系統 POST 到該連接埠,您的伺服器將承載推送給 Claude。
您需要什麼
唯一的硬性要求是@modelcontextprotocol/sdk 套件和 Node.js 相容的執行時。Bun、Node 和 Deno 都可以運作。研究預覽中的預先建立外掛程式使用 Bun,但您的 channel 不一定要。
您的伺服器需要:
- 聲明
claude/channel功能,以便 Claude Code 註冊通知監聽器 - 當發生某事時發出
notifications/claude/channel事件 - 透過 stdio transport 連接(Claude Code 將您的伺服器作為子程序生成)
--dangerously-load-development-channels 在本機測試。請參閱在研究預覽期間測試以取得詳細資訊。
範例:建立 webhook 接收器
本逐步解說建立一個單一檔案伺服器,該伺服器監聽 HTTP 要求並將其轉發到您的 Claude Code 工作階段。最後,任何可以傳送 HTTP POST 的東西(如 CI 管道、監控警報或curl 命令)都可以將事件推送給 Claude。
此範例使用 Bun 作為執行時,用於其內建 HTTP 伺服器和 TypeScript 支援。您可以改用 Node 或 Deno;唯一的要求是 MCP SDK。
編寫 channel 伺服器
建立名為 該檔案按順序執行三項操作:
webhook.ts 的檔案。這是您的整個 channel 伺服器:它透過 stdio 連接到 Claude Code,並在連接埠 8788 上監聽 HTTP POST。當要求到達時,它將主體作為 channel 事件推送給 Claude。webhook.ts
- 伺服器配置:使用
claude/channel在其功能中建立 MCP 伺服器,這是告訴 Claude Code 這是 channel 的原因。instructions字串進入 Claude 的系統提示:告訴 Claude 期望什麼事件、是否回覆,以及如果應該回覆,使用哪個工具和傳遞回哪個屬性(如chat_id)。 - Stdio 連接:透過 stdin/stdout 連接到 Claude Code。這對任何 MCP 伺服器 都是標準的:Claude Code 將其作為子程序生成。
- HTTP 監聽器:在連接埠 8788 上啟動本機網頁伺服器。每個 POST 主體都透過
mcp.notification()作為 channel 事件轉發給 Claude。content成為事件主體,每個meta項目成為<channel>標籤上的屬性。監聽器需要存取mcp實例,因此它在同一程序中執行。對於較大的專案,您可以將其分割成單獨的模組。
向 Claude Code 註冊您的伺服器
將伺服器新增到您的 MCP 配置,以便 Claude Code 知道如何啟動它。對於同一目錄中的專案層級 Claude Code 在啟動時讀取您的 MCP 配置並將每個伺服器作為子程序生成。
.mcp.json,使用相對路徑。對於 ~/.claude.json 中的使用者層級配置,使用完整絕對路徑,以便可以從任何專案找到伺服器:.mcp.json
測試它
在研究預覽期間,自訂 channels 不在允許清單上,因此使用開發旗標啟動 Claude Code:當 Claude Code 啟動時,它讀取您的 MCP 配置,將您的 承載作為 在您的 Claude Code 終端機中,您會看到 Claude 接收訊息並開始回應:讀取檔案、執行命令或訊息要求的任何內容。這是一個單向 channel,因此 Claude 在您的工作階段中採取行動,但不會透過 webhook 傳送任何內容回去。若要新增回覆,請參閱公開回覆工具。如果事件未到達,診斷取決於
webhook.ts 作為子程序生成,HTTP 監聽器自動在您配置的連接埠上啟動(此範例中為 8788)。您不需要自己執行伺服器。如果您看到’被組織政策阻止’,您的 Team 或 Enterprise 管理員需要先啟用 channels。在單獨的終端機中,透過傳送帶有訊息的 HTTP POST 來模擬 webhook 到您的伺服器。此範例將 CI 失敗警報傳送到連接埠 8788(或您配置的任何連接埠):<channel> 標籤到達您的 Claude Code 工作階段:curl 返回的內容:curl成功但沒有任何內容到達 Claude:在您的工作階段中執行/mcp以檢查伺服器的狀態。「無法連接」通常表示伺服器檔案中的相依性或匯入錯誤;檢查~/.claude/debug/<session-id>.txt的偵錯日誌以取得 stderr 追蹤。curl失敗,出現「連接被拒絕」:連接埠要麼尚未繫結,要麼來自較早執行的過時程序正在佔用它。lsof -i :<port>顯示正在監聽的內容;在重新啟動工作階段之前kill過時程序。
在研究預覽期間測試
在研究預覽期間,每個 channel 都必須在核准允許清單上才能註冊。開發旗標在確認提示後繞過特定項目的允許清單。此範例顯示兩種項目類型:--channels 結合不會將繞過擴展到 --channels 項目。在研究預覽期間,核准允許清單由 Anthropic 策劃,因此您的 channel 在您建立和測試時保持在開發旗標上。
此旗標僅跳過允許清單。
channelsEnabled 組織政策仍然適用。不要使用它來執行來自不受信任來源的 channels。伺服器選項
Channel 在Server 建構函式中設定這些選項。instructions 和 capabilities.tools 欄位是標準 MCP;capabilities.experimental['claude/channel'] 和 capabilities.experimental['claude/channel/permission'] 是 channel 特定的新增項目:
| 欄位 | 類型 | 描述 |
|---|---|---|
capabilities.experimental['claude/channel'] | object | 必需。始終為 {}。存在會註冊通知監聽器。 |
capabilities.experimental['claude/channel/permission'] | object | 選用。始終為 {}。聲明此 channel 可以接收權限中繼要求。聲明時,Claude Code 會將工具批准提示轉發到您的 channel,以便您可以遠端批准或拒絕它們。請參閱中繼權限提示。 |
capabilities.tools | object | 僅限雙向。始終為 {}。標準 MCP 工具功能。請參閱公開回覆工具。 |
instructions | string | 建議。新增到 Claude 的系統提示。告訴 Claude 期望什麼事件、<channel> 標籤屬性的含義、是否回覆,如果是,使用哪個工具以及傳遞回哪個屬性(如 chat_id)。 |
capabilities.tools。此範例顯示設定了 channel 功能、工具和指示的雙向設定:
notifications/claude/channel 呼叫 mcp.notification()。參數在下一部分中。
通知格式
您的伺服器發出notifications/claude/channel 和兩個參數:
| 欄位 | 類型 | 描述 |
|---|---|---|
content | string | 事件主體。作為 <channel> 標籤的主體傳遞。 |
meta | Record<string, string> | 選用。每個項目成為 <channel> 標籤上的屬性,用於路由上下文,如聊天 ID、寄件者名稱或警報嚴重性。金鑰必須是識別碼:僅限字母、數字和底線。包含連字號或其他字元的金鑰會被無聲地捨棄。 |
Server 實例上呼叫 mcp.notification() 來推送事件。此範例推送帶有兩個中繼金鑰的 CI 失敗警報:
<channel> 標籤中。source 屬性從您的伺服器配置的名稱自動設定:
公開回覆工具
如果您的 channel 是雙向的(如聊天橋接而不是警報轉發器),請公開標準 MCP 工具,Claude 可以呼叫該工具來傳送訊息回去。工具註冊沒有任何 channel 特定的內容。回覆工具有三個元件:- 您的
Server建構函式功能中的tools: {}項目,以便 Claude Code 發現工具 - 定義工具架構並實現傳送邏輯的工具處理程式
- 您的
Server建構函式中的instructions字串,告訴 Claude 何時以及如何呼叫工具
註冊回覆工具
將以下內容新增到
webhook.ts。import 位於檔案頂部,與您的其他匯入一起;兩個處理程式位於 Server 建構函式和 mcp.connect() 之間。這會註冊一個 reply 工具,Claude 可以使用 chat_id 和 text 呼叫:webhook.ts。出站回覆透過 GET /events 使用 Server-Sent Events (SSE) 串流,因此 curl -N localhost:8788/events 可以即時觀看它們;入站聊天到達 POST /:
"Full
閘道入站訊息
未閘道的 channel 是提示注入向量。任何可以到達您的端點的人都可以在 Claude 前面放置文字。監聽聊天平台或公開端點的 channel 在發出任何內容之前需要真正的寄件者檢查。 在呼叫mcp.notification() 之前,根據允許清單檢查寄件者。此範例捨棄來自不在集合中的寄件者的任何訊息:
message.from.id,而不是 message.chat.id。在群組聊天中,這些不同,根據房間進行閘道會讓允許清單群組中的任何人將訊息注入到工作階段中。
Telegram 和 Discord channels 以相同方式根據寄件者允許清單進行閘道。它們透過配對啟動清單:使用者傳送 DM 給機器人,機器人回覆配對代碼,使用者在其 Claude Code 工作階段中批准它,其平台 ID 被新增。請參閱任一實現以取得完整配對流程。iMessage channel 採用不同的方法:它在啟動時從 Messages 資料庫偵測使用者自己的位址並自動讓它們通過,其他寄件者按控制代碼新增。
中繼權限提示
權限中繼需要 Claude Code v2.1.81 或更新版本。較早版本會忽略
claude/channel/permission 功能。中繼如何運作
當權限提示開啟時,中繼迴圈有四個步驟:- Claude Code 生成短要求 ID 並通知您的伺服器
- 您的伺服器將提示和 ID 轉發到您的聊天應用
- 遠端使用者回覆是或否以及該 ID
- 您的入站處理程式將回覆解析為判決,Claude Code 僅在 ID 符合開啟要求時應用它
權限要求欄位
來自 Claude Code 的出站通知是notifications/claude/channel/permission_request。像頻道通知一樣,傳輸是標準 MCP,但方法和架構是 Claude Code 擴展。params 物件有四個字串欄位,您的伺服器將其格式化為出站提示:
| 欄位 | 描述 |
|---|---|
request_id | 五個小寫字母,從 a-z 中抽取,不包括 l,因此在手機上輸入時永遠不會讀作 1 或 I。將其包含在您的出站提示中,以便可以在回覆中回顯。Claude Code 僅接受帶有其發出的 ID 的判決。本機終端機對話框不顯示此 ID,因此您的出站處理程式是了解它的唯一方式。 |
tool_name | Claude 想要使用的工具的名稱,例如 Bash 或 Write。 |
description | 此特定工具呼叫執行的操作的人類可讀摘要,與本機終端機對話框顯示的文字相同。對於 Bash 呼叫,這是 Claude 對命令的描述,或如果未給出,則是命令本身。 |
input_preview | 工具的引數作為 JSON 字串,截斷為 200 個字元。對於 Bash,這是命令;對於 Write,它是檔案路徑和內容的前綴。如果您只有一行訊息的空間,請從您的提示中省略它。您的伺服器決定要顯示什麼。 |
notifications/claude/channel/permission,有兩個欄位:request_id 回顯上面的 ID,behavior 設定為 'allow' 或 'deny'。允許讓工具呼叫繼續;拒絕會拒絕它,與在本機對話框中回答’否’相同。兩個判決都不影響未來的呼叫。
將中繼新增到聊天橋接
將權限中繼新增到雙向 channel 需要三個元件:- 您的
Server建構函式中experimental功能下的claude/channel/permission: {}項目,以便 Claude Code 知道轉發提示 notifications/claude/channel/permission_request的通知處理程式,格式化提示並透過您的平台 API 傳送出去- 您的入站訊息處理程式中的檢查,識別
yes <id>或no <id>並發出notifications/claude/channel/permission判決通知,而不是將文字轉發給 Claude
處理傳入要求
在您的
Server 建構函式和 mcp.connect() 之間註冊通知處理程式。當權限對話框開啟時,Claude Code 使用四個要求欄位呼叫它。您的處理程式為您的平台格式化提示,並包含使用 ID 回覆的指示:在您的入站處理程式中攔截判決
您的入站處理程式是接收來自您的平台的訊息的迴圈或回呼:與您根據寄件者進行閘道和發出
notifications/claude/channel 以將聊天轉發給 Claude 的地方相同。在聊天轉發呼叫之前新增檢查,識別判決格式並改為發出權限通知。正規表達式符合 Claude Code 生成的 ID 格式:五個字母,永遠不是 l。/i 旗標容許手機自動更正將回覆大寫;在傳送回之前將擷取的 ID 小寫。- 不同格式:您的入站處理程式的正規表達式無法符合,因此
approve it或yes之類的文字(沒有 ID)會作為正常訊息落入 Claude。 - 正確格式,錯誤 ID:您的伺服器發出判決,但 Claude Code 找不到具有該 ID 的開啟要求並無聲地捨棄它。
完整範例
下面組裝的webhook.ts 結合了本頁的所有三個擴展:回覆工具、寄件者閘道和權限中繼。如果您從這裡開始,您還需要初始逐步解說中的專案設定和 .mcp.json 項目。
為了使兩個方向都可以從 curl 測試,HTTP 監聽器提供兩個路徑:
GET /events:保持 SSE 串流開啟並將每個出站訊息推送為data:行,因此curl -N可以即時觀看 Claude 的回覆和權限提示到達。POST /:入站側,與之前相同的處理程式,現在在聊天轉發分支之前插入了判決格式檢查。
"Full
webhook.ts:
/events 串流中,包括五字母 ID。從遠端側批准它:
reply 工具回來並也落入串流中。
此檔案中的三個 channel 特定部分:
Server建構函式中的功能:claude/channel註冊通知監聽器,claude/channel/permission選擇加入權限中繼,tools讓 Claude 發現回覆工具。- 出站路徑:
reply工具處理程式是 Claude 為對話回應呼叫的;PermissionRequestSchema通知處理程式是 Claude Code 在權限對話框開啟時呼叫的。兩者都呼叫send()透過/events廣播,但它們由系統的不同部分觸發。 - HTTP 處理程式:
GET /events保持 SSE 串流開啟,以便 curl 可以即時觀看出站;POST是入站,根據X-Sender標頭進行閘道。yes <id>或no <id>主體作為判決通知進入 Claude Code,永遠不會到達 Claude;其他任何內容都作為 channel 事件轉發給 Claude。
打包為外掛程式
若要使您的 channel 可安裝和可共享,請將其包裝在外掛程式中並將其發佈到市場。使用者使用/plugin install 安裝它,然後使用 --channels plugin:<name>@<marketplace> 按工作階段啟用它。
發佈到您自己的市場的 channel 仍然需要 --dangerously-load-development-channels 才能執行,因為它不在核准允許清單上。若要將其新增,請將其提交到官方市場。Channel 外掛程式在被批准之前會進行安全審查。在 Team 和 Enterprise 計劃上,管理員可以改為將您的外掛程式包含在組織自己的 allowedChannelPlugins 清單中,該清單取代預設 Anthropic 允許清單。
另請參閱
- Channels 安裝並使用 Telegram、Discord、iMessage 或 fakechat 演示,以及為 Team 或 Enterprise 組織啟用 channels
- 工作 channel 實現以取得具有配對流程、回覆工具和檔案附件的完整伺服器程式碼
- MCP 用於 channel 伺服器實現的基礎協議
- 外掛程式 打包您的 channel,以便使用者可以使用
/plugin install安裝它