Skip to main content
ステータス: 公式 Discord ゲートウェイ経由で、DM とギルドチャンネルに対応しています。

クイックセットアップ

新しいアプリケーションとボットを作成し、ボットを Discord サーバーに追加したうえで、OpenClaw とペアリングする必要があります。ボットは、自分専用のプライベートサーバーに追加する構成を推奨します。まだサーバーがない場合は、先に 作成してくださいCreate My Own > For me and my friends を選択します)。
1

Discord アプリケーションとボットを作成する

Discord Developer Portal に移動し、New Application をクリックします。名前は「OpenClaw」などで構いません。左側の Bot を開き、Username を OpenClaw エージェントとして使いたい名前に設定します。
2

特権インテントを有効にする

引き続き Bot ページで、Privileged Gateway Intents までスクロールし、次を有効にします。
  • Message Content Intent(必須)
  • Server Members Intent(推奨。ロール allowlist と名前から ID への解決に必要です)
  • Presence Intent(任意。プレゼンス更新を受信する場合のみ必要です)
3

ボットトークンをコピーする

Bot ページ上部に戻り、Reset Token をクリックします。
名前に反して、ここでは最初のトークンが生成されます。既存の何かが「リセット」されるわけではありません。
表示されたトークンをコピーして安全な場所に保存します。これは Bot Token であり、後続の設定で使用します。
4

招待 URL を生成してボットをサーバーに追加する

左側の OAuth2 を開き、ボットをサーバーに追加するための招待 URL を生成します。OAuth2 URL Generator までスクロールし、次を有効にします。
  • bot
  • applications.commands
その下に Bot Permissions が表示されるので、次を有効にします。
  • View Channels
  • Send Messages
  • Read Message History
  • Embed Links
  • Attach Files
  • Add Reactions(任意)
下部に表示された URL をコピーしてブラウザで開き、対象サーバーを選択して Continue を押します。完了すると、Discord サーバーにボットが追加されます。
5

Developer Mode を有効にして ID を取得する

Discord アプリ側で Developer Mode を有効にし、内部 ID をコピーできるようにします。
  1. User Settings(アバター横の歯車)→ AdvancedDeveloper Mode をオンにする
  2. サイドバーの サーバーアイコン を右クリックして Copy Server ID
  3. 自分のアバター を右クリックして Copy User ID
Server IDUser ID は、Bot Token とあわせて保存しておきます。次の手順でこの 3 つを使います。
6

サーバーメンバーからの DM を許可する

ペアリングを成立させるには、Discord 側でボットから DM を受け取れる必要があります。サーバーアイコン を右クリックし、Privacy Settings を開いて Direct Messages をオンにします。これにより、サーバーメンバー(ボットを含む)から DM を受信できます。OpenClaw で Discord DM を使う場合は、この設定を有効のままにしてください。ギルドチャンネルだけを使う予定であれば、ペアリング完了後に無効化しても構いません。
7

Step 0: ボットトークンを安全に設定する(チャットには送らない)

Discord のボットトークンは、パスワードと同様に機密情報です。エージェントへメッセージを送る前に、OpenClaw を動かしているマシンに設定してください。
openclaw config set channels.discord.token '"YOUR_BOT_TOKEN"' --json
openclaw config set channels.discord.enabled true --json
openclaw gateway
すでに OpenClaw をバックグラウンドサービスとして実行している場合は、openclaw gateway restart を使います。
8

OpenClaw を設定してペアリングする

既存のチャンネル(例: Telegram)で OpenClaw エージェントに次のように伝えます。Discord が最初のチャンネルである場合は、CLI / config タブを使ってください。
「Discord の bot token はすでに config に設定済みです。User ID <user_id> と Server ID <server_id> を使って Discord のセットアップを完了してください。」
9

最初の DM ペアリングを承認する

