Claude Codeのfakechatプラグインでチャンネルの通知を手元で試す
fakechatはlocalhostのWebチャットでChannelsの往復を確かめるプラグインです。導入手順に加え、reply・edit_messageの引数、添付ファイルの置き場所、自作チャンネルとの突き合わせ方をまとめます。
fakechatは、ブラウザで開くlocalhostのチャット画面からClaude Codeのセッションにメッセージを送り、返信を同じ画面で受け取るプラグインです。トークンもアクセス制御も外部サービスも要らないので、Channelsの「通知が届き、Claudeが返す」流れを手元だけで確かめられます。マーケットプレイスの説明も、チャンネル通知の流れをテストするためのlocalhost Webチャットとしています。
Telegramなど実在のアプリを使う前の動作確認や、自作チャンネルとの挙動比較に向いています。仕組みそのものはClaude Code Channelsとはにあります。
fakechatで何が確かめられるか
fakechatが担う範囲は狭く、そこが使いどころです。
fakechatで試せること
受信
ブラウザから打った文が、Claude Codeのセッションにチャンネルイベントとして届きます。
返信
Claudeが
replyツールで返すと、同じ画面に表示されます。添付と編集
画像やファイルの受け渡しと、送信済みメッセージの
edit_messageによる書き換えを試せます。
逆に、履歴も検索もaccess.jsonもskillもありません。READMEは「単一のブラウザタブで、リロードのたびに新しくなる開発用ツール」と位置づけています。送信者の許可リストを試したい場合の対象にはなりません。その設計はChannelsセキュリティ設計で扱っています。
導入から最初の往復まで
必要なのは、claude.aiアカウントかConsole APIキーで認証済みのClaude Codeと、Bunです。チャンネルのプラグインはBunスクリプトなので、先にbun --versionで確認します。TeamやEnterpriseの組織では、管理者がchannelsEnabledを有効にするまでチャンネルは届きません。
fakechatの導入と起動
- 1
プラグインを入れる
Claude Codeのセッション内でインストールします。スコープを聞かれたら、全プロジェクトで使えるユーザースコープを選ぶと手間が減ります。
- 2
チャンネルを有効にして起動し直す
--channelsを付けないとサーバーは接続しません。一度終了してから起動し直します。 - 3
ブラウザで開く
起動時にstderrへURLが出ます。既定は
http://localhost:8787です。
/plugin install fakechat@claude-plugins-officialclaude --channels plugin:fakechat@claude-plugins-officialポートを変えたいときは環境変数FAKECHAT_PORTを指定します。
FAKECHAT_PORT=9000 claude --channels plugin:fakechat@claude-plugins-official起動画面には、plugin:fakechat@claude-plugins-officialからのメッセージがセッションに直接入るという通知が出ます。プラグインが未インストールか許可リストに無い場合は、その理由を示す警告行が下に付きます。
インストールでMarketplace "claude-plugins-official" not foundと出たら、/plugin marketplace add anthropics/claude-plugins-officialを先に実行します。Plugin "fakechat" not found in marketplaceなら、/plugin marketplace update claude-plugins-officialでカタログを更新して再試行します。
画面に「このディレクトリに何がある?」と打つと、端末には← fakechat · web: …の形で受信行が出ます。Claudeがreplyで返すと答えが画面に戻ります。初回の返信で権限確認が出たら、端末側で承認します。
受信イベントの中身を読む
モデルに渡る形は、公式の通知フォーマットに沿っています。サーバーがnotifications/claude/channelで送るcontentが<channel>タグの本文になり、metaの各キーがタグの属性になります。fakechatのサーバー実装では、deliver関数が次のmetaを付けています。
| 属性 | 中身 |
|---|---|
chat_id | 中身固定でweb |
message_id | 中身画面側で採番したID |
user | 中身固定でweb |
ts | 中身送信時刻のISO形式 |
file_path | 中身添付があるときだけ。保存先の絶対パス |
キーはすべて英数字とアンダースコアだけです。ハイフンを含むキーは黙って捨てられるので、自作チャンネルでchat-idのように付けると属性が消えます。
添付の扱いにも設計意図が読み取れます。ファイルの場所は本文ではなくmetaのfile_pathだけに載せています。ソースのコメントによれば、本文に「[attached — Read: PATH]」のような注記を入れると、画面にその文字列を打つだけで偽装できるためです。外部入力を扱う自作チャンネルでも、信頼できる情報は本文でなくmetaに分ける発想がそのまま使えます。
起動時のinstructionsには「送り手が読むのはfakechatの画面で、このセッションの出力は届かない。見せたいことはreplyツール経由にする」と書かれています。端末に答えが出ているのに画面が空のときは、Claudeがreplyを呼んでいない状態です。
2つのツールと添付ファイル
fakechatが公開するツールは2つです。
| ツール | 引数 | 役割 |
|---|---|---|
reply | 引数text(必須)、reply_to(メッセージID)、files(絶対パスの配列) | 役割画面にメッセージを送る |
edit_message | 引数message_id、text(ともに必須) | 役割送信済みメッセージをその場で書き換える |
filesで渡せるファイルは1つあたり50MBまでで、画面には本文の下に[ファイル名]として出ます。画面からの添付は~/.claude/channels/fakechat/inbox/に保存され、そのパスが通知に入ります。Claudeが返すファイルは同じ場所のoutbox/にコピーされ、HTTPで配信されます。
試し方の例として、次のように頼むと2つのツールを一度に確かめられます。
fakechatのreplyで「集計中」と送り、10秒後にedit_messageで
「集計完了」に書き換えて。画面側のメッセージが差し替われば、編集の往復も通っています。自作チャンネルに編集機能を載せるときの挙動の見本になります。
自作チャンネルの確認に使う
fakechatは、自作チャンネルの挙動を比べる基準点として使えます。自作側が動かないとき、fakechatで動くなら原因はプロジェクトの外ではなく自作サーバーの側に絞れます。
通知が届かないときの切り分け
- Qfakechatをチャンネルとして起動していますか?答えがいいえのとき答えがはい
--channels plugin:fakechat@claude-plugins-officialを付けて起動し直します。.mcp.jsonに載っているだけでは届きません。 - Q組織でチャンネルが有効になっていますか?答えがいいえのとき答えがはい
Team・Enterpriseでは管理者が
channelsEnabledを有効にします。無効だとMCPサーバーは接続してもメッセージは届かず、起動時に警告が出ます。 - Q自作サーバーも同じ手順で動きますか?答えがいいえのとき答えがはい
自作はfakechatと違い許可リストに無いので、開発用フラグで起動します。
両方動けば契約は満たしている
通知の形と返信の往復は、fakechatと同じ土台に乗っています。
自作チャンネルの起動には--dangerously-load-development-channelsを使います。--channelsと組み合わせても、フラグの効果は--channels側のエントリには及びません。対話セッションで確認プロンプトが出る前提で、-pやAgent SDKでは無視されます。
claude --dangerously-load-development-channels server:webhookfakechatのサーバーはcapabilitiesにexperimental: { 'claude/channel': {} }を宣言し、toolsを公開する構成です。自作側が送った通知が無視されるときは、この宣言が抜けていないかを先に見比べると早く済みます。最小構成の自作はWebhook受信サーバーの記事、返信ツールの足し方はChannels reply toolの記事にあります。
約300行のサーバーを手本として読む
fakechatのserver.tsは約300行で、BunのBun.serveにHTTPとWebSocketを同居させています。自作チャンネルの骨格として読むと、役割が分かれて見えます。
| 経路 | 役割 |
|---|---|
/ | 役割チャット画面のHTMLを返す |
/ws | 役割画面からのテキストを受け、deliverでClaude Codeへ通知する。返信の配信にも使う |
/upload | 役割添付付きの投稿をPOSTで受け、inbox/に保存してから通知する |
/files/ | 役割outbox/にコピーした返信添付をHTTPで配る |
流れは、入力を受けたらdeliverでnotifications/claude/channelを送り、返信はツール呼び出しで受けて画面へ流す、の2本立てです。Webhook受信サーバーの自作では入口がHTTPのPOSTに変わるだけで、通知を送る側と返信ツールを受ける側の分担は同じです。保存先は~/.claude/channels/fakechat/にまとまるので、残ったファイルを消したいときもこのディレクトリを見れば済みます。
席を外すときの権限確認
チャンネル経由の作業中に権限確認が出ると、端末で応答するまでセッションは止まります。席を外す運用では、権限確認の中継に対応したチャンネルを使うか、信頼できる環境に限って--dangerously-skip-permissionsを使う選択肢があります。fakechatで試すなら、最初のreplyで出る確認を承認する段階までです。中継の実装は権限確認プロンプトの中継手順にあります。
使うときの制約
- 待ち受けは
127.0.0.1に限られ、他の端末からは開けません - 履歴は残らず、リロードで会話は消えます
- 研究プレビュー中は、
--channelsが受け付けるのは許可リスト内のプラグインです。fakechatは公式のclaude-plugins-officialにあるので通ります - Bedrock、Google CloudのAgent Platform、Microsoft Foundryでは、チャンネル自体が使えません
--channelsと--dangerously-load-development-channelsは研究プレビュー中、claude --helpに載りません。使えないのではなく表示されないだけです
まとめ
fakechatは、Channelsの受信・返信・添付・編集をアカウント作成なしで確かめるためのプラグインです。本番のアプリを設定する前の動作確認と、自作チャンネルの挙動を比べる基準に使えます。Telegramなど対応アプリ全体の選び方はClaude Code Channels対応アプリの記事に、プラグインとして配る段階はChannelsプラグイン化の記事にまとめています。