Pular para conteúdo

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:

  1. Contextualização: Definir propósito e informações do canal
  2. Dinâmico: Atualizar tópico baseado em eventos (metas, prazos, status)
  3. Onboarding: Explicar para que serve cada canal
  4. Status: Mostrar informações atualizadas (sprint atual, deadline, etc.)

Como funciona internamente?

Quando a SLACK_SET_TOPIC é executada, o sistema:

  1. Valida channel ID e conteúdo do tópico
  2. Verifica tamanho (máximo 250 caracteres)
  3. Atualiza tópico usando endpoint conversations.setTopic
  4. Tópico aparece abaixo do nome do canal
  5. Se erro: Retorna erro (canal não encontrado, sem permissão)
  6. 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

  1. Criar canal: Definir tópico após criação
  2. Status de projeto: "Sprint 15 | Meta: 50 pontos | Deadline: 29/01"
  3. Informações dinâmicas: Atualizar contadores, datas, status
  4. Links úteis: "Docs: link | Board: link | CI/CD: link"
  5. Contexto: "Canal oficial de suporte - Horário: 9h-18h"
  6. 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úblicos
  • groups: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:

  1. Clique com botão direito no canal
  2. View channel details
  3. 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:

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