OpenClawSkills
GitHub
チャンネル • 5分で読める

Slack

Slack:Socket モードまたは HTTP(Events API)モードの設定方法。

Tutorial.step

Socket Mode(デフォルト)

#

Tutorial.step

初心者向けクイックセットアップ

1. Slack Appを作成し、<strong>Socket Mode</strong>を有効にします。

2. <strong>App Token</strong>(<code>xapp-...</code>)と<strong>Bot Token</strong>(<code>xoxb-...</code>)を作成します。

3. OpenClawにtokenを設定し、gatewayを起動します。

Minimal configuration:

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

#

Tutorial.step

Detailed Setup

1. https://api.slack.com/appsでSlack Appを作成します(From scratch)。

2. <strong>Socket Mode</strong> → 有効にします。次に<strong>Basic Information</strong> → <strong>App-Level Tokens</strong> → <strong>Generate Token and Scopes</strong>に移動し、scope <code>connections:write</code>を追加します。<strong>App Token</strong>(<code>xapp-...</code>)をコピーします。

3. <strong>OAuth & Permissions</strong> → bot token scopesを追加します(イベントサブスクリプションと一致させるために、以下のmanifestを使用することをお勧めします)。<strong>Install to Workspace</strong>をクリックし、<strong>Bot User OAuth Token</strong>(<code>xoxb-...</code>)をコピーします。

4. オプション:<strong>OAuth & Permissions</strong> → <strong>User Token Scopes</strong>を追加します(以下のread-onlyリスト)。appを再インストールし、<strong>User OAuth Token</strong>(<code>xoxp-...</code>)をコピーします。

5. <strong>Event Subscriptions</strong> → eventsを有効にし、以下をサブスクライブします:

- <code>message.*</code>(編集/削除/スレッドブロードキャストを含む)

- <code>app_mention</code>

- <code>reaction_added</code>、<code>reaction_removed</code>

- <code>member_joined_channel</code>、<code>member_left_channel</code>

- <code>channel_rename</code>

- <code>pin_added</code>、<code>pin_removed</code>

6. botを読み取りたいチャンネルに招待します。

7. Slash Commands:<code>channels.slack.slashCommand</code>を使用する場合、<code>/openclaw</code>を作成します。native commandsを有効にする場合、各組み込みコマンドに対してslash commandを作成する必要があります(<code>/help</code>内のコマンドと同じ名前)。Slackは<code>channels.slack.commands.native: true</code>を明示的に設定しない限り、デフォルトでnative commandsを有効にしません(グローバル<code>commands.native</code>はデフォルトで<code>"auto"</code>で、Slackを無効にします)。

8. App Home:<strong>Messages Tab</strong>を有効にし、ユーザーがbotにDMできるようにします。

scopes/eventsの設定漏れを避けるために、以下のmanifestを使用することをお勧めします。

マルチアカウント:'<code>'channels.slack.accounts'</code>'を使用して、各workspaceのtokenを設定します(オプションの'<code>'name'</code>')。共有構造については'<a href="/gateway/configuration#telegramaccounts--discordaccounts--slackaccounts--signalaccounts--imessageaccounts">'/gateway/configuration'</a>'を参照してください。

#

Tutorial.step

OpenClaw Configuration (Minimal)

環境変数の使用をお勧めします(サーバーに適しています):

- <code>SLACK_APP_TOKEN=xapp-...</code>

- <code>SLACK_BOT_TOKEN=xoxb-...</code>

または設定ファイル:

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

#

Tutorial.step

User token(オプション)

OpenClawはSlack user token(<code>xoxp-...</code>)を使用して、読み取り操作(履歴、pins、reactions、emoji、メンバー情報など)を行うことができます。デフォルトでは読み取り専用のまま:読み取りはuser tokenを優先(存在する場合)、書き込みは明示的にuser tokenの書き込みを許可しない限り、bot tokenを優先します。<code>userTokenReadOnly: false</code>を設定しても、bot tokenが利用可能な限り、書き込み操作はbot tokenを優先します。

user tokenは設定ファイルでのみ設定可能です(envはサポートされていません)。マルチアカウントの場合、'<code>'channels.slack.accounts.'<id>'.userToken'</code>'を設定します。

Example (bot + app + user tokens):

