Node.jsサーバーで動作させることを前提とした、TypeScript実装のDiscord Botです。 AI連携を前提とした設計になっています。
GCP e2-micro / Oracle Always Free VMにデプロイすると無料枠で動かせてイイカンジです
- メンションでAIに相談し、必要に応じてスラッシュコマンドを自律実行
/butlerスラッシュコマンドのサブコマンド実行- イベントリマインダーの作成と定期通知
- ボイスチャンネルが開始された際の通知
このBotにおけるプラグインとは、非コア機能をモジュールとして追加するための単位です。
各プラグインは src/plugins/<plugin-name>/manifest.ts でマニフェストを公開し、起動時に一括登録されます。
プラグインの具体的な追加手順は src/plugins/README.md を参照してください。
- ユーザー向けの入口は
/butler <subcommand>に統一される - AI経由の実行でも同じツールハンドラを通る
- 非コア機能を
src/plugins/配下に閉じ込めて差し替えしやすくする
AIプロバイダは環境変数で切り替えます。 例: AI_PROVIDER=gemini。
- 対応プロバイダ: gemini / openai / claude / workersai
- Workers AIは
AI_CLOUDFLARE_ACCOUNT_IDが必要
.
├── package.json
├── tsconfig.json
├── src/
│ ├── assets/ # アセット(予定)
│ ├── core/ # 環境変数/共通ロジック
│ ├── runtime/ # Discord Botの実行機構
│ ├── plugins/ # プラグイン実装とマニフェスト
│ └── utils/ # 汎用ユーティリティ
└── ... # 省略
- Discord開発者ポータルを開く: https://discord.com/developers/applications
- 連携対象のアプリを選択(ない場合は、
New Application)して、左メニューから「OAuth2」→「URL Generator」を開く - Scopesで
botとapplications.commandsを選択する - 現状、必要な最低限のBot Permissionsは次の通り:
- View Channels / Send Messages / Read Message History
- Add Reactions / Manage Messages(リアクションの一括削除に必要)
- Manage Events(イベントリマインダーの作成/更新に必要)
- Connect / Speak / Mute Members(今後の音声機能を利用する場合に必要)
- Embed Links(リンクを整形して表示する場合に必要)
- 生成されたURLをコピーしてブラウザで開く
- 追加先のDiscordサーバーを選択して「認証」する
- 認証後、サーバー内にボットが参加していることを確認する
- 以降の起動手順に進む(環境変数の
DISCORD_TOKENが必要)
npmを前提にローカルで動かします。
.env.exampleをコピーして.envを作成する.envに本番用の値を記入する(このファイルはGit管理しない)npm ciを実行するnpm run buildを実行するnpm run startを実行する
.env.exampleをコピーして.envを作成する.envに開発用の値を記入するnpm ciを実行するnpm run devを実行する
DISCORD_TOKEN: Discord APIを利用するために必要なトークンDISCORD_GUILD_ID:/butlerをギルド限定で登録する場合のギルドID(未設定の場合はグローバル登録)NOTIFY_TEXT_CHANNEL_ID: 通知など、BOTが自発的に発言する際のテキストチャンネルIDAI_PROVIDER: 利用するAIプロバイダ(gemini / openai / claude / workersai)AI_MODEL: 利用するモデル名AI_API_KEY: AIプロバイダのAPIキーAI_CLOUDFLARE_ACCOUNT_ID: Workers AI利用時のみ必要なAccount ID (オプション)AI_PROMPT_APPEND: systemプロンプトへの追記
事前に、ユーザー設定(⚙) → 詳細設定 → 開発者モードをONにし、それぞれ次の方法でIDを取得してください。
DISCORD_GUILD_ID: サーバー名を右クリック → 「IDをコピー」NOTIFY_TEXT_CHANNEL_ID: 通知用テキストチャンネル名を右クリック → 「IDをコピー」