Discord (Bot API)

Status: Bereit für DMs und Guild-Textkanäle über das offizielle Discord Bot Gateway.

Schnellstart (Einsteiger)

  1. Erstelle einen Discord Bot und kopiere das Bot Token.
  2. Aktiviere in den Discord-App-Einstellungen Message Content Intent (und Server Members Intent, falls du Allowlists oder Namensauflösung nutzen möchtest).
  3. Setze das Token für OpenClaw:
    • Env: DISCORD_BOT_TOKEN=...
    • Oder Config: channels.discord.token: "...".
    • Wenn beides gesetzt ist, hat die Config Vorrang (Env-Fallback gilt nur für den Default-Account).
  4. Lade den Bot auf deinen Server ein mit Nachrichtenberechtigungen (erstelle einen privaten Server, wenn du nur DMs nutzen möchtest).
  5. Starte das Gateway.
  6. DM-Zugriff ist standardmäßig auf Pairing eingestellt; genehmige den Pairing-Code beim ersten Kontakt.

Minimale Config:

{
  channels: {
    discord: {
      enabled: true,
      token: "YOUR_BOT_TOKEN",
    },
  },
}

Ziele

  • Mit OpenClaw über Discord DMs oder Guild-Kanäle kommunizieren.
  • Direkte Chats laufen in der Haupt-Session des Agents zusammen (Standard: agent:main:main); Guild-Kanäle bleiben isoliert als agent:<agentId>:discord:channel:<channelId> (Anzeigenamen nutzen discord:<guildSlug>#<channelSlug>).
  • Gruppen-DMs werden standardmäßig ignoriert; aktiviere sie über channels.discord.dm.groupEnabled und schränke sie optional über channels.discord.dm.groupChannels ein.
  • Routing bleibt deterministisch: Antworten gehen immer zurück zum Kanal, von dem sie kamen.

Wie es funktioniert

  1. Erstelle eine Discord-Anwendung → Bot, aktiviere die benötigten Intents (DMs + Guild-Nachrichten + Message Content) und hole dir das Bot Token.
  2. Lade den Bot auf deinen Server ein mit den Berechtigungen zum Lesen/Senden von Nachrichten, wo du ihn nutzen möchtest.
  3. Konfiguriere OpenClaw mit channels.discord.token (oder DISCORD_BOT_TOKEN als Fallback).
  4. Starte das Gateway; es startet automatisch den Discord Channel, wenn ein Token verfügbar ist (Config zuerst, Env als Fallback) und channels.discord.enabled nicht false ist.
    • Wenn du Env-Variablen bevorzugst, setze DISCORD_BOT_TOKEN (ein Config-Block ist optional).
  5. Direkte Chats: Nutze user:<id> (oder eine <@id>-Erwähnung) beim Versenden; alle Turns landen in der gemeinsamen main-Session. Reine numerische IDs sind mehrdeutig und werden abgelehnt.
  6. Guild-Kanäle: Nutze channel:<channelId> zum Versenden. Erwähnungen sind standardmäßig erforderlich und können pro Guild oder pro Kanal gesetzt werden.
  7. Direkte Chats: Standardmäßig sicher über channels.discord.dm.policy (Standard: "pairing"). Unbekannte Absender erhalten einen Pairing-Code (läuft nach 1 Stunde ab); genehmige über openclaw pairing approve discord <code>.
    • Um das alte “offen für alle”-Verhalten beizubehalten: Setze channels.discord.dm.policy="open" und channels.discord.dm.allowFrom=["*"].
    • Für eine harte Allowlist: Setze channels.discord.dm.policy="allowlist" und liste Absender in channels.discord.dm.allowFrom auf.
    • Um alle DMs zu ignorieren: Setze channels.discord.dm.enabled=false oder channels.discord.dm.policy="disabled".
  8. Gruppen-DMs werden standardmäßig ignoriert; aktiviere sie über channels.discord.dm.groupEnabled und schränke sie optional über channels.discord.dm.groupChannels ein.
  9. Optionale Guild-Regeln: Setze channels.discord.guilds mit Schlüsseln nach Guild-ID (bevorzugt) oder Slug, mit Regeln pro Kanal.
  10. Optionale native Commands: commands.native ist standardmäßig "auto" (an für Discord/Telegram, aus für Slack). Überschreibe mit channels.discord.commands.native: true|false|"auto"; false löscht zuvor registrierte Commands. Text-Commands werden über commands.text gesteuert und müssen als eigenständige /...-Nachrichten gesendet werden. Nutze commands.useAccessGroups: false, um Access-Group-Checks für Commands zu umgehen.
  11. Optionaler Guild-Context-Verlauf: Setze channels.discord.historyLimit (Standard 20, fällt zurück auf messages.groupChat.historyLimit), um die letzten N Guild-Nachrichten als Context einzubeziehen, wenn auf eine Erwähnung geantwortet wird. Setze 0 zum Deaktivieren.
  12. Reactions: Der Agent kann Reactions über das discord-Tool auslösen (gesteuert durch channels.discord.actions.*).
    • Reaction-Entfernungs-Semantik: siehe /tools/reactions.
    • Das discord-Tool wird nur verfügbar gemacht, wenn der aktuelle Channel Discord ist.
  13. Native Commands nutzen isolierte Session-Keys (agent:<agentId>:discord:slash:<userId>) statt der gemeinsamen main-Session.

Hinweis: Name → ID-Auflösung nutzt Guild-Member-Suche und benötigt Server Members Intent; wenn der Bot keine Members durchsuchen kann, nutze IDs oder <@id>-Erwähnungen. Hinweis: Slugs sind kleingeschrieben mit Leerzeichen ersetzt durch -. Kanalnamen werden ohne führendes # geslugged. Hinweis: Guild-Context-[from:]-Zeilen enthalten author.tag + id, um ping-fertige Antworten zu erleichtern.

Config-Schreibzugriff

Standardmäßig darf Discord Config-Updates schreiben, die durch /config set|unset ausgelöst werden (benötigt commands.config: true).

Deaktivieren mit:

{
  channels: { discord: { configWrites: false } },
}

Eigenen Bot erstellen

Das ist das “Discord Developer Portal”-Setup zum Betrieb von OpenClaw in einem Server-(Guild-)Kanal wie #help.

1) Discord-App + Bot-User erstellen

  1. Discord Developer Portal → ApplicationsNew Application
  2. In deiner App:
    • BotAdd Bot
    • Kopiere das Bot Token (das kommt in DISCORD_BOT_TOKEN)

