Slack

ステータス:Slackアプリ連携によるDM + チャンネルで本番運用可能。デフォルトモードはSocket Modeで、HTTP Events APIモードもサポートしています。

クイックセットアップ

Socket Mode(デフォルト)

  ### ステップ1:Slackアプリとトークンの作成
    Slackアプリ設定で:

    - **Socket Mode**を有効化
    - `connections:write`スコープで**App Token**(`xapp-...`)を作成
    - アプリをインストールして**Bot Token**(`xoxb-...`)をコピー


  ### ステップ2:OpenClawの設定
{
  channels: {
    slack: {
      enabled: true,
      mode: "socket",
      appToken: "xapp-...",
      botToken: "xoxb-...",
    },
  },
}
    環境変数フォールバック(デフォルトアカウントのみ):
SLACK_APP_TOKEN=xapp-...
SLACK_BOT_TOKEN=xoxb-...
  ### ステップ3:アプリイベントのサブスクライブ
    以下のBotイベントをサブスクライブしてください:

    - `app_mention`
    - `message.channels`、`message.groups`、`message.im`、`message.mpim`
    - `reaction_added`、`reaction_removed`
    - `member_joined_channel`、`member_left_channel`
    - `channel_rename`
    - `pin_added`、`pin_removed`

    App Homeの**Messages Tab**も有効にしてください(DM用)。


  ### ステップ4:Gatewayの起動
openclaw gateway

HTTP Events APIモード

  ### ステップ1:Slackアプリの設定(HTTP用)

    - モードをHTTPに設定(`channels.slack.mode="http"`)
    - Slackの**Signing Secret**をコピー
    - Event Subscriptions + Interactivity + Slash commandのRequest URLを同じWebhookパスに設定(デフォルト`/slack/events`)


  ### ステップ2:OpenClaw HTTPモードの設定
{
  channels: {
    slack: {
      enabled: true,
      mode: "http",
      botToken: "xoxb-...",
      signingSecret: "your-signing-secret",
      webhookPath: "/slack/events",
    },
  },
}
  ### ステップ3:マルチアカウントHTTPのWebhookパスを一意にする
    アカウントごとのHTTPモードがサポートされています。

    各アカウントに異なる`webhookPath`を指定して登録が衝突しないようにしてください。

トークンモデル

  • Socket ModeにはbotToken + appTokenが必要です。
  • HTTPモードにはbotToken + signingSecretが必要です。
  • 設定のトークンが環境変数フォールバックより優先されます。
  • SLACK_BOT_TOKEN / SLACK_APP_TOKEN環境変数はデフォルトアカウントにのみ適用されます。
  • userTokenxoxp-...)は設定のみ(環境変数フォールバックなし)で、デフォルトは読み取り専用(userTokenReadOnly: true)です。
  • オプション:送信メッセージでアクティブなAgent ID(カスタムusernameとアイコン)を使用する場合はchat:write.customizeを追加してください。icon_emoji:emoji_name:構文を使用します。

ヒント: アクション/ディレクトリ読み取りでは、設定時にuser tokenが優先される場合があります。書き込みではbot tokenが引き続き優先されます。user tokenによる書き込みはuserTokenReadOnly: falseかつbot tokenが利用不可の場合のみ許可されます。

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

DMポリシー

`channels.slack.dmPolicy`でDMアクセスを制御します(レガシー:`channels.slack.dm.policy`):

- `pairing`(デフォルト)
- `allowlist`
- `open`(`channels.slack.allowFrom`に`"*"`を含む必要あり。レガシー:`channels.slack.dm.allowFrom`)
- `disabled`

DMフラグ:

- `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`を継承しない

DMでのペアリングは`openclaw pairing approve slack <code>`で行います。

チャンネルポリシー

`channels.slack.groupPolicy`でチャンネル処理を制御します:

- `open`
- `allowlist`
- `disabled`

チャンネル許可リストは`channels.slack.channels`に安定したチャンネルIDで設定します。

注意:`channels.slack`が完全に存在しない場合(環境変数のみのセットアップ)、ランタイムは`groupPolicy="allowlist"`にフォールバックし警告をログに記録します(`channels.defaults.groupPolicy`が設定されていても)。

名前/ID解決:

