クイックセットアップ
- ソケットモード (デフォルト)
- HTTP イベント API モード
Slack アプリとトークンの作成
Slack アプリの設定で以下の操作を行います:
- Socket Mode を有効にする。
connections:write権限を持つ App Token (xapp-...) を作成する。- アプリをインストールし、Bot Token (
xoxb-...) をコピーする。
アプリイベントの購読
以下のボットイベントを購読(Subscribe)します:
app_mentionmessage.channels,message.groups,message.im,message.mpimreaction_added,reaction_removedmember_joined_channel,member_left_channelchannel_renamepin_added,pin_removed
トークンモデル
- ソケットモードには
botTokenとappTokenが必要です。 - HTTP モードには
botTokenとsigningSecretが必要です。 - 構成ファイル内のトークンは、環境変数の値を上書きします。
SLACK_BOT_TOKEN/SLACK_APP_TOKEN環境変数は、デフォルトアカウントにのみ適用されます。userToken(xoxp-...) は構成ファイルでのみ指定可能(環境変数なし)で、デフォルトは読み取り専用 (userTokenReadOnly: true) です。- オプション: 送信メッセージにアクティブなエージェントのアイデンティティ(カスタム
usernameとアイコン)を使用したい場合は、chat:write.customize権限を追加してください。icon_emojiは:emoji_name:形式を使用します。
アクセス制御とルーティング
- 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> を使用します。コマンドとスラッシュコマンドの動作
- Slack ではネイティブコマンドの自動モードは オフ です (
commands.native: "auto"では Slack のネイティブコマンドは有効になりません)。 - Slack ネイティブのコマンドハンドラーを有効にするには
channels.slack.commands.native: true(またはグローバルなcommands.native: true) を設定してください。 - ネイティブコマンドを有効にした場合は、Slack 側で対応するスラッシュコマンド (
/<command>名) を登録してください。ただし、以下の例外があります:- ステータスコマンドには
/agentstatusを登録してください (Slack は/statusを予約済みのため)。
- ステータスコマンドには
- ネイティブコマンドが有効でない場合、
channels.slack.slashCommand経由で構成された単一のスラッシュコマンドを実行できます。 - ネイティブの引数メニューは、選択肢の数に応じてレンダリング戦略を自動調整します:
- 5 つまで: ボタンブロック。
- 6〜100 個: 静的セレクトメニュー。
- 100 個超: インタラクティブオプションハンドラーが利用可能な場合、非同期フィルタリング付きの外部セレクト。
- エンコードされたオプション値が Slack の制限を超える場合はボタンにフォールバックします。
- 長いオプションペイロードの場合、スラッシュコマンド引数メニューは値を送信する前に確認ダイアログを表示します。
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
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ごとに設定- ダイレクトチャット用のレガシーフォールバック:
channels.slack.dm.replyToMode
[[reply_to_current]][[reply_to:<id>]]
replyToMode="off" は、明示的な [[reply_to_*]] タグを含め、Slack における すべての 返信スレッド化を無効にします。これは、"off" モードでも明示的なタグが尊重される Telegram とは異なります。この違いはプラットフォームのスレッドモデルを反映しています(Slack のスレッドはチャネルのメインフローからメッセージを隠しますが、Telegram の返信はメインフローに見えたままになります)。
メディア、チャンク化、配信
受信添付ファイル
受信添付ファイル
Slack の添付ファイルは、Slack がホストするプライベート URL(トークン認証されたリクエストフロー)からダウンロードされ、フェッチ成功時かつサイズ制限内であればメディアストアに書き込まれます。インバウンドのサイズ上限はデフォルトで
20MB です(channels.slack.mediaMaxMb で上書き可能)。送信テキストとファイル
送信テキストとファイル
- テキストチャンクは
channels.slack.textChunkLimit(デフォルト 4000) を使用します。 channels.slack.chunkMode="newline"を設定すると段落優先の分割が有効になります。- ファイル送信は Slack のアップロード API を使用し、スレッド返信 (
thread_ts) を含めることができます。 - 送信メディアの上限は
channels.slack.mediaMaxMbに従います(設定されている場合)。未設定時はメディアパイプラインの MIME タイプごとのデフォルトが使用されます。
配信ターゲット
配信ターゲット
推奨される明示的なターゲット:
- DM の場合:
user:<id> - チャネルの場合:
channel:<id>
アクションとゲート (Action Gating)
Slack のアクションはchannels.slack.actions.* で制御されます。
現在の Slack ツールで利用可能なアクショングループ:
| グループ名 | デフォルト |
|---|---|
messages | 有効 |
reactions | 有効 |
pins | 有効 |
memberInfo | 有効 |
emojiList | 有効 |
イベントと運用の動作
- メッセージの編集、削除、スレッド放送(Thread broadcast)はシステムイベントにマップされます。
- リアクションの追加および削除イベントはシステムイベントにマップされます。
- メンバーの参加・脱退、チャネルの作成・名前変更、およびピンの追加・削除イベントはシステムイベントにマップされます。
- アシスタントのスレッドステータス更新(スレッド内の「入力中…」インジケーター用)は
assistant.threads.setStatusを使用し、ボットスコープassistant:writeを必要とします。 configWritesが有効な場合、channel_id_changedイベントによってチャネル構成キーが移行されることがあります。- チャネルのトピックや目的(Purpose)のメタデータは信頼できないコンテキストとして扱われ、ルーティングコンテキストに注入される場合があります。
- ブロックアクションやモーダル操作は、豊富なペイロードフィールドを持つ構造化された
Slack interaction: ...システムイベントを発行します:- ブロックアクション: 選択された値、ラベル、ピッカーの値、および
workflow_*メタデータ。 - モーダルの
view_submissionおよびview_closedイベント: ルーティングされたチャネルメタデータとフォーム入力。
- ブロックアクション: 選択された値、ラベル、ピッカーの値、および
確認リアクション (Ack reactions)
ackReaction は、OpenClaw がメッセージを処理している間、確認用の絵文字を送信します。
解決順序:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- エージェントのアイデンティティ絵文字 (
agents.list[].identity.emoji, なければ ”👀”)
- Slack ではショートコード(例:
"eyes") を指定してください。 ""を設定すると、そのアカウントまたはグローバルでリアクションを無効にできます。
タイピングリアクションのフォールバック
typingReaction は、OpenClaw が返信を生成している間、受信メッセージに一時的なリアクションを追加し、完了後に削除します。これは、Slack ネイティブのアシスタントタイピングが利用できない場合(特に DM など)に有用なフォールバックです。
解決順序:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
- Slack ではショートコード(例:
"hourglass_flowing_sand") を指定してください。 - このリアクションはベストエフォートであり、返信の完了時または失敗時に自動的に削除が試みられます。
マニフェストとスコープのチェックリスト
Slack アプリマニフェストの例
Slack アプリマニフェストの例
オプションのユーザートークンスコープ (読み取り操作)
オプションのユーザートークンスコープ (読み取り操作)
channels.slack.userToken を構成する場合、一般的な読み取りスコープは以下の通りです:channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read(Slack の検索結果を読み取る必要がある場合)
トラブルシューティング
チャネルで返信がない
チャネルで返信がない
以下の項目を順番に確認してください:
groupPolicy- チャネルの許可リスト (
channels.slack.channels) requireMention- チャネルごとの
users許可リスト
DM メッセージが無視される
DM メッセージが無視される
以下の項目を確認してください:
channels.slack.dm.enabledchannels.slack.dmPolicy(または旧キーchannels.slack.dm.policy)- ペアリングの承認状態、または許可リストのエントリ
Socket Mode が接続されない
Socket Mode が接続されない
Slack アプリ設定で Bot トークンと App トークンが正しいか、また Socket Mode が有効になっているかを確認してください。
HTTP モードでイベントを受信しない
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 やチャネル/ユーザーの許可リストも確認してください。テキストストリーミング
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)。
ネイティブストリーミングを無効にする(ドラフトプレビュー動作を維持する)場合:
channels.slack.streamMode(replace | status_final | append) はchannels.slack.streamingに自動移行されます。- ブール値の
channels.slack.streamingはchannels.slack.nativeStreamingに自動移行されます。
要件
- Slack アプリ設定で Agents and AI Apps を有効にする。
- アプリに
assistant:writeスコープが付与されていること。 - そのメッセージに対して返信スレッドが利用可能であること(スレッドの選択は
replyToModeに従います)。
動作
- 最初のテキストチャンクでストリームが開始されます (
chat.startStream)。 - 以降のテキストチャンクは同じストリームに追加されます (
chat.appendStream)。 - 返信の終了時にストリームが完了します (
chat.stopStream)。 - メディアやテキスト以外のペイロードは、通常の配信方法にフォールバックします。
- 返信の途中でストリーミングが失敗した場合、残りのペイロードは通常の配信方法で送信されます。
構成リファレンスのポインタ
主要なリファレンス:-
構成リファレンス - 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
- モード/認証: