ApiEnvios
Provides tools to manage and operate WhatsApp messaging accounts, including sending text and media messages, running campaigns, inspecting received messages, managing instances and number pools, configuring webhooks, managing account members, and viewing metrics, with provider routing and anti-ban/anti-flood safeguards.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ApiEnviossend a WhatsApp message to +55 11 98888-7777 saying my order shipped"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Api-WhatsApp-MCP (ApiEnvios)
Plataforma de envio de WhatsApp multi-tenant e de código aberto, com pool de números por instância, fallback opcional entre três provedores, proteção anti-ban e anti-flood, painel web de administração, API REST e um servidor MCP remoto (OAuth 2.1) para que assistentes de IA, como o Claude, gerenciem a conta e até conversem pelo WhatsApp.
Stack: Node 20+ · TypeScript · Fastify 5 · Prisma 5 (PostgreSQL 16) · Redis 7 + BullMQ · Zod · Pino · Eta + Alpine.js (painel) · Vitest · Docker.
Status:
0.1.0, extraído de um sistema em produção. As APIs ainda podem mudar antes da1.0.
Arquitetura
Conta (ApiClient / tenant)
├── Usuários (OWNER / MEMBER) ── login com JWT (painel / API)
└── Instâncias ── uma "instância" = um POOL de números
└── Números (InstanceNumber) ── cada número = uma sessão real em um provedor
├── 1. Evolution API (texto/mídia, principal)
├── 2. WuzAPI (texto/mídia + botões, localização, contato, enquetes, listas)
└── 3. WhatsApp Cloud (API oficial: PLANEJADO, ainda não integrado)Você envia para uma instância e o roteador escolhe o melhor número CONNECTED
(rodízio anti-ban), preferindo um número WuzAPI quando o conteúdo exige recursos ricos
(botões / localização / contato / enquete / lista). A Evolution não suporta esses
tipos e falham de forma explícita (nunca degradam em silêncio para texto). Quando um ban é
detectado, o número passa para BANNED e um webhook é disparado.
Related MCP server: MCP WhatsApp
Autenticação e papéis
Autenticação | Cabeçalho | Uso |
Token da instância |
| Aplicações cliente que enviam por uma instância específica |
API key da conta |
| Gerenciamento de várias instâncias (a instância vai no corpo) |
JWT (login humano) |
| Pessoas (painel / API / MCP), com um papel |
Recurso | MEMBER | OWNER (dono da conta) | Super admin |
Enviar / campanhas / status | sim (instâncias próprias) | sim (conta) | sim (global) |
Ver instâncias | só as suas ( | todas da conta | todas |
Métricas | suas instâncias | conta | conta |
Criar / editar / apagar instância | próprias | conta | qualquer |
Atribuir dono de instância | não | sim | sim |
Gerenciar membros ( | não | sim (somente MEMBER) | sim |
Webhooks da conta | — | sim | sim |
Admin: contas / usuários / instâncias globais ( | não | não | sim |
Início rápido
Com Docker Compose
git clone https://github.com/Otavio1661/Api-WhatsApp-MCP.git && cd Api-WhatsApp-MCP
cp .env.example .env
# Preencha API_SECRET, JWT_SECRET, SECRETS_ENCRYPTION_KEY (openssl rand -base64 32)
# e POSTGRES_PASSWORD (openssl rand -hex 24)
docker compose -f docker-compose.example.yml up -d --buildA API e o painel respondem em http://localhost:3000 (painel em /admin).
Crie o primeiro administrador definindo ADMIN_SEED_EMAIL / ADMIN_SEED_PASSWORD e
rodando npm run db:seed a partir de um checkout apontado para o mesmo banco (a imagem de
produção não traz as ferramentas de desenvolvimento). Veja docs/self-hosting.md.
Desenvolvimento local
npm install
cp .env.example .env # DATABASE_URL, REDIS_*, JWT_SECRET, API_SECRET, SECRETS_ENCRYPTION_KEY...
docker compose -f docker-compose.example.yml up -d postgres redis
npx prisma migrate deploy && npx prisma generate
npm run db:seed # SOMENTE DEV: dados fictícios de demonstração (veja prisma/seed.ts)
npm run devPainel web (/admin)
Login com JWT (cookie httpOnly). Telas por papel: Instâncias (status derivado do pool), Monitor (campanhas e mensagens), Webhooks, Docs (referência da API filtrada por papel, com a seção MCP para conectar assistentes de IA), Equipe (OWNER: membros e donos de instâncias) e Administração (super admin: contas e usuários).
Capturas de tela
Pool de números de uma instância, com o status de cada conexão:

Monitor de campanhas (lotes) e mensagens recentes:

Cadastro e acompanhamento de webhooks:

Página Docs, seção MCP: URL do ambiente e comandos de conexão (Claude Code e Codex):

Referência das 30 ferramentas do MCP, gerada a partir do código:

Quer ver o painel com esses mesmos dados no seu computador? Veja o modo demonstração.
Capturas de uma instância de demonstração com dados fictícios e um provedor simulado; os status de conexão e os números são de exemplo, não representam uso real.
API REST (resumo)
POST /v1/instance/:id/messages/chat { to, body }
POST /v1/instance/:id/messages/media { to, type, mediaUrl, caption }
POST /v1/messages { to, type, text|mediaUrl, instanceId?, scheduledAt? }
POST /v1/campaigns { to:[...], text|mediaUrl, instanceId?, externalIdPrefix? }
GET /v1/messages/:id status da mensagem
GET /v1/messages?status=&page=&limit= histórico
GET/POST/PATCH/DELETE /v1/instances[/:id] (+ /connect, /qr, /status, /numbers ...)
GET /v1/metrics?days=30
POST /v1/webhooks { url, events[], secret? }
GET/POST/PATCH/DELETE /v1/account/users (OWNER) gerencia MEMBERs
GET/POST/PATCH/DELETE /v1/admin/... (super admin) contas, usuários, instâncias globais
GET /health { status, version, uptimeSec, checks:{database,redis} }O painel serve a referência completa, filtrada por papel, em /admin/docs.
Webhooks
Eventos: BAN_DETECTED, NUMBER_DISCONNECTED, NUMBER_ROTATED, MESSAGE_FAILED,
MESSAGE_DELIVERED, PROVIDER_DOWN. A entrega é assíncrona, com retry e backoff
(BullMQ). Com um secret, todo POST leva:
X-ApiEnvios-Event: <evento>
X-ApiEnvios-Timestamp: <epoch em ms>
X-ApiEnvios-Signature: sha256=<HMAC-SHA256 de "<timestamp>.<corpo>">Valide recalculando o HMAC sobre ${timestamp}.${rawBody} com o seu secret.
As URLs de webhook passam por uma verificação anti-SSRF (endereços privados, de loopback e
de metadados de nuvem são rejeitados).
Anti-ban e anti-flood
Espaçamento de envio por instância (lock no Redis + atraso aleatório).
Limite por destinatário por hora, por conta (
ApiClient.maxPerRecipientPerHour,0= sem limite); ao excedê-lo, a API devolve429 Retry-Aftersem enfileirar.Aquecimento de números novos, rotação automática em caso de ban e limite diário por número.
Servidor MCP (assistentes de IA)
POST /mcp expõe 30 tools (instâncias, mensagens, mensagens recebidas, campanhas,
webhooks, membros, métricas) via Streamable HTTP (stateless) com OAuth 2.1 + PKCE e
Dynamic Client Registration. Cada tool chama a rota REST normal com o JWT do usuário
logado, então o isolamento por tenant, a checagem de papéis e o anti-flood valem exatamente
como na API. Uma ponte opcional WhatsApp <-> assistente permite que um assistente
conectado responda mensagens em seu nome (totalmente configurável).
Início rápido (troque a URL pela URL HTTPS pública da sua API):
# Claude Code
claude mcp add --transport http apienvios https://api.example.com/mcp # depois rode /mcp para fazer login
# OpenAI Codex CLI
codex mcp add apienvios --url https://api.example.com/mcp
codex mcp login apienvios --oauth-client-registration dcrCliente | Situação do guia de conexão |
Verificado na documentação do fabricante | |
Verificado na documentação do fabricante | |
Verificado na documentação do fabricante | |
Verificado; o fabricante diz que DCR não é suportado, contorno não testado | |
Verificado na documentação do fabricante | |
Parcial (alguns pontos não confirmados) | |
Pela ponte |
Documentação completa: como funciona, conectar um cliente, referência das tools, segurança, solução de problemas e exemplos.
Segredos criptografados em repouso
Instance.token, Instance.webhookSecret e ApiClient.apiKey são credenciais ativas que
precisam ser exibidas em texto claro no painel/API após a criação, por isso são protegidas
com criptografia simétrica reversível (AES-256-GCM) em vez de hash:
Implementação em
src/utils/secrets-crypto.ts: IV aleatório por valor, armazenado comoiv:tag:ciphertext(base64). A chave mestra vem deSECRETS_ENCRYPTION_KEY(openssl rand -base64 32), nunca do schema, das migrations nem do git.Um blind index (
tokenHash/apiKeyHash, HMAC-SHA256 derivado da chave mestra) permite ao middleware de autenticação localizar credenciais sem descriptografar todas as linhas.Sem
SECRETS_ENCRYPTION_KEY, a criação de uma nova instância ou tenant falha.
Login externo plugável (opcional)
Por padrão, os usuários se autenticam com um hash bcrypt local. Para delegar as senhas a
outro sistema (LDAP, SSO, um serviço de identidade interno), registre um ExternalAuthProvider
(src/services/external-auth.ts) na inicialização e defina User.externalId nos usuários
correspondentes. Um usuário com externalId e sem provider registrado não consegue entrar.
Documentação
docs/self-hosting.md — deploy, proxy reverso, atualizações, backups
docs/configuration.md — todas as variáveis de ambiente
docs/providers.md — Evolution API, WuzAPI e o plano da WhatsApp Cloud API
docs/mcp/overview.md — MCP: como funciona, fluxo OAuth, sessões, limites, ponte WhatsApp
docs/mcp/connect.md — conectar Claude Code, Codex, Cursor, Gemini CLI e outros
docs/mcp-tools.md — referência das 30 tools (gerada a partir do código)
docs/mcp/security.md, docs/mcp/troubleshooting.md, docs/mcp/examples.md
docs/security.md — modelo de segurança e checklist de hardening
Testes
npm test # vitest (unitários + integração com Prisma/Redis simulados; não precisa de infraestrutura)
npm run build # compilação (tsc) + cópia das views e dos arquivos públicos do painel para dist/web
npm run docs:mcp-tools:check # falha se docs/mcp-tools.md estiver desatualizado (regenere com npm run docs:mcp-tools)Contribuição e segurança
Veja CONTRIBUTING.md e SECURITY.md. Relate vulnerabilidades de forma privada, nunca em uma issue pública.
Licença
This server cannot be deployed
Maintenance
Related MCP Connectors
WhatsMCP connects Claude and other MCP-compatible AI agents directly to WhatsApp. Send and receive text, images, documents, and voice notes; manage groups (create, add/remove members, promote admins); look up contacts and profiles; follow channels; and read call and message history — all through a standard MCP interface. For voice use cases, WhatsMCP offers SIP-based calling plans (inbound-only, or full inbound/outbound) so AI voice agents can answer and place WhatsApp calls, plus low-latency WebSocket integrations with voice agent providers like ElevenLabs. Multiple WhatsApp accounts can be paired and managed per workspace, with webhook support for real-time inbound message delivery to your own infrastructure.
Let Claude or ChatGPT search, read and send your WhatsApp messages over MCP. OAuth sign-in.
Read-only WhatsApp MCP for your AI agent: it reads the chats you choose. Try the public demo.
- cloziqOAuthcom.cloziq
Create your offers and launch AI Instagram DM sales agents from any MCP client, over OAuth.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceEnables WhatsApp automation through MCP protocol, allowing users to manage sessions, send messages, handle groups/communities, and access contacts through natural language interactions with AI agents.4 npm-
- AlicenseBqualityBmaintenanceEnables sending messages, images, documents and more on WhatsApp directly from any MCP-compatible AI, with tools for chat management, groups, and webhooks.371MIT
- AlicenseBqualityCmaintenanceEnables AI assistants to manage WhatsApp business operations including chatbots, broadcasts, campaigns, and contacts through 120+ MCP tools.1008 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to send and receive WhatsApp messages, search chats, share media, manage approvals, and get activity summaries through MCP.Apache 2.0