Discord
ステータス: 公式 Discord ゲートウェイ経由での DM およびギルドチャンネルに対応済み。
クイックセットアップ
新しいアプリケーションとボットを作成し、ボットをサーバーに追加し、OpenClaw とペアリングする必要があります。ボットは自身のプライベートサーバーに追加することをお勧めします。まだお持ちでない場合は、まずサーバーを作成してください (自分で作成 > 自分と友達のため を選択)。
ステップ 1: Discord アプリケーションとボットを作成する
Discord Developer Portal にアクセスし、New Application をクリックします。「OpenClaw」のような名前を付けます。サイドバーの Bot をクリックします。Username を OpenClaw エージェントの呼び名に設定します。
ステップ 2: 特権インテントを有効にする
Bot ページで、下にスクロールして Privileged Gateway Intents を有効にします:
- Message Content Intent (必須)
- Server Members Intent (推奨; ロール許可リストと名前からIDへのマッチングに必要)
- Presence Intent (オプション; プレゼンス更新が必要な場合のみ)
ステップ 3: ボットトークンをコピーする
Bot ページで上にスクロールし、Reset Token をクリックします。
ℹ️ 名前とは異なり、これは最初のトークンを生成します — 何も「リセット」されません。
トークンをコピーしてどこかに保存します。これが Bot Token で、すぐに必要になります。
ステップ 4: 招待 URL を生成し、ボットをサーバーに追加する
サイドバーの OAuth2 をクリックします。サーバーにボットを追加するための適切な権限を持つ招待 URL を生成します。OAuth2 URL Generator まで下にスクロールし、以下を有効にします:
botapplications.commands
Bot Permissions セクションが下に表示されます。以下を有効にします:
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (オプション)
下部に生成された URL をコピーし、ブラウザに貼り付けてサーバーを選択し、Continue をクリックして接続します。これで Discord サーバーにボットが表示されるはずです。
ステップ 5: 開発者モードを有効にして ID を収集する
Discord アプリに戻り、内部 ID をコピーできるように開発者モードを有効にする必要があります。
- User Settings (アバター横の歯車アイコン) → Advanced → Developer Mode をオンに切り替えます
- サイドバーのサーバーアイコンを右クリック → Copy Server ID
- 自身のアバターを右クリック → Copy User ID
Server ID と User ID を Bot Token と一緒に保存します — 次のステップでこれら3つを OpenClaw に送信します。
ステップ 6: サーバーメンバーからの DM を許可する
ペアリングを機能させるには、Discord がボットからあなたへの DM を許可する必要があります。サーバーアイコンを右クリック → Privacy Settings → Direct Messages をオンに切り替えます。これにより、サーバーメンバー(ボットを含む)があなたに DM を送信できるようになります。OpenClaw で Discord DM を使用したい場合は、これを有効にしたままにします。ギルドチャンネルのみを使用する予定の場合は、ペアリング後に DM を無効にできます。
ステップ 7: ステップ 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 ボットトークンはすでに 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: ギルド許可リストにサーバーを追加する
これにより、エージェントは DM だけでなく、サーバー上の任意のチャンネルで応答できるようになります。
「Discord Server ID
<server_id>をギルド許可リストに追加してください」
ステップ 2: @メンションなしでの応答を許可する
デフォルトでは、エージェントはギルドチャンネルで @メンションされた場合にのみ応答します。プライベートサーバーの場合、おそらくすべてのメッセージに応答してほしいでしょう。
「このサーバーでエージェントが @メンションなしで応答することを許可してください」
ステップ 3: ギルドチャンネルでのメモリを計画する
デフォルトでは、長期メモリ (MEMORY.md) は DM セッションでのみロードされます。ギルドチャンネルは MEMORY.md を自動ロードしません。
「Discord チャンネルで質問するとき、MEMORY.md からの長期的なコンテキストが必要な場合は、memory_search または memory_get を使用してください。」
次に、Discord サーバーにいくつかのチャンネルを作成し、チャットを開始します。エージェントはチャンネル名を確認でき、各チャンネルは独自の分離されたセッションを取得します — つまり、ワークフローに合わせて #coding、#home、#research などを設定できます。
ランタイムモデル
- ゲートウェイが Discord 接続を所有します。
- 返信ルーティングは決定的です: Discord からの受信は Discord に返信します。
- デフォルト (
session.dmScope=main) では、ダイレクトチャットはエージェントのメインセッション (agent:main:main) を共有します。 - ギルドチャンネルは分離されたセッションキーです (
agent:<agentId>:discord:channel:<channelId>)。 - グループ DM はデフォルトで無視されます (
channels.discord.dm.groupEnabled=false)。 - ネイティブスラッシュコマンドは分離されたコマンドセッションで実行されます (
agent:<agentId>:discord:slash:<userId>)。同時に、CommandTargetSessionKeyをルーティングされた会話セッションに引き継ぎます。
フォーラムチャンネル
Discord のフォーラムおよびメディアチャンネルはスレッド投稿のみを受け付けます。OpenClaw はそれらを作成する2つの方法をサポートしています:
- フォーラム親 (
channel:<forumId>) にメッセージを送信してスレッドを自動作成します。スレッドタイトルはメッセージの最初の空でない行を使用します。 openclaw message thread createを使用して直接スレッドを作成します。フォーラムチャンネルの場合は--message-idを渡さないでください。
例: スレッドを作成するためにフォーラム親に送信する
openclaw message send --channel discord --target channel:<forumId> \
--message "Topic title\nBody of the post"
例: 明示的にフォーラムスレッドを作成する
openclaw message thread create --channel discord --target channel:<forumId> \
--thread-name "Topic title" --message "Body of the post"
フォーラム親は Discord コンポーネントを受け付けません。コンポーネントが必要な場合は、スレッド自体 (channel:<threadId>) に送信してください。
インタラクティブコンポーネント
OpenClaw はエージェントメッセージ用に Discord コンポーネント v2 コンテナをサポートしています。components ペイロードを含むメッセージツールを使用します。インタラクション結果は通常の受信メッセージとしてエージェントにルーティングされ、既存の Discord replyToMode 設定に従います。サポートされるブロック:
text,section,separator,actions,media-gallery,file- アクション行は最大5つのボタンまたは単一の選択メニューを許可します
- 選択タイプ:
string,user,role,mentionable,channel
デフォルトでは、コンポーネントは1回使用です。components.reusable=true を設定すると、ボタン、選択、フォームが期限切れになるまで複数回使用できるようになります。ボタンをクリックできるユーザーを制限するには、そのボタンに allowedUsers を設定します (Discord ユーザー ID、タグ、または *)。設定すると、一致しないユーザーは一時的な拒否メッセージを受け取ります。/model および /models スラッシュコマンドは、プロバイダーとモデルのドロップダウン、および Submit ステップを含むインタラクティブなモデルピッカーを開きます。ピッカーの返信は一時的で、呼び出しユーザーのみが使用できます。ファイル添付:
fileブロックは添付ファイル参照 (attachment://<filename>) を指す必要がありますmedia/path/filePath経由で添付ファイルを提供します (単一ファイル); 複数ファイルの場合はmedia-galleryを使用します- アップロード名を添付ファイル参照と一致させる必要がある場合は、
filenameを使用して上書きします
モーダルフォーム:
- 最大5つのフィールドを持つ
components.modalを追加します - フィールドタイプ:
text,checkbox,radio,select,role-select,user-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(デフォルト)allowlistopen(channels.discord.allowFromに"*"を含める必要があります; レガシー:channels.discord.dm.allowFrom)disabled
DM ポリシーが open でない場合、未知のユーザーはブロックされます (または pairing モードではペアリングを促されます)。マルチアカウントの優先順位:
channels.discord.accounts.default.allowFromはdefaultアカウントにのみ適用されます。- 名前付きアカウントは、自身の
allowFromが設定されていない場合、channels.discord.allowFromを継承します。 - 名前付きアカウントは
channels.discord.accounts.default.allowFromを継承しません。
配信用の DM ターゲット形式:
user:<id><@id>メンション
明示的なユーザー/チャンネルターゲット種別が提供されない限り、単なる数値 ID は曖昧であり拒否されます。
ロールベースのエージェントルーティング
bindings[].match.roles を使用して、Discord ギルドメンバーをロール ID ごとに異なるエージェントにルーティングします。ロールベースのバインディングはロール ID のみを受け付け、ピアまたは親ピアのバインディングの後、ギルドのみのバインディングの前に評価されます。バインディングが他のマッチフィールド (例: peer + guildId + roles) も設定する場合、設定されたすべてのフィールドが一致する必要があります。
{
bindings: [
{
agentId: "opus",
match: {
channel: "discord",
guildId: "123456789012345678",
roles: ["111111111111111111"],
},
},
{
agentId: "sonnet",
match: {
channel: "discord",
guildId: "123456789012345678",
},
},
],
}
開発者ポータル設定
ネイティブコマンドとコマンド認証
commands.nativeはデフォルトで"auto"であり、Discord で有効になります。- チャンネルごとの上書き:
channels.discord.commands.native。 commands.native=falseは、以前に登録された Discord ネイティブコマンドを明示的にクリアします。- ネイティブコマンド認証は、通常のメッセージ処理と同じ Discord 許可リスト/ポリシーを使用します。
- コマンドは、認可されていないユーザーに対しても Discord UI に表示される可能性がありますが、実行時には OpenClaw 認証が適用され、「認可されていません」が返されます。
コマンドカタログと動作については スラッシュコマンド を参照してください。デフォルトのスラッシュコマンド設定:
ephemeral: true
機能詳細
ツールとアクションゲート
安全性と運用
- ボットトークンをシークレットとして扱います(監視環境では
DISCORD_BOT_TOKENが推奨)。 - 最小権限のDiscord権限を付与します。
- コマンドのデプロイ/ステートが古い場合は、ゲートウェイを再起動して
openclaw channels status --probeで再確認してください。