Pular para conteúdo

SLACK_CREATE_CHANNEL - Criar Canal

O que é esta Tool?

A SLACK_CREATE_CHANNEL é a tool responsável por criar canais públicos ou privados no Slack programaticamente usando a API.

Por que esta Tool existe?

Criar canais manualmente é trabalhoso em automações. A SLACK_CREATE_CHANNEL existe para:

  1. Automação de workspaces: Criar canais automaticamente para novos projetos
  2. Onboarding: Criar canal privado para cada novo cliente/membro
  3. Gestão dinâmica: Criar canais temporários para eventos, sprints, incidentes
  4. Organização: Estruturar workspace programaticamente

Como funciona internamente?

Quando a SLACK_CREATE_CHANNEL é executada, o sistema:

  1. Valida o nome do canal (apenas letras minúsculas, números, hífens, underscores)
  2. Verifica se existe canal com mesmo nome
  3. Cria o canal usando endpoint conversations.create
  4. Define privacidade (público ou privado)
  5. Se erro: Retorna erro (nome inválido, já existe, sem permissão)
  6. Se sucesso: Retorna channel ID, nome e detalhes

Código interno (productivity-executors.service.ts - implementação futura):

async executeSlackCreateChannel(data: any, variables: Record<string, any>): Promise<any> {
  const { botToken, channelName, isPrivate, description } = data;

  // Normalizar nome do canal (lowercase, sem espaços)
  const normalizedName = channelName
    .toLowerCase()
    .replace(/\s+/g, '-')
    .replace(/[^a-z0-9-_]/g, '');

  const createUrl = 'https://slack.com/api/conversations.create';
  const response = await axios.post(createUrl,
    {
      name: normalizedName,
      is_private: isPrivate || false,
      team_id: undefined, // Optional: para Enterprise Grid
    },
    {
      headers: {
        'Authorization': `Bearer ${botToken}`,
        'Content-Type': 'application/json',
      }
    }
  );

  if (!response.data.ok) {
    throw new Error(`Failed to create channel: ${response.data.error}`);
  }

  const channelId = response.data.channel.id;

  // Definir descrição/tópico se fornecido
  if (description) {
    await axios.post('https://slack.com/api/conversations.setTopic',
      {
        channel: channelId,
        topic: description,
      },
      {
        headers: {
          'Authorization': `Bearer ${botToken}`,
          'Content-Type': 'application/json',
        }
      }
    );
  }

  return {
    success: true,
    channelId: channelId,
    channelName: normalizedName,
    isPrivate: isPrivate || false,
    message: 'Channel created successfully',
  };
}

Quando você DEVE usar esta Tool?

Use SLACK_CREATE_CHANNEL sempre que precisar de criar canais automaticamente:

Casos de uso

  1. Novos projetos: Criar #projeto-nome-cliente automaticamente
  2. Novos clientes: Criar canal privado #cliente-empresa
  3. Sprints: Criar #sprint-2025-01 a cada sprint
  4. Incidentes: Criar #incident-20250115-database para cada incidente
  5. Eventos: Criar #evento-workshop-javascript
  6. Departamentos: Estruturar #dept-vendas, #dept-ti, etc.

Quando NÃO usar SLACK_CREATE_CHANNEL

  • Canal já existe: Verifique antes de criar
  • Uso único: Para testes, crie manualmente
  • Sem automação: Se for ação isolada, use UI do Slack

Parâmetros Detalhados

botToken (string, obrigatório)

O que é: Token de autenticação do Slack Bot.

Permissões necessárias:

  • channels:manage - Criar e gerenciar canais públicos
  • groups:write - Criar canais privados
  • im:write - Criar DMs (opcional)

Como configurar:

  1. Acesse https://api.slack.com/apps
  2. Selecione seu App
  3. Em OAuth & Permissions, adicione scopes acima
  4. Reinstale o App
  5. Copie o Bot User OAuth Token

Flow completo para testar:

{
  "name": "Teste Criar Canal Slack",
  "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": "teste-automacao",
          "isPrivate": false,
          "description": "Canal de teste criado automaticamente"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "✅ Canal criado com sucesso!"
        }
      }
    },
    {
      "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" }
  ]
}

channelName (string, obrigatório)

O que é: Nome do canal a ser criado.

