Discord
Discord Bot の対応状況、機能、設定。
ステータス:DMとサーバー(guild)テキストチャンネルで使用可能、公式Discord bot gatewayベース。
クイックセットアップ
1. Discord botを作成し、bot tokenをコピーします。
2. Discord Developer Portalで<strong>Message Content Intent</strong>を有効にします(allowlistやニックネーム解決を使用する場合は、<strong>Server Members Intent</strong>も有効にすることをお勧めします)。
3. OpenClawにtokenを設定します:
- Environment variable: <code>DISCORD_BOT_TOKEN=...</code>
- または設定:<code>channels.discord.token: "..."</code>。
- 両方を設定した場合、設定が優先されます(環境変数はデフォルトアカウントのフォールバックのみ)。
4. botをサーバーに招待し、メッセージの読み書き権限を付与します(DMのみを使用する場合は、テスト用のプライベートサーバーを作成することもできます)。
5. Gatewayを起動します。
6. DMはデフォルトでペアリング:最初の連絡でペアリングコードが送信され、承認後にのみメッセージが処理されます。
Minimum configuration:
{
channels: {
discord: {
enabled: true,
token: "YOUR_BOT_TOKEN",
},
},
}Goals
- DiscordのDMまたはサーバーチャンネルを通じてOpenClawとチャットします。
- DMはデフォルトでエージェントのメインセッションに折りたたまれます(デフォルト'<code>'agent:main:main'</code>');サーバーチャンネルは'<code>'agent:'<agentId>':discord:channel:'<channelId>''</code>'に分離されます(表示名は'<code>'discord:'<guildSlug>'#'<channelSlug>''</code>'を使用)。
- グループDMはデフォルトで無視されます;<code>channels.discord.dm.groupEnabled</code>で有効にし、<code>channels.discord.dm.groupChannels</code>でさらに制限できます。
- 決定論的ルーティングを維持:返信は常にソースチャンネルに戻ります。
How It Works
1. Discord Application → Botを作成し、必要なintents(DM/サーバーメッセージ/メッセージコンテンツ)を有効にし、bot tokenを取得します。
2. botをサーバーに招待し、ターゲットチャンネルでのメッセージの読み取り/送信権限を付与します。
3. OpenClawで<code>channels.discord.token</code>を設定します(または<code>DISCORD_BOT_TOKEN</code>をフォールバックとして使用)。
4. Gatewayを起動:tokenが利用可能で<code>channels.discord.enabled</code>が<code>false</code>でない場合、Discordチャンネルが自動的に起動します。
- 環境変数のみでも動作します:<code>DISCORD_BOT_TOKEN</code>を設定します(設定ブロックを書く必要はありません)。
5. DM配信ターゲットは'<code>'user:'<id>''</code>'(または'<code>''<@id>''</code>'メンション)を使用します。生の数値IDはあいまいで拒否されます。
6. サーバーチャンネル配信は'<code>'channel:'<channelId>''</code>'を使用します。デフォルトでメンションが必要で、guildまたはチャンネルごとに設定可能です。
7. DMはデフォルトでセキュリティゲートキーパー:'<code>'channels.discord.dm.policy'</code>'(デフォルト'<code>'"pairing"'</code>')。未知の送信者はペアリングコードを受け取ります(1時間有効)、承認:'<code>'openclaw pairing approve discord '<code>''</code>'。
- 誰でもDMできるようにする場合:<code>channels.discord.dm.policy="open"</code>および<code>channels.discord.dm.allowFrom=["*"]</code>。
- 厳密なallowlistの場合:<code>channels.discord.dm.policy="allowlist"</code>および<code>channels.discord.dm.allowFrom</code>で許可された送信者をリストします。
- DMを完全に無視する場合:<code>channels.discord.dm.enabled=false</code>または<code>channels.discord.dm.policy="disabled"</code>。
8. グループDMはデフォルトで無視されます;<code>channels.discord.dm.groupEnabled</code>で有効にします。
9. オプション:<code>channels.discord.guilds</code>(guild id優先)を使用してサーバールールとチャンネルルールを設定します。
10. オプション:ネイティブコマンド。<code>commands.native</code>はデフォルトで<code>"auto"</code>(Discord/Telegramはデフォルトでオン、Slackはデフォルトでオフ)。<code>channels.discord.commands.native: true|false|"auto"</code>で上書き;<code>false</code>は登録されたコマンドをクリアします。テキストコマンドは<code>commands.text</code>で制御され、個別の<code>/...</code>メッセージとして送信する必要があります。<code>commands.useAccessGroups: false</code>はコマンドのaccess-groupチェックをバイパスします。
- コマンドリストと設定:'<a href="/tools/slash-commands">'/tools/slash-commands'</a>'
11. オプション:サーバーチャンネルコンテキスト。<code>channels.discord.historyLimit</code>(デフォルト20、フォールバック<code>messages.groupChat.historyLimit</code>)は、botがメンションされたときに最近のN件のメッセージをコンテキストとして注入します;<code>0</code>に設定して無効にします。
12. Reactions:エージェントは'<code>'discord'</code>'ツール経由でトリガーできます('<code>'channels.discord.actions.*'</code>'スイッチで制御)。リアクションキャンセルのセマンティクスについては'<a href="/tools/reactions">'/tools/reactions'</a>'を参照してください。
13. ネイティブコマンドは分離されたセッションキーを使用:'<code>'agent:'<agentId>':discord:slash:'<userId>''</code>'(共有'<code>'main'</code>'セッションには書き込まれません)。
Additional notes:
- ニックネーム/ユーザー名→idの解決はguildメンバー検索に依存し、<strong>Server Members Intent</strong>が必要です;メンバー検索が失敗する場合は、idまたは<code><@id></code>メンションを直接使用してください。
- slug:すべて小文字、スペースは<code>-</code>に置換;チャンネル名のslugには<code>#</code>は含まれません。
- グループメッセージの<code>[from:]</code>行には、簡単なpingのために<code>author.tag</code> + <code>id</code>が含まれます。
設定の書き戻し(Config writes)
デフォルトでは、Discordは<code>/config set|unset</code>によってトリガーされた更新を設定ファイルに書き戻すことが許可されています(<code>commands.config: true</code>が必要)。
無効にするには:
{
channels: { discord: { configWrites: false } },
}独自のbotを作成する方法(Developer Portal)
これは、サーバーチャンネル(<code>#help</code>など)でOpenClawを使用するための典型的な設定ワークフローです。
#
1)App + Botユーザーを作成
1. Discord Developer Portal → <strong>Applications</strong> → <strong>New Application</strong>
2. アプリケーションで:
- <strong>Bot</strong> → <strong>Add Bot</strong>
- <strong>Bot Token</strong>をコピー(<code>DISCORD_BOT_TOKEN</code>用)
#
2)必要なintentsを有効にする
Discordの「特権intents」は明示的に有効にする必要があります:
<strong>Bot</strong> → <strong>Privileged Gateway Intents</strong>で有効にします:
- <strong>Message Content Intent</strong>(必須;そうしないと「Used disallowed intents」が表示されるか、botは接続してもメッセージを処理しません)
- <strong>Server Members Intent</strong>(推奨;メンバー/ユーザー検索とallowlistマッチング用)
<strong>Presence Intent</strong>は通常必要ありません。
#
3)招待リンクを生成(OAuth2 URL Generator)
アプリケーションで:<strong>OAuth2</strong> → <strong>URL Generator</strong>
<strong>Scopes</strong>
- ✅ <code>bot</code>
- ✅ <code>applications.commands</code>(ネイティブコマンドに必要)
<strong>Bot Permissions (minimum recommended)</strong>
- ✅ View Channels
- ✅ Send Messages
- ✅ Read Message History
- ✅ Embed Links
- ✅ Attach Files
- ✅ Add Reactions(オプションだが推奨)
- ✅ Use External Emojis / Stickers(オプション)
デバッグ中でbotを完全に信頼していない場合を除き、<strong>Administrator</strong>を選択しないでください。
生成されたURLをコピーし、開いてサーバーを選択してインストールを完了します。
#
4)IDを取得(guild/user/channel)
Discordは数値IDを広範囲に使用します;OpenClaw設定もIDの使用を推奨します:
1. Discord(デスクトップ/Web)→ <strong>User Settings</strong> → <strong>Advanced</strong> → <strong>Developer Mode</strong>を有効にする
2. 右クリックしてコピー:
- サーバー名 → <strong>Copy Server ID</strong>
- チャンネル → <strong>Copy Channel ID</strong>
- ユーザー → <strong>Copy User ID</strong>
#
5)OpenClawを設定
##
Token
サーバーで環境変数を使用することをお勧めします:
- <code>DISCORD_BOT_TOKEN=...</code>
または設定ファイル:
{
channels: {
discord: {
enabled: true,
token: "YOUR_BOT_TOKEN",
},
},
}複数アカウント:'<code>'channels.discord.accounts'</code>'を使用して各アカウントのtokenを設定します(オプションの'<code>'name'</code>')。共有構造については'<a href="/gateway/configuration#telegramaccounts--discordaccounts--slackaccounts--signalaccounts--imessageaccounts">'/gateway/configuration'</a>'を参照してください。
##
Allowlist + ルーティング
例:「1つのサーバーのみ、自分のみ、#helpのみ許可」:
{
channels: {
discord: {
enabled: true,
dm: { enabled: false },
guilds: {
YOUR_GUILD_ID: {
users: ["YOUR_USER_ID"],
requireMention: true,
channels: {
help: { allow: true, requireMention: true },
},
},
},
retry: {
attempts: 3,
minDelayMs: 500,
maxDelayMs: 30000,
jitter: 0.1,
},
},
},
}Explanation:
- <code>requireMention: true</code>は、メンションされた場合のみ返信することを意味します(共有チャンネルでのノイズを避けるため推奨)。
- <code>agents.list[].groupChat.mentionPatterns</code>(または<code>messages.groupChat.mentionPatterns</code>)もメンションとして扱われます。
- <code>channels</code>が存在する場合、リストされていないチャンネルはデフォルトで拒否されます。
- スレッドは親チャンネルの設定(allowlist、requireMention、skills、promptsなど)を継承しますが、スレッドのチャンネルIDを明示的に設定に追加しない限り。
- botが送信したメッセージはデフォルトで無視されます;<code>channels.discord.allowBots=true</code>で許可できます(ただし、自分のメッセージはフィルタリングされます)。
- 他のbotへの返信を許可する場合(<code>allowBots=true</code>)、bot間ループを防ぐために<code>requireMention</code>、ユーザーallowlist、明確なプロンプトを使用してください。
#
6) Verify
1. gatewayを起動します。
2. サーバーチャンネルで送信:<code>@YourBot hello</code>。
3. 反応がない場合は、以下のトラブルシューティングを参照してください。
#
トラブルシューティング
- まず<code>openclaw doctor</code>と<code>openclaw channels status --probe</code>を実行します。
- <strong>"Used disallowed intents"</strong>:Developer Portalで<strong>Message Content Intent</strong>(通常は<strong>Server Members Intent</strong>も)を有効にし、gatewayを再起動します。
- <strong>接続できるがサーバーチャンネルで返信しない</strong>:
- Message Content Intentが不足しているか、
- botにチャンネル権限がない(View/Send/Read History)か、
- 設定でメンションが必要ですが@していないか、
- allowlistがチャンネル/ユーザーを拒否した。
- <strong><code>requireMention: false</code>でも返信しない</strong>:
- <code>channels.discord.groupPolicy</code>はデフォルトで<strong>allowlist</strong>;<code>"open"</code>に設定するか、<code>channels.discord.guilds</code>で許可されたguild/channelを設定します。
- <code>DISCORD_BOT_TOKEN</code>のみを設定し、<code>channels.discord</code>設定ブロックを作成しない場合、実行時のデフォルト<code>groupPolicy</code>は<code>open</code>です。<code>channels.discord.groupPolicy</code>/<code>channels.defaults.groupPolicy</code>またはguild/channel allowlistを明示的に設定すると、制限されます。
- <code>requireMention</code>は<code>channels.discord.guilds</code>(または特定のチャンネル)の下に配置する必要があります;トップレベルの<code>channels.discord.requireMention</code>は無視されます。