Skip to main content
Glama

Uazapi WhatsApp MCP Server

by pabloweyne
workflow-chatbot-v4-full.json25.7 kB
{ "name": "UAZAPI WhatsApp Chatbot v4 - Completo", "nodes": [ { "parameters": { "httpMethod": "POST", "path": "uazapi-webhook", "responseMode": "responseNode", "options": {} }, "id": "webhook-trigger", "name": "Webhook UAZAPI", "type": "n8n-nodes-base.webhook", "typeVersion": 2, "position": [240, 300] }, { "parameters": { "jsCode": "const body = $input.first().json.body || $input.first().json;\nconst remoteJid = body.key?.remoteJid || body.remoteJid || '';\nconst participant = body.key?.participant || body.participant || '';\nconst pushName = body.pushName || '';\nconst isGroup = remoteJid.includes('@g.us');\nconst senderPhone = isGroup ? participant.split('@')[0] : remoteJid.split('@')[0];\nconst message = body.message?.conversation || body.message?.extendedTextMessage?.text || body.message?.imageMessage?.caption || '';\nconst mentionedJids = body.message?.extendedTextMessage?.contextInfo?.mentionedJid || [];\nconst botNumber = $env.BOT_PHONE_NUMBER || '';\nconst isBotMentioned = mentionedJids.some(jid => jid.includes(botNumber)) || message.toLowerCase().includes('@bot');\n\nreturn {\n json: {\n rawBody: body,\n chatId: remoteJid,\n senderPhone: senderPhone,\n senderName: pushName,\n message: message,\n messageId: body.key?.id || '',\n timestamp: Date.now(),\n isGroup: isGroup,\n isBotMentioned: isBotMentioned,\n replyTo: isGroup ? remoteJid : senderPhone,\n redisKeyUser: `uazapi:user:${senderPhone}`,\n redisKeyConfig: 'uazapi:config',\n redisKeyStats: 'uazapi:stats',\n redisKeySchedule: 'uazapi:schedule'\n }\n};" }, "id": "extract-data", "name": "Extrair Dados", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [460, 300] }, { "parameters": { "conditions": { "options": { "caseSensitive": true }, "conditions": [{ "leftValue": "={{ $json.senderPhone }}", "rightValue": "SEU_NUMERO_AQUI", "operator": { "type": "string", "operation": "equals" } }] } }, "id": "check-auth", "name": "Autorizado?", "type": "n8n-nodes-base.if", "typeVersion": 2, "position": [680, 300] }, { "parameters": { "operation": "get", "key": "={{ $json.redisKeyConfig }}" }, "id": "redis-config", "name": "Redis Config", "type": "n8n-nodes-base.redis", "typeVersion": 1, "position": [900, 240], "credentials": { "redis": { "id": "REDIS_CREDENTIAL_ID", "name": "Redis" } } }, { "parameters": { "jsCode": "const msgData = $('Extrair Dados').first().json;\nlet config = { grupos_habilitados: false, responder_apenas_mencao: true, grupos_whitelist: [] };\ntry {\n const r = $input.first().json;\n if (r && typeof r === 'string') config = { ...config, ...JSON.parse(r) };\n else if (r?.value) config = { ...config, ...JSON.parse(r.value) };\n} catch (e) {}\n\nlet shouldProcess = true, skipReason = '';\nif (msgData.isGroup) {\n if (!config.grupos_habilitados) { shouldProcess = false; skipReason = 'grupos_off'; }\n else if (config.responder_apenas_mencao && !msgData.isBotMentioned) { shouldProcess = false; skipReason = 'sem_mencao'; }\n else if (config.grupos_whitelist.length > 0 && !config.grupos_whitelist.some(g => msgData.chatId.includes(g.id))) { shouldProcess = false; skipReason = 'whitelist'; }\n}\nif (!msgData.message?.trim()) { shouldProcess = false; skipReason = 'vazio'; }\n\nreturn { json: { ...msgData, config, shouldProcess, skipReason } };" }, "id": "filter-groups", "name": "Filtrar Grupos", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [1120, 240] }, { "parameters": { "conditions": { "conditions": [{ "leftValue": "={{ $json.shouldProcess }}", "rightValue": "={{true}}", "operator": { "type": "boolean", "operation": "equals" } }] } }, "id": "should-process", "name": "Processar?", "type": "n8n-nodes-base.if", "typeVersion": 2, "position": [1340, 240] }, { "parameters": { "operation": "get", "key": "={{ $json.redisKeyUser }}" }, "id": "redis-user", "name": "Redis User", "type": "n8n-nodes-base.redis", "typeVersion": 1, "position": [1560, 180], "credentials": { "redis": { "id": "REDIS_CREDENTIAL_ID", "name": "Redis" } } }, { "parameters": { "jsCode": "const msgData = $('Filtrar Grupos').first().json;\nlet ctx = { historico: [], contatos: [], grupos: [], stats: { enviadas: 0, grupos_criados: 0, agendadas: 0 } };\ntry {\n const r = $input.first().json;\n if (r && typeof r === 'string') ctx = JSON.parse(r);\n else if (r?.value) ctx = JSON.parse(r.value);\n} catch (e) {}\n\nif (ctx.historico?.length > 10) ctx.historico = ctx.historico.slice(-10);\n\nlet prompt = '';\nif (ctx.historico?.length) {\n prompt += '\\n## HISTÓRICO\\n';\n ctx.historico.forEach(m => prompt += `${m.role === 'user' ? 'Você' : 'Bot'}: ${m.content}\\n`);\n}\nif (ctx.contatos?.length) {\n prompt += '\\n## CONTATOS SALVOS\\n';\n ctx.contatos.forEach(c => prompt += `- ${c.nome}: ${c.numero}\\n`);\n}\nif (ctx.grupos?.length) {\n prompt += '\\n## GRUPOS SALVOS\\n';\n ctx.grupos.forEach(g => prompt += `- ${g.nome}\\n`);\n}\nprompt += `\\n## ESTATÍSTICAS\\n- Mensagens enviadas: ${ctx.stats?.enviadas || 0}\\n- Grupos criados: ${ctx.stats?.grupos_criados || 0}\\n- Agendamentos: ${ctx.stats?.agendadas || 0}`;\nprompt += `\\n## CONFIG GRUPOS\\n- Habilitados: ${msgData.config.grupos_habilitados}\\n- Só @: ${msgData.config.responder_apenas_mencao}`;\nif (msgData.isGroup) prompt += `\\n## CONTEXTO: Mensagem de GRUPO`;\n\nreturn { json: { ...msgData, ctx, prompt } };" }, "id": "prepare-ctx", "name": "Preparar Contexto", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [1780, 180] }, { "parameters": { "model": "gpt-4o", "messages": { "values": [ { "role": "system", "content": "=Você é um assistente WhatsApp avançado via UAZAPI com memória, agendamento e relatórios.\n\n## AÇÕES\n\n### Mensagens\n- enviar_texto: {numero, mensagem}\n- enviar_imagem: {numero, url, legenda}\n- enviar_documento: {numero, url, nome}\n\n### Mensagens em Massa (COM PROTEÇÃO ANTI-BAN)\n⚠️ REGRAS OBRIGATÓRIAS:\n1. NUNCA enviar sem confirmação explícita do usuário\n2. SEMPRE mostrar preview antes (quantas pessoas, lista de nomes)\n3. Pedir confirmação: \"Confirma envio para X pessoas? (sim/não)\"\n4. Máximo 20 pessoas por lote\n5. Se mais de 20, dividir em lotes e pedir confirmação para cada\n\n- preparar_massa: {numeros: [...], mensagem} - PREPARA e pede confirmação\n- confirmar_massa: {confirmar: true/false} - Executa após confirmação\n- enviar_grupo_todos: {mensagem} - SEMPRE pede confirmação primeiro\n\n### Agendamento (COMPLETO)\n- agendar: {numero, mensagem, data_hora} - formato: \"2024-12-25 09:00\"\n- listar_agendamentos: {} - mostra TODOS os agendados pendentes\n- cancelar_agendamento: {id} - remove da lista\n- enviar_agora: {id} - envia IMEDIATAMENTE (prioridade)\n- editar_agendamento: {id, novo_horario} - altera data/hora\n- pausar_agendamento: {id} - pausa sem remover\n- retomar_agendamento: {id} - retoma pausado\n\n### Grupos\n- criar_grupo: {nome, participantes: [...]}\n- adicionar_participante: {grupo, numero}\n- remover_participante: {grupo, numero}\n- listar_grupos: {}\n\n### Config\n- habilitar_grupos / desabilitar_grupos\n- config_mencao: {apenas_mencao: true/false}\n- add_whitelist: {nome, id} / rem_whitelist: {id}\n\n### Relatórios\n- relatorio: {} - estatísticas gerais\n- relatorio_hoje: {} - atividade de hoje\n- historico_acoes: {limite: 10}\n\n### Contatos\n- salvar_contato: {nome, numero}\n- listar_contatos: {}\n- importar_sheets: {url} - importa do Google Sheets\n\n### Integrações\n- buscar_calendario: {} - eventos do dia\n- criar_evento: {titulo, data_hora}\n- exportar_sheets: {dados, url}\n\n{{ $json.prompt }}\n\n## RESPOSTA JSON\n```json\n{\n \"acao\": \"nome\",\n \"parametros\": {},\n \"mensagem_usuario\": \"resposta amigável\",\n \"salvar\": {\n \"contato\": {\"nome\": \"\", \"numero\": \"\"},\n \"grupo\": {\"nome\": \"\", \"id\": \"\"},\n \"stat\": \"enviadas\" // incrementa contador\n },\n \"config_update\": {}\n}\n```\n\n## EXEMPLOS\n- \"mande oi pro João amanhã 9h\" → agendar\n- \"envie bom dia pra todos os contatos\" → enviar_massa\n- \"quantas mensagens enviei?\" → relatorio\n- \"importa contatos da planilha X\" → importar_sheets" }, { "role": "user", "content": "={{ $json.message }}" } ] }, "options": { "temperature": 0.3, "maxTokens": 2000 } }, "id": "openai", "name": "OpenAI", "type": "@n8n/n8n-nodes-langchain.openAi", "typeVersion": 1.6, "position": [2000, 180], "credentials": { "openAiApi": { "id": "OPENAI_CREDENTIAL_ID", "name": "OpenAI API" } } }, { "parameters": { "jsCode": "const gpt = $input.first().json.message.content;\nconst prev = $('Preparar Contexto').first().json;\nlet parsed;\ntry {\n const m = gpt.match(/```json\\s*([\\s\\S]*?)```/) || gpt.match(/\\{[\\s\\S]*\\}/);\n parsed = JSON.parse(m[1] || m[0]);\n} catch (e) { parsed = { acao: 'responder', parametros: {}, mensagem_usuario: gpt }; }\n\nlet ctx = prev.ctx || { historico: [], contatos: [], grupos: [], stats: { enviadas: 0, grupos_criados: 0, agendadas: 0 } };\nctx.historico.push({ role: 'user', content: prev.message, ts: Date.now() });\nctx.historico.push({ role: 'assistant', content: parsed.mensagem_usuario, ts: Date.now() });\nif (ctx.historico.length > 20) ctx.historico = ctx.historico.slice(-20);\n\n// Salvar dados\nif (parsed.salvar?.contato?.numero) {\n if (!ctx.contatos.find(c => c.numero === parsed.salvar.contato.numero)) ctx.contatos.push(parsed.salvar.contato);\n}\nif (parsed.salvar?.grupo?.id) {\n if (!ctx.grupos.find(g => g.id === parsed.salvar.grupo.id)) ctx.grupos.push(parsed.salvar.grupo);\n}\nif (parsed.salvar?.stat && ctx.stats[parsed.salvar.stat] !== undefined) ctx.stats[parsed.salvar.stat]++;\n\n// Config\nlet config = prev.config;\nif (parsed.config_update) {\n if (typeof parsed.config_update.grupos_habilitados === 'boolean') config.grupos_habilitados = parsed.config_update.grupos_habilitados;\n if (typeof parsed.config_update.responder_apenas_mencao === 'boolean') config.responder_apenas_mencao = parsed.config_update.responder_apenas_mencao;\n if (parsed.config_update.add_whitelist) config.grupos_whitelist.push(parsed.config_update.add_whitelist);\n if (parsed.config_update.rem_whitelist) config.grupos_whitelist = config.grupos_whitelist.filter(g => g.id !== parsed.config_update.rem_whitelist);\n}\n\nreturn {\n json: {\n ...parsed,\n replyTo: prev.replyTo,\n isGroup: prev.isGroup,\n redisKeyUser: prev.redisKeyUser,\n redisKeyConfig: prev.redisKeyConfig,\n redisKeySchedule: prev.redisKeySchedule,\n ctxSave: JSON.stringify(ctx),\n configSave: JSON.stringify(config),\n contatos: ctx.contatos,\n stats: ctx.stats\n }\n};" }, "id": "parse", "name": "Parse Resposta", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [2220, 180] }, { "parameters": { "operation": "set", "key": "={{ $json.redisKeyUser }}", "value": "={{ $json.ctxSave }}", "expire": true, "ttl": 604800 }, "id": "redis-save-user", "name": "Salvar User", "type": "n8n-nodes-base.redis", "typeVersion": 1, "position": [2440, 100], "credentials": { "redis": { "id": "REDIS_CREDENTIAL_ID", "name": "Redis" } } }, { "parameters": { "operation": "set", "key": "={{ $json.redisKeyConfig }}", "value": "={{ $json.configSave }}", "expire": false }, "id": "redis-save-config", "name": "Salvar Config", "type": "n8n-nodes-base.redis", "typeVersion": 1, "position": [2440, 220], "credentials": { "redis": { "id": "REDIS_CREDENTIAL_ID", "name": "Redis" } } }, { "parameters": { "rules": { "values": [ { "conditions": { "conditions": [{ "leftValue": "={{ $json.acao }}", "rightValue": "enviar_texto", "operator": { "type": "string", "operation": "equals" } }] }, "outputLabel": "Enviar Texto" }, { "conditions": { "conditions": [{ "leftValue": "={{ $json.acao }}", "rightValue": "enviar_massa", "operator": { "type": "string", "operation": "equals" } }] }, "outputLabel": "Enviar Massa" }, { "conditions": { "conditions": [{ "leftValue": "={{ $json.acao }}", "rightValue": "agendar", "operator": { "type": "string", "operation": "equals" } }] }, "outputLabel": "Agendar" }, { "conditions": { "conditions": [{ "leftValue": "={{ $json.acao }}", "rightValue": "listar_agendamentos", "operator": { "type": "string", "operation": "equals" } }] }, "outputLabel": "Listar Agendamentos" }, { "conditions": { "conditions": [{ "leftValue": "={{ $json.acao }}", "rightValue": "cancelar_agendamento", "operator": { "type": "string", "operation": "equals" } }] }, "outputLabel": "Cancelar Agendamento" }, { "conditions": { "conditions": [{ "leftValue": "={{ $json.acao }}", "rightValue": "enviar_agora", "operator": { "type": "string", "operation": "equals" } }] }, "outputLabel": "Enviar Agora" }, { "conditions": { "conditions": [{ "leftValue": "={{ $json.acao }}", "rightValue": "criar_grupo", "operator": { "type": "string", "operation": "equals" } }] }, "outputLabel": "Criar Grupo" }, { "conditions": { "conditions": [{ "leftValue": "={{ $json.acao }}", "rightValue": "listar_grupos", "operator": { "type": "string", "operation": "equals" } }] }, "outputLabel": "Listar Grupos" }, { "conditions": { "conditions": [{ "leftValue": "={{ $json.acao }}", "rightValue": "relatorio", "operator": { "type": "string", "operation": "equals" } }] }, "outputLabel": "Relatório" }, { "conditions": { "conditions": [{ "leftValue": "={{ $json.acao }}", "rightValue": "importar_sheets", "operator": { "type": "string", "operation": "equals" } }] }, "outputLabel": "Import Sheets" }, { "conditions": { "conditions": [{ "leftValue": "={{ $json.acao }}", "rightValue": "buscar_calendario", "operator": { "type": "string", "operation": "equals" } }] }, "outputLabel": "Calendar" } ], "fallbackOutput": { "outputLabel": "Resposta" } } }, "id": "router", "name": "Router", "type": "n8n-nodes-base.switch", "typeVersion": 3.2, "position": [2660, 180] }, { "parameters": { "method": "POST", "url": "=https://api.uazapi.com/instances/{{ $env.UAZAPI_INSTANCE_ID }}/messages/send/text", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendBody": true, "specifyBody": "json", "jsonBody": "={ \"phone\": \"{{ $json.parametros.numero }}\", \"message\": \"{{ $json.parametros.mensagem }}\" }" }, "id": "uazapi-text", "name": "UAZAPI Texto", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [2920, -20], "credentials": { "httpHeaderAuth": { "id": "UAZAPI_CREDENTIAL_ID", "name": "UAZAPI Auth" } } }, { "parameters": { "jsCode": "// Envio em massa COM PROTEÇÃO ANTI-BAN\nconst data = $input.first().json;\nconst numeros = data.parametros?.numeros || data.contatos?.map(c => c.numero) || [];\nconst mensagem = data.parametros?.mensagem || '';\n\n// GUARDRAILS:\n// 1. Máximo 20 por lote\n// 2. Delay de 3-5 segundos entre cada envio (randomizado)\n// 3. Pausa de 30 segundos a cada 10 mensagens\n\nconst maxPorLote = 20;\nconst numerosLimitados = numeros.slice(0, maxPorLote);\n\nreturn numerosLimitados.map((num, index) => ({\n json: {\n numero: num,\n mensagem: mensagem,\n replyTo: data.replyTo,\n index: index,\n total: numerosLimitados.length,\n // Delay: 3-5 segundos + pausa extra a cada 10\n delayMs: (3000 + Math.random() * 2000) + (index > 0 && index % 10 === 0 ? 30000 : 0)\n }\n}));" }, "id": "prepare-massa", "name": "Preparar Massa", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [2920, 80] }, { "parameters": { "method": "POST", "url": "=https://api.uazapi.com/instances/{{ $env.UAZAPI_INSTANCE_ID }}/messages/send/text", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendBody": true, "specifyBody": "json", "jsonBody": "={ \"phone\": \"{{ $json.numero }}\", \"message\": \"{{ $json.mensagem }}\" }" }, "id": "uazapi-massa", "name": "UAZAPI Massa", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [3140, 80], "credentials": { "httpHeaderAuth": { "id": "UAZAPI_CREDENTIAL_ID", "name": "UAZAPI Auth" } } }, { "parameters": { "jsCode": "// Salvar agendamento no Redis\nconst data = $input.first().json;\nconst agendamento = {\n id: `sched_${Date.now()}`,\n numero: data.parametros?.numero,\n mensagem: data.parametros?.mensagem,\n data_hora: data.parametros?.data_hora,\n criado_em: new Date().toISOString(),\n status: 'pendente'\n};\n\nreturn { json: { ...data, agendamento, agendamentoJson: JSON.stringify(agendamento) } };" }, "id": "prepare-schedule", "name": "Preparar Agendamento", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [2920, 180] }, { "parameters": { "operation": "push", "key": "={{ $json.redisKeySchedule }}", "value": "={{ $json.agendamentoJson }}" }, "id": "redis-schedule", "name": "Redis Agendar", "type": "n8n-nodes-base.redis", "typeVersion": 1, "position": [3140, 180], "credentials": { "redis": { "id": "REDIS_CREDENTIAL_ID", "name": "Redis" } } }, { "parameters": { "method": "POST", "url": "=https://api.uazapi.com/instances/{{ $env.UAZAPI_INSTANCE_ID }}/groups/create", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendBody": true, "specifyBody": "json", "jsonBody": "={ \"name\": \"{{ $json.parametros.nome }}\", \"participants\": {{ JSON.stringify($json.parametros.participantes || []) }} }" }, "id": "uazapi-group", "name": "UAZAPI Grupo", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [2920, 280], "credentials": { "httpHeaderAuth": { "id": "UAZAPI_CREDENTIAL_ID", "name": "UAZAPI Auth" } } }, { "parameters": { "method": "GET", "url": "=https://api.uazapi.com/instances/{{ $env.UAZAPI_INSTANCE_ID }}/groups", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth" }, "id": "uazapi-list-groups", "name": "UAZAPI List Groups", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [2920, 380], "credentials": { "httpHeaderAuth": { "id": "UAZAPI_CREDENTIAL_ID", "name": "UAZAPI Auth" } } }, { "parameters": { "jsCode": "// Gerar relatório\nconst data = $input.first().json;\nconst stats = data.stats || { enviadas: 0, grupos_criados: 0, agendadas: 0 };\nconst contatos = data.contatos?.length || 0;\n\nconst relatorio = `📊 *RELATÓRIO*\\n\\n` +\n `📤 Mensagens enviadas: ${stats.enviadas}\\n` +\n `👥 Grupos criados: ${stats.grupos_criados}\\n` +\n `⏰ Agendamentos: ${stats.agendadas}\\n` +\n `📇 Contatos salvos: ${contatos}`;\n\nreturn { json: { ...data, mensagem_usuario: relatorio } };" }, "id": "gen-report", "name": "Gerar Relatório", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [2920, 480] }, { "parameters": { "method": "GET", "url": "={{ $json.parametros.url }}", "options": {} }, "id": "fetch-sheets", "name": "Fetch Sheets", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [2920, 580] }, { "parameters": { "method": "GET", "url": "https://www.googleapis.com/calendar/v3/calendars/primary/events", "authentication": "genericCredentialType", "genericAuthType": "oAuth2Api", "sendQuery": true, "queryParameters": { "parameters": [{ "name": "timeMin", "value": "={{ new Date().toISOString() }}" }, { "name": "maxResults", "value": "5" }] } }, "id": "calendar", "name": "Google Calendar", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [2920, 680], "credentials": { "oAuth2Api": { "id": "GOOGLE_CREDENTIAL_ID", "name": "Google OAuth2" } } }, { "parameters": { "method": "POST", "url": "=https://api.uazapi.com/instances/{{ $env.UAZAPI_INSTANCE_ID }}/messages/send/text", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendBody": true, "specifyBody": "json", "jsonBody": "={ \"phone\": \"{{ $('Parse Resposta').first().json.replyTo }}\", \"message\": \"{{ $json.mensagem_usuario || $('Parse Resposta').first().json.mensagem_usuario }}\" }" }, "id": "send-reply", "name": "Enviar Resposta", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [3360, 300], "credentials": { "httpHeaderAuth": { "id": "UAZAPI_CREDENTIAL_ID", "name": "UAZAPI Auth" } } }, { "parameters": { "respondWith": "json", "responseBody": "={\"status\": \"ok\"}" }, "id": "respond-ok", "name": "OK", "type": "n8n-nodes-base.respondToWebhook", "typeVersion": 1.1, "position": [3580, 300] }, { "parameters": { "respondWith": "json", "responseBody": "={\"status\": \"skip\"}" }, "id": "respond-skip", "name": "Skip", "type": "n8n-nodes-base.respondToWebhook", "typeVersion": 1.1, "position": [1560, 340] }, { "parameters": { "respondWith": "json", "responseBody": "={\"status\": \"unauth\"}", "options": { "responseCode": 403 } }, "id": "respond-unauth", "name": "Unauth", "type": "n8n-nodes-base.respondToWebhook", "typeVersion": 1.1, "position": [900, 400] } ], "connections": { "Webhook UAZAPI": { "main": [[{ "node": "Extrair Dados", "type": "main", "index": 0 }]] }, "Extrair Dados": { "main": [[{ "node": "Autorizado?", "type": "main", "index": 0 }]] }, "Autorizado?": { "main": [[{ "node": "Redis Config", "type": "main", "index": 0 }], [{ "node": "Unauth", "type": "main", "index": 0 }]] }, "Redis Config": { "main": [[{ "node": "Filtrar Grupos", "type": "main", "index": 0 }]] }, "Filtrar Grupos": { "main": [[{ "node": "Processar?", "type": "main", "index": 0 }]] }, "Processar?": { "main": [[{ "node": "Redis User", "type": "main", "index": 0 }], [{ "node": "Skip", "type": "main", "index": 0 }]] }, "Redis User": { "main": [[{ "node": "Preparar Contexto", "type": "main", "index": 0 }]] }, "Preparar Contexto": { "main": [[{ "node": "OpenAI", "type": "main", "index": 0 }]] }, "OpenAI": { "main": [[{ "node": "Parse Resposta", "type": "main", "index": 0 }]] }, "Parse Resposta": { "main": [[{ "node": "Salvar User", "type": "main", "index": 0 }, { "node": "Salvar Config", "type": "main", "index": 0 }]] }, "Salvar User": { "main": [[{ "node": "Router", "type": "main", "index": 0 }]] }, "Router": { "main": [ [{ "node": "UAZAPI Texto", "type": "main", "index": 0 }], [{ "node": "Preparar Massa", "type": "main", "index": 0 }], [{ "node": "Preparar Agendamento", "type": "main", "index": 0 }], [{ "node": "UAZAPI Grupo", "type": "main", "index": 0 }], [{ "node": "UAZAPI List Groups", "type": "main", "index": 0 }], [{ "node": "Gerar Relatório", "type": "main", "index": 0 }], [{ "node": "Fetch Sheets", "type": "main", "index": 0 }], [{ "node": "Google Calendar", "type": "main", "index": 0 }], [{ "node": "Enviar Resposta", "type": "main", "index": 0 }] ]}, "UAZAPI Texto": { "main": [[{ "node": "Enviar Resposta", "type": "main", "index": 0 }]] }, "Preparar Massa": { "main": [[{ "node": "UAZAPI Massa", "type": "main", "index": 0 }]] }, "UAZAPI Massa": { "main": [[{ "node": "Enviar Resposta", "type": "main", "index": 0 }]] }, "Preparar Agendamento": { "main": [[{ "node": "Redis Agendar", "type": "main", "index": 0 }]] }, "Redis Agendar": { "main": [[{ "node": "Enviar Resposta", "type": "main", "index": 0 }]] }, "UAZAPI Grupo": { "main": [[{ "node": "Enviar Resposta", "type": "main", "index": 0 }]] }, "UAZAPI List Groups": { "main": [[{ "node": "Enviar Resposta", "type": "main", "index": 0 }]] }, "Gerar Relatório": { "main": [[{ "node": "Enviar Resposta", "type": "main", "index": 0 }]] }, "Fetch Sheets": { "main": [[{ "node": "Enviar Resposta", "type": "main", "index": 0 }]] }, "Google Calendar": { "main": [[{ "node": "Enviar Resposta", "type": "main", "index": 0 }]] }, "Enviar Resposta": { "main": [[{ "node": "OK", "type": "main", "index": 0 }]] } }, "settings": { "executionOrder": "v1" } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/pabloweyne/uazapi-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server