Regras de nomenclatura:

  • ✅ Apenas letras minúsculas, números, hífens (-), underscores (_)
  • ✅ Máximo 80 caracteres
  • ✅ Exemplos válidos: projeto-acme, cliente_xyz, sprint2025
  • ❌ Não pode conter: espaços, maiúsculas, caracteres especiais (@, #, !, etc.)
  • ❌ Não pode começar com: números

Normalização automática:

"Projeto ACME" → "projeto-acme"
"Cliente @XYZ" → "cliente-xyz"
"Sprint 2025.01" → "sprint-2025-01"

Flow completo para testar:

{
  "name": "Criar Canal com Nome Dinâmico",
  "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 Projeto",
        "parameters": {
          "variableName": "projeto",
          "value": {
            "nome": "Sistema CRM",
            "cliente": "Empresa ABC",
            "ano": 2025
          }
        }
      }
    },
    {
      "id": "slack_1",
      "type": "slack_create_channel",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Criar Canal Projeto",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channelName": "projeto-{{projeto.nome | slugify}}-{{projeto.cliente | slugify}}",
          "isPrivate": false,
          "description": "Canal do projeto {{projeto.nome}} para cliente {{projeto.cliente}}"
        }
      }
    },
    {
      "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: Canal #projeto-sistema-crm-empresa-abc será criado

isPrivate (boolean, opcional)

O que é: Define se o canal será privado ou público.

Padrão: false (público)

Diferenças:

Aspecto Público (false) Privado (true)
Visibilidade Todos veem Apenas membros convidados
Ícone # 🔒
Busca Aparece em busca Não aparece
Entrada Qualquer um pode entrar Precisa convite
Scope channels:manage groups:write

Flow completo para testar:

{
  "name": "Criar Canal Privado",
  "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": "Canal Privado",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channelName": "cliente-confidencial",
          "isPrivate": true,
          "description": "Canal privado para discussões confidenciais"
        }
      }
    },
    {
      "id": "slack_2",
      "type": "slack_invite_user",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Convidar Usuário",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channel": "{{channelId}}",
          "userId": "U01234567"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "slack_1" },
    { "source": "slack_1", "target": "slack_2" },
    { "source": "slack_2", "target": "end_1" }
  ]
}

description (string, opcional)

O que é: Descrição/tópico do canal (aparece abaixo do nome).

Padrão: undefined (sem descrição)

Limite: 250 caracteres

Exemplo:

"Canal de discussão do Projeto ACME - Cliente XYZ - 2025"

Flow completo para testar:

{
  "name": "Canal com Descrição",
  "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 com Descrição",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channelName": "projeto-2025-q1",
          "isPrivate": false,
          "description": "📊 Projeto Q1 2025 | 🎯 Meta: Lançamento versão 2.0 | 👥 Equipe: Dev + Design"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "slack_1" },
    { "source": "slack_1", "target": "end_1" }
  ]
}

Parâmetros

