Discord (Bot API)
Status: klaar voor DM’s en tekstkanalen in servers via de officiële Discord-botgateway.Snelle installatie (beginner)
- Maak een Discord-bot en kopieer de bot-token.
- Schakel in de instellingen van de Discord-app Message Content Intent in (en Server Members Intent als je toegestane lijsten of naamopzoekingen wilt gebruiken).
- Stel de token in voor OpenClaw:
- Env:
DISCORD_BOT_TOKEN=... - Of config:
channels.discord.token: "...". - Als beide zijn ingesteld, heeft config voorrang (env-terugval is alleen voor het standaardaccount).
- Env:
- Nodig de bot uit op je server met berichtenrechten (maak een privésserver als je alleen DM’s wilt).
- Start de Gateway.
- DM-toegang is standaard gekoppeld; keur de koppelcode goed bij het eerste contact.
Doelen
- Praten met OpenClaw via Discord-DM’s of serverkanalen.
- Directe chats worden samengevoegd in de hoofdsessie van de agent (standaard
agent:main:main); serverkanalen blijven geïsoleerd alsagent:<agentId>:discord:channel:<channelId>(weergavenamen gebruikendiscord:<guildSlug>#<channelSlug>). - Groeps-DM’s worden standaard genegeerd; inschakelen via
channels.discord.dm.groupEnableden optioneel beperken metchannels.discord.dm.groupChannels. - Routering deterministisch houden: antwoorden gaan altijd terug naar het kanaal waarop ze zijn binnengekomen.
Hoe het werkt
- Maak een Discord-applicatie → Bot, schakel de benodigde intents in (DM’s + serverberichten + berichtinhoud) en pak de bot-token.
- Nodig de bot uit op je server met de rechten om berichten te lezen/verzenden waar je hem wilt gebruiken.
- Configureer OpenClaw met
channels.discord.token(ofDISCORD_BOT_TOKENals terugval). - Start de Gateway; deze start automatisch het Discord-kanaal wanneer een token beschikbaar is (eerst config, env als terugval) en
channels.discord.enablednietfalseis.- Als je env-vars verkiest, stel
DISCORD_BOT_TOKENin (een configblok is optioneel).
- Als je env-vars verkiest, stel
- Directe chats: gebruik
user:<id>(of een<@id>-vermelding) bij het afleveren; alle beurten komen in de gedeeldemain-sessie terecht. Kale numerieke ID’s zijn dubbelzinnig en worden geweigerd. - Serverkanalen: gebruik
channel:<channelId>voor aflevering. Vermeldingen zijn standaard vereist en kunnen per server of per kanaal worden ingesteld. - Directe chats: standaard beveiligd via
channels.discord.dm.policy(standaard:"pairing"). Onbekende afzenders krijgen een koppelcode (verloopt na 1 uur); keur goed viaopenclaw pairing approve discord <code>.- Om het oude “open voor iedereen”-gedrag te behouden: stel
channels.discord.dm.policy="open"enchannels.discord.dm.allowFrom=["*"]in. - Voor een harde toegestane lijst: stel
channels.discord.dm.policy="allowlist"in en vermeld afzenders inchannels.discord.dm.allowFrom. - Om alle DM’s te negeren: stel
channels.discord.dm.enabled=falseofchannels.discord.dm.policy="disabled"in.
- Om het oude “open voor iedereen”-gedrag te behouden: stel
- Groeps-DM’s worden standaard genegeerd; inschakelen via
channels.discord.dm.groupEnableden optioneel beperken metchannels.discord.dm.groupChannels. - Optionele serverregels: stel
channels.discord.guildsin, gesleuteld op server-id (voorkeur) of slug, met regels per kanaal. - Optionele native opdrachten:
commands.nativestaat standaard op"auto"(aan voor Discord/Telegram, uit voor Slack). Overschrijf metchannels.discord.commands.native: true|false|"auto";falsewist eerder geregistreerde opdrachten. Tekstopdrachten worden geregeld doorcommands.texten moeten als zelfstandige/...-berichten worden verzonden. Gebruikcommands.useAccessGroups: falseom toegangscontrole voor opdrachten te omzeilen.- Volledige opdrachtenlijst + config: Slash commands
- Optionele servercontextgeschiedenis: stel
channels.discord.historyLimitin (standaard 20, valt terug opmessages.groupChat.historyLimit) om de laatste N serverberichten als context mee te nemen bij het antwoorden op een vermelding. Stel0in om uit te schakelen. - Reacties: de agent kan reacties activeren via de
discord-tool (afgeschermd doorchannels.discord.actions.*).- Semantiek voor het verwijderen van reacties: zie /tools/reactions.
- De
discord-tool wordt alleen beschikbaar gesteld wanneer het huidige kanaal Discord is.
- Native opdrachten gebruiken geïsoleerde sessiesleutels (
agent:<agentId>:discord:slash:<userId>) in plaats van de gedeeldemain-sessie.
<@id>-vermeldingen.
Let op: Slugs zijn lowercase met spaties vervangen door -. Kanaalnamen worden geslugged zonder de leidende #.
Let op: Servercontext-[from:]-regels bevatten author.tag + id om ping-klare antwoorden te vergemakkelijken.
Config-wegschrijvingen
Standaard mag Discord config-updates wegschrijven die worden getriggerd door/config set|unset (vereist commands.config: true).
Uitschakelen met:
Je eigen bot maken
Dit is de installatie in het “Discord Developer Portal” voor het draaien van OpenClaw in een serverkanaal zoals#help.
1. Maak de Discord-app + botgebruiker
- Discord Developer Portal → Applications → New Application
- In je app:
- Bot → Add Bot
- Kopieer de Bot Token (dit is wat je invult in
DISCORD_BOT_TOKEN)
2) Schakel de gateway-intents in die OpenClaw nodig heeft
Discord blokkeert “privileged intents” tenzij je ze expliciet inschakelt. In Bot → Privileged Gateway Intents, schakel in:- Message Content Intent (vereist om berichttekst te lezen in de meeste servers; zonder dit zie je “Used disallowed intents” of verbindt de bot maar reageert niet op berichten)
- Server Members Intent (aanbevolen; vereist voor sommige lid-/gebruikersopzoekingen en het matchen van toegestane lijsten in servers)
setPresence) gebruikt gateway OP3 en vereist deze intent niet; deze is alleen nodig als je aanwezigheidupdates van andere serverleden wilt ontvangen.
3. Genereer een uitnodigings-URL (OAuth2 URL Generator)
In je app: OAuth2 → URL Generator Scopes- ✅
bot - ✅
applications.commands(vereist voor native opdrachten)
- ✅ View Channels
- ✅ Send Messages
- ✅ Read Message History
- ✅ Embed Links
- ✅ Attach Files
- ✅ Add Reactions (optioneel maar aanbevolen)
- ✅ Use External Emojis / Stickers (optioneel; alleen als je ze wilt)
4. Verkrijg de id’s (server/gebruiker/kanaal)
Discord gebruikt overal numerieke id’s; OpenClaw-config verkiest id’s.- Discord (desktop/web) → User Settings → Advanced → schakel Developer Mode in
- Rechtsklik:
- Servernaam → Copy Server ID (server-id)
- Kanaal (bijv.
#help) → Copy Channel ID - Je gebruiker → Copy User ID
5) Configureer OpenClaw
Token
Stel de bot-token in via env-var (aanbevolen op servers):DISCORD_BOT_TOKEN=...
channels.discord.accounts met per-account tokens en optioneel name. Zie gateway/configuration voor het gedeelde patroon.
Toegestane lijst + kanaalroutering
Voorbeeld “één server, alleen ik toestaan, alleen #help toestaan”:requireMention: truebetekent dat de bot alleen antwoordt wanneer hij wordt vermeld (aanbevolen voor gedeelde kanalen).agents.list[].groupChat.mentionPatterns(ofmessages.groupChat.mentionPatterns) tellen ook als vermeldingen voor serverberichten.- Multi-agent-override: stel per-agent patronen in op
agents.list[].groupChat.mentionPatterns. - Als
channelsaanwezig is, wordt elk kanaal dat niet is vermeld standaard geweigerd. - Gebruik een
"*"-kanaalingang om standaardwaarden toe te passen op alle kanalen; expliciete kanaalingangen overschrijven de wildcard. - Threads erven de configuratie van het bovenliggende kanaal (toegestane lijst,
requireMention, Skills, prompts, enz.) tenzij je de thread-kanaal-id expliciet toevoegt. - Eigenaars-hint: wanneer een per-server of per-kanaal
users-toegestane lijst overeenkomt met de afzender, behandelt OpenClaw die afzender als de eigenaar in de systeemprompt. Voor een globale eigenaar over kanalen heen, stelcommands.ownerAllowFromin. - Door de bot geschreven berichten worden standaard genegeerd; stel
channels.discord.allowBots=truein om ze toe te staan (eigen berichten blijven gefilterd). - Waarschuwing: als je antwoorden op andere bots toestaat (
channels.discord.allowBots=true), voorkom bot-tot-bot-antwoordlussen metrequireMention,channels.discord.guilds.*.channels.<id>.users-toegestane lijsten en/of door guardrails te wissen inAGENTS.mdenSOUL.md.
6. Verifieer dat het werkt
- Start de Gateway.
- Stuur in je serverkanaal:
@Krill hello(of wat je botnaam ook is). - Als er niets gebeurt: controleer Problemen oplossen hieronder.
Problemen oplossen
- Eerst: voer
openclaw doctorenopenclaw channels status --probeuit (actiegerichte waarschuwingen + snelle audits). - “Used disallowed intents”: schakel Message Content Intent (en waarschijnlijk Server Members Intent) in het Developer Portal in en start daarna de Gateway opnieuw.
- Bot verbindt maar antwoordt nooit in een serverkanaal:
- Ontbrekende Message Content Intent, of
- De bot mist kanaalrechten (View/Send/Read History), of
- Je config vereist vermeldingen en je hebt die niet gebruikt, of
- Je server-/kanaaltoegestane lijst weigert het kanaal/de gebruiker.
requireMention: falsemaar nog steeds geen antwoorden:channels.discord.groupPolicystaat standaard op allowlist; stel het in op"open"of voeg een serververmelding toe onderchannels.discord.guilds(optioneel kanalen opsommen onderchannels.discord.guilds.<id>.channelsom te beperken).- Als je alleen
DISCORD_BOT_TOKENinstelt en nooit eenchannels.discord-sectie maakt, stelt de runtimegroupPolicystandaard in opopen. Voegchannels.discord.groupPolicy,channels.defaults.groupPolicyof een server-/kanaaltoegestane lijst toe om het af te schermen.
- Als je alleen
requireMentionmoet onderchannels.discord.guildsstaan (of een specifiek kanaal).channels.discord.requireMentionop het hoogste niveau wordt genegeerd.- Rechtenaudits (
channels status --probe) controleren alleen numerieke kanaal-id’s. Als je slugs/namen gebruikt alschannels.discord.guilds.*.channels-sleutels, kan de audit de rechten niet verifiëren. - DM’s werken niet:
channels.discord.dm.enabled=false,channels.discord.dm.policy="disabled", of je bent nog niet goedgekeurd (channels.discord.dm.policy="pairing"). - Uitvoeringsgoedkeuringen in Discord: Discord ondersteunt een knop-UI voor uitvoeringsgoedkeuringen in DM’s (Eenmalig toestaan / Altijd toestaan / Weigeren).
/approve <id> ...is alleen voor doorgestuurde goedkeuringen en zal de knopprompts van Discord niet oplossen. Als je❌ Failed to submit approval: Error: unknown approval idziet of de UI nooit verschijnt, controleer:channels.discord.execApprovals.enabled: truein je config.- Of je Discord-gebruikers-id in
channels.discord.execApprovals.approversstaat (de UI wordt alleen naar goedkeurders gestuurd). - Gebruik de knoppen in de DM-prompt (Eenmalig toestaan, Altijd toestaan, Weigeren).
- Zie Exec approvals en Slash commands voor de bredere goedkeurings- en opdrachtflow.
Mogelijkheden & beperkingen
- DM’s en tekstkanalen in servers (threads worden als aparte kanalen behandeld; voice wordt niet ondersteund).
- Typindicatoren worden best-effort verzonden; berichtopdeling gebruikt
channels.discord.textChunkLimit(standaard 2000) en splitst lange antwoorden op regelaantal (channels.discord.maxLinesPerMessage, standaard 17). - Optionele alinea-opdeling: stel
channels.discord.chunkMode="newline"in om te splitsen op lege regels (alinea-grenzen) vóór lengte-opdeling. - Uploads van bestanden worden ondersteund tot de geconfigureerde
channels.discord.mediaMaxMb(standaard 8 MB). - Antwoorden in servers zijn standaard vermeldings-afgeschermd om lawaaierige bots te vermijden.
- Antwoordcontext wordt geïnjecteerd wanneer een bericht naar een ander bericht verwijst (geciteerde inhoud + id’s).
- Native antwoord-threading staat standaard uit; schakel in met
channels.discord.replyToModeen reply-tags.
Herhaalbeleid
Uitgaande Discord-API-aanroepen herhalen bij rate limits (429) met Discordretry_after waar beschikbaar, met exponentiële backoff en jitter. Configureer via channels.discord.retry. Zie Retry policy.
Config
messages.ackReaction +
messages.ackReactionScope. Gebruik messages.removeAckAfterReply om de
ack-reactie te verwijderen nadat de bot heeft geantwoord.
dm.enabled: stelfalsein om alle DM’s te negeren (standaardtrue).dm.policy: DM-toegangsbeheer (pairingaanbevolen)."open"vereistdm.allowFrom=["*"].dm.allowFrom: DM-toegestane lijst (gebruikers-id’s of namen). Gebruikt doordm.policy="allowlist"en voordm.policy="open"-validatie. De wizard accepteert gebruikersnamen en lost ze op naar id’s wanneer de bot leden kan doorzoeken.dm.groupEnabled: groeps-DM’s inschakelen (standaardfalse).dm.groupChannels: optionele toegestane lijst voor groeps-DM-kanaal-id’s of slugs.groupPolicy: regelt de afhandeling van serverkanalen (open|disabled|allowlist);allowlistvereist kanaaltoegestane lijsten.guilds: per-serverregels gesleuteld op server-id (voorkeur) of slug.guilds."*": standaard per-serverinstellingen die worden toegepast wanneer geen expliciete vermelding bestaat.guilds.<id>.slug: optionele vriendelijke slug voor weergavenamen.guilds.<id>.users: optionele per-servergebruikers-toegestane lijst (id’s of namen).guilds.<id>.tools: optionele per-server toolbeleid-overschrijvingen (allow/deny/alsoAllow) gebruikt wanneer de kanaaloverschrijving ontbreekt.guilds.<id>.toolsBySender: optionele per-afzender toolbeleid-overschrijvingen op serverniveau (van toepassing wanneer de kanaaloverschrijving ontbreekt;"*"-wildcard ondersteund).guilds.<id>.channels.<channel>.allow: sta het kanaal toe/weiger wanneergroupPolicy="allowlist".guilds.<id>.channels.<channel>.requireMention: vermelding-afscherming voor het kanaal.guilds.<id>.channels.<channel>.tools: optionele per-kanaal toolbeleid-overschrijvingen (allow/deny/alsoAllow).guilds.<id>.channels.<channel>.toolsBySender: optionele per-afzender toolbeleid-overschrijvingen binnen het kanaal ("*"-wildcard ondersteund).guilds.<id>.channels.<channel>.users: optionele per-kanaal gebruikers-toegestane lijst.guilds.<id>.channels.<channel>.skills: skillfilter (weglaten = alle Skills, leeg = geen).guilds.<id>.channels.<channel>.systemPrompt: extra systeemprompt voor het kanaal. Discord-kanaaltopics worden als onbetrouwbare context geïnjecteerd (niet als systeemprompt).guilds.<id>.channels.<channel>.enabled: stelfalsein om het kanaal uit te schakelen.guilds.<id>.channels: kanaalregels (sleutels zijn kanaalslugs of id’s).guilds.<id>.requireMention: per-server vermeldingseis (overschrijfbaar per kanaal).guilds.<id>.reactionNotifications: reactiestelsel-gebeurtenismodus (off,own,all,allowlist).textChunkLimit: uitgaande tekst-chunkgrootte (tekens). Standaard: 2000.chunkMode:length(standaard) splitst alleen bij overschrijden vantextChunkLimit;newlinesplitst op lege regels (alinea-grenzen) vóór lengte-opdeling.maxLinesPerMessage: zachte maximale regellimiet per bericht. Standaard: 17.mediaMaxMb: begrens inkomende media die op schijf worden opgeslagen.historyLimit: aantal recente serverberichten om als context mee te nemen bij het antwoorden op een vermelding (standaard 20; valt terug opmessages.groupChat.historyLimit;0schakelt uit).dmHistoryLimit: DM-geschiedenislimeit in gebruikersbeurten. Per-gebruiker-overschrijvingen:dms["<user_id>"].historyLimit.retry: herhaalbeleid voor uitgaande Discord-API-aanroepen (pogingen, minDelayMs, maxDelayMs, jitter).pluralkit: los PluralKit-geproxiede berichten op zodat systeemleden als afzonderlijke afzenders verschijnen.actions: per-actie tool-afschermingen; weglaten om alles toe te staan (stelfalsein om uit te schakelen).reactions(dekt reageren + reacties lezen)stickers,emojiUploads,stickerUploads,polls,permissions,messages,threads,pins,searchmemberInfo,roleInfo,channelInfo,voiceStatus,eventschannels(kanalen + categorieën + rechten maken/bewerken/verwijderen)roles(rollen toevoegen/verwijderen, standaardfalse)moderation(timeout/kick/ban, standaardfalse)presence(botstatus/-activiteit, standaardfalse)
execApprovals: Discord-specifieke uitvoeringsgoedkeurings-DM’s (knop-UI). Ondersteuntenabled,approvers,agentFilter,sessionFilter.
guilds.<id>.reactionNotifications:
off: geen reactiegebeurtenissen.own: reacties op de eigen berichten van de bot (standaard).all: alle reacties op alle berichten.allowlist: reacties vanguilds.<id>.usersop alle berichten (lege lijst schakelt uit).
PluralKit (PK)-ondersteuning
Schakel PK-opzoekingen in zodat geproxiede berichten worden opgelost naar het onderliggende systeem + lid. Wanneer ingeschakeld gebruikt OpenClaw de lididentiteit voor toegestane lijsten en labelt de afzender alsMember (PK:System) om onbedoelde Discord-pings te voorkomen.
- Gebruik
pk:<memberId>indm.allowFrom,guilds.<id>.usersof per-kanaalusers. - Weergavenamen van leden worden ook gematcht op naam/slug.
- Opzoekingen gebruiken de oorspronkelijke Discord-bericht-id (het pre-proxy-bericht), zodat de PK-API dit alleen binnen zijn venster van 30 minuten kan oplossen.
- Als PK-opzoekingen mislukken (bijv. privé-systeem zonder token), worden geproxiede berichten
behandeld als botberichten en verworpen tenzij
channels.discord.allowBots=true.
Standaarden voor toolacties
| Actiegroep | Standaard | Notities |
|---|---|---|
| reactions | ingeschakeld | Reageren + reacties tonen + emojiList |
| stickers | ingeschakeld | Stickers verzenden |
| emojiUploads | ingeschakeld | Emoji’s uploaden |
| stickerUploads | ingeschakeld | Stickers uploaden |
| polls | ingeschakeld | Polls maken |
| permissions | ingeschakeld | Snapshot van kanaalrechten |
| messages | ingeschakeld | Lezen/verzenden/bewerken/verwijderen |
| threads | ingeschakeld | Maken/lijsten/antwoorden |
| pins | ingeschakeld | Vastzetten/losmaken/lijsten |
| search | ingeschakeld | Berichten zoeken (previewfunctie) |
| memberInfo | ingeschakeld | Lid informatie |
| roleInfo | ingeschakeld | Rollenlijst |
| channelInfo | ingeschakeld | Kanaalinformatie + lijst |
| channels | ingeschakeld | Kanaal-/categoriebeheer |
| voiceStatus | ingeschakeld | Voice-status opzoeken |
| events | ingeschakeld | Geplande events tonen/maken |
| rollen | uitgeschakeld | Rollen toevoegen/verwijderen |
| moderatie | uitgeschakeld | Timeout/kick/ban |
| aanwezigheid | uitgeschakeld | Botstatus/-activiteit (setPresence) |
replyToMode:off(standaard),firstofall. Geldt alleen wanneer het model een reply-tag bevat.
Reply-tags
Om een antwoord in een thread te vragen, kan het model één tag in zijn uitvoer opnemen:[[reply_to_current]]— antwoord op het triggerende Discord-bericht.[[reply_to:<id>]]— antwoord op een specifieke bericht-id uit context/geschiedenis. Huidige bericht-id’s worden aan prompts toegevoegd als[message_id: …]; geschiedenisvermeldingen bevatten al id’s.
channels.discord.replyToMode:
off: tags negeren.first: alleen de eerste uitgaande chunk/bijlage is een antwoord.all: elke uitgaande chunk/bijlage is een antwoord.
allowFrom/users/groupChannelsaccepteren id’s, namen, tags of vermeldingen zoals<@id>.- Prefixen zoals
discord:/user:(gebruikers) enchannel:(groeps-DM’s) worden ondersteund. - Gebruik
*om elke afzender/elk kanaal toe te staan. - Wanneer
guilds.<id>.channelsaanwezig is, worden niet-vermelde kanalen standaard geweigerd. - Wanneer
guilds.<id>.channelsontbreekt, zijn alle kanalen in de toegestane server toegestaan. - Om geen kanalen toe te staan, stel
channels.discord.groupPolicy: "disabled"in (of houd een lege toegestane lijst). - De configuratiewizard accepteert
Guild/Channel-namen (publiek + privé) en lost ze waar mogelijk op naar id’s. - Bij het opstarten lost OpenClaw kanaal-/gebruikersnamen in toegestane lijsten op naar id’s (wanneer de bot leden kan doorzoeken) en logt de mapping; niet-opgeloste items blijven zoals ingevoerd.
- De geregistreerde opdrachten weerspiegelen de chatopdrachten van OpenClaw.
- Native opdrachten respecteren dezelfde toegestane lijsten als DM’s/serverberichten (
channels.discord.dm.allowFrom,channels.discord.guilds, per-kanaalregels). - Slash-commando’s kunnen in de Discord-UI zichtbaar blijven voor gebruikers die niet op de toegestane lijst staan; OpenClaw handhaaft de toegestane lijsten bij uitvoering en antwoordt met “niet geautoriseerd”.
Toolacties
De agent kandiscord aanroepen met acties zoals:
react/reactions(reacties toevoegen of tonen)sticker,poll,permissionsreadMessages,sendMessage,editMessage,deleteMessage- Lees-/zoek-/pin-toolpayloads bevatten genormaliseerde
timestampMs(UTC-epoch ms) entimestampUtcnaast ruwe Discordtimestamp. threadCreate,threadList,threadReplypinMessage,unpinMessage,listPinssearchMessages,memberInfo,roleInfo,roleAdd,roleRemove,emojiListchannelInfo,channelList,voiceStatus,eventList,eventCreatetimeout,kick,bansetPresence(botactiviteit en online status)
[discord message id: …] en geschiedenisregels) zodat de agent ze kan targeten.
Emoji kunnen unicode zijn (bijv. ✅) of aangepaste emoji-syntaxis zoals <:party_blob:1234567890>.
Veiligheid & beheer
- Behandel de bot-token als een wachtwoord; geef de voorkeur aan de
DISCORD_BOT_TOKENenv-var op beheerde hosts of vergrendel de bestandsrechten van de config. - Geef de bot alleen de rechten die hij nodig heeft (meestal Berichten lezen/verzenden).
- Als de bot vastloopt of rate limited is, herstart de Gateway (
openclaw gateway --force) nadat je hebt bevestigd dat geen andere processen de Discord-sessie bezitten.