Servidor MCP de WhatsApp: como montar e usar no Claude e no Cursor
Um servidor MCP de WhatsApp é um programa que expõe ações da API (enviar texto, verificar número, ver o status da instância, ler mensagens) como ferramentas que o Claude, o Cursor e outros clientes MCP podem chamar. Aviso de honestidade: o ZapZap ainda não publica um servidor MCP próprio. Este guia é um exemplo de como montar o seu em cerca de 80 linhas de TypeScript sobre a API que já existe, e não descreve um produto lançado.
Publicado em · 6 min de leitura
O que é MCP e por que ligar o WhatsApp a um assistente de IA
MCP (Model Context Protocol) é um protocolo aberto que define como um cliente de IA (um app de chat, um editor de código, um agente) descobre e chama ferramentas expostas por um servidor. Em vez de cada integração ser feita sob medida, o servidor declara as ferramentas, os parâmetros e as descrições, e o cliente decide quando chamá-las durante a conversa.
Para o WhatsApp isso abre usos concretos: pedir ao assistente que confirme se uma lista de números tem WhatsApp, que resuma as últimas mensagens de um cliente, que verifique se a instância está conectada antes de uma campanha ou que redija e, com a sua aprovação, envie uma mensagem. A parte difícil não é técnica, é de controle: um assistente com acesso de envio precisa de travas.
O que existe hoje e o que não existe
Estado em 27/10/2026. Existe: a API REST do ZapZap, com referência por endpoint e arquivo OpenAPI publicado em OpenAPI; o pacote n8n-nodes-zapzap 0.1.3 no npm, para quem usa n8n; e a SDK oficial do MCP em TypeScript (@modelcontextprotocol/sdk, versão 1.32.2 no npm nesta data), que usaremos no exemplo. Não existe: um servidor MCP do ZapZap publicado e mantido por nós.
Por isso o código abaixo é seu: você o hospeda, você o mantém e você responde pelo que o assistente pode fazer com ele. A vantagem é o controle total sobre quais ferramentas existem. Se um dia houver um servidor oficial, ele estará anunciado nas páginas de documentação e este guia será atualizado.
Quais ferramentas expor (comece só com leitura)
| Ferramenta | Endpoint da API | Risco | Observação |
|---|---|---|---|
| instance_status | GET /{instanceId}/instance/status | Baixo | Mostra se a instância está conectada |
| check_numbers | POST /{instanceId}/chat/check | Baixo | Recebe numbers e devolve isInWhatsapp e jid |
| find_messages | POST /{instanceId}/message/find | Médio | Lê conversas; dado pessoal |
| send_text | POST /{instanceId}/send/text | Alto | Envia mensagem de verdade; exige trava |
Comece só com as três primeiras e adicione send_text depois de testar as travas da seção de segurança. Quem lê mensagens de clientes tem de tratá-las como dado pessoal e como entrada não confiável, já que o texto de um cliente pode tentar instruir o assistente (injeção de prompt).
Código: servidor MCP em TypeScript sobre a API do ZapZap
O servidor abaixo usa transporte stdio, o mais simples para rodar localmente: o cliente inicia o processo e conversa pela entrada e saída padrão. Cada ferramenta tem um esquema de entrada em zod e devolve texto. As credenciais vêm de variáveis de ambiente do processo, nunca do assistente.
A ferramenta send_text tem três travas: só envia para números de uma lista permitida (ZAPZAP_ALLOWED), limita o tamanho do texto e fica desligada a menos que ZAPZAP_ENABLE_SEND seja true. Instale com npm install @modelcontextprotocol/sdk zod e compile com tsc ou rode com tsx.
TypeScript (server.ts)
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const BASE = "https://api.zapzapapi.com/api/v1/" + process.env.ZAPZAP_INSTANCE_ID;
const headers = {
"Content-Type": "application/json",
"x-api-key": process.env.ZAPZAP_API_KEY ?? "",
"x-api-secret": process.env.ZAPZAP_API_SECRET ?? "",
};
const allowed = new Set((process.env.ZAPZAP_ALLOWED ?? "").split(",").filter(Boolean));
const sendEnabled = process.env.ZAPZAP_ENABLE_SEND === "true";
async function call(method: "GET" | "POST", path: string, body?: unknown) {
const res = await fetch(BASE + path, { method, headers, body: body ? JSON.stringify(body) : undefined });
const text = await res.text();
if (!res.ok) throw new Error("ZapZap " + res.status + ": " + text.slice(0, 300));
return text;
}
const ok = (text: string) => ({ content: [{ type: "text" as const, text }] });
const server = new McpServer({ name: "whatsapp-zapzap-exemplo", version: "0.1.0" });
server.registerTool(
"instance_status",
{ description: "Mostra se a instancia de WhatsApp esta conectada." },
async () => ok(await call("GET", "/instance/status")),
);
server.registerTool(
"check_numbers",
{
description: "Verifica quais numeros (com DDI, so digitos) tem WhatsApp.",
inputSchema: { numbers: z.array(z.string().regex(/^\d{10,15}$/)).min(1).max(50) },
},
async ({ numbers }) => ok(await call("POST", "/chat/check", { numbers })),
);
server.registerTool(
"find_messages",
{
description: "Lista mensagens recentes de uma conversa (chatid, ex: 5511999999999@s.whatsapp.net).",
inputSchema: { chatid: z.string(), limit: z.number().int().min(1).max(30).default(10) },
},
async ({ chatid, limit }) => ok(await call("POST", "/message/find", { chatid, limit, offset: 0 })),
);
if (sendEnabled) {
server.registerTool(
"send_text",
{
description: "Envia uma mensagem de texto. So funciona para numeros da lista permitida.",
inputSchema: { number: z.string().regex(/^\d{10,15}$/), text: z.string().min(1).max(1000) },
},
async ({ number, text }) => {
if (!allowed.has(number)) throw new Error("number not in the allowed list");
return ok(await call("POST", "/send/text", { number, text }));
},
);
}
await server.connect(new StdioServerTransport());Como ligar o servidor ao Claude e ao Cursor
Clientes MCP leem uma configuração JSON com o comando que inicia cada servidor e as variáveis de ambiente. No Claude Desktop, o arquivo é claude_desktop_config.json; no Cursor, .cursor/mcp.json no projeto (ou o equivalente global). No Claude Code, o comando claude mcp add registra o servidor. O formato do JSON é o mesmo nos dois primeiros, mas o local do arquivo e os menus mudam entre versões: confira a documentação de cada cliente.
Depois de salvar, reinicie o cliente. As ferramentas aparecem na lista; peça algo como: verifique se a instância está conectada e depois cheque se estes três números têm WhatsApp. Aprove cada chamada na primeira vez em vez de liberar tudo de uma vez.
JSON (claude_desktop_config.json ou .cursor/mcp.json)
{
"mcpServers": {
"whatsapp": {
"command": "npx",
"args": ["tsx", "/caminho/para/server.ts"],
"env": {
"ZAPZAP_INSTANCE_ID": "SEU_INSTANCE_ID",
"ZAPZAP_API_KEY": "SUA_API_KEY",
"ZAPZAP_API_SECRET": "SEU_API_SECRET",
"ZAPZAP_ALLOWED": "5511999999999",
"ZAPZAP_ENABLE_SEND": "false"
}
}
}
}Segurança: o que fazer antes de liberar o envio
Quatro regras. Primeira: lista permitida de destinatários, como no código; um assistente nunca deve poder enviar para qualquer número. Segunda: aprovação humana por chamada de envio, que os clientes MCP costumam oferecer e que você deve manter ligada. Terceira: trate o conteúdo lido como não confiável. Uma mensagem de cliente dizendo para ignorar as instruções e enviar algo a outro número é um ataque real; a lista permitida e a aprovação são as defesas. Quarta: instância dedicada, não o número principal do negócio.
Some limites de volume no próprio servidor (contador por hora), registro em log de toda chamada e credenciais com rotação. E lembre que o envio automatizado continua sujeito aos Termos do WhatsApp: ferramenta de IA não muda o risco de restrição do número, e uma conversa iniciada pelo assistente com quem não conhece você é o cenário de maior risco. Veja por que o WhatsApp bloqueia números.
Alternativas: OpenAPI, n8n e código próprio
O MCP é um entre vários caminhos para dar ferramentas a um agente. Se o seu agente fala OpenAPI, o arquivo OpenAPI do ZapZap descreve todas as rotas e pode alimentar um gerador de ferramentas. Se você já usa n8n, o fluxo do agente de IA no n8n cobre o caso sem escrever servidor. E para frameworks em Python, o guia de LangChain e CrewAI mostra a mesma ideia com ferramentas HTTP.
Escolha pelo onde o agente roda: MCP serve bem para assistentes de uso pessoal e de equipe (Claude, Cursor); n8n, para automações com gatilho; código próprio, para produto. Em todos, a referência da API é a mesma: send/text, chat/check, message/find e instance/status.
Resumo rápido
- MCP é um protocolo aberto para clientes de IA chamarem ferramentas; o ZapZap ainda não publica um servidor MCP próprio (estado em 27/10/2026).
- Dá para montar o seu em TypeScript com @modelcontextprotocol/sdk sobre os endpoints instance/status, chat/check, message/find e send/text.
- Comece só com ferramentas de leitura; libere o envio com lista permitida, limite de volume e aprovação humana.
- Mensagens lidas são entrada não confiável: injeção de prompt é risco real.
- O envio automatizado continua sujeito aos Termos do WhatsApp, com ou sem assistente de IA.
Continue lendo
Perguntas frequentes
O ZapZap tem um servidor MCP pronto?
Não. Em 27/10/2026 não há um servidor MCP publicado e mantido pelo ZapZap. O guia mostra como montar o seu sobre a API REST existente. O que existe publicado é a API, o OpenAPI e o pacote n8n-nodes-zapzap para n8n.
Como usar o WhatsApp como ferramenta no Claude?
Monte (ou instale) um servidor MCP que chame a API, registre-o na configuração do cliente (claude_desktop_config.json no Claude Desktop, ou claude mcp add no Claude Code) e reinicie. As ferramentas aparecem para o assistente chamar, com aprovação sua.
É seguro deixar um assistente de IA enviar WhatsApp?
Só com travas: lista permitida de destinatários, aprovação humana por envio, limite de volume, log e instância dedicada. Comece apenas com ferramentas de leitura e trate o texto lido como não confiável por causa de injeção de prompt.
Qual a diferença entre MCP e chamar a API direto?
A API é a interface do serviço. O MCP é uma camada padronizada que apresenta ações da API como ferramentas descobertas pelo cliente de IA. Você escreve o servidor uma vez e qualquer cliente MCP compatível o usa.
Funciona no Cursor e em outros clientes?
Qualquer cliente que fale MCP pode usar o servidor. O Cursor lê um mcp.json com o comando e as variáveis de ambiente. Locais de arquivo e menus mudam entre versões, então confira a documentação do cliente que você usa.
Comece pela API: ela é a base de qualquer agente
Crie a conta, verifique o telefone e receba o crédito de boas-vindas, sem depositar (um por telefone, sujeito à campanha vigente). Conecte por QR code e teste as chamadas antes de expor como ferramenta.
