
【最新版】SlackでOpenClawを使う方法(Socket Mode/HTTP Events APIの設定手順)
2026年3月18日
概要
ステータス: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 Token(
xapp-...)を作成し、スコープconnections:writeを付与 - アプリをインストールし、Bot Token(
xoxb-...)をコピー
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_mentionmessage.channels/message.groups/message.im/message.mpimreaction_added/reaction_removedmember_joined_channel/member_left_channelchannel_renamepin_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フォールバックはデフォルトアカウントにのみ適用されます。userToken(xoxp-...)は設定ファイルのみ(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(デフォルト)allowlistopen(channels.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.allowFromはdefaultアカウントにのみ適用されます。- 名前付きアカウントは、自身の
allowFromが未設定の場合にchannels.slack.allowFromを継承します。 - 名前付きアカウントは
channels.slack.accounts.default.allowFromを継承しません。
DMのペアリング承認では、openclaw pairing approve slack <code> を使用します。
チャンネルポリシー
channels.slack.groupPolicy がチャンネル処理を制御します。
openallowlistdisabled
チャンネル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 が必要):
requireMentionusers(allowlist)allowBotsskillssystemPrompttools/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: falsename: "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のデフォルトはthread、thread.inheritParentのデフォルトはfalseです。channels.slack.thread.initialHistoryLimitは、新しいスレッドセッション開始時に既存スレッドメッセージを何件取得するかを制御します(デフォルト20、0で無効)。
返信スレッディング制御:
channels.slack.replyToMode:off | first | all(デフォルトoff)channels.slack.replyToModeByChatType:direct | 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>.ackReactionchannels.slack.ackReactionmessages.ackReaction- エージェントアイデンティティ絵文字のフォールバック(
agents.list[].identity.emoji、なければ"👀")
注意:
- Slackはshortcode(例:
"eyes")を期待します。 ""を指定すると、そのSlackアカウントまたは全体でリアクションを無効化できます。
Typing reaction fallback
typingReaction は、OpenClawが返信を生成している間に受信Slackメッセージへ一時的なリアクションを付与し、完了時に削除します。Slackネイティブのtyping表示が利用できない場合(特にDM)に有用なフォールバックです。
解決順序:
channels.slack.accounts.<accountId>.typingReactionchannels.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:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read(Slack検索読み取りに依存する場合)
トラブルシューティング
チャンネルに返信がない(No replies in channels)
次を順番に確認します。
groupPolicy- チャンネルallowlist(
channels.slack.channels) requireMention- チャンネル単位の
usersallowlist
有用なコマンド:
openclaw channels status --probe openclaw logs --follow openclaw doctor
DMが無視される(DM messages ignored)
次を確認します。
channels.slack.dm.enabledchannels.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 は、streaming が partial のときのSlackネイティブストリーミングAPI(chat.startStream / chat.appendStream / chat.stopStream)を制御します(デフォルト:true)。
ネイティブSlackストリーミングを無効化(ドラフトプレビュー挙動は維持):
channels:
slack:
streaming: partial
nativeStreaming: falseレガシーキー:
channels.slack.streamMode(replace | status_final | append)はchannels.slack.streamingへ自動移行されます。- booleanの
channels.slack.streamingはchannels.slack.nativeStreamingへ自動移行されます。
要件
- Slackアプリ設定で Agents and AI Apps を有効化します。
- アプリに
assistant:writeスコープがあることを確認します。 - 対象メッセージで返信スレッドが利用できる必要があります。スレッド選択は
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
関連
参考
関連記事

AIエージェントのメモリスタックとは?2026年に重要度が上がる理由をやさしく解説
2026年4月8日
OpenClaw vs Hermes vs Claude、創業者はどれを選ぶべき?2026年版の実務比較
2026年4月8日