Skip to main content

Slack

Socket-Modus (Standard)

Schnellstart (Einsteiger)

  1. Erstellen Sie eine Slack-App und aktivieren Sie den Socket-Modus.
  2. Erstellen Sie ein App-Token (xapp-...) und ein Bot-Token (xoxb-...).
  3. Setzen Sie die Tokens für OpenClaw und starten Sie das Gateway.
Minimale Konfiguration:

Einrichtung

  1. Erstellen Sie eine Slack-App („From scratch“) unter https://api.slack.com/apps.
  2. Socket Mode → aktivieren. Gehen Sie dann zu Basic InformationApp-Level TokensGenerate Token and Scopes mit dem Scope connections:write. Kopieren Sie das App-Token (xapp-...).
  3. OAuth & Permissions → fügen Sie Bot-Token-Scopes hinzu (verwenden Sie das Manifest unten). Klicken Sie auf Install to Workspace. Kopieren Sie das Bot User OAuth Token (xoxb-...).
  4. Optional: OAuth & Permissions → fügen Sie User Token Scopes hinzu (siehe die schreibgeschützte Liste unten). Installieren Sie die App erneut und kopieren Sie das User OAuth Token (xoxp-...).
  5. Event Subscriptions → aktivieren Sie Events und abonnieren Sie:
    • message.* (enthält Bearbeitungen/Löschungen/Thread-Broadcasts)
    • app_mention
    • reaction_added, reaction_removed
    • member_joined_channel, member_left_channel
    • channel_rename
    • pin_added, pin_removed
  6. Laden Sie den Bot in die Kanäle ein, die er lesen soll.
  7. Slash Commands → erstellen Sie /openclaw, wenn Sie channels.slack.slashCommand verwenden. Wenn Sie native Commands aktivieren, fügen Sie pro integrierter Funktion einen Slash Command hinzu (gleiche Namen wie /help). Nativ ist für Slack standardmäßig deaktiviert, es sei denn, Sie setzen channels.slack.commands.native: true (globales commands.native ist "auto", wodurch Slack deaktiviert bleibt).
  8. App Home → aktivieren Sie den Messages Tab, damit Benutzer dem Bot Direktnachrichten senden können.
Verwenden Sie das Manifest unten, damit Scopes und Events synchron bleiben. Multi-Account-Unterstützung: Verwenden Sie channels.slack.accounts mit Tokens pro Account und optional name. Siehe gateway/configuration für das gemeinsame Muster.

OpenClaw-Konfiguration (Socket-Modus)

Setzen Sie Tokens über Umgebungsvariablen (empfohlen):
  • SLACK_APP_TOKEN=xapp-...
  • SLACK_BOT_TOKEN=xoxb-...
Oder über die Konfiguration:

User-Token (optional)

OpenClaw kann ein Slack-User-Token (xoxp-...) für Leseoperationen verwenden (Verlauf, Pins, Reaktionen, Emoji, Mitgliederinformationen). Standardmäßig bleibt dies schreibgeschützt: Lesezugriffe bevorzugen bei Vorhandensein das User-Token, Schreibzugriffe verwenden weiterhin das Bot-Token, sofern Sie nicht ausdrücklich optieren. Selbst mit userTokenReadOnly: false bleibt das Bot-Token für Schreibzugriffe bevorzugt, wenn es verfügbar ist. User-Tokens werden in der Konfigurationsdatei eingerichtet (keine Unterstützung über Umgebungsvariablen). Für Multi-Account setzen Sie channels.slack.accounts.<id>.userToken. Beispiel mit Bot- + App- + User-Token:
Beispiel mit explizit gesetztem userTokenReadOnly (User-Token-Schreibzugriffe erlauben):

Token-Nutzung

  • Leseoperationen (Verlauf, Reaktionsliste, Pin-Liste, Emoji-Liste, Mitgliederinformationen, Suche) bevorzugen das User-Token, falls konfiguriert, andernfalls das Bot-Token.
  • Schreiboperationen (Nachrichten senden/bearbeiten/löschen, Reaktionen hinzufügen/entfernen, pinnen/entpinnen, Datei-Uploads) verwenden standardmäßig das Bot-Token. Wenn userTokenReadOnly: false gesetzt ist und kein Bot-Token verfügbar ist, greift OpenClaw auf das User-Token zurück.