2) Gateway Intents aktivieren, die OpenClaw braucht

Discord blockiert “privileged intents”, außer du aktivierst sie explizit.

In BotPrivileged Gateway Intents, aktiviere:

  • Message Content Intent (erforderlich zum Lesen von Nachrichtentexten in den meisten Guilds; ohne siehst du “Used disallowed intents” oder der Bot verbindet sich, reagiert aber nicht auf Nachrichten)
  • Server Members Intent (empfohlen; erforderlich für einige Member/User-Lookups und Allowlist-Matching in Guilds)

Du brauchst normalerweise nicht den Presence Intent.

3) Invite-URL generieren (OAuth2 URL Generator)

In deiner App: OAuth2URL Generator

Scopes

  • bot
  • applications.commands (erforderlich für native Commands)

Bot Permissions (minimale Baseline)

  • ✅ View Channels
  • ✅ Send Messages
  • ✅ Read Message History
  • ✅ Embed Links
  • ✅ Attach Files
  • ✅ Add Reactions (optional, aber empfohlen)
  • ✅ Use External Emojis / Stickers (optional; nur wenn du sie möchtest)

Vermeide Administrator, außer du debuggst und vertraust dem Bot vollständig.

Kopiere die generierte URL, öffne sie, wähle deinen Server und installiere den Bot.

4) IDs holen (Guild/User/Channel)

