Slack
ステータス: Slack アプリ統合による DM とチャンネルに対応した本番運用対応。デフォルト モードは Socket Mode で、HTTP リクエスト URL にも対応しています。ペアリング
Slack DM はデフォルトでペアリング モードです。
スラッシュコマンド
ネイティブ コマンドの挙動とコマンド カタログ。
チャンネルのトラブルシューティング
チャンネル横断の診断と修復プレイブック。
クイックセットアップ
- Socket Mode(デフォルト)
- HTTP リクエスト URL
新しい Slack アプリを作成する
Slack アプリ設定で Create New App ボタンを押します:
- from a manifest を選択し、アプリ用のワークスペースを選びます
- 以下の マニフェスト例 を貼り付け、そのまま作成を続行します
connections:writeを付けた App-Level Token (xapp-...) を生成します- アプリをインストールし、表示される Bot Token (
xoxb-...) をコピーします
マニフェストとスコープのチェックリスト
- Socket Mode(デフォルト)
- HTTP リクエスト URL
追加のマニフェスト設定
上記のデフォルトを拡張するさまざまな機能を表に出します。オプションのネイティブ スラッシュコマンド
オプションのネイティブ スラッシュコマンド
オプションの作成者スコープ(書き込み操作)
オプションの作成者スコープ(書き込み操作)
送信メッセージでデフォルトの Slack アプリ ID ではなく、アクティブなエージェント ID(カスタム ユーザー名とアイコン)を使いたい場合は、
chat:write.customize bot スコープを追加します。絵文字アイコンを使う場合、Slack では :emoji_name: 構文が必要です。オプションのユーザー トークン スコープ(読み取り操作)
オプションのユーザー トークン スコープ(読み取り操作)
channels.slack.userToken を設定する場合、一般的な読み取りスコープは次のとおりです:channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read(Slack 検索の読み取りに依存する場合)
トークン モデル
- Socket Mode には
botToken+appTokenが必要です。 - HTTP モードには
botToken+signingSecretが必要です。 botToken、appToken、signingSecret、userTokenはプレーンテキストの 文字列または SecretRef オブジェクトを受け付けます。- config のトークンは env フォールバックより優先されます。
SLACK_BOT_TOKEN/SLACK_APP_TOKENの env フォールバックはデフォルト アカウントにのみ適用されます。userToken(xoxp-...) は config 専用です(env フォールバックなし)。デフォルトでは読み取り専用動作(userTokenReadOnly: true)になります。
- Slack アカウントの検査では、認証情報ごとの
*Sourceと*Statusフィールド(botToken、appToken、signingSecret、userToken)を追跡します。 - ステータスは
available、configured_unavailable、またはmissingです。 configured_unavailableは、そのアカウントが SecretRef または別の非インラインなシークレット ソースで設定されているが、現在のコマンド/実行時パス では実際の値を解決できなかったことを意味します。- HTTP モードでは
signingSecretStatusが含まれます。Socket Mode では、 必要な組み合わせはbotTokenStatus+appTokenStatusです。
アクションとゲート
Slack アクションはchannels.slack.actions.* で制御されます。
現在の Slack ツールで利用可能なアクション グループ:
| Group | Default |
|---|---|
| messages | enabled |
| reactions | enabled |
| pins | enabled |
| memberInfo | enabled |
| emojiList | enabled |
send、upload-file、download-file、read、edit、delete、pin、unpin、list-pins、member-info、emoji-list が含まれます。
アクセス制御とルーティング
- DM ポリシー
- チャンネル ポリシー
- メンションとチャンネル ユーザー
channels.slack.dmPolicy は DM アクセスを制御します(レガシー: channels.slack.dm.policy):pairing(デフォルト)allowlistopen(channels.slack.allowFromに"*"を含める必要があります。レガシー:channels.slack.dm.allowFrom)disabled
dm.enabled(デフォルト true)channels.slack.allowFrom(推奨)dm.allowFrom(レガシー)dm.groupEnabled(グループ DM はデフォルト false)dm.groupChannels(オプションの MPIM 許可リスト)
channels.slack.accounts.default.allowFromはdefaultアカウントにのみ適用されます。- 名前付きアカウントは、自身の
allowFromが未設定の場合にchannels.slack.allowFromを継承します。 - 名前付きアカウントは
channels.slack.accounts.default.allowFromを継承しません。
openclaw pairing approve slack <code> を使用します。スレッド、セッション、返信タグ
- DM は
directとしてルーティングされ、チャンネルはchannel、MPIM はgroupとしてルーティングされます。 - デフォルトの
session.dmScope=mainでは、Slack DM はエージェントのメイン セッションに集約されます。 - チャンネル セッション:
agent:<agentId>:slack:channel:<channelId>。 - スレッド返信では、該当する場合にスレッド セッション接尾辞(
:thread:<threadTs>)が作成されることがあります。 channels.slack.thread.historyScopeのデフォルトはthread、thread.inheritParentのデフォルトはfalseです。channels.slack.thread.initialHistoryLimitは、新しいスレッド セッション開始時に取得する既存スレッド メッセージ数を制御します(デフォルトは20、無効化するには0に設定)。channels.slack.thread.requireExplicitMention(デフォルトfalse):trueの場合、暗黙のスレッド メンションを抑制し、bot がすでにそのスレッドに参加していても、スレッド内の明示的な@botメンションにのみ応答します。これがない場合、bot が参加したスレッド内の返信はrequireMentionゲートをバイパスします。
channels.slack.replyToMode:off|first|all|batched(デフォルトoff)channels.slack.replyToModeByChatType:direct|group|channelごと- ダイレクト チャット向けのレガシー フォールバック:
channels.slack.dm.replyToMode
[[reply_to_current]][[reply_to:<id>]]
replyToMode="off" は、明示的な [[reply_to_*]] タグを含め、Slack のすべての返信スレッドを無効にします。これは Telegram と異なり、Telegram では "off" モードでも明示的タグが引き続き尊重されます。この違いはプラットフォームのスレッド モデルを反映しています。Slack のスレッドはチャンネルからメッセージを隠しますが、Telegram の返信はメインのチャット フロー内で表示されたままです。
Ack reaction
ackReaction は、OpenClaw が受信メッセージを処理している間、確認用の絵文字を送信します。
解決順序:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- エージェント ID の絵文字フォールバック(
agents.list[].identity.emoji、なければ"👀")
- Slack では shortcode(たとえば
"eyes")が必要です。 - Slack アカウント単位またはグローバルでリアクションを無効化するには
""を使用します。
テキスト ストリーミング
channels.slack.streaming はライブ プレビューの挙動を制御します:
off: ライブ プレビュー ストリーミングを無効にします。partial(デフォルト): プレビュー テキストを最新の部分出力で置き換えます。block: チャンク化されたプレビュー更新を追記します。progress: 生成中は進捗ステータス テキストを表示し、その後に最終テキストを送信します。
channels.slack.streaming.nativeTransport は、channels.slack.streaming.mode が partial のときの Slack ネイティブ テキスト ストリーミングを制御します(デフォルト: true)。
- Slack ネイティブ テキスト ストリーミングと Slack assistant のスレッド ステータスを表示するには、返信スレッドが利用可能である必要があります。スレッド選択は引き続き
replyToModeに従います。 - チャンネルおよびグループ チャットのルートでは、ネイティブ ストリーミングが利用できない場合でも通常のドラフト プレビューを使用できます。
- トップレベルの Slack DM はデフォルトでスレッド外のままなので、スレッド スタイルのプレビューは表示されません。そこで進捗を見せたい場合は、スレッド返信または
typingReactionを使用してください。 - メディアおよび非テキスト ペイロードは通常配信にフォールバックします。
- 返信の途中でストリーミングに失敗した場合、OpenClaw は残りのペイロードについて通常配信にフォールバックします。
channels.slack.streamMode(replace | status_final | append)は自動的にchannels.slack.streaming.modeに移行されます。- 真偽値の
channels.slack.streamingは自動的にchannels.slack.streaming.modeとchannels.slack.streaming.nativeTransportに移行されます。 - レガシーの
channels.slack.nativeStreamingは自動的にchannels.slack.streaming.nativeTransportに移行されます。
Typing reaction フォールバック
typingReaction は、OpenClaw が返信を処理している間、受信した Slack メッセージに一時的なリアクションを追加し、実行完了時にそれを削除します。これは、デフォルトの「入力中…」ステータス インジケーターを使うスレッド返信の外で特に有用です。
解決順序:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
- Slack では shortcode(たとえば
"hourglass_flowing_sand")が必要です。 - このリアクションはベストエフォートであり、返信または失敗パスの完了後に自動クリーンアップが試行されます。
メディア、チャンク化、配信
受信添付ファイル
受信添付ファイル
Slack のファイル添付は、Slack がホストするプライベート URL からダウンロードされ(トークン認証付きリクエスト フロー)、取得に成功し、サイズ制限内であればメディア ストアに書き込まれます。実行時の受信サイズ上限は、
channels.slack.mediaMaxMb で上書きしない限り、デフォルトで 20MB です。送信テキストとファイル
送信テキストとファイル
- テキスト チャンクには
channels.slack.textChunkLimit(デフォルト 4000)を使用します channels.slack.chunkMode="newline"で段落優先の分割が有効になります- ファイル送信では Slack のアップロード API を使用し、スレッド返信(
thread_ts)を含めることができます - 送信メディアの上限は、設定されていれば
channels.slack.mediaMaxMbに従います。未設定の場合、チャンネル送信ではメディア パイプラインの MIME 種別デフォルトを使用します
配信先
配信先
推奨される明示的な送信先:
- DM には
user:<id> - チャンネルには
channel:<id>
コマンドとスラッシュの挙動
スラッシュコマンドは、Slack では 1 つの設定済みコマンド、または複数のネイティブ コマンドとして表示されます。コマンド デフォルトを変更するにはchannels.slack.slashCommand を設定します:
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
channels.slack.commands.native: true またはグローバル設定の commands.native: true で有効化します。
- Slack ではネイティブ コマンドの自動モードはオフのため、
commands.native: "auto"では Slack ネイティブ コマンドは有効になりません。
- 最大 5 個のオプション: ボタン ブロック
- 6〜100 個のオプション: static select メニュー
- 100 個を超える場合: interactivity のオプション ハンドラーが利用可能なら、非同期オプション フィルタリング付き external select
- Slack の制限を超えた場合: エンコードされたオプション値はボタンにフォールバックします
agent:<agentId>:slack:slash:<userId> のような分離キーを使用しつつ、コマンド実行自体は CommandTargetSessionKey を使って対象の会話セッションへルーティングします。
インタラクティブ返信
Slack はエージェント作成のインタラクティブ返信コントロールをレンダリングできますが、この機能はデフォルトで無効です。 グローバルに有効化するには:[[slack_buttons: Approve:approve, Reject:reject]][[slack_select: Choose a target | Canary:canary, Production:production]]
- これは Slack 固有の UI です。他のチャンネルでは Slack Block Kit ディレクティブを独自のボタン システムに変換しません。
- インタラクティブ コールバック値は OpenClaw が生成する不透明トークンであり、エージェントが生の値を書いたものではありません。
- 生成されたインタラクティブ ブロックが Slack Block Kit の制限を超える場合、OpenClaw は無効な blocks ペイロードを送信する代わりに元のテキスト返信へフォールバックします。
Slack での Exec 承認
Slack は、Web UI やターミナルにフォールバックする代わりに、インタラクティブ ボタンと interaction を備えたネイティブ承認クライアントとして動作できます。- Exec 承認では、ネイティブ DM/チャンネル ルーティングに
channels.slack.execApprovals.*を使用します。 - Plugin 承認も、リクエストがすでに Slack に届いており、承認 ID 種別が
plugin:の場合は、同じ Slack ネイティブ ボタン画面で解決できます。 - 承認者の認可は引き続き適用されます。Slack 経由でリクエストを承認または拒否できるのは、承認者として識別されたユーザーのみです。
interactivity が有効な場合、承認プロンプトは会話内に Block Kit ボタンとして直接レンダリングされます。
それらのボタンが存在する場合、それが主要な承認 UX です。OpenClaw は、
ツール結果がチャット承認を利用不可と示す場合、または手動承認が唯一の経路である場合にのみ、手動の /approve コマンドを含めるべきです。
設定パス:
channels.slack.execApprovals.enabledchannels.slack.execApprovals.approvers(オプション。可能ならcommands.ownerAllowFromにフォールバック)channels.slack.execApprovals.target(dm|channel|both、デフォルト:dm)agentFilter,sessionFilter
enabled が未設定または "auto" のときにネイティブ exec 承認を自動有効化します。Slack をネイティブ承認クライアントとして明示的に無効化するには enabled: false を設定します。
承認者が解決される場合にネイティブ承認を強制的に有効化するには enabled: true を設定します。
明示的な Slack exec 承認設定がない場合のデフォルト動作:
approvals.exec 転送は別物です。exec 承認プロンプトも
他のチャットや明示的な帯域外送信先へルーティングする必要がある場合にのみ使用してください。共有の approvals.plugin 転送も
別物です。Slack ネイティブ ボタンは、それらのリクエストがすでに Slack に届いている場合でも Plugin 承認を解決できます。
同一チャット内の /approve も、すでにコマンドに対応している Slack チャンネルと DM で動作します。完全な承認転送モデルについては Exec approvals を参照してください。
イベントと運用時の挙動
- メッセージの編集/削除/スレッド ブロードキャストは system event にマッピングされます。
- リアクションの追加/削除イベントは system event にマッピングされます。
- メンバーの参加/退出、チャンネルの作成/名前変更、ピンの追加/削除イベントは system event にマッピングされます。
channel_id_changedは、configWritesが有効な場合にチャンネル設定キーを移行できます。- チャンネル topic/purpose メタデータは信頼されていないコンテキストとして扱われ、ルーティング コンテキストに注入されることがあります。
- スレッド開始メッセージと初期スレッド履歴コンテキスト シーディングは、該当する場合、設定済み送信者許可リストでフィルタリングされます。
- Block action と modal interaction は、リッチなペイロード フィールドを持つ構造化された
Slack interaction: ...system event を出力します:- block action: 選択値、ラベル、picker 値、
workflow_*メタデータ - modal の
view_submissionおよびview_closedイベント。ルーティングされたチャンネル メタデータとフォーム入力を含みます
- block action: 選択値、ラベル、picker 値、
設定リファレンスへのポインター
主要リファレンス:-
設定リファレンス - Slack
シグナルの高い Slack フィールド:
- モード/認証:
mode,botToken,appToken,signingSecret,webhookPath,accounts.* - DM アクセス:
dm.enabled,dmPolicy,allowFrom(レガシー:dm.policy,dm.allowFrom),dm.groupEnabled,dm.groupChannels - 互換性トグル:
dangerouslyAllowNameMatching(緊急用。必要になるまでオフのままにしてください) - チャンネル アクセス:
groupPolicy,channels.*,channels.*.users,channels.*.requireMention - スレッド/履歴:
replyToMode,replyToModeByChatType,thread.*,historyLimit,dmHistoryLimit,dms.*.historyLimit - 配信:
textChunkLimit,chunkMode,mediaMaxMb,streaming,streaming.nativeTransport - 運用/機能:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
- モード/認証:
トラブルシューティング
チャンネルで返信がない
チャンネルで返信がない
次の順に確認してください:
groupPolicy- チャンネル許可リスト(
channels.slack.channels) requireMention- チャンネルごとの
users許可リスト
DM メッセージが無視される
DM メッセージが無視される
次を確認してください:
channels.slack.dm.enabledchannels.slack.dmPolicy(またはレガシーのchannels.slack.dm.policy)- ペアリング承認 / 許可リスト エントリ
Socket mode が接続しない
Socket mode が接続しない
bot トークン + app トークン、および Slack アプリ設定での Socket Mode 有効化を確認してください。
openclaw channels status --probe --json に botTokenStatus または
appTokenStatus: "configured_unavailable" が表示される場合、その Slack アカウントは
設定済みですが、現在の実行時が SecretRef に支えられた
値を解決できていません。HTTP mode でイベントを受信しない
HTTP mode でイベントを受信しない
次を確認してください:
- signing secret
- webhook path
- Slack Request URLs(Events + Interactivity + Slash Commands)
- HTTP アカウントごとに一意の
webhookPath
signingSecretStatus: "configured_unavailable" が表示される場合、その HTTP アカウントは設定済みですが、現在の実行時が
SecretRef に支えられた signing secret を解決できていません。ネイティブ/スラッシュコマンドが発火しない
ネイティブ/スラッシュコマンドが発火しない
意図したものが次のどちらかを確認してください:
- ネイティブ コマンド モード(
channels.slack.commands.native: true)で、Slack に一致するスラッシュコマンドが登録されている - または単一スラッシュコマンド モード(
channels.slack.slashCommand.enabled: true)
commands.useAccessGroups とチャンネル/ユーザー許可リストも確認してください。