- チャンネル許可リストとDM許可リストのエントリは、トークンアクセスが許可する場合に起動時に解決されます
- 未解決のチャンネル名エントリは設定どおり保持されますがルーティングではデフォルトで無視されます
- 受信認可とチャンネルルーティングはデフォルトでID優先です。直接のユーザー名/スラグマッチングには`channels.slack.dangerouslyAllowNameMatching: true`が必要です

メンションとチャンネルユーザー

チャンネルメッセージはデフォルトでメンションゲート付きです。

メンションソース:

- 明示的なアプリメンション(`<@botId>`)
- メンション正規表現パターン(`agents.list[].groupChat.mentionPatterns`、フォールバック`messages.groupChat.mentionPatterns`)
- 暗黙的なリプライ先Bot検出(スレッド内)

チャンネルごとの制御(`channels.slack.channels.<id>`。名前は起動時解決または`dangerouslyAllowNameMatching`経由のみ):

- `requireMention`
- `users`(許可リスト)
- `allowBots`
- `skills`
- `systemPrompt`
- `tools`、`toolsBySender`
- `toolsBySender`キーフォーマット:`id:`、`e164:`、`username:`、`name:`、または`"*"`ワイルドカード

コマンドとスラッシュ動作

  • ネイティブコマンドの自動モードはSlackではオフです(commands.native: "auto"ではSlackネイティブコマンドは有効になりません)。
  • channels.slack.commands.native: true(またはグローバルcommands.native: true)でSlackネイティブコマンドハンドラーを有効にします。
  • ネイティブコマンドが有効な場合、対応するスラッシュコマンドをSlackに登録してください(例外あり):
    • statusコマンドには/agentstatusを登録してください(Slackは/statusを予約済み)
  • ネイティブコマンドが無効な場合でも、channels.slack.slashCommandで単一のスラッシュコマンドを設定・実行できます。
  • ネイティブ引数メニューはレンダリング戦略を適応的に変更します:
    • 5つ以下:ボタンブロック
    • 6〜100:静的セレクトメニュー
    • 100以上:非同期オプションフィルタリング付き外部セレクト
    • エンコードされたオプション値がSlack制限を超える場合はボタンにフォールバック

デフォルトのスラッシュコマンド設定:

  • enabled: false
  • name: "openclaw"
  • sessionPrefix: "slack:slash"
  • ephemeral: true

スラッシュセッションは隔離されたキーを使用します:

  • agent:<agentId>:slack:slash:<userId>

コマンド実行はターゲット会話セッション(CommandTargetSessionKey)に対して行われます。

インタラクティブ返信

Slackはagentが作成するインタラクティブ返信コントロールをレンダリングできますが、この機能はデフォルトで無効です。

グローバルに有効化:

{
  channels: {
    slack: {
      capabilities: {
        interactiveReplies: true,
      },
    },
  },
}

有効にすると、AgentはSlack専用の返信ディレクティブを発行できます:

  • [[slack_buttons: Approve:approve, Reject:reject]]
  • [[slack_select: Choose a target | Canary:canary, Production:production]]

これらのディレクティブはSlack Block Kitにコンパイルされ、クリックや選択は既存のSlackインタラクションイベントパスを通じてルーティングされます。

注意事項:

  • これはSlack専用のUIです。他のチャンネルはSlack Block Kitディレクティブを独自のボタンシステムに変換しません。
  • インタラクティブコールバック値はOpenClaw生成のオペークトークンであり、agentが作成した生の値ではありません。
  • 生成されたインタラクティブブロックがSlack Block Kitの制限を超える場合、無効なブロックペイロードの代わりに元のテキスト返信にフォールバックします。

スレッド、セッション、リプライタグ

  • DMはdirect、チャンネルはchannel、MPIMはgroupとしてルーティングされます。
  • デフォルトのsession.dmScope=mainでは、Slack DMはAgentメインセッションに集約されます。
  • チャンネルセッション:agent:<agentId>:slack:channel:<channelId>
  • スレッド返信は該当する場合にスレッドセッションサフィックス(:thread:<threadTs>)を作成できます。
  • channels.slack.thread.historyScopeのデフォルトはthreadthread.inheritParentのデフォルトはfalseです。
  • channels.slack.thread.initialHistoryLimitは新しいスレッドセッション開始時に取得する既存スレッドメッセージ数を制御します(デフォルト200で無効)。

