Slack (socket mode)
Setup
- Create a Slack app (From scratch) in https://api.slack.com/apps.
- Socket Mode → toggle on. Then go to Basic Information → App-Level Tokens → Generate Token and Scopes with scope
connections:write. Copy the App Token (xapp-...). - OAuth & Permissions → add bot token scopes (use the manifest below). Click Install to Workspace. Copy the Bot User OAuth Token (
xoxb-...). - Event Subscriptions → enable events and subscribe to:
message.*(includes edits/deletes/thread broadcasts)app_mentionreaction_added,reaction_removedmember_joined_channel,member_left_channelchannel_renamepin_added,pin_removed
- Invite the bot to channels you want it to read.
- Slash Commands → create
/clawdif you useslack.slashCommand. If you enablecommands.native, add slash commands for the built-in chat commands (same names as/help). - App Home → enable the Messages Tab so users can DM the bot.
slack.accounts with per-account tokens and optional name. See gateway/configuration for the shared pattern.
Manifest (optional)
Use this Slack app manifest to create the app quickly (adjust the name/command if you want).commands.native, add one slash_commands entry per command you want to expose (matching the /help list).
Scopes (current vs optional)
Slack’s Conversations API is type-scoped: you only need the scopes for the conversation types you actually touch (channels, groups, im, mpim). See https://api.slack.com/docs/conversations-api for the overview.Required scopes
chat:write(send/update/delete messages viachat.postMessage) https://api.slack.com/methods/chat.postMessageim:write(open DMs viaconversations.openfor user DMs) https://api.slack.com/methods/conversations.openchannels:history,groups:history,im:history,mpim:historyhttps://api.slack.com/methods/conversations.historychannels:read,groups:read,im:read,mpim:readhttps://api.slack.com/methods/conversations.infousers:read(user lookup) https://api.slack.com/methods/users.inforeactions:read,reactions:write(reactions.get/reactions.add) https://api.slack.com/methods/reactions.get https://api.slack.com/methods/reactions.addpins:read,pins:write(pins.list/pins.add/pins.remove) https://api.slack.com/scopes/pins:read https://api.slack.com/scopes/pins:writeemoji:read(emoji.list) https://api.slack.com/scopes/emoji:readfiles:write(uploads viafiles.uploadV2) https://api.slack.com/messaging/files/uploading
Not needed today (but likely future)
mpim:write(only if we add group-DM open/DM start viaconversations.open)groups:write(only if we add private-channel management: create/rename/invite/archive)chat:write.public(only if we want to post to channels the bot isn’t in) https://api.slack.com/scopes/chat:write.publicusers:read.email(only if we need email fields fromusers.info) https://api.slack.com/changelog/2017-04-narrowing-email-accessfiles:read(only if we start listing/reading file metadata)
Config
Slack uses Socket Mode only (no HTTP webhook server). Provide both tokens:SLACK_BOT_TOKENSLACK_APP_TOKEN
messages.ackReaction +
messages.ackReactionScope.
Limits
- Outbound text is chunked to
slack.textChunkLimit(default 4000). - Media uploads are capped by
slack.mediaMaxMb(default 20).
Reply threading
Slack supports optional threaded replies via tags:[[reply_to_current]]— reply to the triggering message.[[reply_to:<id>]]— reply to a specific message id.
slack.replyToMode:
off(default),first,all.
Sessions + routing
- DMs share the
mainsession (like WhatsApp/Telegram). - Channels map to
slack:channel:<channelId>sessions. - Slash commands use
slack:slash:<userId>sessions. - Native command registration is controlled by
commands.native; text commands require standalone/...messages and can be disabled withcommands.text: false. Slack slash commands are managed in the Slack app and are not removed automatically. Usecommands.useAccessGroups: falseto bypass access-group checks for commands. - Full command list + config: Slash commands
DM security (pairing)
- Default:
slack.dm.policy="pairing"— unknown DM senders get a pairing code (expires after 1 hour). - Approve via:
clawdbot pairing approve --provider slack <code>. - To allow anyone: set
slack.dm.policy="open"andslack.dm.allowFrom=["*"].
Group policy
slack.groupPolicycontrols channel handling (open|disabled|allowlist).allowlistrequires channels to be listed inslack.channels.
slack.channels.<id> or slack.channels.<name>):
allow: allow/deny the channel whengroupPolicy="allowlist".requireMention: mention gating for the channel.allowBots: allow bot-authored messages in this channel (default: false).users: optional per-channel user allowlist.skills: skill filter (omit = all skills, empty = none).systemPrompt: extra system prompt for the channel (combined with topic/purpose).enabled: setfalseto disable the channel.
Delivery targets
Use these with cron/CLI sends:user:<id>for DMschannel:<id>for channels
Tool actions
Slack tool actions can be gated withslack.actions.*:
| Action group | Default | Notes |
|---|---|---|
| reactions | enabled | React + list reactions |
| messages | enabled | Read/send/edit/delete |
| pins | enabled | Pin/unpin/list |
| memberInfo | enabled | Member info |
| emojiList | enabled | Custom emoji list |
Notes
- Mention gating is controlled via
slack.channels(setrequireMentiontotrue);routing.groupChat.mentionPatternsalso count as mentions. - Multi-agent override:
routing.agents.<agentId>.mentionPatternstakes precedence. - Reaction notifications follow
slack.reactionNotifications(usereactionAllowlistwith modeallowlist). - Bot-authored messages are ignored by default; enable via
slack.allowBotsorslack.channels.<id>.allowBots. - For the Slack tool, reaction removal semantics are in /tools/reactions.
- Attachments are downloaded to the media store when permitted and under the size limit.