Json5
{
  channels: {
    slack: {
      enabled: true,
      appToken: "xapp-...",
      botToken: "xoxb-...",
      userToken: "xoxp-...",
    },
  },
}

user tokenの書き込みを許可(慎重に使用):

Json5
{
  channels: {
    slack: {
      enabled: true,
      appToken: "xapp-...",
      botToken: "xoxb-...",
      userToken: "xoxp-...",
      userTokenReadOnly: false,
    },
  },
}

##

Tutorial.step

Token使用ルール

- 読み取り操作(履歴、reactionsリスト、pinsリスト、emojiリスト、メンバー情報、検索)はuser tokenを優先(設定されている場合)、それ以外はbot tokenを使用します。

- 書き込み操作(送信/編集/削除メッセージ、追加/削除reactions、pin/unpin、ファイルアップロード)はデフォルトでbot tokenを使用します。<code>userTokenReadOnly: false</code>でbot tokenが利用できない場合のみ、user tokenにフォールバックします。

#

Tutorial.step

履歴コンテキスト

- <code>channels.slack.historyLimit</code>(または<code>channels.slack.accounts.*.historyLimit</code>)は、コンテキストとして注入する最近のチャンネル/グループメッセージの数を制御します。

- <code>messages.groupChat.historyLimit</code>にフォールバックします。<code>0</code>に設定して無効化(デフォルト50)。

Tutorial.step

HTTP Mode(Events API)

GatewayがHTTPS経由でSlackからアクセス可能な場合(典型的なサーバーデプロイ)、HTTP webhookモードがより適しています。HTTPモードはEvents API + Interactivity + Slash Commandsを使用し、同じRequest URLを共有します。

#

Tutorial.step

Setup

1. Slack Appを作成し、(オプションで)Socket Modeを無効にします(HTTPのみを使用する場合)。

2. <strong>Basic Information</strong> → <strong>Signing Secret</strong>をコピーします。

3. <strong>OAuth & Permissions</strong> → appをインストールし、<strong>Bot User OAuth Token</strong>(<code>xoxb-...</code>)をコピーします。

4. <strong>Event Subscriptions</strong> → eventsを有効にし、<strong>Request URL</strong>をgatewayのwebhook path(デフォルト<code>/slack/events</code>)に向けます。

5. <strong>Interactivity & Shortcuts</strong> → 有効にし、同じ<strong>Request URL</strong>を設定します。

6. <strong>Slash Commands</strong> → コマンドに同じ<strong>Request URL</strong>を設定します。

公開URLの例:

<code>https://gateway-host/slack/events</code>

#

Tutorial.step

OpenClaw Configuration (Minimal)

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

マルチアカウントHTTPモード:各アカウントに'<code>'channels.slack.accounts.'<id>'.mode = "http"'</code>'を設定し、各アカウントに一意の'<code>'webhookPath'</code>'を提供して、各Slack Appが異なるURLを指すようにします。

#

Tutorial.step

Manifest(オプション)

manifestを使用してappを迅速に作成できます(必要に応じて名前/コマンドを変更)。user tokenを設定する予定がある場合は、user scopesも追加してください。

Json
{
  "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",
        "groups:read",
        "groups:write",
        "im:history",
        "im:read",
        "im:write",
        "mpim:history",
        "mpim:read",
        "mpim:write",
        "users:read",
        "app_mentions:read",
        "reactions:read",
        "reactions:write",
        "pins:read",
        "pins:write",
        "emoji:read",
        "commands",
        "files:read",
        "files:write"
      ],
      "user": [
        "channels:history",
        "channels:read",
        "groups:history",
        "groups:read",
        "im:history",
        "im:read",
        "mpim:history",
        "mpim:read",
        "users:read",
        "reactions:read",
        "pins:read",
        "emoji:read",
        "search:read"
      ]
    }
  },
  "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"
      ]
    }
  }
}

native commandsを有効にする場合、公開したい各コマンドに対して<code>slash_commands</code>エントリを追加する必要があります(<code>/help</code>リストと一貫性)、<code>channels.slack.commands.native</code>を使用してデフォルトの動作を上書きします。

Tutorial.step

Scopes(現在必要 vs オプション)

