Slack
Modo socket (predeterminado)
Configuración rápida (principiante)
- Cree una app de Slack y habilite Socket Mode.
- Cree un App Token (
xapp-...) y un Bot Token (xoxb-...). - Configure los tokens para OpenClaw e inicie el Gateway.
Configuración
- Cree una app de Slack (From scratch) en https://api.slack.com/apps.
- Socket Mode → actívelo. Luego vaya a Basic Information → App-Level Tokens → Generate Token and Scopes con el alcance
connections:write. Copie el App Token (xapp-...). - OAuth & Permissions → agregue los alcances del bot (use el manifiesto de abajo). Haga clic en Install to Workspace. Copie el Bot User OAuth Token (
xoxb-...). - Opcional: OAuth & Permissions → agregue User Token Scopes (vea la lista de solo lectura abajo). Reinstale la app y copie el User OAuth Token (
xoxp-...). - Event Subscriptions → habilite eventos y suscríbase a:
message.*(incluye ediciones/eliminaciones/difusiones de hilos)app_mentionreaction_added,reaction_removedmember_joined_channel,member_left_channelchannel_renamepin_added,pin_removed
- Invite al bot a los canales que desea que lea.
- Slash Commands → cree
/openclawsi usachannels.slack.slashCommand. Si habilita comandos nativos, agregue un comando slash por cada comando integrado (los mismos nombres que/help). De forma predeterminada, los nativos están desactivados para Slack a menos que configurechannels.slack.commands.native: true(el valor globalcommands.nativees"auto", lo que deja Slack desactivado). - App Home → habilite la Messages Tab para que los usuarios puedan enviar mensajes directos al bot.
channels.slack.accounts con tokens por cuenta y name opcional. Vea gateway/configuration para el patrón compartido.
Configuración de OpenClaw (modo socket)
Configure los tokens mediante variables de entorno (recomendado):SLACK_APP_TOKEN=xapp-...SLACK_BOT_TOKEN=xoxb-...
Token de usuario (opcional)
OpenClaw puede usar un token de usuario de Slack (xoxp-...) para operaciones de lectura (historial,
pines, reacciones, emoji, información de miembros). De forma predeterminada, esto permanece en solo lectura: las lecturas
prefieren el token de usuario cuando está presente, y las escrituras siguen usando el token del bot a menos
que usted lo habilite explícitamente. Incluso con userTokenReadOnly: false, el token del bot
sigue siendo preferido para escrituras cuando está disponible.
Los tokens de usuario se configuran en el archivo de configuración (no hay soporte por variables de entorno). Para
multi‑cuenta, configure channels.slack.accounts.<id>.userToken.
Ejemplo con tokens de bot + app + usuario:
Uso de tokens
- Las operaciones de lectura (historial, lista de reacciones, lista de pines, lista de emoji, información de miembros, búsqueda) prefieren el token de usuario cuando está configurado; de lo contrario, el token del bot.
- Las operaciones de escritura (enviar/editar/eliminar mensajes, agregar/quitar reacciones, fijar/desfijar,
cargas de archivos) usan el token del bot de forma predeterminada. Si
userTokenReadOnly: falsey no hay token de bot disponible, OpenClaw recurre al token de usuario.
Contexto de historial
channels.slack.historyLimit(ochannels.slack.accounts.*.historyLimit) controla cuántos mensajes recientes del canal/grupo se incluyen en el prompt.- Vuelve a
messages.groupChat.historyLimit. Configure0para deshabilitar (predeterminado 50).
Modo HTTP (Events API)
Use el modo de webhook HTTP cuando su Gateway sea accesible por Slack a través de HTTPS (típico en despliegues de servidor). El modo HTTP usa Events API + Interactivity + Slash Commands con una URL de solicitud compartida.Configuración (modo HTTP)
- Cree una app de Slack y deshabilite Socket Mode (opcional si solo usa HTTP).
- Basic Information → copie el Signing Secret.
- OAuth & Permissions → instale la app y copie el Bot User OAuth Token (
xoxb-...). - Event Subscriptions → habilite eventos y configure la Request URL a la ruta del webhook del Gateway (predeterminado
/slack/events). - Interactivity & Shortcuts → habilite y configure la misma Request URL.
- Slash Commands → configure la misma Request URL para su(s) comando(s).
https://gateway-host/slack/events
Configuración de OpenClaw (mínima)
channels.slack.accounts.<id>.mode = "http" y proporcione un
webhookPath único por cuenta para que cada app de Slack apunte a su propia URL.
Manifiesto (opcional)
Use este manifiesto de app de Slack para crear la app rápidamente (ajuste el nombre/comando si lo desea). Incluya los alcances de usuario si planea configurar un token de usuario.slash_commands por cada comando que quiera exponer (coincidiendo con la lista /help). Reemplace con channels.slack.commands.native.
Alcances (actuales vs opcionales)
La API de Conversaciones de Slack está tipada por conversación: solo necesita los alcances para los tipos de conversación que realmente use (channels, groups, im, mpim). Vea https://docs.slack.dev/apis/web-api/using-the-conversations-api/ para una visión general.Alcances del token del bot (requeridos)
chat:write(enviar/actualizar/eliminar mensajes mediantechat.postMessage) https://docs.slack.dev/reference/methods/chat.postMessageim:write(abrir mensajes directos medianteconversations.openpara DMs de usuario) 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(búsqueda de usuarios) 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(cargas mediantefiles.uploadV2) https://docs.slack.dev/messaging/working-with-files/#upload
Alcances del token de usuario (opcional, solo lectura por defecto)
Agregue estos en User Token Scopes si configurachannels.slack.userToken.
channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read
No necesarios hoy (pero probables en el futuro)
mpim:write(solo si agregamos apertura de DM grupal/inicio de DM medianteconversations.open)groups:write(solo si agregamos gestión de canales privados: crear/renombrar/invitar/archivar)chat:write.public(solo si queremos publicar en canales en los que el bot no está) https://docs.slack.dev/reference/scopes/chat.write.publicusers:read.email(solo si necesitamos campos de correo electrónico deusers.info) https://docs.slack.dev/changelog/2017-04-narrowing-email-accessfiles:read(solo si comenzamos a listar/leer metadatos de archivos)
Configuración
Slack usa solo Socket Mode (sin servidor de webhook HTTP). Proporcione ambos tokens:SLACK_BOT_TOKENSLACK_APP_TOKEN
messages.ackReaction +
messages.ackReactionScope. Use messages.removeAckAfterReply para limpiar la
reacción de acuse después de que el bot responda.
Límites
- El texto saliente se fragmenta en
channels.slack.textChunkLimit(predeterminado 4000). - Fragmentación opcional por salto de línea: configure
channels.slack.chunkMode="newline"para dividir en líneas en blanco (límites de párrafo) antes de fragmentar por longitud. - Las cargas de medios están limitadas por
channels.slack.mediaMaxMb(predeterminado 20).
Enhebrado de respuestas
De forma predeterminada, OpenClaw responde en el canal principal. Usechannels.slack.replyToMode para controlar el enhebrado automático:
| Modo | Comportamiento |
|---|---|
off | Predeterminado. Responder en el canal principal. Solo enhebra si el mensaje desencadenante ya estaba en un hilo. |
first | La primera respuesta va al hilo (bajo el mensaje desencadenante), las respuestas posteriores van al canal principal. Útil para mantener el contexto visible evitando saturar hilos. |
all | Todas las respuestas van al hilo. Mantiene las conversaciones contenidas pero puede reducir la visibilidad. |
slack sendMessage).
Enhebrado por tipo de chat
Puede configurar un comportamiento de enhebrado diferente por tipo de chat configurandochannels.slack.replyToModeByChatType:
direct: DMs 1:1 (Slackim)group: DMs grupales / MPIMs (Slackmpim)channel: canales estándar (públicos/privados)
replyToModeByChatType.<chatType>replyToMode- Predeterminado del proveedor (
off)
channels.slack.dm.replyToMode aún se acepta como respaldo para direct cuando no hay una anulación por tipo de chat.
Ejemplos:
Enhebrar solo DMs:
Etiquetas manuales de enhebrado
Para un control más fino, use estas etiquetas en las respuestas del agente:[[reply_to_current]]— responder al mensaje desencadenante (iniciar/continuar hilo).[[reply_to:<id>]]— responder a un id de mensaje específico.
Sesiones + enrutamiento
- Los DMs comparten la sesión
main(como WhatsApp/Telegram). - Los canales se asignan a sesiones
agent:<agentId>:slack:channel:<channelId>. - Los slash commands usan sesiones
agent:<agentId>:slack:slash:<userId>(prefijo configurable mediantechannels.slack.slashCommand.sessionPrefix). - Si Slack no proporciona
channel_type, OpenClaw lo infiere a partir del prefijo del ID del canal (D,C,G) y usachannelde forma predeterminada para mantener estables las claves de sesión. - El registro de comandos nativos usa
commands.native(predeterminado global"auto"→ Slack desactivado) y puede anularse por espacio de trabajo conchannels.slack.commands.native. Los comandos de texto requieren mensajes/...independientes y pueden deshabilitarse concommands.text: false. Los slash commands de Slack se gestionan en la app de Slack y no se eliminan automáticamente. Usecommands.useAccessGroups: falsepara omitir comprobaciones de grupos de acceso para comandos. - Lista completa de comandos + configuración: Slash commands
Seguridad de DMs (emparejamiento)
- Predeterminado:
channels.slack.dm.policy="pairing"— los remitentes de DM desconocidos reciben un código de emparejamiento (expira después de 1 hora). - Aprobar mediante:
openclaw pairing approve slack <code>. - Para permitir a cualquiera: configure
channels.slack.dm.policy="open"ychannels.slack.dm.allowFrom=["*"]. channels.slack.dm.allowFromacepta IDs de usuario, @handles o correos electrónicos (resueltos al iniciar cuando los tokens lo permiten). El asistente acepta nombres de usuario y los resuelve a ids durante la configuración cuando los tokens lo permiten.
Política de grupos
channels.slack.groupPolicycontrola el manejo de canales (open|disabled|allowlist).allowlistrequiere que los canales estén listados enchannels.slack.channels.- Si solo configura
SLACK_BOT_TOKEN/SLACK_APP_TOKENy nunca crea una secciónchannels.slack, el tiempo de ejecución establecegroupPolicyenopende forma predeterminada. Agreguechannels.slack.groupPolicy,channels.defaults.groupPolicyo una lista de permitidos de canales para reforzarlo. - El asistente de configuración acepta nombres
#channely los resuelve a IDs cuando es posible (públicos + privados); si existen múltiples coincidencias, prefiere el canal activo. - Al iniciar, OpenClaw resuelve nombres de canal/usuario en listas de permitidos a IDs (cuando los tokens lo permiten) y registra el mapeo; las entradas no resueltas se mantienen tal como se escribieron.
- Para permitir ningún canal, configure
channels.slack.groupPolicy: "disabled"(o mantenga una lista de permitidos vacía).
channels.slack.channels.<id> o channels.slack.channels.<name>):
allow: permitir/denegar el canal cuandogroupPolicy="allowlist".requireMention: control por mención para el canal.tools: anulaciones opcionales de política de herramientas por canal (allow/deny/alsoAllow).toolsBySender: anulaciones opcionales de política de herramientas por remitente dentro del canal (las claves son ids de remitente/@handles/correos; se admite el comodín"*").allowBots: permitir mensajes creados por el bot en este canal (predeterminado: false).users: lista de permitidos de usuarios opcional por canal.skills: filtro de skills (omitir = todas las skills, vacío = ninguna).systemPrompt: prompt de sistema adicional para el canal (combinado con el tema/propósito).enabled: configurefalsepara deshabilitar el canal.
Destinos de entrega
Úselos con envíos por cron/CLI:user:<id>para DMschannel:<id>para canales
Acciones de herramientas
Las acciones de herramientas de Slack pueden controlarse conchannels.slack.actions.*:
| Grupo de acciones | Predeterminado | Notas |
|---|---|---|
| reactions | habilitado | Reaccionar + listar reacciones |
| messages | habilitado | Leer/enviar/editar/eliminar |
| pins | habilitado | Fijar/desfijar/listar |
| memberInfo | habilitado | Información de miembros |
| emojiList | habilitado | Lista de emoji personalizados |
Notas de seguridad
- Las escrituras usan por defecto el token del bot para que las acciones que cambian el estado queden dentro de los permisos e identidad del bot de la app.
- Configurar
userTokenReadOnly: falsepermite usar el token de usuario para operaciones de escritura cuando no hay token de bot disponible, lo que significa que las acciones se ejecutan con el acceso del usuario que instaló la app. Trate el token de usuario como altamente privilegiado y mantenga estrictos los controles de acciones y listas de permitidos. - Si habilita escrituras con token de usuario, asegúrese de que el token de usuario incluya los alcances de escritura
esperados (
chat:write,reactions:write,pins:write,files:write) o esas operaciones fallarán.
Solución de problemas
Ejecute primero esta escalera:- Conectado pero sin respuestas en canales: el canal está bloqueado por
groupPolicyo no está en la lista de permitidoschannels.slack.channels. - DMs ignorados: el remitente no está aprobado cuando
channels.slack.dm.policy="pairing". - Errores de API (
missing_scope,not_in_channel, fallas de autenticación): los tokens de bot/app o los alcances de Slack están incompletos.
Notas
- El control por mención se gestiona mediante
channels.slack.channels(configurerequireMentionentrue);agents.list[].groupChat.mentionPatterns(omessages.groupChat.mentionPatterns) también cuentan como menciones. - Anulación multi‑agente: configure patrones por agente en
agents.list[].groupChat.mentionPatterns. - Las notificaciones de reacciones siguen
channels.slack.reactionNotifications(usereactionAllowlistcon el modoallowlist). - Los mensajes creados por el bot se ignoran por defecto; habilite mediante
channels.slack.allowBotsochannels.slack.channels.<id>.allowBots. - Advertencia: si permite respuestas a otros bots (
channels.slack.allowBots=trueochannels.slack.channels.<id>.allowBots=true), evite bucles de respuestas entre bots con listas de permitidosrequireMention,channels.slack.channels.<id>.usersy/o eliminando guardas enAGENTS.mdySOUL.md. - Para la herramienta de Slack, la semántica de eliminación de reacciones está en /tools/reactions.
- Los adjuntos se descargan al almacén de medios cuando está permitido y por debajo del límite de tamaño.