Verlaufskontext

  • channels.slack.historyLimit (oder channels.slack.accounts.*.historyLimit) steuert, wie viele aktuelle Kanal-/Gruppennachrichten in den Prompt eingebettet werden.
  • Fällt zurück auf messages.groupChat.historyLimit. Setzen Sie 0, um dies zu deaktivieren (Standard: 50).

HTTP-Modus (Events API)

Verwenden Sie den HTTP-Webhook-Modus, wenn Ihr Gateway für Slack über HTTPS erreichbar ist (typisch für Server-Deployments). Der HTTP-Modus verwendet die Events API + Interactivity + Slash Commands mit einer gemeinsamen Request-URL.

Einrichtung (HTTP-Modus)

  1. Erstellen Sie eine Slack-App und deaktivieren Sie den Socket-Modus (optional, wenn Sie nur HTTP verwenden).
  2. Basic Information → kopieren Sie das Signing Secret.
  3. OAuth & Permissions → installieren Sie die App und kopieren Sie das Bot User OAuth Token (xoxb-...).
  4. Event Subscriptions → aktivieren Sie Events und setzen Sie die Request URL auf den Webhook-Pfad Ihres Gateways (Standard: /slack/events).
  5. Interactivity & Shortcuts → aktivieren und dieselbe Request URL setzen.
  6. Slash Commands → setzen Sie dieselbe Request URL für Ihre Commands.
Beispiel-Request-URL: https://gateway-host/slack/events

OpenClaw-Konfiguration (minimal)

Multi-Account-HTTP-Modus: Setzen Sie channels.slack.accounts.<id>.mode = "http" und stellen Sie pro Account eine eindeutige webhookPath bereit, damit jede Slack-App auf ihre eigene URL zeigen kann.

Manifest (optional)

Verwenden Sie dieses Slack-App-Manifest, um die App schnell zu erstellen (passen Sie Name/Befehl nach Bedarf an). Fügen Sie die User-Scopes hinzu, wenn Sie ein User-Token konfigurieren möchten.
Wenn Sie native Commands aktivieren, fügen Sie einen slash_commands-Eintrag pro Command hinzu, den Sie bereitstellen möchten (entsprechend der /help-Liste). Überschreiben Sie dies mit channels.slack.commands.native.

Scopes (aktuell vs. optional)

Die Conversations API von Slack ist typ-spezifisch: Sie benötigen nur die Scopes für die Conversation-Typen, die Sie tatsächlich verwenden (channels, groups, im, mpim). Siehe https://docs.slack.dev/apis/web-api/using-the-conversations-api/ für den Überblick.

Bot-Token-Scopes (erforderlich)

User-Token-Scopes (optional, standardmäßig schreibgeschützt)

Fügen Sie diese unter User Token Scopes hinzu, wenn Sie channels.slack.userToken konfigurieren.
  • channels:history, groups:history, im:history, mpim:history
  • channels:read, groups:read, im:read, mpim:read
  • users:read
  • reactions:read
  • pins:read
  • emoji:read
  • search:read

Derzeit nicht benötigt (aber wahrscheinlich zukünftig)

Konfiguration

Slack verwendet ausschließlich den Socket-Modus (kein HTTP-Webhook-Server). Stellen Sie beide Tokens bereit:
Tokens können auch über Umgebungsvariablen bereitgestellt werden:
  • SLACK_BOT_TOKEN
  • SLACK_APP_TOKEN
Ack-Reaktionen werden global über messages.ackReaction + messages.ackReactionScope gesteuert. Verwenden Sie messages.removeAckAfterReply, um die Ack-Reaktion zu entfernen, nachdem der Bot geantwortet hat.

Limits

  • Ausgehender Text wird in Blöcke von channels.slack.textChunkLimit aufgeteilt (Standard: 4000).
  • Optionale Zeilenumbruch-Chunking: Setzen Sie channels.slack.chunkMode="newline", um vor der Längenaufteilung an Leerzeilen (Absatzgrenzen) zu trennen.
  • Medien-Uploads sind durch channels.slack.mediaMaxMb begrenzt (Standard: 20).

Antwort-Threading

Standardmäßig antwortet OpenClaw im Hauptkanal. Verwenden Sie channels.slack.replyToMode, um automatisches Threading zu steuern: Der Modus gilt sowohl für Auto-Antworten als auch für Agenten-Werkzeugaufrufe (slack sendMessage).