ゲートウェイが起動していることを確認したうえで、Discord からボットへ DM を送ります。ボットからペアリングコードが返されます。
既存のチャンネル上でエージェントにペアリングコードを送ります。
「この Discord のペアリングコードを承認してください: <CODE>
ペアリングコードの有効期限は 1 時間です。これで Discord の DM からエージェントと会話できるようになります。
トークン解決はアカウント単位で行われます。config に設定されたトークンが環境変数より優先されます。DISCORD_BOT_TOKEN が使われるのはデフォルトアカウントだけです。

推奨: ギルドワークスペースを用意する

DM が動作したら、Discord サーバー全体をワークスペースとして構成できます。各チャンネルは独自のコンテキストを持つ個別のエージェントセッションになり、プライベートサーバーではこの構成が特に有効です。
1

サーバーをギルド allowlist に追加する

これにより、エージェントは DM だけでなく、サーバー内のチャンネルにも応答できるようになります。
「Discord Server ID <server_id> を guild allowlist に追加してください」
2

@mention なしでも応答できるようにする

デフォルトでは、ギルドチャンネルではエージェントへの @mention がある場合だけ応答します。プライベートサーバーでは、すべてのメッセージに応答させたいケースが多くあります。
「このサーバーでは、@mention なしでもエージェントが応答できるようにしてください」
3

ギルドチャンネルでのメモリの扱いを決める

デフォルトでは、長期メモリ(MEMORY.md)は DM セッションでのみ自動読み込みされます。ギルドチャンネルでは自動では読み込まれません。
「Discord チャンネルで質問したとき、MEMORY.md の長期コンテキストが必要なら memory_search または memory_get を使ってください」
ここまで完了したら、Discord サーバー上にいくつかチャンネルを作成して会話を始めてください。エージェントはチャンネル名を認識でき、各チャンネルには独立したセッションキーが割り当てられます。#coding#home#research など、用途ごとに分けて運用できます。

ランタイムモデル

  • ゲートウェイが Discord 接続を保持します。
  • 応答ルーティングは決定的です。Discord から入った返信は Discord に返ります。
  • デフォルトでは(session.dmScope=main)、DM はエージェントのメインセッション(agent:main:main)を共有します。
  • ギルドチャンネルは独立したセッションキー(agent:<agentId>:discord:channel:<channelId>)として扱われます。
  • グループ DM はデフォルトで無視されます(channels.discord.dm.groupEnabled=false)。
  • ネイティブスラッシュコマンドは独立したコマンドセッション(agent:<agentId>:discord:slash:<userId>)で実行されますが、ルーティング先の会話セッションに対する CommandTargetSessionKey は保持されます。

フォーラムチャンネル

Discord の forum チャンネルと media チャンネルでは、投稿はスレッド形式のみ受け付けられます。OpenClaw では、次の 2 通りの作成方法に対応しています。
  • forum 親(channel:<forumId>)にメッセージを送信してスレッドを自動作成する
  • openclaw message thread create でスレッドを直接作成する。forum チャンネルでは --message-id を渡さないでください
例: forum 親に送信してスレッドを作成する
openclaw message send --channel discord --target channel:<forumId> \
  --message "Topic title\nBody of the post"
例: forum スレッドを明示的に作成する
openclaw message thread create --channel discord --target channel:<forumId> \
  --thread-name "Topic title" --message "Body of the post"
forum 親では Discord コンポーネントを受け付けません。コンポーネントが必要な場合は、スレッド本体(channel:<threadId>)に送信してください。

インタラクティブコンポーネント

OpenClaw は、エージェントメッセージ向けに Discord components v2 コンテナをサポートしています。components ペイロードを含む message ツールを使用してください。インタラクション結果は通常の受信メッセージとしてエージェントへ戻り、既存の Discord replyToMode 設定に従って処理されます。 サポートされるブロック:
  • textsectionseparatoractionsmedia-galleryfile
  • action row では最大 5 個のボタン、または 1 個の select menu を使用できます
  • select の型は stringuserrolementionablechannel です