Discord nutzt überall numerische IDs; OpenClaw-Config bevorzugt IDs.

  1. Discord (Desktop/Web) → User SettingsAdvanced → aktiviere Developer Mode
  2. Rechtsklick:
    • Servername → Copy Server ID (Guild-ID)
    • Kanal (z. B. #help) → Copy Channel ID
    • Dein User → Copy User ID

5) OpenClaw konfigurieren

Token

Setze das Bot Token über Env-Variable (empfohlen auf Servern):

  • DISCORD_BOT_TOKEN=...

Oder über Config:

{
  channels: {
    discord: {
      enabled: true,
      token: "YOUR_BOT_TOKEN",
    },
  },
}

Multi-Account-Support: Nutze channels.discord.accounts mit Tokens pro Account und optionalem name. Siehe gateway/configuration für das gemeinsame Pattern.

Allowlist + Channel-Routing

Beispiel “einzelner Server, nur ich erlaubt, nur #help erlaubt”:

{
  channels: {
    discord: {
      enabled: true,
      dm: { enabled: false },
      guilds: {
        YOUR_GUILD_ID: {
          users: ["YOUR_USER_ID"],
          requireMention: true,
          channels: {
            help: { allow: true, requireMention: true },
          },
        },
      },
      retry: {
        attempts: 3,
        minDelayMs: 500,
        maxDelayMs: 30000,
        jitter: 0.1,
      },
    },
  },
}

Hinweise:

  • requireMention: true bedeutet, der Bot antwortet nur bei Erwähnung (empfohlen für geteilte Kanäle).
  • agents.list[].groupChat.mentionPatterns (oder messages.groupChat.mentionPatterns) zählen auch als Erwähnungen für Guild-Nachrichten.
  • Multi-Agent-Override: Setze Agent-spezifische Patterns auf agents.list[].groupChat.mentionPatterns.
  • Wenn channels vorhanden ist, wird jeder nicht aufgelistete Kanal standardmäßig abgelehnt.
  • Nutze einen "*"-Kanal-Eintrag, um Defaults über alle Kanäle anzuwenden; explizite Kanal-Einträge überschreiben den Wildcard.
  • Threads erben die Config des Eltern-Kanals (Allowlist, requireMention, Skills, Prompts usw.), außer du fügst die Thread-Kanal-ID explizit hinzu.
  • Bot-verfasste Nachrichten werden standardmäßig ignoriert; setze channels.discord.allowBots=true, um sie zu erlauben (eigene Nachrichten bleiben gefiltert).
  • Warnung: Wenn du Antworten auf andere Bots erlaubst (channels.discord.allowBots=true), verhindere Bot-zu-Bot-Antwortschleifen mit requireMention, channels.discord.guilds.*.channels.<id>.users-Allowlists und/oder klaren Leitplanken in AGENTS.md und SOUL.md.

6) Prüfen, ob es funktioniert

  1. Starte das Gateway.
  2. Sende in deinem Server-Kanal: @Krill hello (oder wie auch immer dein Bot heißt).
  3. Wenn nichts passiert: Schau dir Troubleshooting unten an.

