SlackでOpenClawを使うイメージ

【最新版】SlackでOpenClawを使う方法(Socket Mode/HTTP Events APIの設定手順)

概要

ステータス:Slackアプリ連携によるDM+チャンネル対応はproduction-readyです。デフォルトはSocket Modeですが、HTTP Events APIモードもサポートしています。

  • Pairing:SlackのDMはデフォルトでペアリング(承認)モードです(参考: /channels/pairing
  • Slash commands:ネイティブコマンド挙動とカタログ(参考: /tools/slash-commands
  • Channel troubleshooting:チャネル横断の診断と復旧(参考: /channels/troubleshooting

クイックセットアップ

Socket Mode(デフォルト)

Step 1:Slackアプリ作成とトークン発行

Slackアプリの設定画面で、以下を行います。

  • Socket Mode を有効化
  • App Tokenxapp-...)を作成し、スコープ connections:write を付与
  • アプリをインストールし、Bot Tokenxoxb-...)をコピー

Step 2:OpenClawを設定

設定例:

{
  channels: {
    slack: {
      enabled: true,
      mode: "socket",
      appToken: "xapp-...",
      botToken: "xoxb-...",
    },
  },
}

Envフォールバック(デフォルトアカウントのみ):

SLACK_APP_TOKEN=xapp-...
SLACK_BOT_TOKEN=xoxb-...

Step 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

また、DMのために App Home の Messages Tab を有効化します。

Step 4:Gatewayを起動

openclaw gateway

HTTP Events APIモード

Step 1:SlackアプリをHTTP用に設定

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

Step 2:OpenClaw(HTTPモード)を設定

{
  channels: {
    slack: {
      enabled: true,
      mode: "http",
      botToken: "xoxb-...",
      signingSecret: "your-signing-secret",
      webhookPath: "/slack/events",
    },
  },
}

Step 3:マルチアカウント(HTTP)ではWebhookパスをユニークにする

アカウントごとのHTTPモードがサポートされています。

登録の衝突を避けるため、各アカウントに異なる webhookPath を割り当てます。

トークンモデル

  • Socket Modeでは botToken + appToken が必要です。
  • HTTPモードでは botToken + signingSecret が必要です。
  • 設定内トークンはEnvフォールバックより優先されます。
  • SLACK_BOT_TOKEN / SLACK_APP_TOKEN のEnvフォールバックはデフォルトアカウントにのみ適用されます。
  • userTokenxoxp-...)は設定ファイルのみ(Envフォールバックなし)です。デフォルトは読み取り専用(userTokenReadOnly: true)になります。
  • 任意:送信メッセージでアクティブなエージェントのアイデンティティ(username とアイコン)を使いたい場合、chat:write.customize を追加できます。icon_emoji:emoji_name: 構文です。

補足:アクション/ディレクトリ読み取りでは、設定されている場合 userToken が優先されることがあります。書き込みは引き続きBotトークンが優先です(userTokenReadOnly: false かつBotトークンが利用できない場合のみ、user-tokenの書き込みが許可されます)。

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

DMポリシー

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

  • pairing(デフォルト)
  • allowlist
  • openchannels.slack.allowFrom"*" を含める必要。レガシー:channels.slack.dm.allowFrom
  • disabled

DM関連フラグ:

  • dm.enabled(デフォルト true)
  • channels.slack.allowFrom(推奨)
  • dm.allowFrom(レガシー)
  • dm.groupEnabled(グループDM、デフォルト false)
  • dm.groupChannels(任意のMPIM allowlist)

マルチアカウントの優先順位:

  • channels.slack.accounts.default.allowFromdefault アカウントにのみ適用されます。
  • 名前付きアカウントは、自身の allowFrom が未設定の場合に channels.slack.allowFrom を継承します。
  • 名前付きアカウントは channels.slack.accounts.default.allowFrom を継承しません。

DMのペアリング承認では、openclaw pairing approve slack <code> を使用します。

チャンネルポリシー

