Claude Code Channels 挑戰 OpenClaw 龍蝦

▋ Claude Code 新功能:Channels 實測與 OpenClaw 差異分析

Claude Code 剛發布了全新的 Channels 功能,簡單來說就是透過 MCP 協定將事件傳出,讓你直接用 Telegram 或 Discord 來控管 Claude Code。這聽起來跟 OpenClaw 非常相似,但我實測後發現兩者還是有一些細微的架構差異。

首先,如果你原本已經有一套龍蝦的配置,目前是無法直接無痛移轉到 Claude Code 的,畢竟底層架構不同。另外,Claude Code 的 Channels 目前缺乏 Heartbeat 機制,這意味著如果 Claude Code 當下沒有在執行任務,它就不會回應你的訊息。這點在遠端喚醒的體驗上,跟 OpenClaw 還是有落差。

一個實際的應用場景是:你可以建立一個 Channels 來幫你重啟龍蝦。因為每當我們修改了 .openclaw.json 設定後,龍蝦必須重啟才能生效,這時候透過 Channels 來下指令就非常方便。


▋ 安裝與環境設定

要體驗這個功能,必須先將 Claude Code 升級到 2.1.80 以上版本。進入介面後執行安裝指令:

/plugin install telegram@claude-plugins-official

我在安裝時遇到 plugin not found 的錯誤,這通常是因為舊有的 marketplace 資訊沒更新。解法是進入 /plugin 選單,手動將 claude-plugins-official 更新到最新版,Telegram 外掛才會出現。注意更新完後,單純執行 /reload-plugins 可能沒用,建議直接重啟 Claude Code。


▋ Telegram 連線實作

實際設定流程與官方文件略有出入。設定 Token 時,應使用 /configure 指令而非 /telegram:configure:

/configure <你的Token>

接著在本地啟動服務:

claude –channels plugin:telegram@claude-plugins-official

當你從 Telegram Bot 發送訊息給 Claude Code 時,系統會要求配對。回到 Claude Code 介面輸入 Telegram 上顯示的配對碼:

/telegram:access pair xxxxx

這個流程與當初設定龍蝦非常像。除了 Telegram,官方也提供 Discord 插件,設定邏輯大同小異。如果你想先在本地測試,官方還有一個 fakechat demo,可以在 localhost 模擬聊天 UI,不需連接外部服務。


▋ 使用者指南 vs 開發者參考

官方釋出了兩份文件。第一篇是針對一般使用者的操作手冊,涵蓋安裝、設定以及企業級的安全控管。第二篇則針對開發者,解釋了 Channel 的本質就是一個 MCP Server。只要在 capabilities 中宣告 claude/channel,並透過 notifications 運作,就能將事件推入 session。

這代表應用空間很大。你可以寫一個 Webhook Receiver,當 CI Pipeline 跑完時自動推通知給 Claude Code,或是讓系統監控警報直接觸發 Claude 自動處理問題。


▋ 安全機制與限制

Channels 區分為單向推播(如 CI 通知)與雙向對話(如 Telegram 橋接)。在安全性方面,每個 Channel 都有 sender allowlist,只有經過配對的使用者 ID 才能傳送訊息,這能有效防止未經授權的指令變成 Prompt Injection 的漏洞。

目前 Channels 處於 Research Preview 階段,若要測試自己開發的 Channel,啟動時須加上 –dangerously-load-development-channels 參數。此外,Team 與 Enterprise 方案預設是關閉此功能的,需由管理員手動開啟,個人版則無此限制。

大家目前有在用 OpenClaw 或其他遠端控制方案嗎?你認為 Channels 未來能完全取代龍蝦,還是兩者會並存發展?


如何撰寫自定義的 MCP Channel 來對接特定的監控系統

那麼,讓我們來看看如果要開發一個自定義的 Channel(例如對接公司的內部監控系統或特殊的 Webhook),在技術架構上需要注意哪些核心細節:

▋ 自定義 Channel 的運作邏輯

自定義 Channel 本質上是一個 MCP Server。開發時最關鍵的步驟是在 Server 的 capabilities 中宣告支援 claude/channel。

這與一般的 MCP Tool 不同,一般的 Tool 是由 Claude 主動調用,而 Channel 則是讓外部事件(如監控警報、CI 失敗通知)主動推播進 Claude 的對話 Session 中。當事件發生時,你的 Server 會透過 JSON-RPC 的 notifications/claude/channel 機制發送通知,這時候 Claude 就會接收到訊息並開始根據內容執行任務。


