SLACK_SET_TOPIC - Definir Tópico do Canal
O que é esta Tool?
A SLACK_SET_TOPIC é a tool responsável por definir ou atualizar o tópico (descrição) de canais do Slack programaticamente.
Por que esta Tool existe?
Tópicos de canal fornecem contexto importante. A SLACK_SET_TOPIC existe para:
- Contextualização: Definir propósito e informações do canal
- Dinâmico: Atualizar tópico baseado em eventos (metas, prazos, status)
- Onboarding: Explicar para que serve cada canal
- Status: Mostrar informações atualizadas (sprint atual, deadline, etc.)
Como funciona internamente?
Quando a SLACK_SET_TOPIC é executada, o sistema:
- Valida channel ID e conteúdo do tópico
- Verifica tamanho (máximo 250 caracteres)
- Atualiza tópico usando endpoint
conversations.setTopic - Tópico aparece abaixo do nome do canal
- Se erro: Retorna erro (canal não encontrado, sem permissão)
- Se sucesso: Confirma atualização
Código interno (productivity-executors.service.ts - implementação futura):
async executeSlackSetTopic(data: any, variables: Record<string, any>): Promise<any> {
const { botToken, channel, topic } = data;
// Validar tamanho (máximo 250 caracteres)
if (topic.length > 250) {
throw new Error('Topic exceeds 250 characters limit');
}
const setTopicUrl = 'https://slack.com/api/conversations.setTopic';
const response = await axios.post(setTopicUrl,
{
channel: channel,
topic: topic,
},
{
headers: {
'Authorization': `Bearer ${botToken}`,
'Content-Type': 'application/json',
}
}
);
if (!response.data.ok) {
throw new Error(`Failed to set topic: ${response.data.error}`);
}
return {
success: true,
channel: channel,
topic: topic,
message: 'Topic set successfully',
};
}
Quando você DEVE usar esta Tool?
Use SLACK_SET_TOPIC sempre que precisar de definir ou atualizar informações do canal:
Casos de uso
- Criar canal: Definir tópico após criação
- Status de projeto: "Sprint 15 | Meta: 50 pontos | Deadline: 29/01"
- Informações dinâmicas: Atualizar contadores, datas, status
- Links úteis: "Docs: link | Board: link | CI/CD: link"
- Contexto: "Canal oficial de suporte - Horário: 9h-18h"
- Onboarding: Explicar propósito para novos membros
Quando NÃO usar SLACK_SET_TOPIC
- Mensagens: Use SLACK_SEND_MESSAGE para comunicação
- Conversas: Tópico não é para chat, é para descrição estática
- Conteúdo longo: Limite de 250 caracteres - use pin message
Parâmetros Detalhados
botToken (string, obrigatório)
O que é: Token de autenticação do Slack Bot.
Permissões necessárias:
channels:manage- Gerenciar canais públicosgroups:write- Gerenciar canais privados
Flow completo para testar:
{
"name": "Teste Definir Tópico",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "slack_1",
"type": "slack_set_topic",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Definir Tópico",
"parameters": {
"botToken": "xoxb-seu-token-aqui",
"channel": "C01234567",
"topic": "📊 Canal de Reports | Atualizado diariamente às 9h"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "✅ Tópico atualizado!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "slack_1" },
{ "source": "slack_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
channel (string, obrigatório)
O que é: ID do canal onde o tópico será definido.
Formatos aceitos:
- Channel ID público:
C01234567 - Channel ID privado:
G01234567
Como obter:
- Clique com botão direito no canal
- View channel details
- Copie o Channel ID
Flow completo para testar:
{
"name": "Definir Tópico em Canal Específico",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Dados Canal",
"parameters": {
"variableName": "canal",
"value": {
"id": "C01234567",
"nome": "projeto-x"
}
}
}
},
{
"id": "slack_1",
"type": "slack_set_topic",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Atualizar Tópico",
"parameters": {
"botToken": "xoxb-seu-token-aqui",
"channel": "{{canal.id}}",
"topic": "Canal do {{canal.nome}} - Atualizado automaticamente"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "slack_1" },
{ "source": "slack_1", "target": "end_1" }
]
}
topic (string, obrigatório)
O que é: Texto do tópico/descrição do canal.
Limite: 250 caracteres
Suporta:
- Emojis: 🚀 📊 ✅ ⚠️
- Markdown básico: negrito, itálico
- Links: https://exemplo.com|Texto
Exemplos úteis:
"📊 Canal de Vendas | Meta: R$ 100k | Atualizado: 15/01/2025"
"🚀 Projeto ACME | PM: @João | Deadline: 31/01 | Status: 🟢 On track"
"💬 Suporte Técnico | Horário: 9h-18h | SLA: 2h | Docs: <link>"
"🏃 Sprint 15 | 01-15/01 | Meta: 50 pontos | 30 concluídos"
Flow completo para testar:
{
"name": "Tópico Dinâmico com Variáveis",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Status Sprint",
"parameters": {
"variableName": "sprint",
"value": {
"numero": 15,
"meta": 50,
"concluidos": 35,
"inicio": "01/01",
"fim": "15/01",
"status": "🟡 Em andamento"
}
}
}
},
{
"id": "slack_1",
"type": "slack_set_topic",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Atualizar Status",
"parameters": {
"botToken": "xoxb-seu-token-aqui",
"channel": "C_SPRINT_15",
"topic": "🏃 Sprint {{sprint.numero}} | {{sprint.inicio}}-{{sprint.fim}} | Meta: {{sprint.meta}} pts | Feito: {{sprint.concluidos}} pts | {{sprint.status}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "slack_1" },
{ "source": "slack_1", "target": "end_1" }
]
}
Resultado: 🏃 Sprint 15 | 01/01-15/01 | Meta: 50 pts | Feito: 35 pts | 🟡 Em andamento
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| botToken | string | Sim | Token do Bot (channels:manage ou groups:write) |
| channel | string | Sim | ID do canal (C01234567 ou G01234567) |
| topic | string | Sim | Texto do tópico (máx 250 chars) |
Exemplo 1: Tópico com Status de Projeto
Objetivo: Atualizar tópico com informações dinâmicas de projeto
JSON para Importar
{
"name": "Atualizar Tópico Projeto",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Status Projeto",
"parameters": {
"variableName": "projeto",
"value": {
"nome": "Sistema CRM",
"canal": "C_PROJ_CRM",
"progresso": 75,
"deadline": "31/01/2025",
"pm": "João Silva",
"status": "🟢 On Track"
}
}
}
},
{
"id": "slack_1",
"type": "slack_set_topic",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Atualizar Tópico",
"parameters": {
"botToken": "xoxb-seu-token-aqui",
"channel": "{{projeto.canal}}",
"topic": "🚀 {{projeto.nome}} | PM: {{projeto.pm}} | Progresso: {{projeto.progresso}}% | Deadline: {{projeto.deadline}} | {{projeto.status}}"
}
}
},
{
"id": "slack_2",
"type": "slack_send_message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Notificar",
"parameters": {
"botToken": "xoxb-seu-token-aqui",
"channel": "{{projeto.canal}}",
"text": "📊 Tópico atualizado com status mais recente do projeto!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "slack_1" },
{ "source": "slack_1", "target": "slack_2" },
{ "source": "slack_2", "target": "end_1" }
]
}
Resultado:
Tópico: 🚀 Sistema CRM | PM: João Silva | Progresso: 75% | Deadline: 31/01/2025 | 🟢 On Track
Mensagem: 📊 Tópico atualizado com status mais recente do projeto!
Exemplo 2: Definir Tópico ao Criar Canal
Objetivo: Após criar canal, definir tópico descritivo
JSON para Importar
{
"name": "Criar Canal + Definir Tópico",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "slack_1",
"type": "slack_create_channel",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Criar Canal",
"parameters": {
"botToken": "xoxb-seu-token-aqui",
"channelName": "projeto-ecommerce-2025",
"isPrivate": false
}
}
},
{
"id": "slack_2",
"type": "slack_set_topic",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Definir Tópico",
"parameters": {
"botToken": "xoxb-seu-token-aqui",
"channel": "{{channelId}}",
"topic": "🛒 Projeto E-commerce 2025 | Cliente: Loja ABC | PM: Maria Santos | Início: 15/01 | Prazo: 3 meses"
}
}
},
{
"id": "slack_3",
"type": "slack_send_message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Mensagem Inicial",
"parameters": {
"botToken": "xoxb-seu-token-aqui",
"channel": "{{channelId}}",
"text": "🎉 Canal criado e configurado!\n\nVamos começar o projeto! 🚀"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "slack_1" },
{ "source": "slack_1", "target": "slack_2" },
{ "source": "slack_2", "target": "slack_3" },
{ "source": "slack_3", "target": "end_1" }
]
}
Exemplo 3: Atualização Automática Diária
Objetivo: Atualizar tópico com data atual todos os dias
JSON para Importar
{
"name": "Atualizar Tópico Diário",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Data Atual",
"parameters": {
"variableName": "hoje",
"value": "{{now | date('DD/MM/YYYY')}}"
}
}
},
{
"id": "slack_1",
"type": "slack_set_topic",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Atualizar Data",
"parameters": {
"botToken": "xoxb-seu-token-aqui",
"channel": "C_REPORTS",
"topic": "📊 Canal de Reports | Última atualização: {{hoje}} | Reports gerados automaticamente às 9h"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "slack_1" },
{ "source": "slack_1", "target": "end_1" }
]
}
Nota: Execute este flow diariamente via schedule/cron.
Resposta da Tool
{
"success": true,
"channel": "C01234567",
"topic": "📊 Canal de Reports | Atualizado diariamente às 9h",
"message": "Topic set successfully"
}
Boas Práticas
✅ SIM:
- Usar emojis para facilitar leitura: 📊 🚀 ✅ ⚠️
- Incluir informações úteis: prazos, links, status
- Manter conciso (máx 250 chars)
- Atualizar regularmente em projetos ativos
- Incluir horários/frequências quando relevante
- Usar indicadores visuais de status: 🟢 🟡 🔴
❌ NÃO:
- Não escreva textos longos (use pin message)
- Não use tópico para conversas
- Não inclua informações sensíveis
- Não abuse de formatação
Dicas
💡 Emojis úteis:
- Status: 🟢 🟡 🔴 ✅ ⚠️ 🚨
- Categorias: 📊 🚀 💼 🔧 📝 🎯
- Tempo: ⏰ 📅 ⏳
💡 Template padrão: [Emoji] [Nome/Descrição] | [Info 1] | [Info 2] | [Status]
💡 Atualização dinâmica: Use com schedule para atualizar tópicos automaticamente
💡 Limite de 250 chars: Planeje bem o que incluir - priorize informações mais importantes
💡 Links úteis: Inclua links para docs, boards, wikis usando formato <url|texto>
Erros Comuns
channel_not_found
Causa: Channel ID inválido Solução: Verifique o Channel ID
is_archived
Causa: Canal está arquivado Solução: Desarquive o canal primeiro
restricted_action
Causa: Bot sem permissão
Solução: Adicione scope channels:manage ou groups:write
not_in_channel
Causa: Bot não é membro do canal privado
Solução: Adicione bot ao canal com /invite @Bot
topic_too_long
Causa: Tópico excede 250 caracteres Solução: Encurte o texto - use abreviações, remova palavras desnecessárias
Diferença: Topic vs Purpose
Slack tem dois campos similares:
| Campo | Função | Limite | API Endpoint |
|---|---|---|---|
| Topic | Descrição curta do canal | 250 chars | conversations.setTopic |
| Purpose | Propósito detalhado do canal | 250 chars | conversations.setPurpose |
Topic aparece mais visível (abaixo do nome). Purpose aparece nos detalhes do canal.
Recomendação: Use Topic para informações dinâmicas (status, prazos). Use Purpose para descrição estática (propósito permanente do canal).
Próxima Tool
→ SLACK_CREATE_CHANNEL - Criar canal → SLACK_SEND_MESSAGE - Enviar mensagem → SLACK_ARCHIVE_CHANNEL - Arquivar canal