Slack
Configuración de Slack vía Socket Mode o HTTP (Events API).
Socket Mode (Predeterminado)
#
Configuración Rápida para Principiantes
1. Crea una Slack App y habilita <strong>Socket Mode</strong>.
2. Crea un <strong>App Token</strong> (<code>xapp-...</code>) y un <strong>Bot Token</strong> (<code>xoxb-...</code>).
3. Configura los tokens en OpenClaw e inicia el gateway.
Configuración mínima:
{
channels: {
slack: {
enabled: true,
appToken: "xapp-...",
botToken: "xoxb-...",
},
},
}#
Configuración Detallada
1. Crea una Slack App en https://api.slack.com/apps (Desde cero).
2. <strong>Socket Mode</strong> → Habilitar. Luego ve a <strong>Basic Information</strong> → <strong>App-Level Tokens</strong> → <strong>Generate Token and Scopes</strong>, añade el scope <code>connections:write</code>. Copia el <strong>App Token</strong> (<code>xapp-...</code>).
3. <strong>OAuth & Permissions</strong> → Añade bot token scopes (recomendamos usar el manifest abajo para asegurar que los scopes coincidan con las suscripciones de eventos). Haz clic en <strong>Install to Workspace</strong>, copia el <strong>Bot User OAuth Token</strong> (<code>xoxb-...</code>).
4. Opcional: <strong>OAuth & Permissions</strong> → Añade <strong>User Token Scopes</strong> (lista de solo lectura abajo). Reinstala la app y copia el <strong>User OAuth Token</strong> (<code>xoxp-...</code>).
5. <strong>Event Subscriptions</strong> → Habilita eventos y suscríbete a:
- <code>message.*</code> (incluye ediciones/eliminaciones/difusiones de hilos)
- <code>app_mention</code>
- <code>reaction_added</code>, <code>reaction_removed</code>
- <code>member_joined_channel</code>, <code>member_left_channel</code>
- <code>channel_rename</code>
- <code>pin_added</code>, <code>pin_removed</code>
6. Invita el bot a los canales que quieres que lea.
7. Slash Commands: Si usas <code>channels.slack.slashCommand</code>, crea <code>/openclaw</code>. Si habilitas comandos nativos, necesitas crear un slash command para cada comando integrado (mismos nombres que en <code>/help</code>). Slack no habilitará comandos nativos por defecto a menos que establezcas explícitamente <code>channels.slack.commands.native: true</code> (el <code>commands.native</code> global por defecto es <code>"auto"</code>, que mantiene Slack deshabilitado).
8. App Home: Habilita <strong>Messages Tab</strong> para que los usuarios puedan enviar DM al bot.
Recomendamos usar el manifest abajo para evitar missing scopes/events.
Multi-cuenta: Usa '<code>'channels.slack.accounts'</code>' para configurar tokens para cada workspace (opcional '<code>'name'</code>'). Para estructura compartida, ver '<a href="/gateway/configuration#telegramaccounts--discordaccounts--slackaccounts--signalaccounts--imessageaccounts">'/gateway/configuration'</a>'.
#
Configuración de OpenClaw (Mínima)
Recomendado usar variables de entorno (adecuado para servidores):
- <code>SLACK_APP_TOKEN=xapp-...</code>
- <code>SLACK_BOT_TOKEN=xoxb-...</code>
O archivo de configuración:
{
channels: {
slack: {
enabled: true,
appToken: "xapp-...",
botToken: "xoxb-...",
},
},
}#
User Token (Opcional)
OpenClaw puede usar un user token de Slack (<code>xoxp-...</code>) para operaciones de lectura (historial, pins, reacciones, emoji, info de miembros, etc.). Por defecto, permanece de solo lectura: las lecturas priorizan el user token (si está presente), las escrituras aún priorizan el bot token a menos que permitas explícitamente escrituras con user token. Incluso si estableces <code>userTokenReadOnly: false</code>, mientras el bot token esté disponible, las operaciones de escritura seguirán priorizando el bot token.
El user token solo se puede establecer vía archivo de configuración (no soportado vía env). Para multi-cuenta, establece '<code>'channels.slack.accounts.'<id>'.userToken'</code>'.
Ejemplo (bot + app + user tokens):
{
channels: {
slack: {
enabled: true,
appToken: "xapp-...",
botToken: "xoxb-...",
userToken: "xoxp-...",
},
},
}Permitir escrituras con user token (usar con precaución):
{
channels: {
slack: {
enabled: true,
appToken: "xapp-...",
botToken: "xoxb-...",
userToken: "xoxp-...",
userTokenReadOnly: false,
},
},
}##
Reglas de Uso de Tokens
- Operaciones de lectura (historial, lista de reacciones, lista de pins, lista de emoji, info de miembros, búsqueda) priorizan el user token (si está configurado), de lo contrario usan el bot token.
- Operaciones de escritura (enviar/editar/eliminar mensajes, agregar/eliminar reacciones, pin/unpin, subir archivos) por defecto usan el bot token; solo fallback a user token si <code>userTokenReadOnly: false</code> y el bot token no está disponible.
#
Contexto de Historial
- <code>channels.slack.historyLimit</code> (o <code>channels.slack.accounts.*.historyLimit</code>) controla cuántos mensajes recientes del canal/grupo se inyectan como contexto.
- Fallback a <code>messages.groupChat.historyLimit</code>. Establece en <code>0</code> para deshabilitar (por defecto 50).
Modo HTTP (Events API)
Cuando tu Gateway puede ser accedido por Slack vía HTTPS (despliegue típico de servidor), el modo HTTP webhook es más adecuado. El modo HTTP usa Events API + Interactivity + Slash Commands, compartiendo la misma Request URL.
#
Configuración
1. Crea una Slack App y (opcionalmente) deshabilita Socket Mode (si solo usas HTTP).
2. <strong>Basic Information</strong> → Copia el <strong>Signing Secret</strong>.
3. <strong>OAuth & Permissions</strong> → Instala la app y copia el <strong>Bot User OAuth Token</strong> (<code>xoxb-...</code>).
4. <strong>Event Subscriptions</strong> → Habilita eventos y apunta la <strong>Request URL</strong> a la ruta webhook del gateway (por defecto <code>/slack/events</code>).
5. <strong>Interactivity & Shortcuts</strong> → Habilita y establece la misma <strong>Request URL</strong>.
6. <strong>Slash Commands</strong> → Establece la misma <strong>Request URL</strong> para tus comandos.
Ejemplo de URL pública:
<code>https://gateway-host/slack/events</code>
#
Configuración de OpenClaw (Mínima)
{
channels: {
slack: {
enabled: true,
mode: "http",
botToken: "xoxb-...",
signingSecret: "tu-signing-secret",
webhookPath: "/slack/events",
},
},
}Modo HTTP multi-cuenta: Establece '<code>'channels.slack.accounts.'<id>'.mode = "http"'</code>' para cada cuenta, y proporciona un '<code>'webhookPath'</code>' único para cada cuenta para que cada Slack App apunte a una URL diferente.
#
Manifest (Opcional)
Puedes usar un manifest para crear rápidamente una app (cambia nombre/comandos según necesites). Si planeas configurar user token, por favor añade user scopes también.
ChannelsSlackPage.step11.code1
Si habilitas comandos nativos, necesitas añadir una entrada <code>slash_commands</code> para cada comando que quieras exponer (consistente con la lista <code>/help</code>), y usar <code>channels.slack.commands.native</code> para anular el comportamiento por defecto.
Scopes (Required vs Optional)
Slack Conversations API splits scopes by conversation type: you only need the conversation type scopes you'll use (channels, groups, im, mpim). Overview: https://docs.slack.dev/apis/web-api/using-the-conversations-api/
#
Bot Token Scopes (Required)
- <code>chat:write</code> (send/update/delete messages)
https://docs.slack.dev/reference/methods/chat.postMessage
- <code>im:write</code> (open DM conversation, for user DMs)
https://docs.slack.dev/reference/methods/conversations.open
- <code>channels:history</code>, <code>groups:history</code>, <code>im:history</code>, <code>mpim:history</code>
https://docs.slack.dev/reference/methods/conversations.history
- <code>channels:read</code>, <code>groups:read</code>, <code>im:read</code>, <code>mpim:read</code>
https://docs.slack.dev/reference/methods/conversations.info
- <code>users:read</code> (user info query)
https://docs.slack.dev/reference/methods/users.info
- <code>reactions:read</code>, <code>reactions:write</code>
https://docs.slack.dev/reference/methods/reactions.get
https://docs.slack.dev/reference/methods/reactions.add
- <code>pins:read</code>, <code>pins:write</code>
https://docs.slack.dev/reference/scopes/pins.read
https://docs.slack.dev/reference/scopes/pins.write
- <code>emoji:read</code>
https://docs.slack.dev/reference/scopes/emoji.read
- <code>files:write</code> (upload)
https://docs.slack.dev/messaging/working-with-files/#upload
#
User Token Scopes
Solo añade a <strong>User Token Scopes</strong> cuando configuras <code>channels.slack.userToken</code>:
- <code>channels:history</code>, <code>groups:history</code>, <code>im:history</code>, <code>mpim:history</code>
- <code>channels:read</code>, <code>groups:read</code>, <code>im:read</code>, <code>mpim:read</code>
- <code>users:read</code>
- <code>reactions:read</code>
- <code>pins:read</code>
- <code>emoji:read</code>
- <code>search:read</code>
Ejemplo de Configuración
{
"slack": {
"enabled": true,
"botToken": "xoxb-...",
"appToken": "xapp-...",
"groupPolicy": "allowlist",
"dm": {
"enabled": true,
"policy": "pairing",
"allowFrom": ["U123", "U456", "*"],
"groupEnabled": false,
"groupChannels": ["G123"],
"replyToMode": "all"
},
"channels": {
"C123": { "allow": true, "requireMention": true },
"#general": {
"allow": true,
"requireMention": true,
"users": ["U123"],
"skills": ["search", "docs"],
"systemPrompt": "Mantén respuestas cortas."
}
},
"reactionNotifications": "own",
"reactionAllowlist": ["U123"],
"replyToMode": "off",
"actions": {
"reactions": true,
"reactionLevel": "minimal"
},
"commands": {
"native": false
}
}
}Las reacciones de ack se controlan globalmente por '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'messages.ackReaction'</code>' + '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'messages.ackReactionScope'</code>'; '<code className="bg-white/10 px-1.5 py-0.5 rounded text-emerald-300 text-sm">'messages.removeAckAfterReply'</code>' puede remover la reacción de ack después de una respuesta.
Threading
Slack soporta respuestas en hilos. OpenClaw puede responder en hilos o a nivel superior.
- <code>channels.slack.replyToMode</code>: <code>off | all | first | last</code>
- <code>off</code>: Responder a nivel superior (sin hilo).
- <code>all</code>: Responder en hilo para todos los mensajes.
- <code>first</code>: Responder en hilo solo para el primer mensaje.
- <code>last</code>: Responder en hilo solo para el último mensaje.
- Predeterminado: <code>off</code>.
- Anulación por canal: '<code>'channels.slack.channels.'<id>'.replyToMode'</code>'.
- Usuarios por canal: '<code>'channels.slack.channels.'<id>'.users'</code>'.
- Skills por canal: '<code>'channels.slack.channels.'<id>'.skills'</code>'.
- Prompt de sistema por canal: '<code>'channels.slack.channels.'<id>'.systemPrompt'</code>'.
Threading para Mensajes Directos
Los DMs también pueden usar threading. Configura vía <code>channels.slack.dm.replyToMode</code>.
- <code>off</code>: Responder a nivel superior.
- <code>all</code>: Responder en hilo para todos los mensajes.
- <code>first</code>: Responder en hilo solo para el primer mensaje.
- <code>last</code>: Responder en hilo solo para el último mensaje.
- Predeterminado: <code>off</code>.
Configurar Threading por Tipo de Chat
Usa <code>channels.slack.replyToModeByChatType</code>:
{
channels: {
slack: {
replyToMode: "off",
replyToModeByChatType: {
direct: "all",
group: "first",
},
},
},
}Tipos de chat soportados:
- <code>direct</code>: DMs uno-a-uno (Slack <code>im</code>)
- <code>group</code>: DMs grupales/MPIM (Slack <code>mpim</code>)
- <code>channel</code>: Canales regulares (públicos/privados)
Prioridad:
1. 1. '<code>'replyToModeByChatType.'<chatType>''</code>'
2. 2. <code>replyToMode</code>
3. 3. Valor predeterminado (<code>off</code>)
La configuración legacy <code>channels.slack.dm.replyToMode</code> todavía se acepta como fallback para <code>direct</code>.
ChannelsSlackPage.step18.p11
Manual Threading Tags
Para control más granular, usa en respuestas de agente:
- <code>[[reply_to_current]]</code>
- '<code>'[[reply_to:'<id>']]'</code>'
Sessions and Routing
- DMs use the <code>main</code> session (similar to WhatsApp/Telegram).
- Channel session key: '<code>'agent:'<agentId>':slack:channel:'<channelId>''</code>'.
- Slash command session key: '<code>'agent:'<agentId>':slack:slash:'<userId>''</code>' (prefix can be configured via '<code>'channels.slack.slashCommand.sessionPrefix'</code>').
- If Slack doesn't provide <code>channel_type</code>, OpenClaw infers by channel id prefix (<code>D</code>/<code>C</code>/<code>G</code>), defaulting to <code>channel</code> to ensure session key stability.
- Native command registration: Global <code>commands.native</code> defaults to <code>"auto"</code> (Slack defaults to disabled), can be overridden with <code>channels.slack.commands.native</code>. Text commands require separate <code>/...</code> messages, can be disabled with <code>commands.text: false</code>. Slack slash commands are managed by the Slack App and won't be automatically removed. <code>commands.useAccessGroups: false</code> can bypass access-group checks.
- Command list and configuration: '<a href="/tools/slash-commands">'/tools/slash-commands'</a>'
DM Security (Pairing)
- Default: <code>channels.slack.dm.policy="pairing"</code> (unknown senders receive a pairing code, expires in 1 hour).
- Approve: '<code>'openclaw pairing approve slack '<code>''</code>'.
- To allow anyone to DM: <code>channels.slack.dm.policy="open"</code> and <code>channels.slack.dm.allowFrom=["*"]</code>.
- <code>channels.slack.dm.allowFrom</code> supports user id, @handle, or email (resolved at startup if tokens allow). The wizard will resolve username to id when possible.
Group Policy
- <code>channels.slack.groupPolicy</code> controls channel handling: <code>open|disabled|allowlist</code>.
- <code>allowlist</code> requires listing allowed channels in <code>channels.slack.channels</code>.
- If you only set <code>SLACK_BOT_TOKEN</code>/<code>SLACK_APP_TOKEN</code> but never create a <code>channels.slack</code> configuration section, the runtime default <code>groupPolicy</code> is <code>open</code>. Once you explicitly configure <code>channels.slack.groupPolicy</code>/<code>channels.defaults.groupPolicy</code> or a channel allowlist, it will be tightened.