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.
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_mentionreaction_added,reaction_removedmember_joined_channel,member_left_channelchannel_renamepin_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.
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-...
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:
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).
https://gateway-host/slack/events
OpenClaw-config (minimaal)
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.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 jechannels.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_BOT_TOKENSLACK_APP_TOKEN
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. Gebruikchannels.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. |
slack sendMessage).
Threading per chat-type
Je kunt verschillend threading-gedrag per chat-type configureren doorchannels.slack.replyToModeByChatType in te stellen:
direct: 1:1 DM’s (Slackim)group: groeps-DM’s / MPIM’s (Slackmpim)channel: standaardkanalen (openbaar/privé)
replyToModeByChatType.<chatType>replyToMode- Provider-standaard (
off)
channels.slack.dm.replyToMode wordt nog geaccepteerd als fallback voor direct wanneer geen chat-type-override is ingesteld.
Voorbeelden:
Alleen DM’s in threads:
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).
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 metchannels.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:- 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.
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.