Troubleshooting

  • Zuerst: Führe openclaw doctor und openclaw channels status --probe aus (umsetzbare Warnungen + schnelle Audits).
  • “Used disallowed intents”: Aktiviere Message Content Intent (und wahrscheinlich Server Members Intent) im Developer Portal, dann starte das Gateway neu.
  • Bot verbindet sich, antwortet aber nie in einem Guild-Kanal:
    • Message Content Intent fehlt, oder
    • Dem Bot fehlen Kanal-Berechtigungen (View/Send/Read History), oder
    • Deine Config verlangt Erwähnungen und du hast ihn nicht erwähnt, oder
    • Deine Guild/Kanal-Allowlist lehnt den Kanal/User ab.
  • requireMention: false, aber trotzdem keine Antworten:
  • channels.discord.groupPolicy ist standardmäßig allowlist; setze es auf "open" oder füge einen Guild-Eintrag unter channels.discord.guilds hinzu (liste optional Kanäle unter channels.discord.guilds.<id>.channels auf, um einzuschränken).
    • Wenn du nur DISCORD_BOT_TOKEN setzt und nie einen channels.discord-Abschnitt erstellst, setzt die Runtime groupPolicy standardmäßig auf open. Füge channels.discord.groupPolicy, channels.defaults.groupPolicy oder eine Guild/Kanal-Allowlist hinzu, um es zu sperren.
  • requireMention muss unter channels.discord.guilds (oder einem spezifischen Kanal) stehen. channels.discord.requireMention auf oberster Ebene wird ignoriert.
  • Permission-Audits (channels status --probe) prüfen nur numerische Kanal-IDs. Wenn du Slugs/Namen als channels.discord.guilds.*.channels-Keys nutzt, kann das Audit keine Berechtigungen verifizieren.
  • DMs funktionieren nicht: channels.discord.dm.enabled=false, channels.discord.dm.policy="disabled", oder du wurdest noch nicht genehmigt (channels.discord.dm.policy="pairing").
  • Exec-Approvals in Discord: Discord unterstützt eine Button-UI für Exec-Approvals in DMs (Allow once / Always allow / Deny). /approve <id> ... ist nur für weitergeleitete Approvals und löst Discords Button-Prompts nicht auf. Wenn du ❌ Failed to submit approval: Error: unknown approval id siehst oder die UI nie erscheint, prüfe:
    • channels.discord.execApprovals.enabled: true in deiner Config.
    • Deine Discord-User-ID ist in channels.discord.execApprovals.approvers aufgelistet (die UI wird nur an Approvers gesendet).
    • Nutze die Buttons im DM-Prompt (Allow once, Always allow, Deny).
    • Siehe Exec Approvals und Slash Commands für den breiteren Approvals- und Command-Flow.

Funktionen & Limits

  • DMs und Guild-Textkanäle (Threads werden als separate Kanäle behandelt; Voice nicht unterstützt).
  • Tippindikatoren werden best-effort gesendet; Nachrichten-Chunking nutzt channels.discord.textChunkLimit (Standard 2000) und teilt hohe Antworten nach Zeilenanzahl (channels.discord.maxLinesPerMessage, Standard 17).
  • Optionales Newline-Chunking: Setze channels.discord.chunkMode="newline", um an Leerzeilen (Absatzgrenzen) zu teilen, bevor nach Länge gechunkt wird.
  • Datei-Uploads unterstützt bis zum konfigurierten channels.discord.mediaMaxMb (Standard 8 MB).
  • Erwähnungs-gesteuerte Guild-Antworten standardmäßig, um laute Bots zu vermeiden.
  • Reply-Context wird injiziert, wenn eine Nachricht auf eine andere Nachricht verweist (zitierter Inhalt + IDs).
  • Natives Reply-Threading ist standardmäßig aus; aktiviere mit channels.discord.replyToMode und Reply-Tags.

Retry Policy

Ausgehende Discord-API-Calls wiederholen bei Rate Limits (429) unter Nutzung von Discords retry_after, wenn verfügbar, mit exponentiellem Backoff und Jitter. Konfiguriere über channels.discord.retry. Siehe Retry Policy.

Config

{
  channels: {
    discord: {
      enabled: true,
      token: "abc.123",
      groupPolicy: "allowlist",
      guilds: {
        "*": {
          channels: {
            general: { allow: true },
          },
        },
      },
      mediaMaxMb: 8,
      actions: {
        reactions: true,
        stickers: true,
        emojiUploads: true,
        stickerUploads: true,
        polls: true,
        permissions: true,
        messages: true,
        threads: true,
        pins: true,
        search: true,
        memberInfo: true,
        roleInfo: true,
        roles: false,
        channelInfo: true,
        channels: true,
        voiceStatus: true,
        events: true,
        moderation: false,
      },
      replyToMode: "off",
      dm: {
        enabled: true,
        policy: "pairing", // pairing | allowlist | open | disabled
        allowFrom: ["123456789012345678", "steipete"],
        groupEnabled: false,
        groupChannels: ["openclaw-dm"],
      },
      guilds: {
        "*": { requireMention: true },
        "123456789012345678": {
          slug: "friends-of-openclaw",
          requireMention: false,
          reactionNotifications: "own",
          users: ["987654321098765432", "steipete"],
          channels: {
            general: { allow: true },
            help: {
              allow: true,
              requireMention: true,
              users: ["987654321098765432"],
              skills: ["search", "docs"],
              systemPrompt: "Keep answers short.",
            },
          },
        },
      },
    },
  },
}

