MCP WhatsApp (uazapi)
Provides access to WhatsApp through the uazapi API, enabling reading conversation history, listing open chats and instances, sending messages and media such as PDFs, product photos and location, scheduling campaigns with safe delays, and managing CRM-related data like lead status, tags, assignees and internal notes.
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
MCP WhatsApp (uazapi)
Servidor MCP que dá ao Claude acesso ao WhatsApp da empresa através da API uazapi. Feito para rodar em VPS via EasyPanel e ser conectado ao Claude como conector remoto.
Com ele o Claude consegue, por exemplo:
responder clientes lendo antes o histórico da conversa;
levantar atendimentos em aberto, conversas paradas e clientes por etiqueta;
mandar catálogo em PDF, foto de produto, localização da loja;
agendar campanhas de divulgação com intervalo seguro entre mensagens;
manter o CRM em dia (status do lead, tags, responsável, notas internas).
Índice
Related MCP server: WAHA WhatsApp MCP Server
Como funciona
Claude ──HTTPS (POST /mcp)──▶ este servidor MCP ──HTTPS──▶ uazapi ──▶ WhatsApp
Authorization: Bearer (na sua VPS) header: tokenHá duas URLs de conexão:
URL | Alcance |
| Todos os números da conta; o Claude escolhe pelo parâmetro |
| Somente aquele número. O parâmetro |
O servidor opera em modo stateless: cada requisição é independente, então o container pode reiniciar ou escalar sem derrubar a conexão com o Claude.
Pré-requisitos
Conta uazapi — anote a URL do servidor (ex.:
https://seusubdominio.uazapi.com) e o token de administrador (ou o token de uma instância específica).VPS com EasyPanel instalado.
Um subdomínio apontando para a VPS (ex.:
whatsapp-mcp.suaempresa.com.br).Use WhatsApp Business, não o WhatsApp comum — a própria uazapi recomenda, porque a conta pessoal desconecta e trava com mais frequência em integrações.
Deploy no EasyPanel
1. Criar o serviço
No projeto do EasyPanel: + Service → App, nome mcp-whatsapp.
2. Apontar para o repositório
Na aba Source:
Campo | Valor |
Tipo | GitHub (ou Git) |
Repositório | este repositório |
Branch |
|
Build Path |
|
Na aba Build, escolha Dockerfile (o Dockerfile na raiz já está pronto).
3. Configurar as variáveis
Na aba Environment, cole e ajuste:
UAZAPI_URL=https://seusubdominio.uazapi.com
UAZAPI_ADMIN_TOKEN=seu-token-de-administrador
MCP_AUTH_TOKEN=cole-aqui-um-segredo-longo
PORT=8080
SEND_ENABLED=falseCom UAZAPI_ADMIN_TOKEN, o servidor descobre sozinho todos os números da conta —
inclusive os que você criar depois. Não precisa cadastrar loja por loja.
Gere o MCP_AUTH_TOKEN com:
openssl rand -hex 32Comece com
SEND_ENABLED=false. Assim o Claude consegue ler o WhatsApp mas não envia nada, e você valida tudo sem risco. Depois mude paratrue.
4. Expor a porta e o domínio
Na aba Domains: Add Domain.
Campo | Valor |
Host |
|
Caminho |
|
Protocolo (destino) |
|
Porta (destino) |
|
HTTPS | ligado (Let's Encrypt) |
5. Deploy e verificação
Clique em Deploy. Quando terminar, teste:
curl "https://whatsapp-mcp.suaempresa.com.br/health?token=SEU_MCP_AUTH_TOKEN"Resposta esperada:
{
"status": "ok",
"server": "whatsapp-uazapi",
"version": "1.1.0",
"instances": ["loja-centro", "loja-shopping"],
"autoDiscovery": true,
"sendEnabled": false,
"authRequired": true
}Confira três coisas:
instancesdeve listar seus números (a lista só aparece com o token; sem ele, o/healthmostra apenas status, versão e a quantidade eminstancias). Vazio significa que a descoberta falhou — chequeUAZAPI_ADMIN_TOKENe os logs do container.authRequireddeve sertrue. Se vierfalse, oMCP_AUTH_TOKENnão foi aplicado e o endereço está aberto na internet — corrija antes de prosseguir.statusvindo como"atencao"traz um campoavisosexplicando o que falta.
Variáveis de ambiente
Conexão com a uazapi
UAZAPI_URL é sempre obrigatória. Depois, escolha uma das formas:
Variável | Descrição |
| URL do seu servidor uazapi. |
| Forma A (recomendada). Token de administrador; o servidor descobre todas as instâncias da conta sozinho. |
| Forma B. Token de uma instância só. |
| Forma C. Lista fixa em JSON. |
| Número usado quando o Claude não especifica qual. |
| Cache da lista descoberta, em segundos (padrão |
As formas podem ser combinadas: uma instância declarada à mão tem prioridade sobre a descoberta automática de mesmo nome.
Segurança
Variável | Padrão | Descrição |
| — | Segredo que abre qualquer rota. Defina sempre em produção. Aceito em |
| — | JSON |
|
|
|
| vazio | Prefixos autorizados a receber mensagens, separados por vírgula. Vazio libera todos. |
|
| Teto de destinatários por campanha. |
|
| Intervalo mínimo entre mensagens de campanha. |
Operação
Variável | Padrão | Descrição |
|
| Porta HTTP. |
|
| Interface de escuta. |
|
|
|
|
| DDI aplicado a números informados sem código de país. |
|
| Tempo máximo de espera por resposta da uazapi. |
| — | Endereço público do servidor usado nos links de upload. Se vazio, vem do próprio pedido (funciona atrás do EasyPanel). |
| — | Chave da OpenAI usada para transcrever áudios ( |
|
|
|
|
|
|
Conectar a um número só (URL travada)
Quando a conta tem muitas instâncias — ou quando algumas pertencem a clientes — o mais seguro é conectar o Claude a uma URL travada num número:
https://SEU-DOMINIO/mcp/loja-centroNessa conexão:
as ferramentas não têm o parâmetro
instance: não existe como pedir outro número;whatsapp_list_instancesmostra só aquele;se o modelo mandar
instanceassim mesmo, o campo é descartado, não redireciona;as instruções de abertura avisam que a conexão é restrita, então o Claude explica isso ao usuário em vez de tentar contornar.
Nomes com espaço ou maiúsculas funcionam (/mcp/Loja%20Norte); a comparação ignora
maiúsculas. GET /health?token=SEU_TOKEN lista a URL de cada instância em endpoints.porInstancia
(sem o token, o /health só informa status e versão, para não expor os nomes dos clientes).
Uma senha por loja
Para que cada URL tenha a própria credencial, use MCP_INSTANCE_TOKENS:
MCP_AUTH_TOKEN=segredo-geral-da-administracao
MCP_INSTANCE_TOKENS={"loja-centro":"segredo-da-loja-centro","loja-shopping":"segredo-do-shopping"}Regras:
o token geral abre qualquer rota, inclusive
/mcp;o token de uma loja abre apenas
/mcp/<aquela loja>— em/mcpou na rota de outra loja ele recebe401.
Assim você entrega a URL e a senha da Loja Centro a quem cuida dela, sem dar acesso ao resto da conta.
Números privados
Para um número que não deve aparecer na conexão geral (um WhatsApp pessoal, por exemplo),
liste-o em MCP_PRIVATE_INSTANCES e dê a ele um token próprio:
MCP_PRIVATE_INSTANCES=Pessoal Fulano
MCP_INSTANCE_TOKENS={"Pessoal Fulano":"senha-so-do-pessoal"}Com isso:
o número some de
/mcp, dewhatsapp_list_instancese do/health; nenhuma conexão geral consegue operar nele, nem pelo nome nem pelo nome do perfil;ele só abre em
/mcp/Pessoal%20Fulano, e só com o token próprio: oMCP_AUTH_TOKENgeral é recusado nessa rota;sem token próprio em
MCP_INSTANCE_TOKENS, a rota fica fechada para todos.
Vários números (multi-loja)
Toda ferramenta aceita o parâmetro opcional instance, e o Claude enxerga os nomes reais
dos seus números na descrição desse parâmetro. Basta pedir em português:
"manda pelo WhatsApp da loja do shopping"
O nome de cada instância vem do campo Nome no painel da uazapi. Nomes descritivos
(loja-centro, loja-shopping) funcionam muito melhor que instancia1, instancia2.
Quando o Claude não informa instance, o número é escolhido nesta ordem:
UAZAPI_DEFAULT_INSTANCE, se definida;a única instância existente, se houver só uma;
a única instância conectada, se houver só uma conectada;
caso contrário, o Claude pergunta a você qual usar.
Criou uma instância nova na uazapi? Peça "atualiza a lista de números do WhatsApp" —
o Claude chama whatsapp_list_instances com refresh=true e ela aparece na hora,
sem redeploy.
Conectar ao Claude
Claude Code (recomendado — permite enviar o header de autenticação)
claude mcp add --transport http whatsapp \
https://whatsapp-mcp.suaempresa.com.br/mcp \
--header "Authorization: Bearer SEU_MCP_AUTH_TOKEN"Confira com /mcp dentro do Claude Code: deve aparecer whatsapp como conectado.
Claude Desktop / claude.ai (conector personalizado)
Em Configurações → Conectores → Adicionar conector personalizado:
Nome: o rótulo que você quiser.
URL do servidor MCP:
https://SEU-DOMINIO/mcp(ou/mcp/<instancia>para travar num número só).Autenticação: escolha "Sem login". Este servidor usa chave de API, não OAuth.
Cabeçalhos de requisição: adicione um cabeçalho
x-tokencom o valor doMCP_AUTH_TOKEN. A lista suspensa também oferecetoken,x-api-token,api-token,x-auth-tokenex-access-token— todos funcionam.
Se a opção "Entrar agora (Detectado)" aparecer marcada, é porque a primeira tentativa
recebeu 401 — normalmente token errado ou ausente. Selecione "Sem login" e confira o
cabeçalho.
Alternativa sem cabeçalho, para clientes que não os suportam:
https://SEU-DOMINIO/mcp?token=SEU_MCP_AUTH_TOKENFunciona igual, mas a URL passa a ser o segredo: trate como senha, não compartilhe e
troque o MCP_AUTH_TOKEN se ela vazar. Prefira o cabeçalho quando houver a opção — o
valor fica guardado pelo cliente em vez de viajar na URL.
Claude Desktop via arquivo de configuração (modo local stdio)
Em claude_desktop_config.json:
{
"mcpServers": {
"whatsapp": {
"command": "node",
"args": ["/caminho/para/mcp-whatsapp-uazapi/dist/index.js"],
"env": {
"MCP_TRANSPORT": "stdio",
"UAZAPI_URL": "https://seusubdominio.uazapi.com",
"UAZAPI_TOKEN": "token-da-sua-instancia"
}
}
}
}Conectar ao Codex
Crie um bloco por número em ~/.codex/config.toml, usando a URL travada /mcp/<instancia>:
[mcp_servers.whatsapp_loja_centro]
url = "https://SEU-DOMINIO/mcp/loja-centro"
bearer_token_env_var = "MCP_WHATSAPP_TOKEN"
[mcp_servers.whatsapp_loja_norte]
url = "https://SEU-DOMINIO/mcp/Loja%20Norte"
bearer_token_env_var = "MCP_WHATSAPP_TOKEN"Antes de abrir o Codex, guarde o token numa variável (MCP_AUTH_TOKEN ou o token da
loja em MCP_INSTANCE_TOKENS):
export MCP_WHATSAPP_TOKEN="seu-token"Se o Codex mostrar "user cancelled" em consultas grandes, aumente o tempo de espera de
cada bloco com tool_timeout_sec = 120 e use um limit menor.
A lista com a URL de cada número fica em https://SEU-DOMINIO/health?token=SEU_TOKEN
(campo endpoints.porInstancia). Nomes com espaço usam %20.
Ferramentas disponíveis
São 38 ferramentas e 4 fluxos guiados. As mais usadas no dia a dia estão em negrito.
Instância
Ferramenta | O que faz |
| Lista os números/lojas com status; |
| Estado da conexão (conectado, desconectado…). |
| Gera QR Code ou código de pareamento. |
| Encerra a sessão do WhatsApp. |
Envio
Ferramenta | O que faz |
| Mensagem de texto, com preview de link opcional. |
| Envia um arquivo de verdade (PDF, imagem, planilha, vídeo, áudio). Basta o link: o servidor baixa o arquivo (links de compartilhamento do Google Drive e Dropbox incluídos), recusa link que abre página em vez de arquivo e deduz tipo e nome. Até |
| Para arquivos do computador: devolve um link de upload (curl) e o |
| Botões, lista, enquete ou carrossel. |
| Localização da loja no mapa. |
| Cartão de contato (vCard). |
| "Digitando…" / "Gravando áudio…". |
Mensagens
Ferramenta | O que faz |
| Histórico de uma conversa. Filtra por período ( |
| Baixa a mídia de uma mensagem; transcreve áudios e informa |
| Abre planilhas recebidas (xlsx, xlsb, xlsm, xls, ods, csv) no servidor e devolve as linhas como texto, aba por aba e em páginas. Até |
| Reage com emoji. |
| Edita uma mensagem já enviada. |
| Apaga para todos. |
| Marca mensagens como lidas. |
Erros chegam ao modelo como Erro [categoria]: ... — tempo_esgotado, falha_de_rede,
sessao_desconectada, limite_de_requisicoes, nao_autorizado, nao_encontrado,
requisicao_invalida, falha_no_servidor_uazapi ou bloqueado_pela_configuracao. Um erro
sem categoria (como "user cancelled") foi gerado pelo cliente MCP, não pelo servidor.
Conversas, contatos e CRM
Ferramenta | O que faz |
| Busca conversas por nome, etiqueta, status do lead, ticket aberto… |
| Dados completos de um contato ou grupo. |
| Confere quais números existem no WhatsApp. |
| Lista os contatos da instância. |
| Salva um número na agenda. |
| Arquiva, fixa, silencia ou marca como lido. |
| Bloqueia ou desbloqueia. |
| Lê e grava notas internas (invisíveis ao cliente). |
| Atualiza status do funil, tags, atendente, CPF/CNPJ, e-mail. |
Etiquetas
Ferramenta | O que faz |
| Lista etiquetas com seus IDs. |
| Aplica ou remove etiquetas de uma conversa. |
| Cria, renomeia ou exclui etiqueta. |
Grupos
Ferramenta | O que faz |
| Lista os grupos da instância. |
| Detalhes, participantes e link de convite. |
| Cria grupo. |
| Adiciona, remove, promove ou rebaixa membros. |
Campanhas
Ferramenta | O que faz |
| Agenda disparo em massa com intervalo entre mensagens. |
| Acompanha campanhas e progresso. |
| Auditoria; filtre por |
| Pausa, retoma ou exclui campanha. |
Fluxos prontos (prompts)
Além das ferramentas, o servidor oferece quatro fluxos guiados que aparecem no menu de prompts do Claude. Eles já trazem a sequência correta de passos e as travas de segurança:
Prompt | Para quê |
| Lê o histórico da conversa (transcrevendo áudios) e propõe a resposta. |
| Levanta os atendimentos em aberto e o que está parado. |
| Monta um disparo com validação de números e aprovação antes de enviar. |
| Confere quais números estão conectados e o que fazer com os que caíram. |
Exemplos de uso no Claude
"Quais conversas estão com atendimento em aberto há mais de 2 dias?"
"Manda o catálogo
https://.../catalogo-primavera.pdfpara a Maria do (19) 99999-1234."
"Confere se esses 80 números têm WhatsApp e me diz quantos são válidos."
"Cria uma campanha para as clientes com etiqueta VIP avisando da promoção de brincos, com intervalo de 20 a 40 segundos entre as mensagens."
"Lê a conversa com o (19) 98888-7777 e me resume o que a cliente pediu."
"Quais números de WhatsApp estão conectados agora?"
Segurança
O que este servidor faz por você:
Autenticação obrigatória quando
MCP_AUTH_TOKENestá definido; a comparação do token é feita em tempo constante.Isolamento por instância: a rota
/mcp/<instancia>remove o parâmetro de escolha de número do schema das ferramentas, eMCP_INSTANCE_TOKENSdá a cada loja sua credencial.Modo somente leitura com
SEND_ENABLED=false.Lista de números autorizados com
ALLOWED_NUMBERS, ótima para testar.Travas de campanha: teto de destinatários, intervalo mínimo entre mensagens e campo
confirmobrigatório — o Claude não dispara em massa por engano.Respostas enxutas: mídias em base64 e listas gigantes são truncadas antes de chegar ao modelo.
Token de administrador usado só para leitura: serve apenas para descobrir as instâncias. Criar, apagar ou reconfigurar instâncias não está exposto como ferramenta.
Container sem root e sem dependências de desenvolvimento na imagem final.
O que você precisa fazer:
Nunca deixe a URL pública sem
MCP_AUTH_TOKEN.Mantenha o HTTPS ligado no EasyPanel.
Trate
UAZAPI_ADMIN_TOKEN,UAZAPI_TOKENeMCP_AUTH_TOKENcomo senhas: só nas variáveis de ambiente, nunca no código, em prints ou em conversas.Se um token vazar, rotacione: o admin em
POST /admin/token/rotate(permitido uma vez a cada 24 h), os de instância no painel da uazapi.Disparos em massa podem levar o número ao banimento pelo WhatsApp. Envie para quem optou por receber, use intervalos generosos e varie o texto.
Desenvolvimento local
npm install
cp .env.example .env # preencha UAZAPI_URL e UAZAPI_TOKEN
npm run dev # recarrega ao salvar
npm run build # compila para dist/
npm test # compila e roda os testes
npm run typecheck # checagem de tiposOs testes sobem uma uazapi falsa e exercitam o servidor MCP de verdade — nenhuma mensagem real é enviada.
Testar uma ferramenta por linha de comando:
curl -s https://whatsapp-mcp.suaempresa.com.br/mcp \
-H "Authorization: Bearer SEU_MCP_AUTH_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"whatsapp_instance_status","arguments":{}}}'Solução de problemas
Sintoma | Causa provável | O que fazer |
| Token errado ou ausente | Confira o cabeçalho (ou |
Conector do Claude pede login OAuth | A primeira tentativa levou | Marque "Sem login" e corrija o token: o servidor usa chave de API, não OAuth. |
| Falta | A mensagem no log diz qual variável falta. |
Ferramentas de envio recusam |
| Mude para |
| Token admin inválido ou URL errada | Confira |
Claude pergunta de qual número enviar | Mais de uma instância e nenhuma padrão | Defina |
| Nome não confere | A resposta lista os nomes válidos; confira em |
Instância nova não aparece | Cache de 5 minutos | Peça "atualiza a lista de números" ( |
| Token da instância inválido | Copie novamente o token no painel da uazapi. |
| Limite de instâncias/plano atingido | Verifique o plano na uazapi. |
Envios falham com a instância "disconnected" | Sessão caiu | Rode |
Claude não lista as ferramentas | URL sem | A URL correta termina em |
Resposta truncada | Resultado grande demais | Reduza |
Logs do container: aba Logs do serviço no EasyPanel. Suba LOG_LEVEL=debug para ver
cada chamada feita à uazapi.
Licença
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
WhatsApp for Claude, ChatGPT or any AI agent: search, reply and send. Personal or Business API.
Your own WhatsApp in Claude and ChatGPT: read chats, draft replies, send messages you approve.
Your WhatsApp Business inbox in Claude or ChatGPT: who's waiting, follow-ups and replies.
Business WhatsApp from Claude: read chats, reply to customers, pause the AI agent, edit its prompt.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceEnables interaction with WhatsApp through the Uazapi API, allowing users to send text and media messages, manage contacts, and list conversations through natural language.-
- AlicenseAqualityDmaintenanceEnables Claude to interact with WhatsApp through a unified backend API, providing 20 tools for messaging, media, groups, contacts, and chat management.2219 npmMIT
- AlicenseBqualityDmaintenanceEnables Claude or other MCP clients to interact with WhatsApp through the WAHA HTTP API, supporting messaging, group management, and contact operations.212 npmMIT
- AlicenseBqualityCmaintenanceEnables Claude to manage WhatsApp templates, flows, and send messages through the WhatsApp Cloud API.3114 npmMIT