▋ 單向推播與雙向互動的實作差異

如果你只需要讓 Claude 接收通知(單向),實作相對簡單。只需要確保 Webhook 接收到資料後,正確轉換成 Claude 能理解的文字格式並推送到 Session 即可。這類應用很適合放在自動化部署流程中,一旦部署失敗,Claude 收到通知後可以直接去檢查日誌。

如果是要像 Telegram 這樣可以來回對話(雙向),則需要實作 reply tool。當 Claude 處理完訊息並產生回覆時,它會調用這個 tool,你的 Server 接收到回覆後,再透過對應的 API(如 Telegram Bot API)把訊息傳回給使用者。


▋ 開發環境的啟動指令

在開發階段,因為自定義的 Channel 尚未經過官方驗證,直接執行啟動指令會被擋下來。你必須在啟動 Claude Code 時加上特殊的開發標籤:

claude –dangerously-load-development-channels <你的MCP伺服器路徑或指令>

這會跳過安全檢查,允許 Claude 載入非官方提供的 Channel 插件。這對於企業內部開發私有的運維自動化工具非常有用。


▋ 安全性與 Allowlist 設計

安全性是開發 Channel 時最容易被忽略的一環。因為 Channel 是一個可以讓外部訊息進入系統的入口,如果不加限制,任何人只要知道你的 Endpoint 都能對你的 Claude 下指令。

官方的設計建議是在 Server 端實作配對機制(Pairing)。當新的使用者 ID 傳送訊息時,Server 應該先比對內部的 Allowlist。如果是未知的 ID,則應在 Claude 端顯示一個配對碼,要求使用者手動輸入完成授權。這能有效防止透過外部通訊軟體進行的 Prompt Injection 攻擊。


▋ 未來的擴充可能性

既然 Channel 是基於 MCP,這代表它可以跟其他的 MCP Tool 產生聯動。想像一下,你的監控系統發現資料庫壓力過大,透過 Channel 發通知給 Claude,Claude 收到後自動調用 SQL Tool 進去檢查慢查詢,最後再透過 Channel 回報處理進度給你的手機。這種全自動化的運維流程,正是 Channels 功能最迷人的地方。


寫一個簡單的 Python 或 Node.js 範例,示範如何建立一個基礎的 MCP Channel Server

那麼,我用 Node.js 配合 @modelcontextprotocol/sdk 來示範一個最基礎的 MCP Channel Server 結構。這個範例會展示如何宣告 claude/channel 能力,並模擬一個外部事件推播到 Claude Code。

▋ 基礎環境準備

首先,你需要安裝 MCP 的官方 SDK。在你的專案目錄執行:

npm install @modelcontextprotocol/sdk


▋ MCP Channel Server 範例程式碼

這個簡單的 Server 會建立一個 stdio 傳輸介面。核心在於 capabilities 的宣告,以及使用 notification 把訊息擠進 Claude 的 Session。

JavaScript

import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { 
  CallToolRequestSchema, 
  ListToolsRequestSchema,
  NotificationSchema 
} from "@modelcontextprotocol/sdk/types.js";

const server = new Server(
  { name: "my-custom-channel", version: "1.0.0" },
  { 
    capabilities: { 
      // 關鍵:告訴 Claude Code 這是一個 Channel
      "claude/channel": {} 
    } 
  }
);

// 模擬一個外部事件(例如來自 Webhook 或 監控系統)
function sendExternalAlert(message) {
  server.notification({
    method: "notifications/claude/channel/message",
    params: {
      channelId: "my-monitor-01",
      message: {
        role: "user",
        content: [{ type: "text", text: `[警報通知]: ${message}` }]
      },
      metadata: {
        senderId: "system-monitor",
        isAuthorized: true // 這裡應配合你的 Allowlist 邏輯
      }
    }
  });
}

const transport = new StdioServerTransport();
await server.connect(transport);

// 啟動 10 秒後模擬發送一個通知
setTimeout(() => {
  sendExternalAlert("伺服器 CPU 使用率過高,請檢查進程。");
}, 10000);

▋ 如何在 Claude Code 中測試

