Slack
Modo Socket (padrão)
Configuração rápida (iniciante)
- Crie um app do Slack e habilite o Socket Mode.
- Crie um App Token (
xapp-...) e um Bot Token (xoxb-...). - Defina os tokens para o OpenClaw e inicie o gateway.
Configuração
- Crie um app do Slack (From scratch) em https://api.slack.com/apps.
- Socket Mode → ative. Em seguida vá para Basic Information → App-Level Tokens → Generate Token and Scopes com o escopo
connections:write. Copie o App Token (xapp-...). - OAuth & Permissions → adicione os escopos do bot (use o manifesto abaixo). Clique em Install to Workspace. Copie o Bot User OAuth Token (
xoxb-...). - Opcional: OAuth & Permissions → adicione User Token Scopes (veja a lista somente leitura abaixo). Reinstale o app e copie o User OAuth Token (
xoxp-...). - Event Subscriptions → habilite eventos e assine:
message.*(inclui edições/exclusões/broadcasts de thread)app_mentionreaction_added,reaction_removedmember_joined_channel,member_left_channelchannel_renamepin_added,pin_removed
- Convide o bot para os canais que você quer que ele leia.
- Slash Commands → crie
/openclawse você usarchannels.slack.slashCommand. Se você habilitar comandos nativos, adicione um comando de barra por comando embutido (mesmos nomes de/help). O modo nativo vem desativado por padrão para o Slack, a menos que você definachannels.slack.commands.native: true(ocommands.nativeglobal é"auto", que mantém o Slack desativado). - App Home → habilite a Messages Tab para que usuários possam enviar DM ao bot.
channels.slack.accounts com tokens por conta e name opcional. Veja gateway/configuration para o padrão compartilhado.
Configuração do OpenClaw (Modo Socket)
Defina os tokens via variáveis de ambiente (recomendado):SLACK_APP_TOKEN=xapp-...SLACK_BOT_TOKEN=xoxb-...
Token de usuário (opcional)
O OpenClaw pode usar um token de usuário do Slack (xoxp-...) para operações de leitura (histórico,
pins, reações, emoji, informações de membros). Por padrão, ele permanece somente leitura: leituras
preferem o token de usuário quando presente, e gravações ainda usam o token do bot, a menos
que você opte explicitamente. Mesmo com userTokenReadOnly: false, o token do bot continua
preferido para gravações quando está disponível.
Tokens de usuário são configurados no arquivo de configuração (sem suporte a variáveis de ambiente). Para
múltiplas contas, defina channels.slack.accounts.<id>.userToken.
Exemplo com tokens de bot + app + usuário:
Uso de tokens
- Operações de leitura (histórico, lista de reações, lista de pins, lista de emojis, informações de membros, busca) preferem o token de usuário quando configurado; caso contrário, o token do bot.
- Operações de gravação (enviar/editar/excluir mensagens, adicionar/remover reações, pin/unpin,
upload de arquivos) usam o token do bot por padrão. Se
userTokenReadOnly: falsee nenhum token de bot estiver disponível, o OpenClaw recorre ao token de usuário.
Contexto de histórico
channels.slack.historyLimit(ouchannels.slack.accounts.*.historyLimit) controla quantas mensagens recentes de canal/grupo são incluídas no prompt.- Volta para
messages.groupChat.historyLimit. Defina0para desativar (padrão 50).
Modo HTTP (Events API)
Use o modo webhook HTTP quando seu Gateway for acessível pelo Slack via HTTPS (típico para implantações em servidor). O modo HTTP usa a Events API + Interactivity + Slash Commands com uma URL de requisição compartilhada.Configuração (Modo HTTP)
- Crie um app do Slack e desative o Socket Mode (opcional se você usar apenas HTTP).
- Basic Information → copie o Signing Secret.
- OAuth & Permissions → instale o app e copie o Bot User OAuth Token (
xoxb-...). - Event Subscriptions → habilite eventos e defina a Request URL para o caminho de webhook do seu gateway (padrão
/slack/events). - Interactivity & Shortcuts → habilite e defina a mesma Request URL.
- Slash Commands → defina a mesma Request URL para seu(s) comando(s).
https://gateway-host/slack/events
Configuração do OpenClaw (mínima)
channels.slack.accounts.<id>.mode = "http" e forneça um
webhookPath exclusivo por conta para que cada app do Slack possa apontar para sua própria URL.
Manifesto (opcional)
Use este manifesto de app do Slack para criar o app rapidamente (ajuste o nome/comando se quiser). Inclua os escopos de usuário se você planeja configurar um token de usuário.slash_commands por comando que deseja expor (correspondendo à lista /help). Substitua com channels.slack.commands.native.
Escopos (atuais vs opcionais)
A Conversations API do Slack é escopada por tipo: você só precisa dos escopos para os tipos de conversa que realmente usa (channels, groups, im, mpim). Veja https://docs.slack.dev/apis/web-api/using-the-conversations-api/ para uma visão geral.Escopos do token do bot (obrigatórios)
chat:write(enviar/atualizar/excluir mensagens viachat.postMessage) https://docs.slack.dev/reference/methods/chat.postMessageim:write(abrir DMs viaconversations.openpara DMs de usuário) 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(consulta de usuário) 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(uploads viafiles.uploadV2) https://docs.slack.dev/messaging/working-with-files/#upload
Escopos do token de usuário (opcional, somente leitura por padrão)
Adicione estes em User Token Scopes se você configurarchannels.slack.userToken.
channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read
Não necessários hoje (mas prováveis no futuro)
mpim:write(somente se adicionarmos abertura de group-DM/início de DM viaconversations.open)groups:write(somente se adicionarmos gerenciamento de canais privados: criar/renomear/convidar/arquivar)chat:write.public(somente se quisermos postar em canais nos quais o bot não está) https://docs.slack.dev/reference/scopes/chat.write.publicusers:read.email(somente se precisarmos de campos de email deusers.info) https://docs.slack.dev/changelog/2017-04-narrowing-email-accessfiles:read(somente se começarmos a listar/ler metadados de arquivos)
Configuração
O Slack usa apenas o Modo Socket (sem servidor de webhook HTTP). Forneça ambos os tokens:SLACK_BOT_TOKENSLACK_APP_TOKEN
messages.ackReaction +
messages.ackReactionScope. Use messages.removeAckAfterReply para limpar a
reação de ack após o bot responder.
Limites
- Texto de saída é fragmentado em
channels.slack.textChunkLimit(padrão 4000). - Fragmentação opcional por nova linha: defina
channels.slack.chunkMode="newline"para dividir em linhas em branco (limites de parágrafo) antes da fragmentação por comprimento. - Uploads de mídia são limitados por
channels.slack.mediaMaxMb(padrão 20).
Encadeamento de respostas
Por padrão, o OpenClaw responde no canal principal. Usechannels.slack.replyToMode para controlar o encadeamento automático:
| Modo | Comportamento |
|---|---|
off | Padrão. Responder no canal principal. Só cria thread se a mensagem de disparo já estiver em uma thread. |
first | A primeira resposta vai para a thread (sob a mensagem de disparo); respostas subsequentes vão para o canal principal. Útil para manter o contexto visível evitando poluição de threads. |
all | Todas as respostas vão para a thread. Mantém conversas contidas, mas pode reduzir a visibilidade. |
slack sendMessage).
Encadeamento por tipo de chat
Você pode configurar comportamentos de encadeamento diferentes por tipo de chat definindochannels.slack.replyToModeByChatType:
direct: DMs 1:1 (Slackim)group: DMs em grupo / MPIMs (Slackmpim)channel: canais padrão (públicos/privados)
replyToModeByChatType.<chatType>replyToMode- Padrão do provedor (
off)
channels.slack.dm.replyToMode legado ainda é aceito como fallback para direct quando nenhum override por tipo de chat está definido.
Exemplos:
Criar threads apenas em DMs:
Tags manuais de encadeamento
Para controle refinado, use estas tags nas respostas do agente:[[reply_to_current]]— responder à mensagem de disparo (iniciar/continuar thread).[[reply_to:<id>]]— responder a um ID de mensagem específico.
Sessões + roteamento
- DMs compartilham a sessão
main(como WhatsApp/Telegram). - Canais mapeiam para sessões
agent:<agentId>:slack:channel:<channelId>. - Slash commands usam sessões
agent:<agentId>:slack:slash:<userId>(prefixo configurável viachannels.slack.slashCommand.sessionPrefix). - Se o Slack não fornecer
channel_type, o OpenClaw infere a partir do prefixo do ID do canal (D,C,G) e usachannelpor padrão para manter chaves de sessão estáveis. - O registro de comandos nativos usa
commands.native(padrão global"auto"→ Slack desativado) e pode ser substituído por workspace comchannels.slack.commands.native. Comandos de texto exigem mensagens/...independentes e podem ser desativados comcommands.text: false. Slash commands do Slack são gerenciados no app do Slack e não são removidos automaticamente. Usecommands.useAccessGroups: falsepara ignorar verificações de grupo de acesso para comandos. - Lista completa de comandos + configuração: Slash commands
Segurança de DM (pareamento)
- Padrão:
channels.slack.dm.policy="pairing"— remetentes desconhecidos em DM recebem um código de pareamento (expira após 1 hora). - Aprovar via:
openclaw pairing approve slack <code>. - Para permitir qualquer pessoa: defina
channels.slack.dm.policy="open"echannels.slack.dm.allowFrom=["*"]. channels.slack.dm.allowFromaceita IDs de usuário, @handles ou emails (resolvidos na inicialização quando os tokens permitem). O assistente aceita nomes de usuário e os resolve para IDs durante a configuração quando os tokens permitem.
Política de grupo
channels.slack.groupPolicycontrola o tratamento de canais (open|disabled|allowlist).allowlistexige que os canais estejam listados emchannels.slack.channels.- Se você definir apenas
SLACK_BOT_TOKEN/SLACK_APP_TOKENe nunca criar uma seçãochannels.slack, o runtime definegroupPolicycomoopenpor padrão. Adicionechannels.slack.groupPolicy,channels.defaults.groupPolicyou uma lista de permissões de canais para restringir. - O assistente de configuração aceita nomes
#channele os resolve para IDs quando possível (públicos + privados); se existirem múltiplas correspondências, ele prefere o canal ativo. - Na inicialização, o OpenClaw resolve nomes de canais/usuários em allowlists para IDs (quando os tokens permitem) e registra o mapeamento; entradas não resolvidas são mantidas como digitadas.
- Para permitir nenhum canal, defina
channels.slack.groupPolicy: "disabled"(ou mantenha uma allowlist vazia).
channels.slack.channels.<id> ou channels.slack.channels.<name>):
allow: permitir/negar o canal quandogroupPolicy="allowlist".requireMention: controle por menção para o canal.tools: overrides opcionais de política de ferramentas por canal (allow/deny/alsoAllow).toolsBySender: overrides opcionais de política de ferramentas por remetente dentro do canal (as chaves são IDs de remetente/@handles/emails; wildcard"*"suportado).allowBots: permitir mensagens de autoria do bot neste canal (padrão: false).users: allowlist opcional de usuários por canal.skills: filtro de skills (omitido = todas as skills, vazio = nenhuma).systemPrompt: prompt de sistema extra para o canal (combinado com tópico/finalidade).enabled: definafalsepara desativar o canal.
Alvos de entrega
Use estes com envios via cron/CLI:user:<id>para DMschannel:<id>para canais
Ações de ferramentas
Ações de ferramentas do Slack podem ser controladas comchannels.slack.actions.*:
| Grupo de ação | Padrão | Notas |
|---|---|---|
| reactions | enabled | Reagir + listar reações |
| messages | enabled | Ler/enviar/editar/excluir |
| pins | enabled | Fixar/desafixar/listar |
| memberInfo | enabled | Informações de membros |
| emojiList | enabled | Lista de emojis personalizados |
Notas de segurança
- Gravações usam o token do bot por padrão para que ações que alteram estado permaneçam escopadas às permissões e identidade do bot do app.
- Definir
userTokenReadOnly: falsepermite que o token de usuário seja usado para operações de gravação quando um token de bot não estiver disponível, o que significa que as ações serão executadas com o acesso do usuário que instalou. Trate o token de usuário como altamente privilegiado e mantenha controles e allowlists restritos. - Se você habilitar gravações com token de usuário, garanta que o token de usuário inclua os escopos de gravação
esperados (
chat:write,reactions:write,pins:write,files:write) ou essas operações falharão.
Solução de problemas
Execute esta escada primeiro:- Conectado, mas sem respostas em canais: canal bloqueado por
groupPolicyou não está na allowlistchannels.slack.channels. - DMs ignoradas: remetente não aprovado quando
channels.slack.dm.policy="pairing". - Erros de API (
missing_scope,not_in_channel, falhas de autenticação): tokens de bot/app ou escopos do Slack incompletos.
Notas
- Controle por menção é definido via
channels.slack.channels(definarequireMentioncomotrue);agents.list[].groupChat.mentionPatterns(oumessages.groupChat.mentionPatterns) também contam como menções. - Override multiagente: defina padrões por agente em
agents.list[].groupChat.mentionPatterns. - Notificações de reação seguem
channels.slack.reactionNotifications(usereactionAllowlistcom modoallowlist). - Mensagens de autoria do bot são ignoradas por padrão; habilite via
channels.slack.allowBotsouchannels.slack.channels.<id>.allowBots. - Aviso: Se você permitir respostas a outros bots (
channels.slack.allowBots=trueouchannels.slack.channels.<id>.allowBots=true), evite loops de bot-para-bot com allowlistsrequireMention,channels.slack.channels.<id>.userse/ou proteções claras emAGENTS.mdeSOUL.md. - Para a ferramenta do Slack, a semântica de remoção de reações está em /tools/reactions.
- Anexos são baixados para o repositório de mídia quando permitido e abaixo do limite de tamanho.