Ack-Reactions werden global über messages.ackReaction + messages.ackReactionScope gesteuert. Nutze messages.removeAckAfterReply, um die Ack-Reaction nach der Bot-Antwort zu entfernen.

  • dm.enabled: Setze false, um alle DMs zu ignorieren (Standard true).
  • dm.policy: DM-Zugriffskontrolle (pairing empfohlen). "open" benötigt dm.allowFrom=["*"].
  • dm.allowFrom: DM-Allowlist (User-IDs oder Namen). Wird von dm.policy="allowlist" und für dm.policy="open"-Validierung genutzt. Der Wizard akzeptiert Usernamen und löst sie zu IDs auf, wenn der Bot Members durchsuchen kann.
  • dm.groupEnabled: Gruppen-DMs aktivieren (Standard false).
  • dm.groupChannels: Optionale Allowlist für Gruppen-DM-Kanal-IDs oder Slugs.
  • groupPolicy: Steuert Guild-Kanal-Handling (open|disabled|allowlist); allowlist benötigt Kanal-Allowlists.
  • guilds: Regeln pro Guild mit Schlüssel nach Guild-ID (bevorzugt) oder Slug.
  • guilds."*": Standard-Guild-Einstellungen, die angewendet werden, wenn kein expliziter Eintrag existiert.
  • guilds.<id>.slug: Optionaler freundlicher Slug für Anzeigenamen.
  • guilds.<id>.users: Optionale User-Allowlist pro Guild (IDs oder Namen).
  • guilds.<id>.tools: Optionale Tool-Policy-Overrides pro Guild (allow/deny/alsoAllow), genutzt wenn das Kanal-Override fehlt.
  • guilds.<id>.toolsBySender: Optionale Tool-Policy-Overrides pro Sender auf Guild-Ebene (gilt wenn das Kanal-Override fehlt; "*"-Wildcard unterstützt).
  • guilds.<id>.channels.<channel>.allow: Kanal erlauben/verweigern wenn groupPolicy="allowlist".
  • guilds.<id>.channels.<channel>.requireMention: Erwähnungs-Gating für den Kanal.
  • guilds.<id>.channels.<channel>.tools: Optionale Tool-Policy-Overrides pro Kanal (allow/deny/alsoAllow).
  • guilds.<id>.channels.<channel>.toolsBySender: Optionale Tool-Policy-Overrides pro Sender innerhalb des Kanals ("*"-Wildcard unterstützt).
  • guilds.<id>.channels.<channel>.users: Optionale User-Allowlist pro Kanal.
  • guilds.<id>.channels.<channel>.skills: Skill-Filter (weglassen = alle Skills, leer = keine).
  • guilds.<id>.channels.<channel>.systemPrompt: Extra System-Prompt für den Kanal (kombiniert mit Kanal-Topic).
  • guilds.<id>.channels.<channel>.enabled: Setze false, um den Kanal zu deaktivieren.
  • guilds.<id>.channels: Kanal-Regeln (Keys sind Kanal-Slugs oder IDs).
  • guilds.<id>.requireMention: Erwähnungs-Anforderung pro Guild (pro Kanal überschreibbar).
  • guilds.<id>.reactionNotifications: Reaction-System-Event-Modus (off, own, all, allowlist).
  • textChunkLimit: Ausgehende Text-Chunk-Größe (Zeichen). Standard: 2000.
  • chunkMode: length (Standard) teilt nur bei Überschreitung von textChunkLimit; newline teilt an Leerzeilen (Absatzgrenzen) vor Längen-Chunking.
  • maxLinesPerMessage: Soft-Max-Zeilenanzahl pro Nachricht. Standard: 17.
  • mediaMaxMb: Eingehende Medien auf Disk begrenzen.
  • historyLimit: Anzahl der letzten Guild-Nachrichten als Context bei Antwort auf Erwähnung (Standard 20; fällt zurück auf messages.groupChat.historyLimit; 0 deaktiviert).
  • dmHistoryLimit: DM-History-Limit in User-Turns. Pro-User-Overrides: dms["<user_id>"].historyLimit.
  • retry: Retry-Policy für ausgehende Discord-API-Calls (attempts, minDelayMs, maxDelayMs, jitter).
  • pluralkit: PluralKit-proxied Messages auflösen, sodass System-Members als separate Sender erscheinen.
  • actions: Tool-Gates pro Action; weglassen um alle zu erlauben (setze false zum Deaktivieren).
    • reactions (umfasst react + read reactions)
    • stickers, emojiUploads, stickerUploads, polls, permissions, messages, threads, pins, search
    • memberInfo, roleInfo, channelInfo, voiceStatus, events
    • channels (Kanäle/Kategorien/Berechtigungen erstellen/bearbeiten/löschen)
    • roles (Rollen hinzufügen/entfernen, Standard false)
    • moderation (Timeout/Kick/Ban, Standard false)
  • execApprovals: Discord-only Exec-Approval-DMs (Button-UI). Unterstützt enabled, approvers, agentFilter, sessionFilter.

