DiscordにAIチームメイトを常駐させる——Claude Code Channels実践ガイド

外出中にスマホの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 IntentsMessage 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 allowlist

fakechatで最初のテスト

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 claude

Macが起動している限り動き続けるので、ノート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.target
sudo systemctl enable claude-code
sudo systemctl start claude-code

Restart=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が現実的な出発点になる。

リサーチプレビューの段階なので、細かい仕様は今後変わる可能性がある。現時点の公式ドキュメント(参考リンク参照)を起点にして試してほしい。

参考リンク

コメント

タイトルとURLをコピーしました