返信スレッド制御:

  • channels.slack.replyToModeoff|first|all(デフォルトoff
  • channels.slack.replyToModeByChatTypedirect|group|channelごとに設定
  • ダイレクトチャットのレガシーフォールバック:channels.slack.dm.replyToMode

手動リプライタグもサポートされています:

  • [[reply_to_current]]
  • [[reply_to:<id>]]

注意:replyToMode="off"はSlackで明示的な[[reply_to_*]]タグを含むすべてのリプライスレッドを無効にします。Telegramでは"off"モードでも明示タグは機能するため、動作が異なります。

メディア、チャンキング、配信

受信添付ファイル
Slackファイル添付ファイルはSlackがホストするプライベートURL(トークン認証リクエストフロー)からダウンロードされ、取得成功かつサイズ制限内の場合にメディアストアに書き込まれます。

ランタイム受信サイズ上限は`channels.slack.mediaMaxMb`でオーバーライドしない限りデフォルト`20MB`です。
送信テキストとファイル
- テキストチャンクは`channels.slack.textChunkLimit`を使用(デフォルト4000)
- `channels.slack.chunkMode="newline"`で段落優先の分割を有効化
- ファイル送信はSlackアップロードAPIを使用し、スレッド返信(`thread_ts`)を含めることが可能
- 送信メディア上限は`channels.slack.mediaMaxMb`設定時に適用。未設定の場合はメディアパイプラインのMIME種別デフォルトを使用
配信先ターゲット
推奨される明示的ターゲット:

- `user:<id>`:DM用
- `channel:<id>`:チャンネル用

Slack DMはユーザーターゲットに送信する際にSlack会話APIで開かれます。

アクションとゲート

Slackアクションはchannels.slack.actions.*で制御されます。

現在のSlackツールで利用可能なアクショングループ:

グループデフォルト
messages有効
reactions有効
pins有効
memberInfo有効
emojiList有効

イベントと運用動作

  • メッセージの編集/削除/スレッドブロードキャストはシステムイベントにマッピングされます。
  • リアクションの追加/削除イベントはシステムイベントにマッピングされます。
  • メンバー参加/退出、チャンネル作成/リネーム、ピン追加/削除イベントはシステムイベントにマッピングされます。
  • アシスタントスレッドステータス更新(「入力中…」インジケーター)はassistant.threads.setStatusを使用し、botスコープassistant:writeが必要です。
  • channel_id_changedconfigWritesが有効な場合にチャンネル設定キーを移行できます。
  • チャンネルトピック/目的のメタデータは信頼されないコンテキストとして扱われ、ルーティングコンテキストに注入できます。

確認リアクション

ackReactionはOpenClawが受信メッセージを処理中に確認用の絵文字を送信します。

解決順序:

  • channels.slack.accounts.<accountId>.ackReaction
  • channels.slack.ackReaction
  • messages.ackReaction
  • Agent IDの絵文字フォールバック(agents.list[].identity.emoji、なければ”eyes”)

注意事項:

  • Slackはショートコード(例:"eyes")を使用します。
  • ""でSlackアカウントまたはグローバルでリアクションを無効化できます。

タイピングリアクションフォールバック

typingReactionはOpenClawが返信を処理している間、受信Slackメッセージに一時的なリアクションを追加し、実行完了時に削除します。Slackネイティブアシスタントタイピングが利用できない場合、特にDMで有用なフォールバックです。

テキストストリーミング

OpenClawはAgents and AI Apps APIを通じたSlackネイティブテキストストリーミングをサポートしています。

channels.slack.streamingでライブプレビュー動作を制御します:

  • off:ライブプレビューストリーミングを無効化
  • partial(デフォルト):最新の部分出力でプレビューテキストを置き換え
  • block:チャンク単位のプレビュー更新を追加
  • progress:生成中にプログレスステータステキストを表示し、完了後に最終テキストを送信

channels.slack.nativeStreamingstreamingpartialの場合にSlackネイティブストリーミングAPI(chat.startStream / chat.appendStream / chat.stopStream)を制御します(デフォルト:true)。

要件

  1. Slackアプリ設定でAgents and AI Appsを有効化。
  2. アプリにassistant:writeスコープがあることを確認。
  3. そのメッセージに利用可能なリプライスレッドが必要です。スレッド選択は引き続きreplyToModeに従います。

マニフェストとスコープチェックリスト

Slackアプリマニフェスト例
{
  "display_information": {
    "name": "OpenClaw",
    "description": "Slack connector for OpenClaw"
  },
  "features": {
    "bot_user": {
      "display_name": "OpenClaw",
      "always_online": false
    },
    "app_home": {
      "messages_tab_enabled": true,
      "messages_tab_read_only_enabled": false
    },
    "slash_commands": [
      {
        "command": "/openclaw",
        "description": "Send a message to OpenClaw",
        "should_escape": false
      }
    ]
  },
  "oauth_config": {
    "scopes": {
      "bot": [
        "chat:write",
        "channels:history",
        "channels:read",
        "groups:history",
        "im:history",
        "im:read",
        "im:write",
        "mpim:history",
        "mpim:read",
        "mpim:write",
        "users:read",
        "app_mentions:read",
        "assistant:write",
        "reactions:read",
        "reactions:write",
        "pins:read",
        "pins:write",
        "emoji:read",
        "commands",
        "files:read",
        "files:write"
      ]
    }
  },
  "settings": {
    "socket_mode_enabled": true,
    "event_subscriptions": {
      "bot_events": [
        "app_mention",
        "message.channels",
        "message.groups",
        "message.im",
        "message.mpim",
        "reaction_added",
        "reaction_removed",
        "member_joined_channel",
        "member_left_channel",
        "channel_rename",
        "pin_added",
        "pin_removed"
      ]
    }
  }
}
オプションのuser tokenスコープ(読み取り操作)
`channels.slack.userToken`を設定する場合、一般的な読み取りスコープは以下のとおりです:

- `channels:history`、`groups:history`、`im:history`、`mpim:history`
- `channels:read`、`groups:read`、`im:read`、`mpim:read`
- `users:read`
- `reactions:read`
- `pins:read`
- `emoji:read`
- `search:read`(Slack検索読み取りに依存する場合)

トラブルシューティング

チャンネルで返信がない
以下の順序で確認してください:

- `groupPolicy`
- チャンネル許可リスト(`channels.slack.channels`)
- `requireMention`
- チャンネルごとの`users`許可リスト

便利なコマンド:
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
DMメッセージが無視される
確認事項:

- `channels.slack.dm.enabled`
- `channels.slack.dmPolicy`(またはレガシー`channels.slack.dm.policy`)
- ペアリング承認 / 許可リストエントリ
openclaw pairing list slack
Socket Modeで接続できない
bot + appトークンとSlackアプリ設定のSocket Mode有効化を検証してください。
HTTPモードでイベントを受信できない
以下を検証してください:

- signing secret
- webhookパス
- SlackのRequest URL(Events + Interactivity + Slash Commands)
- HTTPアカウントごとの一意な`webhookPath`
ネイティブ/スラッシュコマンドが動作しない
意図した動作を確認してください:

- ネイティブコマンドモード(`channels.slack.commands.native: true`)と対応するSlackスラッシュコマンドの登録
- または単一スラッシュコマンドモード(`channels.slack.slashCommand.enabled: true`)

`commands.useAccessGroups`とチャンネル/ユーザー許可リストも確認してください。

設定リファレンスポインター

主なリファレンス:

  • 設定リファレンス - Slack

    重要なSlackフィールド:

    • モード/認証:modebotTokenappTokensigningSecretwebhookPathaccounts.*
    • DMアクセス:dm.enableddmPolicyallowFrom(レガシー:dm.policydm.allowFrom)、dm.groupEnableddm.groupChannels
    • 互換性トグル:dangerouslyAllowNameMatching(緊急用。必要な場合のみ有効化)
    • チャンネルアクセス:groupPolicychannels.*channels.*.userschannels.*.requireMention
    • スレッド/履歴:replyToModereplyToModeByChatTypethread.*historyLimitdmHistoryLimitdms.*.historyLimit
    • 配信:textChunkLimitchunkModemediaMaxMbstreamingnativeStreaming
    • 運用/機能:configWritescommands.nativeslashCommand.*actions.*userTokenuserTokenReadOnly

関連項目