Claude CodeでDiscord Botを作る — スラッシュコマンド実装まで
Claude CodeでDiscord Botを構築する手順。アプリ登録からインタラクションサーバーの実装、ngrokでの公開、スラッシュコマンドの登録・動作確認までを扱います。
Claude CodeでDiscord Botを作る流れ
Claude Codeはコードベースを読み、ファイルを編集し、コマンドを実行できるターミナル常駐のコーディングエージェントです。Discord Bot開発でも、Expressサーバーの雛形作成からスラッシュコマンドの実装、npm install や ngrok の実行まで、手を動かす部分の大半を任せられます。
この記事では、Discord公式のBot構築チュートリアルの流れに沿って、Claude Codeに何を指示し、どこを自分の手で操作するかを分けて示します。ゴールはスラッシュコマンドが実際にDiscord上で応答するところまでです。
前提条件
- Node.js(公式チュートリアルはv18以上を前提にしています)
- Claude Codeがインストール済み・ログイン済みであること(
claudeコマンドで起動) - Discordアカウントとテスト用サーバー(Botを試すための自分専用サーバーで十分です)
- ngrokアカウント(ローカルサーバーを一時的に公開するために使います)
Claude Codeはネイティブインストーラーで導入でき、macOS・Linux・WSLでは curl -fsSL https://claude.ai/install.sh | bash、Homebrewでは brew install --cask claude-code が使えます。
手順1: プロジェクトの雛形を用意する
作業ディレクトリを作り、Claude Codeをそこで起動します。
mkdir discord-bot && cd discord-bot
claude起動したら「ExpressでのDiscord Interactionsを受けるサーバーを作りたい。discord-interactionsパッケージを使う」とプロンプトで伝えれば、package.json の初期化から依存パッケージのインストールまで進められます。プロジェクトの前提(Node.jsのバージョン、使うパッケージ、トークンを.envに置く方針など)はCLAUDE.mdに書いておくと、セッションをまたいでも同じ方針で作業してもらえます。CLAUDE.mdはClaude Codeが毎回のセッション開始時に読み込む永続的な指示ファイルで、ビルドコマンドや設計方針のような「何度も言い直したくないルール」を書く場所です。
複数のスラッシュコマンドを段階的に増やしていく設計であれば、cc-sdd のような仕様駆動開発の手順を先に決めてからClaude Codeに実装させる進め方も選択肢になります。手順の型はcc-sddでClaude Codeの仕様駆動開発を実践するで扱っています。
手順2: Discord Developer Portalでアプリを登録する
ここはブラウザ操作が必要なので、Claude Codeでは代行できません。自分の手で進めます。
- Discord Developer Portalで新規アプリを作成する
- General InformationページでApplication IDとPublic Keyを控える
- BotページでReset Tokenを実行し、Bot Tokenを控える(再表示できないため、控え漏れに注意)
- InstallationページでInstallation Contextsを選ぶ(サーバー導入・個人アカウント導入のどちらか、または両方)
- 同じページのDefault Install Settingsで、Guild Installに
applications.commandsとbotスコープ、User Installにapplications.commandsスコープを追加する - Install Linkの項目に表示されるURLをコピーし、ブラウザで開いてテスト用サーバーに追加する
この6でBotをテストサーバーに追加しておかないと、スラッシュコマンドを登録してもサーバー側に何も表示されません。
Botのトークンは公式ドキュメントでも「非常にセンシティブで、バージョン管理には絶対に含めないように」と明記されています。取得した3つの値(Application ID・Public Key・Bot Token)は.envに保存し、.gitignoreに.envを含めておきます。この.envの作成と.gitignoreへの追記はClaude Codeに任せてよい作業です。
手順3: インタラクションサーバーを実装する
Discordはスラッシュコマンドが実行されると、登録したInteraction Endpoint URLへHTTPリクエストを送ります。受け側のサーバーには2つの役割が要ります。
- Discordからのリクエストであることを検証する(Ed25519署名の検証)
PINGリクエストに応答し、コマンド実行時のペイロードを処理する
discord-interactionsパッケージには、この検証をExpressのミドルウェアとして組み込めるverifyKeyMiddlewareが用意されています。Claude Codeに「discord-interactionsのverifyKeyMiddlewareを使ってExpressサーバーを実装して」と頼めば、PUBLIC_KEYを使った検証込みのapp.jsを書いてもらえます。
コマンドを処理する部分の実装イメージは次のようになります。
// "test" コマンドを処理する例
if (name === "test") {
return res.send({
type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE,
data: {
content: `hello world`,
},
});
}InteractionResponseTypeはdiscord-interactionsパッケージがエクスポートする定数です。サーバーはデフォルトでポート3000を待ち受け、PORT環境変数で変更できます。
手順4: ngrokでエンドポイントを公開する
ローカルの3000番ポートを一時的に公開し、DiscordからのリクエストをApp側のInteraction Endpoint URLに届くようにします。
npm run start別のターミナルでngrokを起動します。
ngrok http 3000表示されたForwardingのURL(https://xxxx.ngrok.ioのような形式)の末尾に/interactionsを付け、Developer PortalのGeneral InformationページにあるInteraction Endpoint URLへ貼り付けて保存します。保存時にDiscordが自動でPINGリクエストを送り、検証が通れば設定完了です。ここで失敗する場合は、ngrokとサーバーが同じポート番号を指しているか、URLの貼り付けミスがないかを確認します。
手順5: スラッシュコマンドを登録する
コマンド自体は、DiscordのHTTP APIのPUT /applications/<application_id>/commandsエンドポイントを呼んでグローバルコマンドとして登録します。Claude Codeに登録用スクリプトを実装してもらい、実行だけ自分の環境で行う形が扱いやすいです。
npm run register登録が終わるとDiscordのサーバー側にスラッシュコマンドが表示されます。実行して、実装したハンドラーがチャンネルにメッセージを返せば一連の構築は完了です。
作業ごとの使い分け早見表
Discord Bot構築の各工程を、Claude Codeに任せやすいかどうかで並べると次のとおりです。
| 作業 | Claude Codeへの向き | 理由 |
|---|---|---|
| Expressサーバー・署名検証の実装 | Claude Codeへの向き◎ | 理由discord-interactionsの使い方を調べながらコードを書ける定型作業 |
npm install / ngrokの実行 | Claude Codeへの向き◎ | 理由Bashツールで実行可能(初回は許可プロンプトあり) |
| Developer Portalでのアプリ作成・トークン発行 | Claude Codeへの向き✕ | 理由ブラウザでの操作が必須で代行できない |
.envへのトークン保存 | Claude Codeへの向き○ | 理由値の取得は自分、書き込みはClaude Codeに任せられる |
| スラッシュコマンド登録スクリプトの実行 | Claude Codeへの向き◎ | 理由npm run register相当のコマンドで完結する |
よくあるつまずき
エンドポイント検証が失敗する
Interaction Endpoint URLを保存した直後に検証エラーになる場合、ngrokとExpressサーバーが同じポートで動いているか、URLの末尾に/interactionsが付いているかを確認します。署名検証のミドルウェアがリクエストボディの生データを見られる位置に置かれていないと、正しいリクエストでも検証に失敗します。
ngrokのURLが再起動のたびに変わる
無料プランのngrokはトンネルを張り直すたびにURLが変わります。ローカルサーバーを再起動したときは、Developer Portal側のInteraction Endpoint URLも更新し直す必要があります。
Claude Codeがコマンド実行のたびに止まる
npm installやngrokのような繰り返すコマンドを毎回確認されると作業が止まりがちです。「Yes, and don't ask again」で許可した内容は.claude/settings.local.jsonに残るので、一度許可しておけば以降は聞かれません。
トークンを誤ってコミットしてしまう
.envを.gitignoreに入れ忘れると、Bot Tokenがリポジトリに残ってしまいます。コミット前にgit statusで.envが含まれていないかを確認する習慣が安全です。含めてしまった場合はDeveloper PortalでToken自体をリセットします。
Claude CodeとDiscord以外の連携先
スラッシュコマンドの受け口ができたら、Botの中で外部サービスを呼び出す拡張も考えられます。Claude Codeから他のサービスをMCP経由で扱う実装例として、Auth0 MCPサーバーをClaude Codeで使う設定ガイドやBrowserbase MCPサーバーでクラウドブラウザをClaude Codeから操作するがあります。Botのハンドラー内からこうした外部連携を呼び出す設計にすれば、単純な応答だけでなく実際の作業を代行するコマンドに広げられます。
Slack向けに常駐bot化する実装は、構成が異なるため別の記事Anthropic Agent SDKでSlack常駐botを作るで扱っています。Discordの場合はHTTPのInteractionsエンドポイントを自分で公開する構成、Slackの例はSocket Modeで外部URL不要という違いがあります。
まとめ
Discord Bot構築の大半はClaude Codeに任せられますが、Developer Portalでのアプリ登録とトークン発行だけは自分の手で行う必要があります。手を動かす境界を分けたうえで、Expressサーバーの実装・依存パッケージのインストール・ngrokの起動・コマンド登録スクリプトの実行をClaude Codeに任せれば、スラッシュコマンドが応答するところまで一通り構築できます。