Threading pro Chat-Typ

Sie können unterschiedliches Threading-Verhalten pro Chat-Typ konfigurieren, indem Sie channels.slack.replyToModeByChatType setzen:
Unterstützte Chat-Typen:
  • direct: 1:1-DMs (Slack im)
  • group: Gruppen-DMs / MPIMs (Slack mpim)
  • channel: Standardkanäle (öffentlich/privat)
Priorität:
  1. replyToModeByChatType.<chatType>
  2. replyToMode
  3. Anbieter-Standard (off)
Legacy channels.slack.dm.replyToMode wird weiterhin als Fallback für direct akzeptiert, wenn kein Chat-Typ-Override gesetzt ist. Beispiele: Nur DMs threaden:
Gruppen-DMs threaden, Kanäle im Root belassen:
Kanäle threaden, DMs im Root belassen:

Manuelle Threading-Tags

Für eine feingranulare Steuerung verwenden Sie diese Tags in Agenten-Antworten:
  • [[reply_to_current]] — Antwort auf die auslösende Nachricht (Thread starten/fortsetzen).
  • [[reply_to:<id>]] — Antwort auf eine bestimmte Nachrichten-ID.

Sitzungen + Routing

  • DMs teilen sich die main-Sitzung (wie WhatsApp/Telegram).
  • Kanäle werden auf agent:<agentId>:slack:channel:<channelId>-Sitzungen abgebildet.
  • Slash Commands verwenden agent:<agentId>:slack:slash:<userId>-Sitzungen (Präfix konfigurierbar über channels.slack.slashCommand.sessionPrefix).
  • Wenn Slack kein channel_type bereitstellt, leitet OpenClaw es aus dem Kanal-ID-Präfix ab (D, C, G) und verwendet standardmäßig channel, um Sitzungsschlüssel stabil zu halten.
  • Die Registrierung nativer Commands verwendet commands.native (globaler Standard "auto" → Slack aus) und kann pro Workspace mit channels.slack.commands.native überschrieben werden. Text-Commands erfordern eigenständige /...-Nachrichten und können mit commands.text: false deaktiviert werden. Slack-Slash-Commands werden in der Slack-App verwaltet und nicht automatisch entfernt. Verwenden Sie commands.useAccessGroups: false, um Zugriffsguppenprüfungen für Commands zu umgehen.
  • Vollständige Command-Liste + Konfiguration: Slash commands

DM-Sicherheit (Pairing)

  • Standard: channels.slack.dm.policy="pairing" — unbekannte DM-Absender erhalten einen Pairing-Code (läuft nach 1 Stunde ab).
  • Freigabe über: openclaw pairing approve slack <code>.
  • Um alle zuzulassen: Setzen Sie channels.slack.dm.policy="open" und channels.slack.dm.allowFrom=["*"].
  • channels.slack.dm.allowFrom akzeptiert Benutzer-IDs, @Handles oder E-Mails (werden beim Start aufgelöst, wenn Tokens dies erlauben). Der Assistent akzeptiert Benutzernamen und löst sie während der Einrichtung in IDs auf, wenn Tokens dies erlauben.

Gruppenrichtlinie

  • channels.slack.groupPolicy steuert die Kanalbehandlung (open|disabled|allowlist).
  • allowlist erfordert, dass Kanäle in channels.slack.channels aufgeführt sind.
  • Wenn Sie nur SLACK_BOT_TOKEN/SLACK_APP_TOKEN setzen und niemals einen channels.slack-Abschnitt erstellen, setzt die Laufzeit groupPolicy standardmäßig auf open. Fügen Sie channels.slack.groupPolicy, channels.defaults.groupPolicy oder eine Kanal-Allowlist hinzu, um es einzuschränken.
  • Der Konfigurationsassistent akzeptiert #channel-Namen und löst sie nach Möglichkeit in IDs auf (öffentlich + privat); bei mehreren Treffern wird der aktive Kanal bevorzugt.
  • Beim Start löst OpenClaw Kanal-/Benutzernamen in Allowlists zu IDs auf (wenn Tokens dies erlauben) und protokolliert die Zuordnung; nicht aufgelöste Einträge bleiben unverändert.
  • Um keine Kanäle zuzulassen, setzen Sie channels.slack.groupPolicy: "disabled" (oder behalten Sie eine leere Allowlist).