デフォルトでは、コンポーネントは 1 回限りの利用です。components.reusable=true を指定すると、有効期限が切れるまでボタン、select、フォームを複数回利用できます。 ボタンを押せるユーザーを制限するには、そのボタンに allowedUsers を設定します(Discord ユーザー ID、タグ、または *)。設定されている場合、一致しないユーザーには一時的な拒否メッセージが返されます。 /model/models スラッシュコマンドでは、プロバイダーとモデルのドロップダウン、および Submit ステップを持つ対話型モデルピッカーが開きます。ピッカーの応答は ephemeral で、実行したユーザーだけが利用できます。 ファイル添付:
  • file ブロックは、添付参照(attachment://<filename>)を指している必要があります
  • 添付ファイルは media / path / filePath(単一ファイル)で渡します。複数ファイルには media-gallery を使用してください
  • 添付参照名とアップロード名を一致させたい場合は、filename でアップロード名を上書きします
モーダルフォーム:
  • 最大 5 フィールドまで持てる components.modal を追加できます
  • フィールド型は textcheckboxradioselectrole-selectuser-select です
  • OpenClaw がトリガーボタンを自動で追加します
例:
{
  channel: "discord",
  action: "send",
  to: "channel:123456789012345678",
  message: "Optional fallback text",
  components: {
    reusable: true,
    text: "Choose a path",
    blocks: [
      {
        type: "actions",
        buttons: [
          {
            label: "Approve",
            style: "success",
            allowedUsers: ["123456789012345678"],
          },
          { label: "Decline", style: "danger" },
        ],
      },
      {
        type: "actions",
        select: {
          type: "string",
          placeholder: "Pick an option",
          options: [
            { label: "Option A", value: "a" },
            { label: "Option B", value: "b" },
          ],
        },
      },
    ],
    modal: {
      title: "Details",
      triggerLabel: "Open form",
      fields: [
        { type: "text", label: "Requester" },
        {
          type: "select",
          label: "Priority",
          options: [
            { label: "Low", value: "low" },
            { label: "High", value: "high" },
          ],
        },
      ],
    },
  },
}

アクセス制御とルーティング

channels.discord.dmPolicy は DM へのアクセスを制御します(旧設定: channels.discord.dm.policy)。
  • pairing(デフォルト)
  • allowlist
  • openchannels.discord.allowFrom"*" を含める必要があります。旧設定: channels.discord.dm.allowFrom
  • disabled
DM ポリシーが open でない場合、不明なユーザーはブロックされます。pairing モードではペアリングが要求されます。マルチアカウント時の優先順位:
  • channels.discord.accounts.default.allowFromdefault アカウントにのみ適用されます
  • 名前付きアカウントは、自身の allowFrom が未設定なら channels.discord.allowFrom を継承します
  • 名前付きアカウントは channels.discord.accounts.default.allowFrom を継承しません
DM 配信時のターゲット形式:
  • user:<id>
  • <@id> 形式の mention
数値 ID を裸で渡すと曖昧になるため、明示的な user/channel ターゲット種別がない限り拒否されます。

ロールベースのエージェントルーティング

bindings[].match.roles を使うと、Discord ギルドメンバーをロール ID に応じて別のエージェントへ振り分けられます。ロールベースの binding はロール ID のみを受け付け、評価順は peer / parent-peer binding の後、guild 単位 binding の前です。binding に peerguildIdroles など複数の条件がある場合は、設定されたすべての条件に一致する必要があります。
{
  bindings: [
    {
      agentId: "opus",
      match: {
        channel: "discord",
        guildId: "123456789012345678",
        roles: ["111111111111111111"],
      },
    },
    {
      agentId: "sonnet",
      match: {
        channel: "discord",
        guildId: "123456789012345678",
      },
    },
  ],
}

Developer Portal の設定

  1. Discord Developer Portal → ApplicationsNew Application
  2. BotAdd Bot
  3. ボットトークンをコピーする
Bot → Privileged Gateway Intents で次を有効にします。
  • Message Content Intent
  • Server Members Intent(推奨)
Presence Intent は任意で、メンバーのプレゼンス更新を受信したい場合にのみ必要です。ボット自身のプレゼンス設定(setPresence)だけであれば、メンバー向けの presence updates を有効化する必要はありません。
OAuth URL generator:
  • scopes: bot, applications.commands
一般的な最小権限:
  • View Channels
  • Send Messages
  • Read Message History
  • Embed Links
  • Attach Files
  • Add Reactions(任意)
明示的に必要な場合を除き、Administrator は付与しないでください。
Discord の Developer Mode を有効にしたうえで、次の ID をコピーします。
  • server ID
  • channel ID
  • user ID
OpenClaw の設定では、監査や probe の信頼性のため、数値 ID の使用を推奨します。

ネイティブコマンドとコマンド認可

  • commands.native のデフォルトは "auto" で、Discord では有効になります
  • チャンネル単位の上書きは channels.discord.commands.native です
  • commands.native=false を指定すると、以前に登録された Discord ネイティブコマンドを明示的に削除します
  • ネイティブコマンドの認可には、通常メッセージ処理と同じ Discord allowlist / policy が使われます
  • 権限のないユーザーにも Discord UI 上でコマンドが見えることがありますが、実行時には OpenClaw の認可が適用され、“not authorized” が返ります
コマンド一覧と挙動は Slash commands を参照してください。 デフォルトのスラッシュコマンド設定:
  • ephemeral: true

機能の詳細

Discord は、エージェント出力に含まれる返信タグをサポートします。
  • [[reply_to_current]]
  • [[reply_to:<id>]]
これらは channels.discord.replyToMode で制御されます。
  • off(デフォルト)
  • first
  • all
注: off は暗黙的な reply threading を無効にしますが、明示的な [[reply_to_*]] タグは引き続き有効です。メッセージ ID はコンテキストや履歴にも現れるため、エージェントは特定のメッセージを対象にできます。
OpenClaw は、一時メッセージを送信し、テキストの到着にあわせて編集することで、返信ドラフトをストリーミング表示できます。
  • channels.discord.streaming はプレビュー配信を制御します(off | partial | block | progress、デフォルト: off
  • progress はチャンネル間の一貫性のために受け付けられ、Discord では partial にマッピングされます
  • channels.discord.streamMode は旧エイリアスで、自動移行されます
  • partial では、トークン到着に応じて 1 つのプレビューメッセージを編集します
  • block では、ドラフトサイズのチャンク単位で出力します。サイズや分割位置は draftChunk で調整できます
例:
{
  channels: {
    discord: {
      streaming: "partial",
    },
  },
}
block モードのデフォルトチャンク設定(channels.discord.textChunkLimit の範囲内に丸められます):
{
  channels: {
    discord: {
      streaming: "block",
      draftChunk: {
        minChars: 200,
        maxChars: 800,
        breakPreference: "paragraph",
      },
    },
  },
}
プレビュー配信はテキストのみが対象で、メディア返信は通常の配信にフォールバックします。注: preview streaming と block streaming は別機能です。Discord で block streaming が明示的に有効になっている場合、OpenClaw は二重配信を避けるため preview stream をスキップします。
ギルド履歴コンテキスト:
  • channels.discord.historyLimit のデフォルトは 20
  • フォールバックは messages.groupChat.historyLimit
  • 0 を指定すると無効になります
DM 履歴の制御:
  • channels.discord.dmHistoryLimit
  • channels.discord.dms["<user_id>"].historyLimit
スレッド挙動:
  • Discord スレッドはチャンネルセッションとしてルーティングされます
  • 親スレッドのメタデータは、親セッションとの関連付けに利用できます
  • スレッド固有の設定がない場合、スレッド設定は親チャンネル設定を継承します
チャンネルトピックは 信頼されない コンテキストとして注入されます。システムプロンプトとしては扱われません。
Discord では、スレッドを特定のセッションターゲットに固定できます。これにより、そのスレッドでの後続メッセージは同じセッション(サブエージェントセッションを含む)へ継続してルーティングされます。コマンド:
  • /focus <target> 現在または新規スレッドをサブエージェント / セッションターゲットへ固定する
  • /unfocus 現在のスレッド固定を解除する
  • /agents アクティブな実行と binding 状態を表示する
  • /session idle <duration|off> 固定中セッションの無操作による自動 unfocus 設定を確認 / 更新する
  • /session max-age <duration|off> 固定中セッションの最大寿命を確認 / 更新する
設定:
{
  session: {
    threadBindings: {
      enabled: true,
      idleHours: 24,
      maxAgeHours: 0,
    },
  },
  channels: {
    discord: {
      threadBindings: {
        enabled: true,
        idleHours: 24,
        maxAgeHours: 0,
        spawnSubagentSessions: false, // opt-in
      },
    },
  },
}
注意:
  • session.threadBindings.* はグローバルデフォルトを設定します
  • channels.discord.threadBindings.* は Discord 用の挙動を上書きします
  • sessions_spawn({ thread: true }) に対してスレッドを自動作成 / 固定するには spawnSubagentSessions を true にする必要があります
  • ACP(/acp spawn ... --thread ... または sessions_spawn({ runtime: "acp", thread: true }))でスレッドを自動作成 / 固定するには spawnAcpSessions を true にする必要があります
  • アカウントで thread binding が無効化されている場合、/focus および関連操作は利用できません
詳しくは Sub-agentsACP AgentsConfiguration Reference を参照してください。
安定した「常時接続」型の ACP ワークスペースを実現するには、Discord 会話を対象にしたトップレベルの型付き ACP binding を設定します。設定パス:
  • bindings[]type: "acp"match.channel: "discord" を指定します
例:
{
  agents: {
    list: [
      {
        id: "codex",
        runtime: {
          type: "acp",
          acp: {
            agent: "codex",
            backend: "acpx",
            mode: "persistent",
            cwd: "/workspace/openclaw",
          },
        },
      },
    ],
  },
  bindings: [
    {
      type: "acp",
      agentId: "codex",
      match: {
        channel: "discord",
        accountId: "default",
        peer: { kind: "channel", id: "222222222222222222" },
      },
      acp: { label: "codex-main" },
    },
  ],
  channels: {
    discord: {
      guilds: {
        "111111111111111111": {
          channels: {
            "222222222222222222": {
              requireMention: false,
            },
          },
        },
      },
    },
  },
}
注意:
  • スレッドメッセージは親チャンネルの ACP binding を継承できます
  • binding 済みのチャンネルまたはスレッドでは、/new/reset は同じ ACP セッションをその場でリセットします
  • 一時的な thread binding も引き続き利用でき、アクティブな間はターゲット解決を上書きできます
binding の詳細は ACP Agents を参照してください。
ギルド単位のリアクション通知モード:
  • off
  • own(デフォルト)
  • all
  • allowlistguilds.<id>.users を使用)
リアクションイベントはシステムイベントへ変換され、ルーティング済みの Discord セッションに付与されます。
ackReaction は、OpenClaw が受信メッセージを処理中であることを示す絵文字リアクションを送ります。解決順序:
  • channels.discord.accounts.<accountId>.ackReaction
  • channels.discord.ackReaction
  • messages.ackReaction
  • エージェント identity の絵文字フォールバック(agents.list[].identity.emoji、未設定時は "👀"
注意:
  • Discord は Unicode 絵文字とカスタム絵文字名の両方を受け付けます
  • チャンネルまたはアカウント単位で無効化するには "" を使います
チャンネル起点の設定書き込みは、デフォルトで有効です。これは /config set|unset のフローに影響します(コマンド機能が有効な場合)。無効化:
{
  channels: {
    discord: {
      configWrites: false,
    },
  },
}
channels.discord.proxy を使うと、Discord ゲートウェイの WebSocket 通信と起動時の REST 参照(application ID と allowlist 解決)を HTTP(S) プロキシ経由にできます。
{
  channels: {
    discord: {
      proxy: "http://proxy.example:8080",
    },
  },
}
アカウント単位の上書き:
{
  channels: {
    discord: {
      accounts: {
        primary: {
          proxy: "http://proxy.example:8080",
        },
      },
    },
  },
}
PluralKit 解決を有効にすると、プロキシされたメッセージをシステムメンバーの identity にマッピングできます。
{
  channels: {
    discord: {
      pluralkit: {
        enabled: true,
        token: "pk_live_...", // optional; needed for private systems
      },
    },
  },
}
注意:
  • allowlist では pk:<memberId> を使用できます
  • メンバー表示名の名前 / slug 一致は、channels.discord.dangerouslyAllowNameMatching: true のときだけ有効です
  • 参照には元のメッセージ ID が使われ、時間窓の制約があります
  • 解決に失敗した場合、プロキシメッセージは bot メッセージとして扱われ、allowBots=true でない限り破棄されます
プレゼンス更新は、status または activity を設定したとき、あるいは auto presence を有効にしたときに適用されます。status のみを設定する例:
{
  channels: {
    discord: {
      status: "idle",
    },
  },
}
activity を設定する例(デフォルトの activity type は custom status):
{
  channels: {
    discord: {
      activity: "Focus time",
      activityType: 4,
    },
  },
}
streaming の例:
{
  channels: {
    discord: {
      activity: "Live coding",
      activityType: 1,
      activityUrl: "https://twitch.tv/openclaw",
    },
  },
}
activity type の対応:
  • 0: Playing
  • 1: Streaming(activityUrl 必須)
  • 2: Listening
  • 3: Watching
  • 4: Custom(activity テキストを status state として使います。絵文字は任意です)
  • 5: Competing
auto presence の例(ランタイム健全性シグナル):
{
  channels: {
    discord: {
      autoPresence: {
        enabled: true,
        intervalMs: 30000,
        minUpdateIntervalMs: 15000,
        exhaustedText: "token exhausted",
      },
    },
  },
}
auto presence は、ランタイム可用性を Discord status にマッピングします。healthy は online、degraded または unknown は idle、exhausted または unavailable は dnd になります。テキスト上書き:
  • autoPresence.healthyText
  • autoPresence.degradedText
  • autoPresence.exhaustedText{reason} プレースホルダー対応)
Discord は、DM 内でのボタンベース exec 承認に対応しており、必要に応じて元のチャンネルに承認プロンプトを投稿することもできます。設定パス:
  • channels.discord.execApprovals.enabled
  • channels.discord.execApprovals.approvers
  • channels.discord.execApprovals.targetdm | channel | both、デフォルト: dm
  • agentFiltersessionFiltercleanupAfterResolve
targetchannel または both の場合、承認プロンプトはチャンネルにも表示されます。ボタンを使えるのは設定された承認者だけで、その他のユーザーには ephemeral の拒否が返されます。承認プロンプトにはコマンド本文が含まれるため、チャンネル配信は信頼できるチャンネルにだけ有効化してください。セッションキーからチャンネル ID を導出できない場合、OpenClaw は DM 配信へフォールバックします。このハンドラーのゲートウェイ認可には、他のゲートウェイクライアントと同じ共有認証情報解決契約が使われます。
  • env 優先のローカル認可(OPENCLAW_GATEWAY_TOKEN / OPENCLAW_GATEWAY_PASSWORD、次に gateway.auth.*
  • ローカルモードでは、gateway.auth.* が未設定なら gateway.remote.* をフォールバックとして使用可能
  • 必要に応じて gateway.remote.* によるリモートモードをサポート
  • URL override は override-safe です。CLI override は暗黙の認証情報を再利用せず、env override は env の認証情報だけを使います
承認時に unknown approval ID エラーが出る場合は、承認者一覧と機能の有効化状態を確認してください。関連ドキュメント: Exec approvals

ツールとアクションゲート

Discord の message action には、メッセージ送受信、チャンネル管理、モデレーション、プレゼンス、メタデータ関連のアクションが含まれます。 代表例:
  • messaging: sendMessagereadMessageseditMessagedeleteMessagethreadReply
  • reactions: reactreactionsemojiList
  • moderation: timeoutkickban
  • presence: setPresence
action gate は channels.discord.actions.* 配下にあります。 デフォルトの gate 挙動:
Action groupDefault
reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissionsenabled
rolesdisabled
moderationdisabled
presencedisabled

コンポーネント v2 UI

OpenClaw は、exec 承認と cross-context marker に Discord components v2 を使用します。Discord の message action では、カスタム UI 用の components も受け付けられます(高度な用途。Carbon component instance が必要です)。従来の embeds も引き続き利用できますが、推奨はされません。
  • channels.discord.ui.components.accentColor は、Discord component container で使用するアクセントカラー(16 進数)を設定します
  • アカウント単位では channels.discord.accounts.<id>.ui.components.accentColor で設定します
  • components v2 が存在する場合、embeds は無視されます
例:
{
  channels: {
    discord: {
      ui: {
        components: {
          accentColor: "#5865F2",
        },
      },
    },
  },
}

音声チャンネル

OpenClaw は Discord の音声チャンネルに参加し、リアルタイムで継続的な会話を行えます。これは音声メッセージ添付とは別機能です。 要件:
  • ネイティブコマンド(commands.native または channels.discord.commands.native)を有効にする
  • channels.discord.voice を設定する
  • ボットに対象音声チャンネルでの Connect と Speak 権限を付与する
セッション制御には Discord 専用のネイティブコマンド /vc join|leave|status を使います。このコマンドはアカウントのデフォルトエージェントを使い、他の Discord コマンドと同じ allowlist と group policy ルールに従います。 自動参加の例:
{
  channels: {
    discord: {
      voice: {
        enabled: true,
        autoJoin: [
          {
            guildId: "123456789012345678",
            channelId: "234567890123456789",
          },
        ],
        daveEncryption: true,
        decryptionFailureTolerance: 24,
        tts: {
          provider: "openai",
          openai: { voice: "alloy" },
        },
      },
    },
  },
}
注意:
  • voice.tts は音声再生に限って messages.tts を上書きします
  • 音声 transcript turn の owner 判定は Discord の allowFrom(または dm.allowFrom)から導かれます。owner でない発話者は、gatewaycron などの owner 限定ツールにアクセスできません
  • 音声機能はデフォルトで有効です。無効化するには channels.discord.voice.enabled=false を設定します
  • voice.daveEncryptionvoice.decryptionFailureTolerance@discordjs/voice の join option にそのまま渡されます
  • @discordjs/voice 側のデフォルトは、未設定時に daveEncryption=true および decryptionFailureTolerance=24 です
  • OpenClaw は受信時の復号失敗も監視し、短時間に繰り返し失敗した場合は音声チャンネルから一度離脱して再参加することで自動回復を試みます
  • 受信ログに DecryptionFailed(UnencryptedWhenPassthroughDisabled) が繰り返し出る場合は、上流の @discordjs/voice 受信バグである discord.js #11419 に該当している可能性があります

音声メッセージ

Discord の音声メッセージでは波形プレビューが表示され、OGG/Opus 音声とメタデータが必要です。OpenClaw は波形を自動生成しますが、音声ファイルを検査して変換するために、ゲートウェイホスト上で ffmpegffprobe が利用可能である必要があります。 要件と制約:
  • ローカルファイルパス を指定してください(URL は拒否されます)
  • テキスト本文は省略してください(Discord は同じペイロード内でテキストと音声メッセージを同時に送れません)
  • 音声形式は任意です。必要に応じて OpenClaw が OGG/Opus に変換します
例:
message(action="send", channel="discord", target="channel:123", path="/path/to/audio.mp3", asVoice=true)

トラブルシューティング

  • Message Content Intent を有効にする
  • ユーザー / メンバー解決に依存する場合は Server Members Intent も有効にする
  • intent を変更したあとはゲートウェイを再起動する
  • groupPolicy を確認する
  • channels.discord.guilds 配下の guild allowlist を確認する
  • guild の channels マップが存在する場合、列挙されたチャンネルだけが許可される
  • requireMention の挙動と mention パターンを確認する
便利な確認コマンド:
openclaw doctor
openclaw channels status --probe
openclaw logs --follow
よくある原因:
  • groupPolicy="allowlist" だが、一致する guild / channel allowlist がない
  • requireMention の設定場所が誤っている(channels.discord.guilds または channel entry の下である必要があります)
  • 送信者が guild / channel の users allowlist によってブロックされている
典型的なログ:
  • Listener DiscordMessageListener timed out after 30000ms for event MESSAGE_CREATE
  • Slow listener detected ...
  • discord inbound worker timed out after ...
listener budget の設定:
  • 単一アカウント: channels.discord.eventQueue.listenerTimeout
  • マルチアカウント: channels.discord.accounts.<accountId>.eventQueue.listenerTimeout
worker 実行タイムアウトの設定:
  • 単一アカウント: channels.discord.inboundWorker.runTimeoutMs
  • マルチアカウント: channels.discord.accounts.<accountId>.inboundWorker.runTimeoutMs
  • デフォルト: 1800000(30 分)。無効化するには 0 を指定します
推奨ベースライン:
{
  channels: {
    discord: {
      accounts: {
        default: {
          eventQueue: {
            listenerTimeout: 120000,
          },
          inboundWorker: {
            runTimeoutMs: 1800000,
          },
        },
      },
    },
  },
}
遅い listener のための余裕を増やしたい場合は eventQueue.listenerTimeout を使います。キュー済みエージェントターンに別の安全弁が必要な場合にだけ inboundWorker.runTimeoutMs を調整してください。
channels status --probe の権限チェックは、数値チャンネル ID に対してのみ完全に機能します。slug キーを使用していても、ランタイム上のマッチング自体は可能ですが、probe では権限を完全には検証できません。
  • DM が無効化されている: channels.discord.dm.enabled=false
  • DM policy が無効化されている: channels.discord.dmPolicy="disabled"(旧設定: channels.discord.dm.policy
  • pairing モードでペアリング承認待ちになっている
デフォルトでは、bot が投稿したメッセージは無視されます。channels.discord.allowBots=true を使う場合は、ループを防ぐために厳格な mention ルールと allowlist を組み合わせてください。通常は、ボット自身への mention を含む bot メッセージだけを受け付ける channels.discord.allowBots="mentions" を推奨します。
  • Discord 音声受信の回復ロジックが入っているよう、OpenClaw を最新に保つ(openclaw update
  • channels.discord.voice.daveEncryption=true(デフォルト)を確認する
  • channels.discord.voice.decryptionFailureTolerance=24(上流デフォルト)から始め、必要な場合だけ調整する
  • 次のログを確認する:
    • discord voice: DAVE decrypt failures detected
    • discord voice: repeated decrypt failures; attempting rejoin
  • 自動再参加後も失敗が続く場合は、ログを収集して discord.js #11419 と比較する

設定リファレンスの参照先

主な参照先: 特に確認頻度の高い Discord フィールド:
  • 起動 / 認可: enabledtokenaccounts.*allowBots
  • policy: groupPolicydm.*guilds.*guilds.*.channels.*
  • command: commands.nativecommands.useAccessGroupsconfigWritesslashCommand.*
  • event queue: eventQueue.listenerTimeout(listener budget)、eventQueue.maxQueueSizeeventQueue.maxConcurrency
  • inbound worker: inboundWorker.runTimeoutMs
  • reply / history: replyToModehistoryLimitdmHistoryLimitdms.*.historyLimit
  • delivery: textChunkLimitchunkModemaxLinesPerMessage
  • streaming: streaming(旧エイリアス: streamMode)、draftChunkblockStreamingblockStreamingCoalesce
  • media / retry: mediaMaxMbretry
    • mediaMaxMb は Discord への送信アップロード上限です(デフォルト: 8MB
  • actions: actions.*
  • presence: activitystatusactivityTypeactivityUrl
  • UI: ui.components.accentColor
  • features: threadBindings、トップレベルの bindings[]type: "acp")、pluralkitexecApprovalsintentsagentComponentsheartbeatresponsePrefix

セーフティと運用

  • ボットトークンは機密情報として扱ってください(監視付き環境では DISCORD_BOT_TOKEN を推奨します)
  • Discord 権限は最小権限で付与してください
  • コマンドの deploy 状態や反映状態が古い場合は、ゲートウェイを再起動し、openclaw channels status --probe で再確認してください

関連