Reaction-Notifications nutzen guilds.<id>.reactionNotifications:

  • off: Keine Reaction-Events.
  • own: Reactions auf die eigenen Nachrichten des Bots (Standard).
  • all: Alle Reactions auf alle Nachrichten.
  • allowlist: Reactions von guilds.<id>.users auf alle Nachrichten (leere Liste deaktiviert).

PluralKit (PK) Support

Aktiviere PK-Lookups, sodass proxied Messages zum zugrundeliegenden System + Member aufgelöst werden. Wenn aktiviert, nutzt OpenClaw die Member-Identität für Allowlists und kennzeichnet den Sender als Member (PK:System), um versehentliche Discord-Pings zu vermeiden.

{
  channels: {
    discord: {
      pluralkit: {
        enabled: true,
        token: "pk_live_...", // optional; erforderlich für private Systeme
      },
    },
  },
}

Allowlist-Hinweise (PK-aktiviert):

  • Nutze pk:<memberId> in dm.allowFrom, guilds.<id>.users oder pro-Kanal users.
  • Member-Anzeigenamen werden auch nach Name/Slug gematcht.
  • Lookups nutzen die originale Discord-Nachrichten-ID (die Pre-Proxy-Nachricht), sodass die PK-API sie nur innerhalb ihres 30-Minuten-Fensters auflösen kann.
  • Wenn PK-Lookups fehlschlagen (z. B. privates System ohne Token), werden proxied Messages als Bot-Nachrichten behandelt und verworfen, außer channels.discord.allowBots=true.

Tool-Action-Defaults

Action-GruppeStandardHinweise
reactionsaktiviertReact + list reactions + emojiList
stickersaktiviertSticker senden
emojiUploadsaktiviertEmojis hochladen
stickerUploadsaktiviertSticker hochladen
pollsaktiviertUmfragen erstellen
permissionsaktiviertKanal-Berechtigungs-Snapshot
messagesaktiviertLesen/Senden/Bearbeiten/Löschen
threadsaktiviertErstellen/Auflisten/Antworten
pinsaktiviertPinnen/Entpinnen/Auflisten
searchaktiviertNachrichten-Suche (Preview)
memberInfoaktiviertMember-Info
roleInfoaktiviertRollen-Liste
channelInfoaktiviertKanal-Info + Liste
channelsaktiviertKanal/Kategorie-Management
voiceStatusaktiviertVoice-State-Lookup
eventsaktiviertGeplante Events auflisten/erstellen
rolesdeaktiviertRollen hinzufügen/entfernen
moderationdeaktiviertTimeout/Kick/Ban
  • replyToMode: off (Standard), first oder all. Gilt nur wenn das Modell ein Reply-Tag enthält.

