openclaw.connect('discord')
/** DiscordサーバーをAI駆動のコミュニティハブに変える */
## ステップ1:Discordボットを作成
## ステップ2:OpenClawを設定
💬 ライブ例
ボットが黙っているときに確認すること
Discordに関する報告はほぼ同じ内容です。ボットはサーバーにいて、オンライン表示で、何も反応しない。読むべきエラーはありません。これらの失敗はエラーを発生させないからです。表を上から確認してください。順序は実際に原因となる頻度に対応しています。
| 症状 | 最も可能性の高い原因 | 修正する場所 |
|---|---|---|
| DMには返すがサーバーでは無反応 | Message Content Intentが無効 | Developer Portal → Bot → Privileged Gateway Intents |
| 動いていたのに1チャンネル以外で停止した | 1つ指定したことで残りが拒否リストになった | channels.discord.guilds に "*" のワイルドカードを追加 |
| requireMention: false でも反応しない | groupPolicy が "allowlist" で一致する項目がない | channels.discord.guilds と送信者の users ルール |
| DMがどこにも届かない | ペアリングコードが承認されていない | openclaw pairing approve discord <CODE> |
| 許可リストのロールが一致しない | Server Members Intentが無効 | Developer Portalの同じパネル |
許可リストの挙動は繰り返し人を躓かせるので、はっきり書いておきます。チャンネルを1つも設定していない間はすべてのチャンネルが許可されます。1件でも追加した瞬間、列挙しなかったものはすべて拒否になります。セキュリティが重要なエージェントとしては妥当な既定値ですが、小さな設定追加がサーバーの他の部分の静かな障害に変わります。
ボットの登録とトークンの受け渡し
トークンは環境変数に置き、設定ファイルには参照だけを持たせます。openclaw.jsonはissueに貼り付けられることが多いため、これは重要です。
# Developer Portal → your app → Bot → Privileged Gateway Intents # # Message Content Intent REQUIRED for normal guild messages # Server Members Intent needed for role allowlists and name→ID matching # Presence Intent optional; only for presence updates
重要なのはMessage Contentです。無効のままだとDiscordはイベント自体は送ってきますが、contentフィールドが空になります。エージェントには中身のないメッセージが届き、結果として沈黙します。後から有効にした場合はゲートウェイの再起動が必要です。
export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN"
設定に直接書かないでください。openclaw.jsonを読める人は誰でもボットを乗っ取れますし、このファイルは想像以上の頻度でスクリーンショットに写り込みます。
{
channels: {
discord: {
enabled: true,
token: { source: "env", provider: "default", id: "DISCORD_BOT_TOKEN" },
},
},
}`source: "env"` はSecretRefです。OpenClawが読み込み時に解決するため、実際の値は設定ファイルにも、共有するdiffにも残りません。
openclaw config patch --file ./discord.patch.json5 openclaw gateway restart
`config patch` は既存ファイルへのマージであり置換ではないため、既にカスタマイズ済みの設定に対して実行しても安全です。
ペアリングと、サーバーの残りを塞がないこと
DMは既定で明示的なペアリング承認が必要です。これは意図的な設計です。シェルアクセスを持つエージェントへのDM経路を、ボットを見つけた誰にでも開いておくべきではありません。
openclaw pairing list discord
ボットにDMを送った利用者のコードがここに現れます。承認するまで、そのメッセージはキューされるのではなく破棄されるため、後から遡って読むことはできません。
openclaw pairing approve discord <CODE>
一括ではなく人ごとに承認してください。説明のつかないコードがあるなら、誰かがボットを見つけています。誰がサーバーに追加できるのかを確認してください。
# Keep other channels reachable after you name even one:
{
channels: {
discord: {
guilds: {
"123456789012345678": {
channels: { "*": {} },
},
},
},
},
}このワイルドカードが、前述の既定拒否を打ち消します。一晩デバッグした後ではなく、最初の個別チャンネル設定と同時に追加してください。
実運用のサーバーに繋ぐ前に知っておくべきこと
- ✗共有サーバー上のエージェントは、見えるすべてのチャンネルのすべてのメッセージを読めます。招待した後ではなく、前に許容できるか判断してください。
- ✗Discordのレート制限は厳しめです。賑やかなサーバーで何にでも反応するエージェントは必ず絞られ、その様子は「またボットが黙った」ように見えます。
- ✗ギルドとチャンネルのキーは名前ではなくIDです。名前は変わりますがIDは変わらず、名前をキーにした許可リストはリネームで静かに機能しなくなります。
- ✗呼ばれたときだけ動いてほしいなら明示的に設定してください。「話しかけられたときだけ応答する」は設定項目であり、前提にできる既定値ではありません。