Claude Codeで自作のchannel(外からの通知やメッセージを動いているセッションに流し込む仕組み)を試したい人向け
自作したchannelをまだ正式登録していない段階で、自分のパソコンの中だけでテスト起動して動きを確かめたい場面で使う。Claude Codeの起動コマンドの後ろに、すり抜けたいchannelを server:名前 または plugin:名前@配布元 の形で並べて叩く
Claude Codeには「channel(チャンネル)」という、動いているセッションの外側から出来事を流し込む実験的な仕組みがあります。自作したchannelをまだ正式登録していない状態でも、手元のテストだけ通したい。そのための起動時の指定が --dangerously-load-development-channels です。
名前にdangerous(危険)と付いていて身構えますが、やることは1つだけ。研究プレビュー中のchannelに課された「承認リストに載っていないと動かさない」というルールを、指定したぶんだけ一時的にすり抜けます。それ以上でも以下でもありません。
噛み砕くと、どういうこと?
イベント会場の入口に立つ警備員を思い浮かべてください。研究プレビュー中のchannelは、事前に名簿(承認リスト)に名前が載っている相手しか中に通しません。自作したばかりのchannelは名簿に載っていないので、ふつうに起動しても門前払いされます。
このコマンドは、警備員に「この1人だけは私が保証するので通して」と耳打ちするようなもの。すり抜けられるのは、その場で名前を挙げた相手だけです。
しかも、いきなり通すわけではありません。起動時に「本当にこれを読み込んでいいですか?」と1回確認を求められます。dangerousと付くわりに、ノーチェックではないんですね。
大事な前提:そもそもchannelが動く環境じゃないと意味がない
このコマンドは、自作channelのテストを通すための補助です。だから、channel本体が動く土台が整っていないと、コマンドだけ叩いても始まりません。公式が挙げている条件はわりとはっきりしています。
まず、Claude Codeがv2.1.80以降であること。次に、claude.ai経由かConsoleのAPIキーでAnthropicにログインしていること。そして、Amazon Bedrock / Google Vertex AI / Microsoft Foundry 経由では使えません。Team・Enterpriseの組織で使うなら、管理者がchannelsを明示的にオンにしている必要もあります。
自作channelを動かすには、JavaScriptを実行する土台、つまりBun・Node.js・Denoのどれかも要ります。公式の作りかけサンプルはBunを使っています。
「自作のwebhookチャネル」を例に、実際の手順を見る
題材は、自動テストが失敗したときに「build failed(ビルド失敗)」という通知をClaude Codeのセッションへ飛ばす、小さな自作channelです。公式のwebhook受け取りサンプルをなぞります。手元のパソコンだけで完結する流れなので、頭の中で再現できるはずです。
ステップ1: channel本体のファイルを1つ書く
まず webhook.ts という1ファイルを作ります。中身は、localhost(自分のパソコン自身)のポート8788で外からのデータを待ち受けて、届いた内容をClaude Codeに横流しするだけの小さなサーバーです。ここは公式サンプルがそのまま使えます。
ステップ2: そのファイルをClaude Codeに教える
.mcp.json という設定ファイルに、いま作ったサーバーを登録します。「webhookという名前のサーバーは、bunコマンドで webhook.ts を動かして起動する」と書いておくイメージです。
{"mcpServers":{"webhook":{"command":"bun","args":["./webhook.ts"]}}}
ステップ3: このコマンドで起動する
ここでようやく本題のコマンドです。server: は「.mcp.jsonに直接書いた、まだ正式登録していないサーバー」を指す書き方です。
$ claude --dangerously-load-development-channels server:webhook
起動すると「これを読み込んでいいですか?」と1回確認が出ます。OKすると、Claude Codeが webhook.ts を裏で立ち上げ、ポート8788での待ち受けが自動で始まります。
ステップ4: 別の画面から通知を送ってみる
もう1枚ターミナルを開いて、テストの失敗通知を模した1行を送ります。
$ curl -X POST localhost:8788 -d "build failed on main"
ステップ5: Claudeのセッションに届く
するとClaude Codeを動かしている画面に、こういうタグで通知が飛び込みます。
<channel source="webhook" path="/" method="POST">build failed on main</channel>
Claudeはこれを読んで、開いているファイルを見ながら「mainブランチのビルドが落ちてますね、原因を見ましょうか」みたいに反応します。手が離れていても、外の出来事に気づける。これがchannelの面白いところです。
ステップ6: ここで初心者がやりがちな勘違い
「server:webhook」の webhook は、.mcp.jsonに書いた名前と一致していないといけません。ファイル名(webhook.ts)ではなく、設定ファイルの中で付けた名前です。ここがズレると、すり抜け対象が見つからず動きません。地味ですが踏みやすい穴です。
つまり --dangerously-load-development-channels は何をしてくれるのか
- やってくれる: 承認リストに載っていない自作channelを、その場で名前を挙げたぶんだけ一時的に動かせるようにする。起動前に確認を1回挟む
- やってくれない: ツールを動かすときの確認をスキップしたりはしない。それは別の似た名前のコマンドの役目です。組織がchannels自体を禁止している場合に、その禁止を突破することもしない
- 意味が薄い場面: 自作channelを試すのではなく、すでに承認済みのchannelを使うだけなら不要。その場合は
--channels側で足りる
使いどころ3シナリオ(具体題材で再現)
シナリオ1: 自動テストの失敗を見逃したくないとき
料理レシピサイトを作っていて、コードを直すたびに自動テストが走るとします。テストが落ちたら、その通知をClaude Codeのセッションに飛ばしたい。channelを webhook.ts で自作して、server:webhook ですり抜けテスト。失敗の瞬間にClaudeが気づいて、原因の当たりを付けてくれる動きを手元で確認できます。
シナリオ2: スマホのチャットからClaudeに話しかけたいとき
家計簿アプリを作っている最中、外出先からスマホで「いまの進捗どう?」と聞きたい。TelegramやDiscord、iMessageをchannelにすると、スマホから投げた質問が、パソコンで開いているセッションに届いて、答えが同じチャットに返ってきます。自作した連携をまず手元で通すのに、このコマンドを使います。
シナリオ3: デプロイ完了の合図を受け取りたいとき
個人ブログを公開作業に出して、公開処理が終わった瞬間にClaudeへ知らせたい。公開処理の最後に通知を1本飛ばすchannelを書いて、server: 形式ですり抜け起動。本番の承認リストに載せる前に、通知がちゃんと届くかを安全に試せます。
初心者が踏みやすい落とし穴
- 名前が似ている
--dangerously-skip-permissionsとは全くの別物。あちらは「Claudeがツールを動かすときの確認を全部すっ飛ばす」危険な指定。こちらは「channelの承認リストだけすり抜ける」もので、ツール実行の確認とは無関係です。名前で混同しないこと - dangerousと付くのに、起動時に確認が1回出る。完全に無確認で何でも読み込むわけではありません。「本当にいい?」に答えて初めて読み込まれます
- 承認リストをすり抜けるだけで、組織のルールは別枠。Team・Enterpriseで管理者がchannels自体をオフにしていると、このコマンドを付けても動かず「blocked by org policy(組織のルールでブロック)」と出ます。Pro / Maxの個人ユーザーはこの組織チェックなしで使えます
- すり抜けは名前を挙げた相手1件ずつ。承認済みchannel用の
--channelsと一緒に使っても、--channels側に書いたものまですり抜けが及ぶわけではありません。すり抜けたいものは全部このコマンドの後ろに自分で並べます - channel自体が研究プレビュー(v2.1.80以降)。JavaScriptを動かす土台(Bunなど)が手元にある前提で、Amazon Bedrock / Google Vertex AI / Microsoft Foundry 経由では使えません。土台がないとステップ1で詰まります
- 2つの書き方を取り違えやすい。
plugin:<名前>@<配布元>はプラグインとしてまとめ済みの自作channel用、server:<名前>は .mcp.json に直接書いただけのサーバー用。今回のように1ファイルを直接書いた段階ならserver:です - これは信頼できない相手のchannelを動かす道具ではない。公式も「素性の分からないところから来たchannelをこれで動かすな」と釘を刺しています。すり抜けるのは、自分で書いて中身が分かっているものだけにしてください
書き方
claude --dangerously-load-development-channels server:<名前>
やってみるとこうなる
入力
claude --dangerously-load-development-channels server:webhook
出力例
起動時に「これを読み込んでいいですか?」と確認が1回出る。OKすると指定したchannelが承認リストを通り、自分のパソコンの中でテスト起動できる。例えばwebhookに通知を送ると、セッションに <channel source="webhook" path="/" method="POST">build failed on main</channel> のタグで届き、Claudeが反応する
このページに出てきた言葉
- channel(チャンネル)
- 動いているClaude Codeのセッションに外から出来事を流し込む通り道。スマホからの質問や自動テストの失敗通知を届けられる
- 承認リスト(allowlist)
- 「これは動かしてOK」と公式に認められたchannelの名簿。研究プレビュー中はここに載っているものしか登録できない
- 研究プレビュー
- 正式公開の前に実験的に先行して使えるようにしている段階。仕様が変わる可能性があり、使える条件も限られる
- server:名前 と plugin:名前@配布元
- すり抜けたいchannelの指定の仕方。server: は <code>.mcp.json</code> に直接書いたサーバー用、plugin: はプラグインとしてまとめ済みのchannel用
- Bun / Node.js / Deno
- パソコンの上でJavaScriptを動かす土台ソフト。channel本体はこの上で動く。どれか1つ入っていればいい
- blocked by org policy
- 「組織のルールでブロックされた」という意味の表示。Team・Enterpriseで管理者がchannels自体をオフにしていると出る