Reply-Tags

Um eine Thread-Antwort anzufordern, kann das Modell ein Tag in seiner Ausgabe einfügen:

  • [[reply_to_current]] — Auf die auslösende Discord-Nachricht antworten.
  • [[reply_to:<id>]] — Auf eine spezifische Nachrichten-ID aus Context/History antworten. Aktuelle Nachrichten-IDs werden an Prompts als [message_id: …] angehängt; History-Einträge enthalten bereits IDs.

Das Verhalten wird über channels.discord.replyToMode gesteuert:

  • off: Tags ignorieren.
  • first: Nur der erste ausgehende Chunk/Anhang ist eine Antwort.
  • all: Jeder ausgehende Chunk/Anhang ist eine Antwort.

Allowlist-Matching-Hinweise:

  • allowFrom/users/groupChannels akzeptieren IDs, Namen, Tags oder Erwähnungen wie <@id>.
  • Präfixe wie discord:/user: (Users) und channel: (Gruppen-DMs) werden unterstützt.
  • Nutze *, um jeden Sender/Kanal zu erlauben.
  • Wenn guilds.<id>.channels vorhanden ist, werden nicht aufgelistete Kanäle standardmäßig abgelehnt.
  • Wenn guilds.<id>.channels fehlt, sind alle Kanäle in der allowgelisteten Guild erlaubt.
  • Um keine Kanäle zu erlauben, setze channels.discord.groupPolicy: "disabled" (oder behalte eine leere Allowlist).
  • Der Configure-Wizard akzeptiert Guild/Channel-Namen (öffentlich + privat) und löst sie zu IDs auf, wenn möglich.
  • Beim Start löst OpenClaw Kanal/User-Namen in Allowlists zu IDs auf (wenn der Bot Members durchsuchen kann) und loggt das Mapping; nicht aufgelöste Einträge werden wie eingegeben behalten.

Native-Command-Hinweise:

  • Die registrierten Commands spiegeln OpenClaws Chat-Commands.
  • Native Commands respektieren dieselben Allowlists wie DMs/Guild-Nachrichten (channels.discord.dm.allowFrom, channels.discord.guilds, pro-Kanal-Regeln).
  • Slash-Commands können in der Discord-UI für nicht-allowgelistete User trotzdem sichtbar sein; OpenClaw erzwingt Allowlists bei Ausführung und antwortet “not authorized”.

Tool-Actions

Der Agent kann discord mit Actions wie diesen aufrufen:

  • react / reactions (Reactions hinzufügen oder auflisten)
  • sticker, poll, permissions
  • readMessages, sendMessage, editMessage, deleteMessage
  • Read/Search/Pin-Tool-Payloads enthalten normalisierte timestampMs (UTC-Epoch-ms) und timestampUtc neben rohem Discord-timestamp.
  • threadCreate, threadList, threadReply
  • pinMessage, unpinMessage, listPins
  • searchMessages, memberInfo, roleInfo, roleAdd, roleRemove, emojiList
  • channelInfo, channelList, voiceStatus, eventList, eventCreate
  • timeout, kick, ban

Discord-Nachrichten-IDs werden im injizierten Context sichtbar gemacht ([discord message id: …] und History-Zeilen), sodass der Agent sie ansteuern kann. Emoji können Unicode sein (z. B. ) oder Custom-Emoji-Syntax wie <:party_blob:1234567890>.

Sicherheit & Betrieb

  • Behandle das Bot Token wie ein Passwort; bevorzuge die DISCORD_BOT_TOKEN-Env-Variable auf überwachten Hosts oder sperre die Config-Datei-Berechtigungen.
  • Gib dem Bot nur die Berechtigungen, die er braucht (typischerweise Read/Send Messages).
  • Wenn der Bot hängt oder rate-limited ist, starte das Gateway neu (openclaw gateway --force), nachdem du bestätigt hast, dass kein anderer Prozess die Discord-Session besitzt.