Slack¶
Socketmodus (standaard)¶
Snelle installatie (beginner)¶
- Maak een Slack-app en schakel Socket Mode in.
- Maak een App Token (
xapp-...) en Bot Token (xoxb-...). - Stel tokens in voor OpenClaw en start de Gateway.
Minimale config:
{
channels: {
slack: {
enabled: true,
appToken: "xapp-...",
botToken: "xoxb-...",
},
},
}
Installatie¶
- Maak een Slack-app (From scratch) op https://api.slack.com/apps.
- Socket Mode → schakel in. Ga daarna naar Basic Information → App-Level Tokens → Generate Token and Scopes met scope
connections:write. Kopieer de App Token (xapp-...). - OAuth & Permissions → voeg bot-token-scopes toe (gebruik het manifest hieronder). Klik Install to Workspace. Kopieer de Bot User OAuth Token (
xoxb-...). - Optioneel: OAuth & Permissions → voeg User Token Scopes toe (zie de alleen-lezenlijst hieronder). Installeer de app opnieuw en kopieer de User OAuth Token (
xoxp-...). - Event Subscriptions → schakel events in en abonneer je op:
-
message.*(inclusief bewerkingen/verwijderingen/thread-uitzendingen) -app_mention-reaction_added,reaction_removed-member_joined_channel,member_left_channel-channel_rename-pin_added,pin_removed - Nodig de bot uit voor kanalen die hij moet lezen.
- Slash Commands → maak
/openclawals jechannels.slack.slashCommandgebruikt. Als je native commands inschakelt, voeg één slash command per ingebouwde opdracht toe (dezelfde namen als/help). Native staat standaard uit voor Slack tenzij jechannels.slack.commands.native: trueinstelt (globaalcommands.nativeis"auto"waardoor Slack uit blijft). - App Home → schakel de Messages Tab in zodat gebruikers de bot kunnen DM’en.
Gebruik het manifest hieronder zodat scopes en events gesynchroniseerd blijven.
Ondersteuning voor meerdere accounts: gebruik channels.slack.accounts met tokens per account en optioneel name. Zie gateway/configuration voor het gedeelde patroon.
OpenClaw-config (Socketmodus)¶
Stel tokens in via omgevingsvariabelen (aanbevolen):
SLACK_APP_TOKEN=xapp-...SLACK_BOT_TOKEN=xoxb-...
Of via config:
{
channels: {
slack: {
enabled: true,
appToken: "xapp-...",
botToken: "xoxb-...",
},
},
}
User token (optioneel)¶
OpenClaw kan een Slack user token (xoxp-...) gebruiken voor leesbewerkingen (geschiedenis,
pins, reacties, emoji, ledeninfo). Standaard blijft dit alleen-lezen: lezen
gebruikt bij aanwezigheid bij voorkeur het user token, en schrijven gebruikt
nog steeds het bot-token tenzij je expliciet kiest. Zelfs met userTokenReadOnly: false
blijft het bot-token de voorkeur houden voor schrijven wanneer het beschikbaar is.
User tokens worden geconfigureerd in het configbestand (geen ondersteuning voor env vars). Voor
meerdere accounts stel je channels.slack.accounts.<id>.userToken in.
Voorbeeld met bot- + app- + user-tokens:
{
channels: {
slack: {
enabled: true,
appToken: "xapp-...",
botToken: "xoxb-...",
userToken: "xoxp-...",
},
},
}
Voorbeeld met userTokenReadOnly expliciet ingesteld (user-token-schrijven toestaan):
{
channels: {
slack: {
enabled: true,
appToken: "xapp-...",
botToken: "xoxb-...",
userToken: "xoxp-...",
userTokenReadOnly: false,
},
},
}
Tokengebruik¶
- Leesbewerkingen (geschiedenis, reactieslijst, pinslijst, emojilijst, ledeninfo, zoeken) geven de voorkeur aan het user token wanneer geconfigureerd, anders het bot-token.
- Schrijfbewerkingen (berichten verzenden/bewerken/verwijderen, reacties toevoegen/verwijderen, pinnen/ontpinnen,
bestandsuploads) gebruiken standaard het bot-token. Als
userTokenReadOnly: falseen er geen bot-token beschikbaar is, valt OpenClaw terug op het user token.
Geschiedeniscontext¶
channels.slack.historyLimit(ofchannels.slack.accounts.*.historyLimit) bepaalt hoeveel recente kanaal-/groepberichten in de prompt worden opgenomen.- Valt terug op
messages.groupChat.historyLimit. Stel0in om uit te schakelen (standaard 50).
HTTP-modus (Events API)¶
Gebruik HTTP-webhookmodus wanneer je Gateway via HTTPS door Slack bereikbaar is (typisch voor serverdeployments). HTTP-modus gebruikt de Events API + Interactivity + Slash Commands met één gedeelde request-URL.
Installatie (HTTP-modus)¶
- Maak een Slack-app en schakel Socket Mode uit (optioneel als je alleen HTTP gebruikt).
- Basic Information → kopieer de Signing Secret.
- OAuth & Permissions → installeer de app en kopieer de Bot User OAuth Token (
xoxb-...). - Event Subscriptions → schakel events in en stel de Request URL in op het webhookpad van je Gateway (standaard
/slack/events). - Interactivity & Shortcuts → schakel in en stel dezelfde Request URL in.
- Slash Commands → stel dezelfde Request URL in voor je commando(’s).
Voorbeeld request-URL:
https://gateway-host/slack/events
OpenClaw-config (minimaal)¶
{
channels: {
slack: {
enabled: true,
mode: "http",
botToken: "xoxb-...",
signingSecret: "your-signing-secret",
webhookPath: "/slack/events",
},
},
}
HTTP-modus met meerdere accounts: stel channels.slack.accounts.<id>.mode = "http" in en geef een unieke
webhookPath per account zodat elke Slack-app naar zijn eigen URL kan wijzen.
Manifest (optioneel)¶
Gebruik dit Slack-app-manifest om de app snel te maken (pas naam/commando aan indien gewenst). Neem de user-scopes op als je van plan bent een user token te configureren.
{
"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"
]
}
}
}
Als je native commands inschakelt, voeg één slash_commands-entry toe per commando dat je wilt blootstellen (overeenkomend met de lijst /help). Overschrijf met channels.slack.commands.native.
Scopes (huidig vs optioneel)¶
Slack’s Conversations API is type-gescopeerd: je hebt alleen de scopes nodig voor de gesprekstypen die je daadwerkelijk gebruikt (channels, groups, im, mpim). Zie https://docs.slack.dev/apis/web-api/using-the-conversations-api/ voor het overzicht.
Bot-token-scopes (vereist)¶
chat:write(berichten verzenden/bijwerken/verwijderen viachat.postMessage) https://docs.slack.dev/reference/methods/chat.postMessageim:write(DM’s openen viaconversations.openvoor user-DM’s) https://docs.slack.dev/reference/methods/conversations.openchannels:history,groups:history,im:history,mpim:historyhttps://docs.slack.dev/reference/methods/conversations.historychannels:read,groups:read,im:read,mpim:readhttps://docs.slack.dev/reference/methods/conversations.infousers:read(gebruikersopzoeking) https://docs.slack.dev/reference/methods/users.inforeactions:read,reactions:write(reactions.get/reactions.add) https://docs.slack.dev/reference/methods/reactions.get https://docs.slack.dev/reference/methods/reactions.addpins:read,pins:write(pins.list/pins.add/pins.remove) https://docs.slack.dev/reference/scopes/pins.read https://docs.slack.dev/reference/scopes/pins.writeemoji:read(emoji.list) https://docs.slack.dev/reference/scopes/emoji.readfiles:write(uploads viafiles.uploadV2) https://docs.slack.dev/messaging/working-with-files/#upload
User-token-scopes (optioneel, standaard alleen-lezen)¶
Voeg deze toe onder User Token Scopes als je channels.slack.userToken configureert.
channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read
Vandaag niet nodig (maar waarschijnlijk in de toekomst)¶
mpim:write(alleen als we group-DM openen/DM starten toevoegen viaconversations.open)groups:write(alleen als we private-kanalen gaan beheren: maken/hernoemen/uitnodigen/archiveren)chat:write.public(alleen als we willen posten naar kanalen waar de bot niet in zit) https://docs.slack.dev/reference/scopes/chat.write.publicusers:read.email(alleen als we e-mailvelden nodig hebben vanusers.info) https://docs.slack.dev/changelog/2017-04-narrowing-email-accessfiles:read(alleen als we beginnen met het lijst/lezen van bestandsmetadata)
Config¶
Slack gebruikt alleen Socket Mode (geen HTTP-webhookserver). Geef beide tokens op:
{
"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,
"messages": true,
"pins": true,
"memberInfo": true,
"emojiList": true
},
"slashCommand": {
"enabled": true,
"name": "openclaw",
"sessionPrefix": "slack:slash",
"ephemeral": true
},
"textChunkLimit": 4000,
"mediaMaxMb": 20
}
}
Tokens kunnen ook via omgevingsvariabelen worden aangeleverd:
SLACK_BOT_TOKENSLACK_APP_TOKEN
Ack-reacties worden globaal aangestuurd via messages.ackReaction +
messages.ackReactionScope. Gebruik messages.removeAckAfterReply om de
ack-reactie te verwijderen nadat de bot heeft geantwoord.
Beperkingen¶
- Uitgaande tekst wordt opgeknipt tot
channels.slack.textChunkLimit(standaard 4000). - Optioneel splitsen op nieuwe regels: stel
channels.slack.chunkMode="newline"in om op lege regels (paragraafgrenzen) te splitsen vóór lengte-opknippen. - Media-uploads zijn beperkt door
channels.slack.mediaMaxMb(standaard 20).
Antwoord-threading¶
Standaard antwoordt OpenClaw in het hoofdkanaal. Gebruik channels.slack.replyToMode om automatische threading te regelen:
| Modus | Gedrag |
|---|---|
off |
Standaard. Antwoord in het hoofdkanaal. Thread alleen als het triggerende bericht al in een thread stond. |
first |
Eerste antwoord gaat in de thread (onder het triggerende bericht), vervolgreplies gaan naar het hoofdkanaal. Handig om context zichtbaar te houden en thread-rommel te vermijden. |
all |
Alle antwoorden gaan in de thread. Houdt gesprekken compact maar kan zichtbaarheid verminderen. |
De modus geldt voor zowel auto-replies als agent tool calls (slack sendMessage).
Threading per chat-type¶
Je kunt verschillend threading-gedrag per chat-type configureren door channels.slack.replyToModeByChatType in te stellen:
{
channels: {
slack: {
replyToMode: "off", // default for channels
replyToModeByChatType: {
direct: "all", // DMs always thread
group: "first", // group DMs/MPIM thread first reply
},
},
},
}
Ondersteunde chat-typen:
direct: 1:1 DM’s (Slackim)group: groeps-DM’s / MPIM’s (Slackmpim)channel: standaardkanalen (openbaar/privé)
Voorrang:
replyToModeByChatType.<chatType>replyToMode- Provider-standaard (
off)
Legacy channels.slack.dm.replyToMode wordt nog geaccepteerd als fallback voor direct wanneer geen chat-type-override is ingesteld.
Voorbeelden:
Alleen DM’s in threads:
{
channels: {
slack: {
replyToMode: "off",
replyToModeByChatType: { direct: "all" },
},
},
}
Groeps-DM’s in threads, kanalen in de root houden:
{
channels: {
slack: {
replyToMode: "off",
replyToModeByChatType: { group: "first" },
},
},
}
Kanalen in threads maken, DM’s in de root houden:
{
channels: {
slack: {
replyToMode: "first",
replyToModeByChatType: { direct: "off", group: "off" },
},
},
}
Handmatige threading-tags¶
Voor fijnmazige controle gebruik je deze tags in agent-antwoorden:
[[reply_to_current]]— antwoord op het triggerende bericht (thread starten/voortzetten).[[reply_to:<id>]]— antwoord op een specifiek bericht-id.
Sessies + routering¶
- DM’s delen de
main-sessie (zoals WhatsApp/Telegram). - Kanalen mappen naar
agent:<agentId>:slack:channel:<channelId>-sessies. - Slash commands gebruiken
agent:<agentId>:slack:slash:<userId>-sessies (prefix configureerbaar viachannels.slack.slashCommand.sessionPrefix). - Als Slack
channel_typeniet levert, leidt OpenClaw dit af uit de kanaal-ID-prefix (D,C,G) en valt terug opchannelom sessiesleutels stabiel te houden. - Registratie van native commands gebruikt
commands.native(globale standaard"auto"→ Slack uit) en kan per werkruimte worden overschreven metchannels.slack.commands.native. Tekstcommando’s vereisen losse/...-berichten en kunnen worden uitgeschakeld metcommands.text: false. Slack slash commands worden in de Slack-app beheerd en niet automatisch verwijderd. Gebruikcommands.useAccessGroups: falseom access-group-controles voor commando’s te omzeilen. - Volledige commandolijst + config: Slash commands
DM-beveiliging (koppelen)¶
- Standaard:
channels.slack.dm.policy="pairing"— onbekende DM-afzenders krijgen een koppelcode (verloopt na 1 uur). - Goedkeuren via:
openclaw pairing approve slack <code>. - Om iedereen toe te staan: stel
channels.slack.dm.policy="open"enchannels.slack.dm.allowFrom=["*"]in. channels.slack.dm.allowFromaccepteert gebruikers-ID’s, @handles of e-mails (worden bij opstarten opgelost wanneer tokens dit toestaan). De wizard accepteert gebruikersnamen en zet ze tijdens de installatie om naar id’s wanneer tokens dit toestaan.
Groepsbeleid¶
channels.slack.groupPolicyregelt kanaalafhandeling (open|disabled|allowlist).allowlistvereist dat kanalen inchannels.slack.channelsworden vermeld.- Als je alleen
SLACK_BOT_TOKEN/SLACK_APP_TOKENinstelt en nooit eenchannels.slack-sectie maakt, stelt de runtime standaardgroupPolicyin opopen. Voegchannels.slack.groupPolicy,channels.defaults.groupPolicyof een kanaal-allowlist toe om het te vergrendelen. - De configuratiewizard accepteert
#channel-namen en zet ze waar mogelijk om naar ID’s (openbaar + privé); bij meerdere overeenkomsten heeft het actieve kanaal de voorkeur. - Bij het opstarten zet OpenClaw kanaal-/gebruikersnamen in allowlists om naar ID’s (wanneer tokens dit toestaan) en logt de mapping; niet-opgeloste entries blijven zoals ingevoerd.
- Om geen kanalen toe te staan, stel
channels.slack.groupPolicy: "disabled"in (of houd een lege allowlist aan).
Kanaalopties (channels.slack.channels.<id> of channels.slack.channels.<name>):
allow: sta het kanaal toe/weiger het wanneergroupPolicy="allowlist".requireMention: mention-gating voor het kanaal.tools: optionele per-kanaal tool-policy-overschrijvingen (allow/deny/alsoAllow).toolsBySender: optionele per-afzender tool-policy-overschrijvingen binnen het kanaal (sleutels zijn afzender-id’s/@handles/e-mails;"*"-wildcard ondersteund).allowBots: sta door de bot geschreven berichten toe in dit kanaal (standaard: false).users: optionele per-kanaal gebruikers-allowlist.skills: skill-filter (weglaten = alle Skills, leeg = geen).systemPrompt: extra systeemprompt voor het kanaal (gecombineerd met topic/doel).enabled: stelfalsein om het kanaal uit te schakelen.
Doelbestemmingen voor levering¶
Gebruik deze met cron/CLI-verzendingen:
user:<id>voor DM’schannel:<id>voor kanalen
Toolacties¶
Slack-toolacties kunnen worden begrensd met channels.slack.actions.*:
| Actiegroep | Standaard | Notities |
|---|---|---|
| reactions | ingeschakeld | Reageren + reacties lijst |
| messages | ingeschakeld | Lezen/verzenden/bewerken/verwijderen |
| pins | ingeschakeld | Pinnen/ontpinnen/lijsten |
| memberInfo | ingeschakeld | Lid informatie |
| emojiList | ingeschakeld | Aangepaste emojilijst |
Beveiligingsnotities¶
- Schrijven gebruikt standaard het bot-token zodat statusveranderende acties binnen de bot-rechten en -identiteit van de app blijven.
- Het instellen van
userTokenReadOnly: falsestaat toe dat het user token wordt gebruikt voor schrijf- bewerkingen wanneer geen bot-token beschikbaar is; acties draaien dan met de rechten van de installerende gebruiker. Behandel het user token als zeer geprivilegieerd en houd actiegates en allowlists strak. - Als je user-token-schrijven inschakelt, zorg ervoor dat het user token de
verwachte schrijfrechten bevat (
chat:write,reactions:write,pins:write,files:write), anders zullen die bewerkingen falen.
Problemen oplossen¶
Doorloop eerst deze ladder:
openclaw status
openclaw gateway status
openclaw logs --follow
openclaw doctor
openclaw channels status --probe
Controleer daarna zo nodig de DM-koppelstatus:
openclaw pairing list slack
Veelvoorkomende fouten:
- Verbonden maar geen kanaalantwoorden: kanaal geblokkeerd door
groupPolicyof niet in dechannels.slack.channels-allowlist. - DM’s genegeerd: afzender niet goedgekeurd wanneer
channels.slack.dm.policy="pairing". - API-fouten (
missing_scope,not_in_channel, authenticatiefouten): bot-/app-tokens of Slack-scopes zijn onvolledig.
Voor triageflow: /channels/troubleshooting.
Notities¶
- Mention-gating wordt geregeld via
channels.slack.channels(stelrequireMentionin optrue);agents.list[].groupChat.mentionPatterns(ofmessages.groupChat.mentionPatterns) tellen ook als mentions. - Multi-agent-override: stel per-agent patronen in op
agents.list[].groupChat.mentionPatterns. - Reactienotificaties volgen
channels.slack.reactionNotifications(gebruikreactionAllowlistmet modusallowlist). - Door de bot geschreven berichten worden standaard genegeerd; schakel in via
channels.slack.allowBotsofchannels.slack.channels.<id>.allowBots. - Waarschuwing: als je antwoorden aan andere bots toestaat (
channels.slack.allowBots=trueofchannels.slack.channels.<id>.allowBots=true), voorkom bot-tot-bot-antwoordlussen metrequireMention,channels.slack.channels.<id>.users-allowlists en/of duidelijke guardrails inAGENTS.mdenSOUL.md. - Voor de Slack-tool staan de semantiek voor het verwijderen van reacties in /tools/reactions.
- Bijlagen worden, wanneer toegestaan en onder de groottelimiet, gedownload naar de mediaopslag.