Slack
ステータス: Slack アプリ統合を介した DM とチャネルに対して本番運用対応。デフォルトモードは Socket Mode で、HTTP Events API モードもサポートされています。ペアリング
Slack DM はデフォルトでペアリングモードです。
スラッシュコマンド
ネイティブコマンド動作とコマンドカタログ。
チャネルのトラブルシューティング
チャネル横断の診断と修復プレイブック。
クイックセットアップ
- Socket Mode(デフォルト)
- HTTP Events API モード
Slack アプリとトークンを作成
Slack アプリ設定で次を行います。
- Socket Mode を有効化
connections:writeを持つ App Token(xapp-...)を作成- アプリをインストールし、Bot Token(
xoxb-...)をコピー
アプリイベントを購読
次の bot イベントを購読します。
app_mentionmessage.channels,message.groups,message.im,message.mpimreaction_added,reaction_removedmember_joined_channel,member_left_channelchannel_renamepin_added,pin_removed
マニフェストとスコープのチェックリスト
Slack アプリマニフェストの例
Slack アプリマニフェストの例
オプションの user-token スコープ(読み取り操作)
オプションの user-token スコープ(読み取り操作)
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 のトークンは環境変数フォールバックより優先されます。
- 環境変数フォールバック
SLACK_BOT_TOKEN/SLACK_APP_TOKENはデフォルトアカウントにのみ適用されます。 userToken(xoxp-...)は config 専用です(環境変数フォールバックなし)。デフォルトでは読み取り専用動作(userTokenReadOnly: true)です。- オプション: 送信メッセージでアクティブなエージェントの identity(カスタム
usernameと icon)を使いたい場合はchat:write.customizeを追加してください。icon_emojiには:emoji_name:形式を使います。
- 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 allowlist)
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.replyToMode:off|first|all(デフォルト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 の返信はメインチャットフロー内で可視のままです。
確認リアクション
ackReaction は、OpenClaw が受信メッセージを処理中であることを示す確認絵文字を送信します。
解決順序:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- エージェント identity の絵文字フォールバック(
agents.list[].identity.emoji、なければ"👀")
- Slack では shortcode(例:
"eyes")が必要です。 - Slack アカウント単位またはグローバルでリアクションを無効化するには
""を使います。
テキストストリーミング
channels.slack.streaming はライブプレビュー動作を制御します。
off: ライブプレビューのストリーミングを無効化。partial(デフォルト): プレビュー文字列を最新の部分出力で置き換えます。block: チャンク化されたプレビュー更新を追加します。progress: 生成中は進捗ステータステキストを表示し、その後で最終テキストを送信します。
channels.slack.nativeStreaming は、streaming が partial のときに Slack ネイティブのテキストストリーミングを制御します(デフォルト: true)。
- Slack ネイティブのテキストストリーミングを表示するには返信スレッドが利用可能である必要があります。スレッド選択は引き続き
replyToModeに従います。利用できない場合は通常のドラフトプレビューが使われます。 - メディアおよび非テキストのペイロードは通常配信にフォールバックします。
- ストリーミングが返信の途中で失敗した場合、OpenClaw は残りのペイロードを通常配信にフォールバックします。
channels.slack.streamMode(replace | status_final | append)は自動的にchannels.slack.streamingへ移行されます。- 真偽値の
channels.slack.streamingは自動的にchannels.slack.nativeStreamingへ移行されます。
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 の upload API を使い、スレッド返信(
thread_ts)を含められます - 送信メディア上限は、設定されていれば
channels.slack.mediaMaxMbに従います。未設定の場合、チャネル送信では media pipeline の MIME 種別デフォルトが使われます
配信先
配信先
推奨される明示的なターゲット:
- DM には
user:<id> - チャネルには
channel:<id>
コマンドとスラッシュ動作
- Slack のネイティブコマンド自動モードは オフ です(
commands.native: "auto"では Slack ネイティブコマンドは有効になりません)。 - Slack ネイティブコマンドハンドラーを有効にするには
channels.slack.commands.native: true(またはグローバルのcommands.native: true)を設定してください。 - ネイティブコマンドが有効な場合は、対応するスラッシュコマンドを Slack に登録してください(
/<command>名)。ただし 1 つ例外があります。- ステータスコマンドには
/agentstatusを登録してください(Slack は/statusを予約しています)
- ステータスコマンドには
- ネイティブコマンドが有効でない場合は、
channels.slack.slashCommandにより 1 つの設定済みスラッシュコマンドを実行できます。 - ネイティブ引数メニューは、表示戦略を自動調整するようになりました。
- 最大 5 個の選択肢: button block
- 6〜100 個の選択肢: static select menu
- 100 個超の選択肢: interactivity options handler が利用可能な場合は、非同期オプションフィルタ付き external select
- エンコードされた選択肢の値が Slack 制限を超える場合、フローは button にフォールバックします
- 長い選択肢ペイロードでは、スラッシュコマンド引数メニューは選択値を送信する前に確認ダイアログを使います。
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
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 が生成した不透明トークンです。
- 生成されたインタラクティブ block が Slack Block Kit の制限を超える場合、OpenClaw は無効な block ペイロードを送信する代わりに元のテキスト返信へフォールバックします。
Slack での exec 承認
Slack は、Web UI やターミナルにフォールバックする代わりに、インタラクティブボタンと interaction を備えたネイティブ承認クライアントとして動作できます。- exec 承認はネイティブ DM/チャネルルーティングに
channels.slack.execApprovals.*を使います。 - plugin 承認も、リクエストがすでに Slack に届いていて承認 ID 種別が
plugin:の場合、同じ Slack ネイティブのボタン UI で解決できます。 - 承認者の認可は引き続き強制されます。承認または拒否できるのは承認者として識別されたユーザーのみです。
interactivity が有効な場合、承認プロンプトは会話内に直接 Block Kit ボタンとして表示されます。
それらのボタンが存在する場合、それが主要な承認 UX です。OpenClaw は、tool result がチャット承認を利用できないと示す場合、または手動承認のみが唯一の経路である場合にのみ、手動の /approve コマンドを含めるべきです。
config path:
channels.slack.execApprovals.enabledchannels.slack.execApprovals.approvers(任意。可能な場合はcommands.ownerAllowFromにフォールバック)channels.slack.execApprovals.target(dm|channel|both、デフォルト:dm)agentFilter,sessionFilter
enabled が未設定または "auto" で、少なくとも 1 人の承認者が解決される場合、ネイティブ exec 承認を自動で有効化します。Slack をネイティブ承認クライアントとして明示的に無効化するには enabled: false を設定してください。
承認者が解決されるときにネイティブ承認を強制的にオンにするには enabled: true を設定してください。
明示的な Slack exec 承認設定がない場合のデフォルト動作:
approvals.exec 転送は別機能です。exec 承認プロンプトも他のチャットまたは明示的な帯域外ターゲットへルーティングする必要がある場合にのみ使用してください。共有の approvals.plugin 転送も別機能です。Slack ネイティブボタンは、それらのリクエストがすでに Slack に届いている場合、引き続き plugin 承認を解決できます。
同一チャット内の /approve も、すでにコマンドをサポートしている Slack チャネルと DM で動作します。完全な承認転送モデルについては Exec approvals を参照してください。
イベントと運用動作
- メッセージ編集/削除/スレッドブロードキャストは system event にマップされます。
- reaction の追加/削除イベントは system event にマップされます。
- メンバー参加/離脱、チャネル作成/名称変更、pin 追加/削除イベントは system event にマップされます。
channel_id_changedは、configWritesが有効な場合にチャネル config キーを移行できます。- チャネルトピック/目的メタデータは信頼されないコンテキストとして扱われ、ルーティングコンテキストに注入できます。
- スレッド開始メッセージと初期スレッド履歴コンテキストのシーディングは、適用可能な場合、設定済み送信者 allowlist によってフィルタされます。
- Block action と modal interaction は、豊富なペイロードフィールドを持つ構造化された
Slack interaction: ...system event を出力します。- block action: 選択値、ラベル、picker 値、
workflow_*メタデータ - modal の
view_submissionおよびview_closedイベントと、ルーティングされたチャネルメタデータおよびフォーム入力
- block action: 選択値、ラベル、picker 値、
設定リファレンスへのポインタ
主なリファレンス:-
Configuration reference - 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,nativeStreaming - 運用/機能:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
- モード/認証:
トラブルシューティング
チャネルで返信がない
チャネルで返信がない
次の順で確認してください。
groupPolicy- チャネル allowlist(
channels.slack.channels) requireMention- チャネルごとの
usersallowlist
DM メッセージが無視される
DM メッセージが無視される
次を確認してください。
channels.slack.dm.enabledchannels.slack.dmPolicy(または旧形式のchannels.slack.dm.policy)- pairing 承認 / allowlist エントリ
Socket mode が接続しない
Socket mode が接続しない
bot token と app token、および Slack アプリ設定での Socket Mode 有効化を確認してください。
openclaw channels status --probe --json で botTokenStatus または
appTokenStatus: "configured_unavailable" が表示される場合、その Slack アカウントは
設定されていますが、現在のランタイムでは SecretRef ベースの
値を解決できませんでした。HTTP mode でイベントを受信しない
HTTP mode でイベントを受信しない
次を確認してください。
- signing secret
- webhook path
- Slack Request URL(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 とチャネル/ユーザー allowlist も確認してください。