channels.slack.groupPolicy がチャンネル処理を制御します。

  • open
  • allowlist
  • disabled

チャンネルallowlistは channels.slack.channels 配下に置き、安定したチャンネルIDを使うべきです。

実行時の注意:channels.slack が完全に欠落している(Envのみセットアップ)場合、実行時は groupPolicy="allowlist" にフォールバックし、警告ログが出ます(channels.defaults.groupPolicy が設定されていても同様)。

名前/ID解決:

  • チャンネルallowlistとDM allowlistのエントリは、トークンアクセスが可能なら起動時に解決されます。
  • 解決できなかったチャンネル名エントリは設定のまま保持されますが、デフォルトではルーティングで無視されます。
  • 受信認可とチャンネルルーティングは、デフォルトではID優先です。直接のユーザー名/スラッグ一致には channels.slack.dangerouslyAllowNameMatching: true が必要です。

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

チャンネルメッセージはデフォルトでメンションゲート(メンションがないと反応しない)です。

メンションのソース:

  • 明示的なアプリメンション(<@botId>
  • メンション正規表現(agents.list[].groupChat.mentionPatterns、フォールバック messages.groupChat.mentionPatterns
  • 暗黙の「ボットへのスレッド返信」挙動

チャンネル単位の制御(channels.slack.channels.<id>。名前指定は起動時解決または dangerouslyAllowNameMatching が必要):

  • requireMention
  • users(allowlist)
  • allowBots
  • skills
  • systemPrompt
  • tools / toolsBySender

toolsBySender のキー形式:

  • id: / e164: / username: / name: / "*"(ワイルドカード)
  • (レガシーのプレフィックスなしキーも、依然として id: のみへマップされます)

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

  • Slackでは、ネイティブコマンドのautoモードはオフです(commands.native: "auto" ではSlackのネイティブコマンドは有効化されません)。
  • ネイティブSlackコマンドハンドラは channels.slack.commands.native: true(またはグローバル commands.native: true)で有効化します。
  • ネイティブコマンドが有効な場合、Slack側で一致するスラッシュコマンド(/<command>)を登録します。ただし例外として、ステータスコマンドはSlackが /status を予約しているため /agentstatus を登録します。
  • ネイティブコマンドが無効な場合、channels.slack.slashCommand で設定した単一のスラッシュコマンドを実行できます。

ネイティブ引数メニューのレンダリング戦略:

  • 最大5件:ボタンブロック
  • 6〜100件:static selectメニュー
  • 100件超:external select(interactivityオプションハンドラが利用可能な場合、非同期で候補をフィルタリング)
  • エンコード後のオプション値がSlack制限を超える場合:ボタンにフォールバック
  • エンコードされたオプション値がSlack制限を超えた場合、フローはボタンへフォールバックします。

長いオプションpayloadの場合、スラッシュコマンドの引数メニューは選択値をディスパッチする前に確認ダイアログを表示します。

インタラクティブ返信

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

グローバルで有効化:

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

特定のSlackアカウントのみ有効化:

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

有効化すると、エージェントはSlack専用の返信ディレクティブを出力できます。

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

これらのディレクティブはSlack Block Kitへコンパイルされ、クリック/選択は既存のSlack interactionイベントパスを通じて戻ります。

注意:

  • これはSlack固有UIです。他のチャネルはSlack Block Kitディレクティブを自チャネルのボタンシステムへ変換しません。
  • インタラクティブのコールバック値はOpenClaw生成の不透明トークンであり、エージェントが生で書いた値ではありません。
  • 生成したインタラクティブブロックがSlack Block Kit制限を超える場合、OpenClawは元のテキスト返信へフォールバックします。

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

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

Slashセッションは分離されたキーを使用します。

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

また、コマンド実行はターゲット会話セッション(CommandTargetSessionKey)に対して引き続きルーティングされます。

スレッド、セッション、返信タグ

  • DMは direct、チャンネルは channel、MPIMは group としてルーティングされます。
  • デフォルト session.dmScope=main の場合、Slack DMはエージェントのメインセッションに集約されます。
  • チャンネルセッション: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 ごとの設定
  • レガシー(directチャットのフォールバック):channels.slack.dm.replyToMode

手動の返信タグ:

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

注意:replyToMode="off" はSlack内のすべての返信スレッディング(明示的な返信タグも含む)を無効化します。これはTelegramと異なります(Telegramは "off" でも明示タグが尊重されます)。この差は、Slackのスレッドがチャンネルからメッセージを隠すのに対し、Telegramの返信はメインチャットフローに表示され続ける、というプラットフォームモデルの違いを反映しています。

メディア、チャンク分割、配信

受信添付(Inbound attachments)

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

受信サイズ上限は、channels.slack.mediaMaxMb で上書きしない限りデフォルト 20MB です。

送信テキストとファイル(Outbound text and files)

  • テキストチャンクは channels.slack.textChunkLimit(デフォルト 4000)
  • channels.slack.chunkMode="newline" で段落優先分割を有効化
  • ファイル送信はSlack upload APIを使用し、スレッド返信(thread_ts)も可能
  • 送信メディア上限は、設定があれば channels.slack.mediaMaxMb に従います。未設定の場合、チャネル送信はメディアパイプラインのMIME-kindデフォルトに従います。

配信ターゲット(Delivery targets)

推奨の明示ターゲット:

  • DM:user:<id>
  • チャンネル:channel:<id>

Slack DMは、ユーザーターゲットへ送る際にSlack conversation APIでオープンされます。

アクションとゲート

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

現行のSlack toolingで利用できるアクショングループ:

  • messages(デフォルト:enabled)
  • reactions(デフォルト:enabled)
  • pins(デフォルト:enabled)
  • memberInfo(デフォルト:enabled)
  • emojiList(デフォルト:enabled)

イベントと運用挙動

  • メッセージの編集/削除/スレッドブロードキャストはsystem eventへマップされます。
  • リアクション追加/削除イベントはsystem eventへマップされます。
  • メンバー参加/退出、チャンネル作成/リネーム、ピン追加/削除イベントはsystem eventへマップされます。
  • アシスタントのスレッドステータス更新(スレッド内の「入力中」)は assistant.threads.setStatus を使用し、Botスコープ assistant:write が必要です。
  • channel_id_changed は、configWrites が有効な場合にチャンネル設定キーを移行できます。
  • チャンネルのtopic/purposeメタデータは信頼できないコンテキストとして扱われ、ルーティングコンテキストに注入されることがあります。
  • Block actionおよびmodal interactionは、構造化されたsystem event(Slack interaction: ...)を出力し、豊富なpayloadフィールドを含みます。

block actions:選択値、ラベル、picker値、workflow_* メタデータ。

modal:view_submission / view_closed(ルーティングされたチャンネルメタデータとフォーム入力)。

Ack reactions

ackReaction は、OpenClawが受信メッセージを処理している間に確認用の絵文字を付けます。

解決順序:

  • channels.slack.accounts.<accountId>.ackReaction
  • channels.slack.ackReaction
  • messages.ackReaction
  • エージェントアイデンティティ絵文字のフォールバック(agents.list[].identity.emoji、なければ "👀"

注意:

  • Slackはshortcode(例:"eyes")を期待します。
  • "" を指定すると、そのSlackアカウントまたは全体でリアクションを無効化できます。

Typing reaction fallback

typingReaction は、OpenClawが返信を生成している間に受信Slackメッセージへ一時的なリアクションを付与し、完了時に削除します。Slackネイティブのtyping表示が利用できない場合(特にDM)に有用なフォールバックです。

解決順序:

  • channels.slack.accounts.<accountId>.typingReaction
  • channels.slack.typingReaction

注意:

  • Slackはshortcode(例:"hourglass_flowing_sand")を期待します。
  • リアクションはbest-effortで、返信完了または失敗パス後に自動でクリーンアップを試みます。

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

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 を設定する場合の典型的なreadスコープ:

  • 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検索読み取りに依存する場合)

トラブルシューティング

チャンネルに返信がない(No replies in channels)

次を順番に確認します。

  • groupPolicy
  • チャンネルallowlist(channels.slack.channels
  • requireMention
  • チャンネル単位の users allowlist

有用なコマンド:

openclaw channels status --probe
openclaw logs --follow
openclaw doctor

DMが無視される(DM messages ignored)

次を確認します。

  • channels.slack.dm.enabled
  • channels.slack.dmPolicy(またはレガシー channels.slack.dm.policy
  • ペアリング承認待ち / allowlistエントリ
openclaw pairing list slack

Socket Modeが接続しない(Socket mode not connecting)

BotトークンとAppトークン、およびSlackアプリ設定でのSocket Mode有効化を検証します。

HTTPモードでイベントを受信しない(HTTP mode not receiving events)

次を検証します。

  • Signing secret
  • Webhook path
  • Slack Request URLs(Events + Interactivity + Slash Commands)
  • HTTPアカウントごとのユニークな webhookPath

ネイティブ/スラッシュコマンドが動かない(Native/slash commands not firing)

次のどちらを意図しているかを確認します。

  • ネイティブコマンドモード(channels.slack.commands.native: true)+Slack側で一致するslash commandを登録
  • 単一スラッシュコマンドモード(channels.slack.slashCommand.enabled: true

加えて、commands.useAccessGroups とチャンネル/ユーザーallowlistも確認します。

テキストストリーミング

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

channels.slack.streaming がライブプレビュー挙動を制御します。

  • off:ライブプレビュー配信を無効化
  • partial(デフォルト):プレビューテキストを最新の部分出力に置換
  • block:チャンク化したプレビュー更新を追記
  • progress:生成中は進捗ステータステキストを表示し、最後に最終テキストを送信

channels.slack.nativeStreaming は、streamingpartial のときのSlackネイティブストリーミングAPI(chat.startStream / chat.appendStream / chat.stopStream)を制御します(デフォルト:true)。

ネイティブSlackストリーミングを無効化(ドラフトプレビュー挙動は維持):

channels:
  slack:
    streaming: partial
    nativeStreaming: false

レガシーキー:

  • channels.slack.streamModereplace | status_final | append)は channels.slack.streaming へ自動移行されます。
  • booleanの channels.slack.streamingchannels.slack.nativeStreaming へ自動移行されます。

要件

  1. Slackアプリ設定で Agents and AI Apps を有効化します。
  2. アプリに assistant:write スコープがあることを確認します。
  3. 対象メッセージで返信スレッドが利用できる必要があります。スレッド選択は replyToMode に従います。

挙動

  • 最初のテキストチャンクでストリーム開始(chat.startStream)。
  • 以降のテキストチャンクは同一ストリームへ追記(chat.appendStream)。
  • 返信完了でストリームを確定(chat.stopStream)。
  • メディアや非テキストpayloadは通常配信にフォールバックします。
  • ストリーミングが返信途中で失敗した場合、残りpayloadは通常配信にフォールバックします。

設定リファレンス(Slack)

プライマリ参照: Configuration reference - Slack

高シグナルなSlackフィールド:

  • mode/auth: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

関連

参考

BizClaw 導入支援

OpenClaw の構築を
まるごと代行します

Mac mini のセットアップから Slack・iMessage 連携まで、届いた日から使える状態でお届けします。

サービスを見る

関連記事

Read article
AIエージェントのメモリスタックとは?2026年に重要度が上がる理由をやさしく解説

AIエージェントのメモリスタックとは?2026年に重要度が上がる理由をやさしく解説

Read article
OpenClaw vs Hermes vs Claude、創業者はどれを選ぶべき?2026年版の実務比較

OpenClaw vs Hermes vs Claude、創業者はどれを選ぶべき?2026年版の実務比較

Read article
X公式MCPサーバーとは?AIエージェント運用で何が変わるのかを実務目線で解説

X公式MCPサーバーとは?AIエージェント運用で何が変わるのかを実務目線で解説