Slack Conversations APIは会話タイプごとにscopeを分割しています:使用する会話タイプのscopes(channels、groups、im、mpim)のみが必要です。概要:https://docs.slack.dev/apis/web-api/using-the-conversations-api/

#

Tutorial.step

Bot Token Scopes (Required)

- <code>chat:write</code>(送信/更新/削除メッセージ)

https://docs.slack.dev/reference/methods/chat.postMessage

- <code>im:write</code>(DM会話を開く、user DMs用)

https://docs.slack.dev/reference/methods/conversations.open

- <code>channels:history</code>、<code>groups:history</code>、<code>im:history</code>、<code>mpim:history</code>

https://docs.slack.dev/reference/methods/conversations.history

- <code>channels:read</code>、<code>groups:read</code>、<code>im:read</code>、<code>mpim:read</code>

https://docs.slack.dev/reference/methods/conversations.info

- <code>users:read</code>(ユーザー情報クエリ)

https://docs.slack.dev/reference/methods/users.info

- <code>reactions:read</code>、<code>reactions:write</code>

https://docs.slack.dev/reference/methods/reactions.get

https://docs.slack.dev/reference/methods/reactions.add

- <code>pins:read</code>、<code>pins:write</code>

https://docs.slack.dev/reference/scopes/pins.read

https://docs.slack.dev/reference/scopes/pins.write

- <code>emoji:read</code>

https://docs.slack.dev/reference/scopes/emoji.read

- <code>files:write</code>(アップロード)

https://docs.slack.dev/messaging/working-with-files/#upload

#

Tutorial.step

User token scopes(オプション、デフォルトで読み取り専用)

<code>channels.slack.userToken</code>を設定した場合のみ、<strong>User Token Scopes</strong>に追加します:

- <code>channels:history</code>、<code>groups:history</code>、<code>im:history</code>、<code>mpim:history</code>

- <code>channels:read</code>、<code>groups:read</code>、<code>im:read</code>、<code>mpim:read</code>

- <code>users:read</code>

- <code>reactions:read</code>

- <code>pins:read</code>

- <code>emoji:read</code>

- <code>search:read</code>

Tutorial.step

Configuration Example

Json
{
  "slack": {
    "enabled": true,
    "botToken": "xoxb-...",
    "appToken": "xapp-...",
    "groupPolicy": "allowlist",
    "dm": {
      "enabled": true,
      "policy": "pairing",
      "allowFrom": ["U123", "U456", "*"],
      "groupEnabled": false,
      "groupChannels": ["G123"],
      "replyToMode": "all"
    },
    "channels": {
      "C123": { "allow": true, "requireMention": true },
      "#general": {
        "allow": true,
        "requireMention": true,
        "users": ["U123"],
        "skills": ["search", "docs"],
        "systemPrompt": "Keep answers short."
      }
    },
    "reactionNotifications": "own",
    "reactionAllowlist": ["U123"],
    "replyToMode": "off",
    "actions": {
      "reactions": true,
      "reactionLevel": "minimal"
    },
    "commands": {
      "native": false
    }
  }
}

Ack reactionsはグローバルの'<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'messages.ackReaction'</code>' + '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'messages.ackReactionScope'</code>'で制御されます;'<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'messages.removeAckAfterReply'</code>'は返信後にack reactionを削除できます。

Tutorial.step

Threading

Slackはスレッド返信をサポートしています。OpenClawはスレッドまたはトップレベルで返信できます。

- <code>channels.slack.replyToMode</code>: <code>off | all | first | last</code>

- <code>off</code>:トップレベルで返信(スレッドなし)。

- <code>all</code>:すべてのメッセージをスレッドで返信。

- <code>first</code>:最初のメッセージのみをスレッドで返信。

- <code>last</code>:最後のメッセージのみをスレッドで返信。

- デフォルト:<code>off</code>。

- チャンネルごとの上書き:'<code>'channels.slack.channels.'<id>'.replyToMode'</code>'。

- チャンネルごとのユーザー:'<code>'channels.slack.channels.'<id>'.users'</code>'。

- チャンネルごとのスキル:'<code>'channels.slack.channels.'<id>'.skills'</code>'。

- チャンネルごとのシステムプロンプト:'<code>'channels.slack.channels.'<id>'.systemPrompt'</code>'。

