channels.* 配下のチャンネル別設定キー:DM とグループのアクセス、マルチアカウント構成、メンションゲーティング、および Slack、Discord、Telegram、WhatsApp、Matrix、iMessage、その他のチャンネル Plugin 向けのチャンネル別キー。
エージェント、ツール、Gateway ランタイム、その他のトップレベルキーについては、設定リファレンスを参照してください。
チャンネル
各チャンネルは、その設定セクションが存在すると自動的に起動します(enabled: false の場合を除く)。Telegram と iMessage はコア openclaw パッケージに同梱されています。その他の公式チャンネル(Discord、Slack、WhatsApp、Matrix、Microsoft Teams、IRC、Google Chat、Signal、Mattermost など)は、openclaw plugins install <spec> を使用して個別の Plugin としてインストールします。完全な一覧とインストール仕様については、チャンネルを参照してください。
DM とグループのアクセス
すべてのチャンネルで DM ポリシーとグループポリシーがサポートされています。プロバイダーの
groupPolicy が未設定の場合、channels.defaults.groupPolicy がデフォルトを設定します。
ペアリングコードは 1 時間後に期限切れになります。保留中のペアリング要求は、アカウントごとに 3 件(チャンネルとアカウント ID ごとにスコープ)に制限されます。
プロバイダーブロック自体が完全に欠けている場合(channels.<provider> が存在しない場合)、ランタイムのグループポリシーは起動時の警告を伴って allowlist(フェイルクローズ)にフォールバックします。チャンネルのモデルオーバーライド
channels.modelByChannel を使用して、特定のチャンネル ID またはダイレクトメッセージの相手をモデルに固定します。値には provider/model または設定済みのモデルエイリアスを指定できます。チャンネルマッピングは、セッションに有効なモデルオーバーライドがまだない場合にのみ適用されます(たとえば、/model で設定されたもの)。
グループ/スレッド会話の場合、キーはチャンネル固有のグループ ID、トピック ID、またはチャンネル名です。ダイレクトメッセージ(DM)会話の場合、キーはチャンネルの送信者 ID(nativeDirectUserId、origin.from、origin.to、OriginatingTo、From、または SenderId)から派生した相手の識別子です。正確なキー形式はチャンネルによって異なります。
チャンネルのデフォルトと Heartbeat
プロバイダー間で共有されるグループポリシー、暗黙的メンション、Heartbeat の動作にはchannels.defaults を使用します。
channels.defaults.groupPolicy:プロバイダーレベルのgroupPolicyが未設定の場合のフォールバックグループポリシー。channels.defaults.contextVisibility:すべてのチャンネルに対する補足コンテキストのデフォルト表示モード。値:all(デフォルト、引用/スレッド/履歴のすべてのコンテキストを含める)、allowlist(許可リスト内の送信者からのコンテキストのみを含める)、allowlist_quote(許可リストと同じだが、明示的な引用/返信コンテキストは保持)。チャンネル別のオーバーライド:channels.<channel>.contextVisibility。channels.defaults.implicitMentions:サポートされている受信情報のうち、どれをメンションとして扱うかを制御します。replyToBot、quotedBot、threadParticipationはそれぞれデフォルトでtrueとなり、現在の動作を維持します。チャンネルごとにchannels.<channel>.implicitMentions、アカウントごとにchannels.<channel>.accounts.<id>.implicitMentionsでオーバーライドできます。各フラグは、アカウント → チャンネル → デフォルトの順に個別に解決されます。名前は肯定形です。その情報がメンションゲーティングをバイパスしないようにするには、フラグをfalseに設定します。ネイティブの明示的メンションは常に許可され、チャンネルがその情報を生成しない場合、フラグは効果を持ちません。現在の生成元マトリクスについては、メンションゲーティングを参照してください。これらの設定は、送信時の返信/スレッドモードや、承認済みコマンドの処理には影響しません。channels.defaults.heartbeat.showOk:Heartbeat 出力に正常なチャンネルステータスを含めます(デフォルトはfalse)。channels.defaults.heartbeat.showAlerts:Heartbeat 出力に劣化/エラーステータスを含めます(デフォルトはtrue)。channels.defaults.heartbeat.useIndicator:コンパクトなインジケータースタイルの Heartbeat 出力をレンダリングします(デフォルトはtrue)。
- トップレベルの
bindings[]エントリでtype: "acp"を使用すると、WhatsApp の DM とグループ向けの永続的な ACP バインディングを設定できます。match.peer.idには E.164 形式の直接番号または WhatsApp グループ JID を使用します。フィールドの意味は ACP エージェントで共通化されています。
マルチアカウント WhatsApp
マルチアカウント WhatsApp
- 送信コマンドでは、アカウント
defaultが存在する場合はそれがデフォルトになります。存在しない場合は、設定済みの最初のアカウント ID(ソート順)が使用されます。 - 省略可能な
channels.whatsapp.defaultAccountが設定済みのアカウント ID と一致する場合、そのフォールバックのデフォルトアカウント選択をオーバーライドします。 - 従来のシングルアカウント Baileys 認証ディレクトリは、
openclaw doctorによってwhatsapp/defaultに移行されます。 - アカウント別のオーバーライド:
channels.whatsapp.accounts.<id>.sendReadReceipts、channels.whatsapp.accounts.<id>.dmPolicy、channels.whatsapp.accounts.<id>.allowFrom。
Telegram
- Bot トークン:
channels.telegram.botTokenまたはchannels.telegram.tokenFile(通常ファイルのみ。シンボリックリンクは拒否)を使用し、デフォルトアカウントではTELEGRAM_BOT_TOKENがフォールバックになります。 apiRootは Telegram Bot API のルート専用です。https://api.telegram.org/bot<TOKEN>ではなく、https://api.telegram.orgまたはセルフホスト/プロキシのルートを使用してください。openclaw doctor --fixは誤って末尾に付いた/bot<TOKEN>サフィックスを削除します。--localモードのセルフホスト Bot API サーバーでは、trustedLocalFileRootsに OpenClaw が読み取り可能なホストパスを列挙します。OpenClaw ホストにサーバーのデータボリュームをマウントし、そのデータルートまたはトークン別ディレクトリのいずれかを設定します。/var/lib/telegram-bot-api配下のコンテナパスは、それらのルートにマッピングされます。その他の絶対パスは引き続き拒否されます。- 省略可能な
channels.telegram.defaultAccountが設定済みのアカウント ID と一致する場合、デフォルトのアカウント選択をオーバーライドします。 - マルチアカウント構成(アカウント ID が 2 つ以上)では、フォールバックルーティングを避けるため、明示的なデフォルト(
channels.telegram.defaultAccountまたはchannels.telegram.accounts.default)を設定します。これが欠けているか無効な場合、openclaw doctorが警告します。 configWrites: falseは、Telegram によって開始される設定の書き込み(スーパーグループ ID の移行、/config set|unset)をブロックします。- トップレベルの
bindings[]エントリでtype: "acp"を使用すると、フォーラムトピック向けの永続的な ACP バインディングを設定できます(match.peer.idでは正規形式のchatId:topic:topicIdを使用)。フィールドの意味は ACP エージェントで共通化されています。 - Telegram のストリームプレビューでは
sendMessageとeditMessageTextを使用します(ダイレクトチャットとグループチャットの両方で動作)。 network.dnsResultOrderのデフォルトは"ipv4first"で、一般的な IPv6 取得エラーを回避します。- 再試行ポリシーについては、再試行ポリシーを参照してください。
Discord
- トークン:
channels.discord.token。デフォルトアカウントのフォールバックとしてDISCORD_BOT_TOKENを使用します。 - 明示的な Discord
tokenを指定する直接の送信呼び出しでは、その呼び出しに該当トークンが使用されます。アカウントの再試行およびポリシー設定は、引き続きアクティブなランタイムスナップショットで選択されたアカウントから取得されます。 - オプションの
channels.discord.defaultAccountは、設定済みのアカウント ID と一致する場合、デフォルトのアカウント選択を上書きします。 - 配信先には
user:<id>(DM)またはchannel:<id>(ギルドチャンネル)を使用します。数字だけの ID は拒否されます。 - ギルドのスラッグは小文字で、スペースを
-に置き換えます。チャンネルキーにはスラッグ化した名前を使用します(#は付けません)。ギルド ID の使用を推奨します。 - Bot が作成したメッセージはデフォルトで無視されます。
allowBots: trueで有効にできます。Bot にメンションした Bot メッセージのみを受け入れるにはallowBots: "mentions"を使用します(自身のメッセージは引き続き除外されます)。 - Bot が作成した受信メッセージをサポートするチャンネルでは、共通の Bot ループ保護を使用できます。基本となるペア予算を
channels.defaults.botLoopProtectionで設定し、特定のサーフェスに異なる制限が必要な場合にのみ、チャンネルまたはアカウントで上書きします。 channels.discord.guilds.<id>.ignoreOtherMentions(およびチャンネルごとの上書き)は、Bot ではなく別のユーザーまたはロールにメンションしているメッセージを除外します(@everyone/@here は除きます)。channels.discord.mentionAliasesは、送信前に安定した送信@handleテキストを Discord ユーザー ID にマッピングします。これにより、一時的なディレクトリキャッシュが空でも、既知のチームメイトを決定論的にメンションできます。アカウントごとの上書きはchannels.discord.accounts.<accountId>.mentionAliasesに配置します。maxLinesPerMessage(デフォルト17)は、2000 文字未満でも縦に長いメッセージを分割します。channels.discord.suppressEmbedsのデフォルトはtrueであるため、無効にしない限り、送信 URL は Discord のリンクプレビューとして展開されません。明示的なembedsペイロードは通常どおり送信されます。メッセージごとのツール呼び出しではsuppressEmbedsによって上書きできます。channels.discord.threadBindingsは、Discord のスレッドにバインドされたルーティングを制御します。enabled: スレッドにバインドされたセッション機能(/focus、/unfocus、/agents、/session idle、/session max-age、およびバインドされた配信・ルーティング)に対する Discord の上書きidleHours: 非アクティブ時に自動でフォーカスを解除するまでの時間数に対する Discord の上書き(0で無効化)maxAgeHours: 最大存続時間(時間単位)に対する Discord の上書き(0で無効化)spawnSessions:sessions_spawn({ thread: true })および ACP のスレッド生成時における、スレッドの自動作成・バインド用スイッチ(デフォルト:true)defaultSpawnContext: スレッドにバインドされた生成用のネイティブサブエージェントコンテキスト(デフォルトは"fork")
type: "acp"を持つトップレベルのbindings[]エントリは、チャンネルおよびスレッドの永続的な ACP バインドを設定します(match.peer.idにはチャンネルまたはスレッド ID を使用します)。フィールドのセマンティクスについては、ACP エージェントで共通に説明しています。channels.discord.ui.components.accentColorは、Discord components v2 コンテナのアクセントカラーを設定します。channels.discord.agentComponents.ttlMsは、送信済みの Discord コンポーネントコールバックを登録状態に保つ時間を制御します。デフォルトは1800000(30 分)、最大は86400000(24 時間)です。アカウントごとの上書きはchannels.discord.accounts.<accountId>.agentComponents.ttlMsに配置します。ワークフローに適合する最短の TTL を推奨します。channels.discord.voiceは、Discord ボイスチャンネルでの会話と、オプションの自動参加、LLM、TTS の上書きを有効にします。テキストのみの Discord 設定では、ボイスはデフォルトで無効です。有効にするにはchannels.discord.voice.enabled=trueを設定します。channels.discord.voice.modelは、Discord ボイスチャンネルへの応答に使用する LLM モデルを任意で上書きします。channels.discord.voice.daveEncryption(デフォルトtrue)およびchannels.discord.voice.decryptionFailureTolerance(デフォルト24)は、@discordjs/voiceの DAVE オプションにそのまま渡されます。channels.discord.voice.connectTimeoutMsは、/vc joinと自動参加試行における、最初の@discordjs/voiceReady 待機を制御します(デフォルト30000)。channels.discord.voice.reconnectGraceMsは、切断されたボイスセッションが再接続シグナリングに移行するまで、OpenClaw がそのセッションを破棄せずに待機する時間を制御します(デフォルト15000)。- Discord の音声再生は、別のユーザーの発話開始イベントによって中断されません。フィードバックループを防ぐため、OpenClaw は TTS の再生中に新しい音声キャプチャを無視します。
- さらに OpenClaw は、復号の失敗が繰り返された場合にボイスセッションから退出して再参加し、音声受信の復旧を試みます。
channels.discord.streamingは正規のストリームモードキーです。Discord のデフォルトはstreaming.mode: "progress"であるため、ツールや作業の進行状況は、編集される 1 件のプレビューメッセージに表示されます。無効にするにはstreaming.mode: "off"を設定します。従来のフラットキー(streamMode、chunkMode、blockStreaming、draftChunk、blockStreamingCoalesce)はランタイムで読み込まれなくなりました。永続化された設定を移行するにはopenclaw doctor --fixを実行します。channels.discord.autoPresenceは、ランタイムの可用性を Bot のプレゼンスにマッピングし(正常 => オンライン、劣化 => アイドル、枯渇 => dnd)、任意のステータステキスト上書きを許可します。channels.discord.guilds.<id>.presenceEventsは、ユーザーが利用可能になったことを示す到着イベントを、設定済みの 1 つの Discord チャンネルへエージェントのシステムイベントとしてルーティングします。対象メンバーはchannelIdを閲覧できる必要があります。公開スレッドは親の可視性を継承し、非公開スレッドではさらにメンバーシップまたは Manage Threads が必要です。usersで対象者をさらに絞り込めます。完全なGUILD_CREATEスナップショットから現在オンラインのメンバーを初期登録し、観測されたオフラインからオンラインへの遷移をルーティングします。また、未確認のメンバーから後で初めてオンライン信号を受信した場合、スナップショット後にオンラインになったのか参加したのかは断定せず、新たに利用可能になったものとして扱います。Discord の 75,000 メンバーのスナップショット上限を超えるギルドでは、最初に明示的なオフライン更新が必要です。スロットリング設定:reconnectSuppressSeconds(ギルドのプレゼンス状態を再構築している間、新しい Gateway セッションの後に設ける静止期間。デフォルト 300、0で無効化)およびburstLimit/burstWindowSeconds(ギルドごとに正常にキュー投入されたイベントのレート制限。デフォルトは 60s のスライディングウィンドウあたり 8 イベント)。再開されたセッションでは、再接続抑制ウィンドウは開始されません。既存のユーザーごとの再挨拶クールダウンは 8 時間のままです。これにはchannels.discord.intents.presence=true、Discord の Developer Portal にある特権 Presence Intent、および有効なエージェント Heartbeat が必要です。channels.discord.dangerouslyAllowNameMatchingは、変更可能な名前・タグによる照合を再度有効にします(緊急時の互換モード)。channels.discord.execApprovals: Discord ネイティブの実行承認配信および承認者の認可。enabled:true、false、または"auto"(デフォルト)。自動モードでは、approversまたはcommands.ownerAllowFromから承認者を解決できる場合、実行承認が有効になります。approvers: 実行リクエストの承認を許可する Discord ユーザー ID。省略した場合はcommands.ownerAllowFromにフォールバックします。agentFilter: オプションのエージェント ID 許可リスト。すべてのエージェントの承認を転送する場合は省略します。sessionFilter: オプションのセッションキーパターン(部分文字列または正規表現)。target: 承認プロンプトの送信先。"dm"(デフォルト)は承認者の DM に送信し、"channel"は送信元チャンネルに送信し、"both"は両方に送信します。送信先に"channel"が含まれる場合、ボタンを使用できるのは解決済みの承認者のみです。cleanupAfterResolve:trueの場合、承認、拒否、またはタイムアウト後に承認 DM を削除します。
off(なし)、own(Bot のメッセージ、デフォルト)、all(すべてのメッセージ)、allowlist(すべてのメッセージに対する guilds.<id>.users からのリアクション)。
Google Chat
- サービスアカウント JSON: インライン(
serviceAccount)またはファイルベース(serviceAccountFile)。 serviceAccountは SecretRef を直接受け入れます。- 環境変数のフォールバック:
GOOGLE_CHAT_SERVICE_ACCOUNTまたはGOOGLE_CHAT_SERVICE_ACCOUNT_FILE(デフォルトアカウントのみ)。 - 配信先には
spaces/<spaceId>またはusers/<userId>を使用します。 channels.googlechat.dangerouslyAllowNameMatchingは、変更可能なメールプリンシパルによる照合を再度有効にします(緊急時の互換モード)。
Slack
- Socket モードには、
botTokenとappTokenの両方が必要です(デフォルトアカウントの環境変数フォールバックにはSLACK_BOT_TOKEN+SLACK_APP_TOKEN)。 - HTTP モードには、
botTokenに加えてsigningSecret(ルートまたはアカウント単位)が必要です。 - ユーザー ID(
identity: "user")は、認可した人間として投稿および読み取りを行います。Socket モードではuserTokenとappToken、HTTP モードではuserTokenとsigningSecretが必要です。ボットトークンやボットユーザーは必要ありません。ユーザースコープとイベントサブスクリプションについては、ユーザー IDを参照してください。 enterpriseOrgInstall: trueは、アカウントを Slack Enterprise Grid の 組織全体イベントパスにオプトインします。起動時にauth.testでボットトークンを検証し、 設定されたモードが Slack のインストール ID と一致しない場合は 失敗します。Enterprise DM は無効にするか、有効なallowFrom: ["*"]とともにdmPolicy: "open"を使用する必要があります。 チャンネルおよびユーザーポリシーでは、安定した Slack ID を使用する必要があります。 変更可能な名前やサポートされていないチャンネルプレフィックスがあると起動に失敗します。V1 が処理するのは、 直接の Socket モードまたは HTTP のmessageおよびapp_mentionイベントと即時応答のみです。 リレー、コマンド、インタラクション、App Home、リアクションイベントリスナー、 ピン、アクションツール、ネイティブ承認、バインディング、遅延配信、 プロアクティブ送信は利用できません。リスナーが所有する確認応答、入力中表示、 ステータスリアクションはreactions:writeで引き続き利用できますが、受信リアクション 通知とリアクションアクションツールは利用できません。最小権限のマニフェスト、 セットアップワークフロー、完全な制限事項については、 Enterprise Grid の組織全体インストール を参照してください。socketModeは、Slack SDK Socket モードのトランスポート調整を公開 Bolt レシーバー API に渡します。ping/pong タイムアウトや古い WebSocket の動作を調査する場合にのみ使用してください。clientPingTimeoutのデフォルトは15000です。serverPingTimeoutとpingPongLoggingEnabledは、設定されている場合にのみ渡されます。botToken、appToken、signingSecret、userTokenは、プレーンテキストの 文字列または SecretRef オブジェクトを受け入れます。- Slack アカウントのスナップショットは、
botTokenSource、botTokenStatus、userTokenSource、userTokenStatus、appTokenStatus、および HTTP モードではsigningSecretStatusなど、認証情報ごとのソース/ステータスフィールドを公開します。configured_unavailableは、アカウントが SecretRef を介して設定されているものの、現在のコマンド/ランタイムパスでは シークレット値を解決できなかったことを意味します。 configWrites: falseは、Slack から開始される設定の書き込みをブロックします。- オプションの
channels.slack.defaultAccountは、設定済みのアカウント ID と一致する場合、デフォルトのアカウント選択を上書きします。 channels.slack.streaming.modeは、Slack ストリームモードの正規キーです(デフォルトは"partial")。channels.slack.streaming.nativeTransportは、Slack のネイティブストリーミングトランスポートを制御します(デフォルトはtrue)。従来のstreamMode、ブール値のstreaming、chunkMode、blockStreaming、blockStreamingCoalesce、nativeStreamingの値は、ランタイムでは読み取られなくなりました。openclaw doctor --fixを実行して、永続化された設定をstreaming.{mode,chunkMode,block.enabled,block.coalesce,nativeTransport}に移行してください。unfurlLinksとunfurlMediaは、ボットの返信について Slack のchat.postMessageリンクおよびメディア展開のブール値を渡します。unfurlLinksのデフォルトはfalseであるため、有効にしない限り、送信ボットリンクはインライン展開されません。unfurlMediaは、設定されていない場合は省略されます。1 つのアカウントでトップレベルの値を上書きするには、いずれかの値をchannels.slack.accounts.<accountId>に設定します。- 配信先には
user:<id>(DM)またはchannel:<id>を使用します。
off、own(デフォルト)、all、allowlist(reactionAllowlist から)。
スレッドセッションの分離: thread.historyScope はスレッドごと(デフォルト)、またはチャンネル全体で共有されます。thread.inheritParent は、親チャンネルのトランスクリプトを新しいスレッドにコピーします。thread.initialHistoryLimit(デフォルトは 20)は、新しいスレッドセッションの開始時に取得する既存のスレッドメッセージ数を制限します。0 は、スレッド履歴の取得を無効にします。
- Slack ネイティブストリーミングと、Slack アシスタント形式の「入力中…」スレッドステータスには、返信スレッドの配信先が必要です。トップレベルの DM はデフォルトでスレッド外のままであるため、スレッド形式のネイティブストリーム/ステータスプレビューを表示する代わりに、Slack の下書き投稿・編集プレビューを通じて引き続きストリーミングできます。
typingReactionは、返信の実行中に受信 Slack メッセージへ一時的なリアクションを追加し、完了時に削除します。"hourglass_flowing_sand"のような Slack 絵文字ショートコードを使用してください。channels.slack.execApprovals:Slack ネイティブの承認クライアント配信および実行承認者の認可。Discord と同じスキーマです:enabled(true/false/"auto")、approvers(Slack ユーザー ID)、agentFilter、sessionFilter、target("dm"、"channel"、または"both")。Slack Plugin の承認者を解決できる場合、Plugin の承認は Slack からのリクエストにこのネイティブクライアントパスを使用できます。Slack ネイティブの Plugin 承認配信は、Slack 由来のセッションまたは Slack の配信先に対してapprovals.pluginを介して有効にすることもできます。Plugin の承認では、実行承認者ではなく、allowFromの Slack Plugin 承認者とデフォルトルーティングを使用します。
Mattermost
Mattermost は、Discord、Slack、WhatsApp と同様に、独立した Plugin としてインストールします。oncall(@メンションに応答、デフォルト)、onmessage(すべてのメッセージ)、onchar(トリガープレフィックスで始まるメッセージ)。
Mattermost のネイティブコマンドを有効にする場合:
commands.callbackPathは完全な URL ではなく、パス(例:/api/channels/mattermost/command)である必要があります。commands.callbackUrlは OpenClaw Gateway エンドポイントに解決され、Mattermost サーバーから到達可能である必要があります。- ネイティブスラッシュコールバックは、スラッシュコマンドの登録時に
Mattermost から返されるコマンドごとのトークンで認証されます。登録に失敗した場合や、
有効化されたコマンドがない場合、OpenClaw は
Unauthorized: invalid command token.でコールバックを拒否します。 - プライベート/tailnet/内部コールバックホストの場合、Mattermost では
ServiceSettings.AllowedUntrustedInternalConnectionsにコールバックのホスト/ドメインを含める必要があることがあります。 完全な URL ではなく、ホスト/ドメイン値を使用してください。 channels.mattermost.configWrites:Mattermost から開始される設定の書き込みを許可または拒否します。channels.mattermost.requireMention:チャンネル内で返信する前に@mentionを必須にします。channels.mattermost.groups.<channelId>.requireMention:チャンネル単位のメンションゲート上書き(デフォルトには"*")。- オプションの
channels.mattermost.defaultAccountは、設定済みのアカウント ID と一致する場合、デフォルトのアカウント選択を上書きします。
Signal
off、own(デフォルト)、all、allowlist(reactionAllowlist から)。
channels.signal.account:チャンネルの起動を特定の Signal アカウント ID に固定します。channels.signal.configWrites:Signal から開始される設定の書き込みを許可または拒否します。- オプションの
channels.signal.defaultAccountは、設定済みのアカウント ID と一致する場合、デフォルトのアカウント選択を上書きします。
iMessage
OpenClaw はimsg rpc(stdio 経由の JSON-RPC)を起動します。デーモンやポートは不要です。ホストで Messages データベースと Automation の権限を付与できる場合、新しい OpenClaw iMessage セットアップではこれが推奨される方法です。
BlueBubbles のサポートは削除されました。現在の OpenClaw では、channels.bluebubbles はサポート対象のランタイム設定サーフェスではありません。古い設定を channels.imessage に移行してください。概要についてはBlueBubbles の削除と imsg iMessage パス、完全な変換表についてはBlueBubbles からの移行を参照してください。
Gateway が Messages にサインインしている Mac 上で動作していない場合は、channels.imessage.enabled=true を維持し、channels.imessage.cliPath を、その Mac 上で imsg "$@" を実行する SSH ラッパーに設定します。デフォルトのローカル imsg パスは macOS 専用です。
本番送信で SSH ラッパーに依存する前に、そのラッパーを実際に経由する送信 imsg send を検証してください。一部の macOS TCC 状態では、メッセージのオートメーション権限が /usr/libexec/sshd-keygen-wrapper に割り当てられるため、読み取りとプローブは動作しても、送信は AppleEvents -1743 で失敗することがあります。iMessage の SSH ラッパーのトラブルシューティングセクションを参照してください。
- 任意の
channels.imessage.defaultAccountは、設定済みのアカウント ID と一致する場合にデフォルトのアカウント選択を上書きします。 - Messages DB へのフルディスクアクセスが必要です。
chat_id:<id>ターゲットを優先してください。チャットを一覧表示するにはimsg chats --limit 20を使用します。cliPathは SSH ラッパーを指定できます。SCP による添付ファイル取得にはremoteHost(hostまたはuser@host)を設定します。attachmentRootsとremoteAttachmentRootsは受信添付ファイルのパスを制限します(デフォルト:/Users/*/Library/Messages/Attachments)。- SCP は厳密なホストキー検証を使用するため、リレーホストのキーが
~/.ssh/known_hostsにすでに存在することを確認してください。 channels.imessage.configWrites: iMessage から開始された設定書き込みを許可または拒否します。channels.imessage.sendTransport: 通常の送信返信に使用する優先imsgRPC 送信トランスポートです。auto(デフォルト)は、実行中であれば既存チャットに IMCore ブリッジを使用し、その後 AppleScript にフォールバックします。bridgeはプライベート API による配信を必須とし、applescriptは公開の Messages オートメーション経路を強制します。channels.imessage.actions.*:imsg status/openclaw channels status --probeによっても制御されるプライベート API アクションを有効にします。channels.imessage.includeAttachmentsはデフォルトで無効です。エージェントターンで受信メディアを利用するには、trueに設定してください。- ブリッジまたは Gateway の再起動後の受信復旧は自動です(GUID 重複排除と古いバックログに対する経過時間制限)。既存の
channels.imessage.catchup.enabled: true設定は非推奨の互換性プロファイルとして引き続き尊重されます。catchupはデフォルトで無効です。 channels.imessage.groups: グループレジストリとグループごとの設定です。groupPolicy: "allowlist"を使用する場合、グループメッセージがレジストリゲートを通過できるように、明示的なchat_idキーまたは"*"ワイルドカードエントリのいずれかを設定してください。type: "acp"を持つトップレベルのbindings[]エントリは、iMessage の会話を永続 ACP セッションにバインドできます。match.peer.idには、正規化されたハンドルまたは明示的なチャットターゲット(chat_id:*、chat_guid:*、chat_identifier:*)を使用してください。共通フィールドのセマンティクス: ACP エージェント。
iMessage SSH ラッパーの例
iMessage SSH ラッパーの例
Matrix
Matrix は Plugin によって提供され、channels.matrix 配下で設定します。
- トークン認証では
accessTokenを使用し、パスワード認証ではuserId+passwordを使用します。 channels.matrix.proxyは Matrix の HTTP トラフィックを明示的な HTTP(S) プロキシ経由でルーティングします。名前付きアカウントではchannels.matrix.accounts.<id>.proxyによって上書きできます。channels.matrix.network.dangerouslyAllowPrivateNetworkはプライベートまたは内部のホームサーバーを許可します。proxyとこのネットワークのオプトインは独立した制御です。channels.matrix.defaultAccountは、複数アカウント構成で優先するアカウントを選択します。channels.matrix.autoJoinのデフォルトは"off"です。そのため、autoJoinAllowlistまたはautoJoin: "always"を使用してautoJoin: "allowlist"を設定するまで、招待されたルームと新しい DM 形式の招待は無視されます。channels.matrix.execApprovals: Matrix ネイティブの実行承認配信と承認者の認可です。enabled:true、false、または"auto"(デフォルト)。自動モードでは、approversまたはcommands.ownerAllowFromから承認者を解決できる場合に実行承認が有効になります。approvers: 実行リクエストの承認を許可された Matrix ユーザー ID(例:@owner:example.org)。agentFilter: 任意のエージェント ID 許可リストです。すべてのエージェントの承認を転送する場合は省略します。sessionFilter: 任意のセッションキーパターン(部分文字列または正規表現)。target: 承認プロンプトの送信先です。"dm"(デフォルト)、"channel"(送信元ルーム)、または"both"。- アカウントごとの上書き:
channels.matrix.accounts.<id>.execApprovals。
channels.matrix.dm.sessionScopeは Matrix の DM をセッションにまとめる方法を制御します。per-user(デフォルト)はルーティングされたピア単位で共有し、per-roomは各 DM ルームを分離します。- Matrix のステータスプローブとライブディレクトリ検索は、ランタイムトラフィックと同じプロキシポリシーを使用します。
- Matrix の完全な設定、ターゲット指定ルール、セットアップ例については Matrix を参照してください。
Microsoft Teams
Microsoft Teams は Plugin によって提供され、channels.msteams 配下で設定します。
- ここで扱う主要なキーパス:
channels.msteams、channels.msteams.configWrites。 - Teams の完全な設定(認証情報、Webhook、DM/グループポリシー、チームごと/チャネルごとの上書き)については Microsoft Teams を参照してください。
IRC
IRC は Plugin によって提供され、channels.irc 配下で設定します。
- ここで扱う主要なキーパス:
channels.irc、channels.irc.dmPolicy、channels.irc.configWrites、channels.irc.nickserv.*。 - 任意の
channels.irc.defaultAccountは、設定済みのアカウント ID と一致する場合にデフォルトのアカウント選択を上書きします。 - IRC チャネルの完全な設定(ホスト/ポート/TLS/チャネル/許可リスト/メンションゲート)については IRC を参照してください。
複数アカウント(すべてのチャネル)
チャネルごとに複数のアカウントを実行します(各アカウントは独自のaccountId を持ちます)。
accountIdが省略された場合、defaultが使用されます(CLI + ルーティング)。- 環境変数のトークンは デフォルト アカウントにのみ適用されます。
- 基本チャネル設定は、アカウントごとに上書きしない限り、すべてのアカウントに適用されます。
- 各アカウントを異なるエージェントにルーティングするには
bindings[].match.accountIdを使用します。 - 単一アカウントのトップレベルチャネル設定を使用している状態で、
openclaw channels add(またはチャネルのオンボーディング)によってデフォルト以外のアカウントを追加すると、OpenClaw は最初にアカウントスコープのトップレベル単一アカウント値をチャネルアカウントマップへ昇格させ、元のアカウントが引き続き動作するようにします。ほとんどのチャネルではそれらをchannels.<channel>.accounts.defaultに移動します。Matrix では、既存の一致する名前付きまたはデフォルトのターゲットを代わりに保持できます。 - 既存のチャネルのみのバインディング(
accountIdなし)は引き続きデフォルトアカウントに一致します。アカウントスコープのバインディングは任意のままです。 openclaw doctor --fixは、アカウントスコープのトップレベル単一アカウント値を、そのチャネルで選択された昇格先アカウントへ移動することで、混在した形式も修復します。ほとんどのチャネルではaccounts.defaultを使用します。Matrix では、既存の一致する名前付きまたはデフォルトのターゲットを代わりに保持できます。
その他の Plugin チャネル
多くの Plugin チャネルはchannels.<id> として設定され、それぞれ専用のチャネルページに記載されています(例: Feishu、LINE、Nextcloud Talk、Nostr、QQ Bot、Synology Chat、Twitch、Zalo)。
チャネルの完全な一覧については チャネル を参照してください。
グループチャットのメンションゲート
グループメッセージでは、デフォルトで メンションが必須 です(メタデータのメンションまたは安全な正規表現パターン)。WhatsApp、Telegram、Discord、Google Chat、iMessage のグループチャットに適用されます。 表示される返信は個別に制御されます。通常のグループ、チャネル、内部 WebChat の直接リクエストでは、デフォルトで最終回答が自動配信されます。つまり、最終的なアシスタントテキストは従来の表示返信経路を通じて投稿されます。モデルが作成した送信元への返信を、エージェントがmessage(action=send) を呼び出した後にのみ投稿する場合は、messages.visibleReplies: "message_tool" または messages.groupChat.visibleReplies: "message_tool" をオプトインしてください。オプトインしたツール専用モードで、モデルがメッセージツールを呼び出さずに実質的な最終回答を返した場合、その最終テキストは非公開のままとなり、Gateway の詳細ログには抑制されたペイロードのメタデータが記録され、OpenClaw は同じ返信を message(action=send) 経由で配信するようモデルに求める復旧リトライを 1 回キューに追加します。
ツール専用ポリシーは、アシスタントの送信元への返信と汎用ツールメディアを管理します。認可されたコマンド応答、永続的な完了通知、所有ハーネスが明示的にホスト所有として分類したプロバイダーネイティブのアーティファクトなど、ランタイム所有のターミナル出力は抑制しません。ホスト所有のアーティファクトは通常のチャネルディスパッチ経路で配信され、送信 sendPolicy の拒否にも引き続き従います。周辺的な room_event ターンは、ランタイム出力がホスト所有とマークされていても、明示的なコマンドでない限り何も送信しません。
ツール専用の表示返信には、ツールを確実に呼び出すモデル/ランタイムが必要です。また、GPT-5.6 Sol などの最新世代モデルを使用する共有の周辺的なルームに推奨されます。一部の性能が低いモデルは最終テキストで回答できますが、送信元に表示する出力を message(action=send) で送信する必要があることを理解できない場合があります。OpenClaw は、最終回答が実質的であり、送信元ターンがルームイベントではなく、送信ポリシーが配信を拒否しておらず、送信元への返信がまだ送信されていない場合に限り、一般的な未配信の最終回答をデフォルトで復旧します。復旧は 1 回のリトライに制限されます。合成リトライプロンプトの永続化を抑制し、そのリトライを収集バッチの対象外にするため、無関係なキュー済みプロンプトと統合されることはありません。リトライでも未配信になるか、キューに追加できない場合、OpenClaw は「返信を生成しましたが、このチャットに配信できませんでした。もう一度お試しください。」のようなサニタイズ済み診断のみを配信します。元の非公開の最終テキストが送信元への自動配信対象としてマークされることはありません。返信が繰り返し未配信になるモデルでは、最終アシスタントターンを表示返信経路にするために "automatic" を使用するか、より強力なツール呼び出しモデルへ切り替えるか、Gateway の詳細ログで抑制されたペイロードの概要を確認するか、すべてのグループ/チャネルリクエストで表示される最終返信を使用するよう messages.groupChat.visibleReplies: "automatic" を設定してください。
アクティブなツールポリシーでメッセージツールを利用できない場合、OpenClaw は応答を黙って抑制するのではなく、自動的に表示される返信へフォールバックします。openclaw doctor は、この不一致について警告します。
このルールは、通常のエージェント最終テキストに適用されます。Plugin が所有する会話バインディングでは、バインドされたスレッドで引き受けたターンについて、所有する Plugin が返した返信を表示応答として使用します。Plugin は、それらのバインディング返信のために message(action=send) を呼び出す必要はありません。
トラブルシューティング:グループでの @メンションにより入力中と表示された後、エラーなしで応答がない
症状:グループ/チャンネルでの @メンションに入力中インジケーターが表示され、Gateway ログに dispatch complete (queuedFinal=false, replies=0) と記録されますが、ルームにはメッセージが届きません。同じエージェントへの DM には通常どおり返信があります。
原因:グループ/チャンネルの表示返信モードが "message_tool" に解決されるため、OpenClaw はターンを実行しますが、エージェントが message(action=send) を呼び出さない限り、アシスタントの最終テキストを抑制します。このモードには NO_REPLY の契約はありません。メッセージツールが呼び出されなければ、元の最終テキストは非公開になります。実質的な内容を含むソースターンについて、OpenClaw は保護された復旧再試行を 1 回行うようになりました。短いメモ、明示的な無応答、ルームイベント、送信ポリシーにより拒否されたターン、すでに配信済みのターンは再試行されません。通常のグループおよびチャンネルのターンはデフォルトで "automatic" になるため、この症状が発生するのは、messages.groupChat.visibleReplies(またはグローバルな messages.visibleReplies)が明示的に "message_tool" に設定されている場合だけです。ハーネスの defaultVisibleReplies はここには適用されません。グループ/チャンネルのリゾルバーはこれを無視し、直接/ソースチャットにのみ影響します(Codex ハーネスは、この方法で直接チャットの最終テキストを抑制します)。
修正:ツール呼び出し能力がより高いモデルを選択するか、明示的な "message_tool" オーバーライドを削除して "automatic" のデフォルトへフォールバックするか、messages.groupChat.visibleReplies: "automatic" を設定して、すべてのグループ/チャンネルリクエストで表示返信を強制します。実質的な内容を含むにもかかわらず配信されなかった最終テキストが、無応答のまま成功として終了することはなくなります。message(action=send) による 1 回の再試行で復旧するか、サニタイズされた配信失敗の診断が表示されます。ファイルの保存後、Gateway は messages 設定をホットリロードします。デプロイ環境でファイル監視または設定のリロードが無効になっている場合にのみ、Gateway を再起動してください。
メンションの種類:
- メタデータメンション:プラットフォームネイティブの @メンションです。WhatsApp のセルフチャットモードでは無視されます。
- テキストパターン:
agents.entries.*.groupChat.mentionPatterns内の安全な正規表現パターンです。無効なパターンと、安全でない入れ子状の繰り返しは無視されます。 - メンションによるゲーティングは、検出が可能な場合(ネイティブメンション、または少なくとも 1 つのパターンがある場合)にのみ適用されます。
messages.groupChat.historyLimit はグローバルデフォルトを設定します。チャンネルでは channels.<channel>.historyLimit(またはアカウント単位の設定)でオーバーライドできます。無効にするには 0 を設定します。
messages.groupChat.unmentionedInbound: "room_event" は、サポートされているチャンネルで、常時有効なグループ/チャンネルのメンションなしメッセージを静かなルームコンテキストとして送信します。メンションされたメッセージ、コマンド、ダイレクトメッセージは、引き続きユーザーリクエストとして扱われます。Discord、Slack、Telegram の完全な例については、アンビエントルームイベントを参照してください。
messages.visibleReplies はグローバルなソースイベントのデフォルトであり、messages.groupChat.visibleReplies はグループ/チャンネルのソースイベントについてこれをオーバーライドします。messages.visibleReplies が未設定の場合、直接/ソースチャットでは選択されたランタイムまたはハーネスのデフォルトが使用されますが、内部 WebChat の直接ターンでは、Pi/Codex のプロンプトと同等の動作にするため、最終出力が自動配信されます。表示出力に意図的に message(action=send) を必須とするには、messages.visibleReplies: "message_tool" を設定します。イベントを処理するかどうかは、引き続きチャンネルの許可リストとメンションによるゲーティングによって決まります。
DM 履歴の上限
provider:direct:<id>(またはレガシーな provider:dm:<id>)形式に従うすべてのチャンネルについて、channels.<provider>.dmHistoryLimit と channels.<provider>.dms.<id>.historyLimit を読み取ります。そのため、固定されたチャンネル一覧だけでなく、バンドル済みチャンネルと Plugin チャンネルの両方で機能します。
セルフチャットモード
セルフチャットモードを有効にするには、自分の番号をallowFrom に含めます(ネイティブの @メンションを無視し、テキストパターンにのみ応答します)。
コマンド(チャットコマンドの処理)
コマンドの詳細
コマンドの詳細
- このブロックではコマンドのサーフェスを設定します。現在の組み込みおよびバンドル済みコマンドのカタログについては、スラッシュコマンドを参照してください。
- このページは完全なコマンドカタログではなく、設定キーのリファレンスです。QQ Bot の
/bot-ping/bot-help/bot-logs、LINE の/card、デバイスペアリングの/pair、メモリの/dreaming、電話制御の/phone、Talk の/voiceなど、チャンネル/Plugin が所有するコマンドについては、それぞれのチャンネル/Plugin ページおよびスラッシュコマンドに記載されています。 - テキストコマンドは、先頭に
/を付けた単独のメッセージでなければなりません。 native: "auto"は Discord/Telegram でネイティブコマンドを有効にし、Slack では無効のままにします。nativeSkills: "auto"は Discord/Telegram でネイティブ Skills コマンドを有効にし、Slack では無効のままにします。- チャンネル単位でオーバーライドするには、
channels.discord.commands.native(真偽値または"auto")を使用します。Discord では、falseにより、起動時のネイティブコマンドの登録とクリーンアップが省略されます。 - チャンネル単位のネイティブ Skills 登録は、
channels.<provider>.commands.nativeSkillsでオーバーライドします。 channels.telegram.customCommandsは Telegram ボットのメニュー項目を追加します。bash: trueは、ホストシェル用の! <cmd>を有効にします。tools.elevated.enabledが必要であり、送信者がtools.elevated.allowFrom.<channel>に含まれている必要があります。config: trueは/configを有効にします(openclaw.jsonを読み書きします)。Gateway のchat.sendクライアントでは、永続的な/config set|unsetの書き込みにはoperator.adminも必要です。読み取り専用の/config showは、通常の書き込みスコープを持つオペレータークライアントでも引き続き利用できます。mcp: trueは、mcp.servers配下にある OpenClaw 管理の MCP サーバー設定用の/mcpを有効にします。plugins: trueは、Plugin の検出、インストール、有効化/無効化を制御する/pluginsを有効にします。channels.<provider>.configWritesは、チャンネル単位の設定変更を制限します(デフォルト:true)。- 複数アカウント対応チャンネルでは、
channels.<provider>.accounts.<id>.configWritesにより、そのアカウントを対象とする書き込み(たとえば/allowlist --config --account <id>や/config set channels.<provider>.accounts.<id>...)も制限されます。 restart: falseは、/restartおよび外部からのSIGUSR1再起動リクエストを無効にします。デフォルト:true。ownerAllowFromは、所有者限定コマンドおよび所有者によって制限されるチャンネル操作のための明示的な所有者許可リストです。allowFromとは別のものです。ownerDisplay: "hash"は、システムプロンプト内の所有者 ID をハッシュ化します。ハッシュ化を制御するにはownerDisplaySecretを設定します。allowFromはプロバイダー単位です。設定されている場合、これが唯一の認可ソースになります(チャンネルの許可リスト/ペアリングおよびuseAccessGroupsは無視されます)。useAccessGroups: falseは、allowFromが設定されていない場合に、コマンドがアクセスグループポリシーを回避できるようにします。- コマンドドキュメントの一覧:
関連項目
- 設定リファレンス — トップレベルキー
- 設定 — エージェント
- チャンネルの概要