Kanaloptionen (channels.slack.channels.<id> oder channels.slack.channels.<name>):
  • allow: Kanal erlauben/verbieten, wenn groupPolicy="allowlist".
  • requireMention: Erwähnungs-Gating für den Kanal.
  • tools: optionale kanalweise Tool-Policy-Overrides (allow/deny/alsoAllow).
  • toolsBySender: optionale absenderbezogene Tool-Policy-Overrides innerhalb des Kanals (Schlüssel sind Absender-IDs/@Handles/E-Mails; Platzhalter "*" unterstützt).
  • allowBots: vom Bot verfasste Nachrichten in diesem Kanal zulassen (Standard: false).
  • users: optionale kanalweise Benutzer-Allowlist.
  • skills: Skill-Filter (weglassen = alle Skills, leer = keine).
  • systemPrompt: zusätzlicher System-Prompt für den Kanal (kombiniert mit Thema/Zweck).
  • enabled: setzen Sie false, um den Kanal zu deaktivieren.

Lieferziele

Verwenden Sie diese für Cron-/CLI-Sendungen:
  • user:<id> für DMs
  • channel:<id> für Kanäle

Tool-Aktionen

Slack-Tool-Aktionen können mit channels.slack.actions.* eingeschränkt werden:

Sicherheitshinweise

  • Schreibzugriffe verwenden standardmäßig das Bot-Token, damit zustandsändernde Aktionen auf die Bot-Berechtigungen und -Identität der App beschränkt bleiben.
  • Das Setzen von userTokenReadOnly: false erlaubt die Verwendung des User-Tokens für Schreibzugriffe, wenn kein Bot-Token verfügbar ist; Aktionen laufen dann mit den Rechten des installierenden Benutzers. Behandeln Sie das User-Token als hochprivilegiert und halten Sie Aktions-Gates und Allowlists eng.
  • Wenn Sie User-Token-Schreibzugriffe aktivieren, stellen Sie sicher, dass das User-Token die erwarteten Schreib-Scopes enthält (chat:write, reactions:write, pins:write, files:write), andernfalls schlagen diese Operationen fehl.

Fehlerbehebung

Führen Sie zuerst diese Abfolge aus:
Bestätigen Sie anschließend bei Bedarf den DM-Pairing-Status:
Häufige Fehler:
  • Verbunden, aber keine Kanalantworten: Kanal durch groupPolicy blockiert oder nicht in der channels.slack.channels-Allowlist.
  • DMs werden ignoriert: Absender nicht freigegeben bei channels.slack.dm.policy="pairing".
  • API-Fehler (missing_scope, not_in_channel, Auth-Fehler): Bot-/App-Tokens oder Slack-Scopes sind unvollständig.
Für den Triage-Ablauf: /channels/troubleshooting.

Hinweise

  • Erwähnungs-Gating wird über channels.slack.channels gesteuert (setzen Sie requireMention auf true); agents.list[].groupChat.mentionPatterns (oder messages.groupChat.mentionPatterns) zählen ebenfalls als Erwähnungen.
  • Multi-Agent-Override: Setzen Sie agentenspezifische Muster unter agents.list[].groupChat.mentionPatterns.
  • Reaktionsbenachrichtigungen folgen channels.slack.reactionNotifications (verwenden Sie reactionAllowlist mit Modus allowlist).
  • Vom Bot verfasste Nachrichten werden standardmäßig ignoriert; aktivieren Sie dies über channels.slack.allowBots oder channels.slack.channels.<id>.allowBots.
  • Warnung: Wenn Sie Antworten an andere Bots zulassen (channels.slack.allowBots=true oder channels.slack.channels.<id>.allowBots=true), verhindern Sie Bot-zu-Bot-Antwortschleifen mit requireMention, channels.slack.channels.<id>.users-Allowlists und/oder klaren Guardrails in AGENTS.md und SOUL.md.
  • Für das Slack-Werkzeug sind die Semantiken zum Entfernen von Reaktionen unter /tools/reactions beschrieben.
  • Anhänge werden bei Erlaubnis und unterhalb des Größenlimits in den Medienspeicher heruntergeladen.