Tutorial.step

DMのThreading

DMもスレッドを使用できます。<code>channels.slack.dm.replyToMode</code>で設定します。

- <code>off</code>:トップレベルで返信。

- <code>all</code>:すべてのメッセージをスレッドで返信。

- <code>first</code>:最初のメッセージのみをスレッドで返信。

- <code>last</code>:最後のメッセージのみをスレッドで返信。

- デフォルト:<code>off</code>。

Tutorial.step

チャットタイプごとのThreading設定

<code>channels.slack.replyToModeByChatType</code>を使用します:

Json5
{
  channels: {
    slack: {
      replyToMode: "off",
      replyToModeByChatType: {
        direct: "all",
        group: "first",
      },
    },
  },
}

サポートされるチャットタイプ:

- <code>direct</code>: One-on-one DMs (Slack <code>im</code>)

- <code>group</code>:グループDM/MPIM(Slack <code>mpim</code>)

- <code>channel</code>:通常のチャンネル(公開/プライベート)

Priority:

1. 1. '<code>'replyToModeByChatType.'<chatType>''</code>'

2. 2. <code>replyToMode</code>

3. 3. デフォルト値(<code>off</code>)

レガシー設定<code>channels.slack.dm.replyToMode</code>は<code>direct</code>のフォールバックとして受け入れられます。

#

Tutorial.step

手動Threadingタグ

より細かい制御が必要な場合、エージェント返信で使用します:

- <code>[[reply_to_current]]</code>

- '<code>'[[reply_to:'<id>']]'</code>'

Tutorial.step

セッションとルーティング

- DMは<code>main</code>セッションを使用します(WhatsApp/Telegramと同様)。

- チャンネルセッションキー:'<code>'agent:'<agentId>':slack:channel:'<channelId>''</code>'。

- Slash commandセッションキー:'<code>'agent:'<agentId>':slack:slash:'<userId>''</code>'(プレフィックスは'<code>'channels.slack.slashCommand.sessionPrefix'</code>'で設定可能)。

- Slackが<code>channel_type</code>を提供しない場合、OpenClawはチャンネルIDプレフィックス(<code>D</code>/<code>C</code>/<code>G</code>)で推論し、デフォルトで<code>channel</code>を使用して、セッションキーの安定性を確保します。

- ネイティブコマンド登録:グローバル<code>commands.native</code>はデフォルトで<code>"auto"</code>(Slackはデフォルトで無効)、<code>channels.slack.commands.native</code>で上書き可能。テキストコマンドは別の<code>/...</code>メッセージを必要とし、<code>commands.text: false</code>で無効化可能。Slack slash commandsはSlack Appによって管理され、自動的に削除されません。<code>commands.useAccessGroups: false</code>でaccess-groupチェックをバイパスできます。

- コマンドリストと設定:'<a href="/tools/slash-commands">'/tools/slash-commands'</a>'

Tutorial.step

DMセキュリティ(Pairing)

- デフォルト:<code>channels.slack.dm.policy="pairing"</code>(不明な送信者はペアリングコードを受け取り、1時間で期限切れ)。

- Approve: '<code>'openclaw pairing approve slack '<code>''</code>'.

- 誰でもDMを許可する場合:<code>channels.slack.dm.policy="open"</code>かつ<code>channels.slack.dm.allowFrom=["*"]</code>。

- <code>channels.slack.dm.allowFrom</code>はuser id、@handle、またはemailをサポートします(tokensが許可する場合、起動時に解決)。ウィザードは可能な場合、usernameをidに解決します。

Tutorial.step

グループポリシー(Group policy)

- <code>channels.slack.groupPolicy</code>はチャンネル処理を制御します:<code>open|disabled|allowlist</code>。

- <code>allowlist</code>は<code>channels.slack.channels</code>で許可されたチャンネルを一覧表示することを要求します。

- <code>SLACK_BOT_TOKEN</code>/<code>SLACK_APP_TOKEN</code>のみを設定し、<code>channels.slack</code>設定セクションを作成しない場合、実行時のデフォルト<code>groupPolicy</code>は<code>open</code>です。<code>channels.slack.groupPolicy</code>/<code>channels.defaults.groupPolicy</code>またはチャンネルallowlistを明示的に設定すると、制限されます。