Campo Tipo Obrigatório Descrição
botToken string Sim Token do Bot (channels:manage ou groups:write)
channelName string Sim Nome do canal (lowercase, sem espaços)
isPrivate boolean Não true=Privado (🔒), false=Público (#) (padrão: false)
description string Não Descrição/tópico do canal (máx 250 chars)

Exemplo 1: Criar Canal para Novo Projeto

Objetivo: Automatizar criação de canal quando novo projeto é iniciado

JSON para Importar

{
  "name": "Novo Projeto - Criar Canal",
  "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 Projeto",
        "parameters": {
          "variableName": "projeto",
          "value": {
            "nome": "Plataforma E-commerce",
            "cliente": "Loja Virtual ABC",
            "gerente": "João Silva",
            "gerenteId": "U01234567",
            "inicio": "2025-01-15"
          }
        }
      }
    },
    {
      "id": "slack_1",
      "type": "slack_create_channel",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Criar Canal",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channelName": "proj-ecommerce-loja-abc",
          "isPrivate": false,
          "description": "🚀 {{projeto.nome}} | 🏢 Cliente: {{projeto.cliente}} | 👤 PM: {{projeto.gerente}}"
        }
      }
    },
    {
      "id": "slack_2",
      "type": "slack_send_message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Mensagem Inicial",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channel": "{{channelId}}",
          "text": "🎉 *Bem-vindo ao projeto {{projeto.nome}}!*\n\n📋 *Informações:*\n• Cliente: {{projeto.cliente}}\n• Gerente: <@{{projeto.gerenteId}}>\n• Início: {{projeto.inicio}}\n\nVamos começar! 🚀"
        }
      }
    },
    {
      "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:

Canal #proj-ecommerce-loja-abc criado
Descrição: 🚀 Plataforma E-commerce | 🏢 Cliente: Loja Virtual ABC | 👤 PM: João Silva

Mensagem inicial enviada no canal

Exemplo 2: Canal Privado para Cliente

Objetivo: Criar canal privado para cada novo cliente

JSON para Importar

{
  "name": "Cliente Novo - Canal Privado",
  "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 Privado",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channelName": "cliente-empresa-xyz-2025",
          "isPrivate": true,
          "description": "🔒 Canal privado - Cliente Empresa XYZ"
        }
      }
    },
    {
      "id": "slack_2",
      "type": "slack_invite_user",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Convidar Account Manager",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channel": "{{channelId}}",
          "userId": "U01234567"
        }
      }
    },
    {
      "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 Privado - Cliente Empresa XYZ*\n\nEste é um canal confidencial para discussões sobre o cliente.\n\n⚠️ *Lembrete:* Não compartilhe informações deste canal fora da equipe."
        }
      }
    },
    {
      "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: Canais Temporários por Sprint

Objetivo: Criar canal novo a cada sprint

JSON para Importar

{
  "name": "Sprint - Criar Canal",
  "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 Sprint",
        "parameters": {
          "variableName": "sprint",
          "value": {
            "numero": 15,
            "ano": 2025,
            "mes": "janeiro",
            "inicio": "2025-01-15",
            "fim": "2025-01-29"
          }
        }
      }
    },
    {
      "id": "slack_1",
      "type": "slack_create_channel",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Criar Canal Sprint",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channelName": "sprint-{{sprint.numero}}-{{sprint.ano}}",
          "isPrivate": false,
          "description": "🏃 Sprint {{sprint.numero}} | 📅 {{sprint.inicio}} a {{sprint.fim}}"
        }
      }
    },
    {
      "id": "slack_2",
      "type": "slack_set_topic",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Definir Tópico",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channel": "{{channelId}}",
          "topic": "Sprint {{sprint.numero}} - {{sprint.mes}}/{{sprint.ano}} | 🎯 Meta: Lançar feature X"
        }
      }
    },
    {
      "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" }
  ]
}

Resposta da Tool

{
  "success": true,
  "channelId": "C01234567ABC",
  "channelName": "projeto-acme",
  "isPrivate": false,
  "message": "Channel created successfully"
}

Boas Práticas

SIM:

  • Usar prefixos consistentes: proj-, cliente-, sprint-, incident-
  • Incluir ano/data em canais temporários: sprint-2025-01
  • Definir description clara e objetiva
  • Enviar mensagem inicial explicando o propósito do canal
  • Convidar membros relevantes após criação
  • Arquivar canais antigos periodicamente

NÃO:

  • Não criar canais com nomes genéricos: teste, temp, novo
  • Não criar canais sem planejar estrutura
  • Não deixar canais vazios sem mensagem inicial
  • Não criar muitos canais (causa fragmentação)

Dicas

💡 Nomenclatura: Use padrão consistente em toda organização

💡 Prefixos úteis:

  • proj- - Projetos
  • cliente- - Clientes
  • team- - Times
  • sprint- - Sprints
  • incident- - Incidentes
  • temp- - Temporários

💡 Automação completa: Crie canal + envie mensagem + convide membros + defina tópico em sequência

💡 Verificação: Antes de criar, verifique se canal já existe (API conversations.list)

💡 Limite: Workspaces free têm limite de canais - arquive inutilizados

Erros Comuns

name_taken

Causa: Já existe canal com este nome Solução: Use nome diferente ou adicione sufixo: -2, -new

invalid_name_required

Causa: Nome vazio ou apenas espaços Solução: Forneça nome válido

invalid_name_specials

Causa: Nome contém caracteres especiais (@, #, !) Solução: Use apenas letras, números, hífens, underscores

invalid_name_maxlength

Causa: Nome excede 80 caracteres Solução: Encurte o nome

restricted_action

Causa: Bot não tem permissão para criar canais Solução: Adicione scope channels:manage ou groups:write

is_archived

Causa: Canal com este nome existe mas está arquivado Solução: Desarquive o canal existente ou use nome diferente

Workflow Completo: Novo Projeto

1. Criar canal público (#proj-nome)
2. Definir descrição
3. Enviar mensagem de boas-vindas
4. Convidar membros da equipe
5. Definir tópico com meta/prazo
6. Fixar mensagem com links importantes

Próxima Tool

SLACK_INVITE_USER - Convidar usuários para canal → SLACK_SET_TOPIC - Definir tópico do canal → SLACK_ARCHIVE_CHANNEL - Arquivar canal