外出中にスマホのDiscordへ「リサーチして記事を書いといて」と送ったら、帰宅後には下書きが完成していた。そんな話をすると「どうやっているの?」とよく聞かれる。答えはシンプルで、Claude Code Channelsというプラグインを使ってローカルマシンを24時間待機状態にしているだけだ。
このブログ(enjoy-program.net)自身がその構成を採用している。blog-agents というプロジェクトで、Researcher → Writer → Auditor という記事パイプラインを動かし、各ステップが完了するたびにDiscordの #general に進捗報告が届く。記事を依頼して、外出して、帰ってきたらDiscordを確認する。それだけで記事が仕上がっている。
2026年3月にAnthropicがリサーチプレビューとして発表したChannels機能は、Claude Codeを「開いて使うCLIツール」から「常に待機しているAIチームメイト」へと変える仕組みだ。本記事ではDiscord連携のセットアップから常時稼働、安全な運用まで、実際に動かして確認した内容をまとめる。
Claude Code Channelsとは何か
Channelsは、MCPサーバーとして動作するプラグインだ。Claude Codeがそのプラグインをサブプロセスとして起動し、Discord BotやWebhookからのイベントをstdio経由でセッションに「プッシュ」できる。
Discord Bot(外部)
↓ DiscordのAPIをポーリング
Claude Code Channels Plugin(ローカルMCPサーバー)
↓ stdio経由でClaude Codeに通知
Claude Code セッション(ローカル実行)
↓ ローカルファイルシステムを直接操作
Discord経由で返信従来のCLIは「使うために開く」ツールだった。Channelsは逆で、セッションが起動している限り外部からのメッセージを受け付け続ける。iPhoneからDiscordを通じてxcodebuildを実行してiOSアプリをデプロイしたMacStoriesのレビュアーは「どこからでもMacでしか使えないツールにアクセスできるのは超能力のようだ」と書いている。大げさではなく、実際にそういう感覚になる。
類似機能との使い分け
Channelsは唯一の選択肢ではない。用途によって使い分けが必要だ。
| 機能 | Channels(Discord) | Routines(クラウド) |
|---|---|---|
| 実行環境 | ローカルマシン | Anthropicクラウド |
| ファイルアクセス | ローカルFS全体 | GitHubリポジトリのみ |
| 双方向チャット | あり | なし |
| 常時稼働 | tmux/systemdで実現 | 常時対応(PCなし) |
| スマホからの権限承認 | Permission Relayで可能 | 不可 |
ローカルファイルを直接操作したい、双方向でやり取りしたい、という用途にはChannels一択だ。GitHubリポジトリ上のコードに定期的な処理を走らせるだけでよければ、PCを起動しておかなくて済むRoutinesの方が楽になる。
6ステップのDiscordセットアップ
必要なのは Claude Code v2.1.80以上と、Bunランタイムのインストールだけだ。BedrockやVertex AIの環境では現時点で非対応になっている。
Step 1〜2: Discord BotをサーバーへDeploy
Discord Developer Portal で新しいApplicationを作り、Botセクションからトークンをコピーしておく。このタイミングで Privileged Gateway Intents の Message Content Intent を必ず有効にする。これを忘れるとBotがメッセージ本文を読めず、「コマンドを送っても何も起きない」という状況になる。躓く人の大半がここで詰まる。
次にOAuth2 > URL GeneratorでBotの招待URLを生成し、Discordサーバーへ招待する。必要な権限はView Channels / Send Messages / Send Messages in Threads / Read Message History / Attach Files / Add Reactionsの6つだ。
Step 3〜4: Claude Codeにプラグインを追加
# Bunが未インストールなら先に入れる
curl -fsSL https://bun.sh/install | bash
# Claude Codeセッション内でプラグインをインストール
/plugin install discord@claude-plugins-official
# Botトークンを登録
/discord:configure <コピーしたBOT_TOKEN>/discord:configure を実行すると、トークンは ~/.claude/channels/discord/.env に保存される。
Step 5〜6: 起動とペアリング
# Channelsを有効にしてClaude Codeを起動
claude --channels plugin:discord@claude-plugins-official起動したら、DiscordでBotにDMを送る。BotがペアリングコードをDMで返してくるので、Claude Codeセッションで承認する。
/discord:access pair <ペアリングコード>最後にアクセスポリシーをallowlistに変更する。これをやらないと、誰でもBotに命令できる状態になってしまう。
/discord:access policy allowlistfakechatで最初のテスト
Discordアカウントを使わずに動作確認できるデモ用プラグインがある。Botトークンの取得前に試したい場合はこちらが便利だ。
/plugin install fakechat@claude-plugins-official
claude --channels plugin:fakechat@claude-plugins-official
# → ブラウザで http://localhost:8787 を開いてメッセージを送る24時間稼働させる方法
Channelsはセッションが起動している間しか動かない。Macをシャットダウンすれば、それで終わりだ。「外出中にも動いていてほしい」という用途には、何らかの常時稼働の仕組みが必要になる。
Mac + tmux(追加コスト0円)
手元のMacを使い続けるなら、tmuxでデタッチしてセッションを残す方法が一番手軽だ。
# tmuxセッション作成
tmux new -s claude
cd ~/your-project
claude --channels plugin:discord@claude-plugins-official
# Ctrl+B, D でデタッチ(ターミナルを閉じてもセッションは生きている)
# スリープ防止
caffeinate -i &
# 再接続するとき
tmux attach -t claudeMacが起動している限り動き続けるので、ノートPCを閉じっぱなしにするのが前提になる。自宅のデスクトップMacなら問題ないが、外出先に持ち出すMacだと運用が難しくなる。
VPS + systemd(完全常時稼働)
PCに依存しない構成にしたいなら、VPSにClaude Codeを置いてsystemdで管理する。
# /etc/systemd/system/claude-code.service
[Unit]
Description=Claude Code Discord Channel
After=network.target
[Service]
Type=simple
User=youruser
WorkingDirectory=/home/youruser/projects
ExecStart=/usr/local/bin/claude --channels plugin:discord@claude-plugins-official
Restart=on-failure
RestartSec=10s
EnvironmentFile=/home/youruser/.claude/channels/discord/.env
[Install]
WantedBy=multi-user.targetsudo systemctl enable claude-code
sudo systemctl start claude-codeRestart=on-failure により、Claudeが落ちても10秒後に自動復帰する。コストはHetzner CX23(2vCPU / 2GB RAM)なら月額約€3.99で、試せる現行の最小構成だ(旧CX11は2026年時点で廃止済み)。VPSの選択肢としてはDigitalOcean(約$6/月)やAWS EC2 t3.micro(約$8〜10/月)もある。
Routines(クラウド・PCなし)
ローカルファイルへのアクセスが必要なく、GitHubリポジトリ上での定期処理でよいなら、RoutinesをAnthropicクラウドで動かす方が管理コストは低い。スケジュール・GitHub Eventトリガー・Webhookトリガーに対応しており、PCを起動し続けなくて済む。ただし双方向チャットはできないため「外出中にDiscordで指示する」という用途にはChannelsの方が合っている。
Permission Relay: スマホから権限を承認する
外出中に長時間タスクを走らせていると、Claude Codeが途中で「このファイルを書き換えていいですか?」と権限の確認ダイアログを出すことがある。ローカルにいないと承認できないので、タスクが止まってしまう。
Permission Relay(v2.1.81以上で利用可能)はこの問題をDiscord経由で解決する。
1. Claude がツール実行の権限ダイアログを表示
↓
2. Discord に権限リクエストが転送される:
「Claude wants to run Bash: git push origin main
Reply "yes abcde" or "no abcde"」
↓
3. スマホのDiscordから返信: "yes abcde"
↓
4. 承認されてツール実行request_idは5文字の小文字英字(l を除く)で、スマホで 1 と見間違えないように設計されている。省略形として y / n も使える。
Permission Relayを使えるのはallowlistに登録済みのユーザーのみだ。設定が緩いと第三者からも承認操作が行えてしまうので、前節のallowlist設定は先にやっておいてほしい。
「全部承認が面倒だから --dangerously-skip-permissions を使えばいいのでは」と思うかもしれないが、これはすべてのツール実行を無承認で許可するフラグで、信頼できる環境以外では危険だ。外出中の常時稼働には向かない。Permission Relayを使う方がいい。
Webhookで外部サービスと繋ぐ(応用)
Channelsはチャットプラットフォームだけでなく、GitHub ActionsやSentryなどの外部システムのWebhookも受け付けられる。ただし、この機能は2026年5月時点のリサーチプレビューにおいて --dangerously-load-development-channels フラグが必要な点に注意してほしい。本番環境に使う場合は、まだ様子見が無難だ。
最小構成のWebhookレシーバーはBun + TypeScriptで実装する。
// webhook.ts
import { Server } from '@modelcontextprotocol/sdk/server/index.js'
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
const mcp = new Server(
{ name: 'webhook', version: '0.0.1' },
{
capabilities: { experimental: { 'claude/channel': {} } },
instructions: 'Webhookイベントが届く。内容に応じてコードの修正や調査を行う。',
},
)
await mcp.connect(new StdioServerTransport())
Bun.serve({
port: 8788,
hostname: '127.0.0.1', // ローカルのみ受け付け
async fetch(req) {
const body = await req.text()
await mcp.notification({
method: 'notifications/claude/channel',
params: { content: body },
})
return new Response('ok')
},
})起動時はリサーチプレビュー用のフラグが要る。
# リサーチプレビュー中はdangerouslyフラグが必要
claude --dangerously-load-development-channels server:webhook
# テスト送信
curl -X POST localhost:8788 -d "build failed on main"このWebhookサーバーをCI/CDと組み合わせると、GitHub Actionsのビルド失敗 → Claude Codeがエラーログを読んで原因分析 → Discordに報告という流れが実現する。
落とし穴と安全運用
実際に動かしてみると、いくつか詰まる場所がある。
allowlist設定は最初にやる
デフォルトの pairing ポリシーのままにしておくと、ペアリングコードを知っている人間は誰でもBotを操作できる。セットアップ直後に allowlist に切り替えることを癖にしてほしい。
また、グループチャットでBotを使う場合はチャットルームIDではなくユーザーIDでフィルタリングする。チャットルームIDで判定すると、そのチャンネルの全メンバーからの指示を受け付けてしまう。
自分のメッセージへの返信ループ
Botがメッセージを送ると、fetch_messages でそのメッセージも取得される。何も対処しないとBotが自分のメッセージに反応して永遠に返信し続けるループが起きる。送信者がBot自身かどうかのチェックが必要だ。公式プラグインはこの処理を内包しているが、カスタム実装では見落としやすい。
セッションが落ちたら止まる
Claude Codeのプロセスが終了するとChannelsも止まる。VPS運用ではsystemdの Restart=on-failure で自動復帰を設定する。Mac運用ではスリープ設定に注意が必要で、caffeinate -i & を忘れると知らない間にスリープしてしまう。
コスト感
Channelsの利用自体にサブスクリプション以上の追加費用はかからない。ただしトークン消費は発生する。Proプランで1日長時間使う場合はリミットに当たる可能性がある。SSD Nodesの分析によると目安として Pro($20/月)が約44,000 tokens/5時間ウィンドウ、Max 5x($100/月)が約88,000 tokens/5時間ウィンドウとされているが、これは二次情報源の数値だ。実際の上限は公式のプランページで確認してほしい。
まとめ
Claude Code Channelsを使うと、ローカルマシンがDiscord越しに操作できるAIチームメイトに変わる。このブログの記事パイプラインがそのまま実例で、外出中に依頼を送るだけで記事の執筆が進んでいく。
まずはfakechatで手元のデモ動作を確認してみてほしい。Botトークンなしでもすぐ試せる。問題なければDiscord Developer PortalでBotを作って、本記事の6ステップに進むだけだ。常時稼働については、Macをそのまま使い続けるならtmux + caffeinate、PCに縛られたくないならVPS + systemdが現実的な出発点になる。
リサーチプレビューの段階なので、細かい仕様は今後変わる可能性がある。現時点の公式ドキュメント(参考リンク参照)を起点にして試してほしい。
参考リンク
- Channels - Claude Code 公式ドキュメント
- Channels Reference - Claude Code 公式ドキュメント
- Routines - Claude Code 公式ドキュメント
- Discord プラグイン README - GitHub anthropics/claude-plugins-official
- First Look: Claude Code's Discord/Telegram integrations - MacStories
- Keep Claude Code Agent Running 24/7 - MindStudio
- Claude Code Channels on VPS - DanubeData
- Claude Code Pricing 2026 - SSD Nodes

コメント