開發完畢後,你不能直接用一般的方式載入,必須使用開發者旗標。假設你的腳本名稱是 server.js

claude –dangerously-load-development-channels “node server.js”

啟動後,Claude Code 會建立一個連線 Session。當 10 秒過後,sendExternalAlert 被觸發時,你會在 Claude Code 的終端機介面直接看到該則訊息跳出,Claude 接著會自動根據這條訊息開始思考並嘗試修復問題。


▋ 實作雙向對話的重點

如果你希望 Claude 能「回覆」到你的外部系統(例如回傳訊息到 Slack),你必須在 ListToolsRequestSchema 中註冊一個名為 claude/channel/reply 的工具。

當 Claude 想要回話時,它會自動呼叫這個 Tool。你的 Server 收到 call 後,再把 params 裡面的文字內容打到你的轉接層(Adapter)即可完成閉環。


▋ 開發建議與偵錯

因為 Channel 涉及到非同步的事件推播,偵錯時建議觀察 Claude Code 的日誌輸出。另外,記得處理 pairing 邏輯,雖然範例中直接給了 isAuthorized: true,但在生產環境中,你必須驗證 senderId 是否在你的資料庫名單內,否則任何能接觸到你 MCP Server 的來源都能控制你的開發環境。


針對「雙向回覆」的 Tool 實作細節,提供更具體的程式碼片段

好的,那我們接著看「雙向對話」的核心實作。要讓 Claude 能把話傳回給你的外部系統(例如傳回 Slack 或手機),你的 MCP Server 必須實作一個特定的 Tool。

▋ 實作雙向回覆的核心:claude/channel/reply

在 MCP 的規範中,當 Claude 想要回應一個 Channel 訊息時,它會尋找並呼叫一個名為 claude/channel/reply 的工具。你需要在 Server 的工具清單中註冊它。

以下是擴充後的 Node.js 程式碼片段:

JavaScript

// 在原本的工具定義中加入
server.setRequestHandler(ListToolsRequestSchema, async () => {
  return {
    tools: [
      {
        name: "claude/channel/reply",
        description: "將 Claude 的回覆傳送回外部通訊管道",
        inputSchema: {
          type: "object",
          properties: {
            channelId: { type: "string" },
            message: { type: "string" }
          },
          required: ["channelId", "message"]
        }
      }
    ]
  };
});

// 處理 Claude 的回覆請求
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name === "claude/channel/reply") {
    const { channelId, message } = request.params.arguments;
    
    // 這裡實作你發送到外部 API 的邏輯
    console.log(`[發送回覆至 ${channelId}]: ${message}`);
    
    // 呼叫例如 Telegram Bot API 或 Slack Webhook
    // await sendToExternalPlatform(channelId, message);

    return {
      content: [{ type: "text", text: "訊息已成功傳回外部系統。" }]
    };
  }
  throw new Error("找不到對應的工具");
});

▋ 實作流程的關鍵點

當這套機制跑起來後,整個對話閉環會像這樣運作:

  1. 外部事件觸發:你的監控系統發現異常,呼叫你的 MCP Server。
  2. Notification 推播:Server 發送 notifications/claude/channel/message 給 Claude Code。
  3. Claude 思考:Claude 在終端機看到訊息,分析問題後決定回報處理狀況。
  4. 調用 Reply Tool:Claude 主動執行 claude/channel/reply,把它的回覆文字塞進 message 參數。
  5. 轉接傳回:你的 Server 接收到這個 call,透過網路請求把文字傳回給原本的發話者。

▋ 關於開發安全性(Authentication)

在實作雙向對話時,channelId 的管理非常重要。你必須在 Server 內部維護一個對照表(例如 SQLite 或簡單的 Map),紀錄 channelId 對應到外部系統的哪個對話視窗(Chat ID)或使用者。

這就是為什麼官方範例會需要「配對(Pairing)」的原因。第一次連線時,Server 會產生一個隨機碼,請你在 Claude Code 輸入,這樣 Server 才能把你的「Claude Session」與你的「Telegram 帳號」綁定在一起。


▋ 下一步建議

你可以試著將這個 Server 包裝成一個 Docker Container,然後部署在你的 VPS 上。只要透過 SSH 隧道(SSH Tunnel)或是暴露一個特定的 Port,就能讓本地運行的 Claude Code 連接上這個遠端的「通訊橋接器」。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *