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:
- Automação de workspaces: Criar canais automaticamente para novos projetos
- Onboarding: Criar canal privado para cada novo cliente/membro
- Gestão dinâmica: Criar canais temporários para eventos, sprints, incidentes
- Organização: Estruturar workspace programaticamente
Como funciona internamente?
Quando a SLACK_CREATE_CHANNEL é executada, o sistema:
- Valida o nome do canal (apenas letras minúsculas, números, hífens, underscores)
- Verifica se existe canal com mesmo nome
- Cria o canal usando endpoint
conversations.create - Define privacidade (público ou privado)
- Se erro: Retorna erro (nome inválido, já existe, sem permissão)
- 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
- Novos projetos: Criar #projeto-nome-cliente automaticamente
- Novos clientes: Criar canal privado #cliente-empresa
- Sprints: Criar #sprint-2025-01 a cada sprint
- Incidentes: Criar #incident-20250115-database para cada incidente
- Eventos: Criar #evento-workshop-javascript
- 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úblicosgroups:write- Criar canais privadosim:write- Criar DMs (opcional)
Como configurar:
- Acesse https://api.slack.com/apps
- Selecione seu App
- Em OAuth & Permissions, adicione scopes acima
- Reinstale o App
- 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-- Projetoscliente-- Clientesteam-- Timessprint-- Sprintsincident-- Incidentestemp-- 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