zapo traz dois pacotes opcionais voltados puramente a desenvolvimento e testes — nenhum é para produção:
- Servidor MCP (
@zapo-js/mcp-server) — expõe umWaClientao vivo a um agente de IA (Claude Code, Cursor) para conectar, parear, enviar e inspecionar o estado de forma interativa. - Fake server (
@zapo-js/fake-server) — um servidor WhatsApp Web falso in-process que dirige oWaClientreal ponta-a-ponta, para você testar de forma determinÃstica sem tocar nos servidores do WhatsApp.
Servidor MCP
Ele expõe uma instância deWaClient ao vivo e o namespace do módulo zapo-js como ferramentas MCP. Um agente LLM pode então conduzir fluxos completos do WhatsApp — conectar, parear, enviar, consultar grupos/newsletters, inspecionar eventos, percorrer o estado SQL — sem você escrever scripts descartáveis.
SuperfÃcie de ferramentas
Cada ferramenta embute seu próprio schema e exemplos — o agente os lê em tempo de execução, em vez de memorizar flags.
Instalar e registrar
tsx — sem build, e o zapo-js resolve direto de src/:
Detalhe do pareamento
client.connect() bloqueia até o pareamento terminar, então sempre inicie sem aguardar (await) e depois consulte o buffer de eventos:
auth_qr ao usuário, espere por auth_paired e continue.
Variáveis de ambiente principais
Um
WaClient por processo (multi-sessão exige múltiplos servidores com MCP_AUTH_PATH + MCP_SESSION_ID distintos); sem reconexão automática (chame connect de novo em connection: close); o restart soft não aplica mudanças de código, enquanto process_exit + um supervisor aplica. Referência completa: packages/mcp-server/README.md.
Fake server
O@zapo-js/fake-server é um servidor WhatsApp Web falso in-process que dirige o WaClient real ponta-a-ponta — handshake Noise XX/IK completo, pareamento por QR, Signal Protocol (X3DH + Double Ratchet), SenderKey de grupo, upload/download de mÃdia sobre HTTPS auto-assinado e sincronização de app-state — tudo sem tocar nos servidores do WhatsApp. Ele alimenta a própria suÃte de testes cross-check e os benchmarks da biblioteca, e você pode usá-lo para testar sua integração de forma determinÃstica.
InÃcio rápido
chatSocketUrls (aponta para o WebSocket falso), testHooks.noiseRootCa (confia no certificado do servidor falso sem burlar a verificação — a checagem completa da cadeia ainda roda) e proxy.mediaUpload / proxy.mediaDownload (roteia a mÃdia para o servidor HTTPS falso).
O que ele simula
FakeWaServer— o listener WebSocket, o handshake Noise, um roteador de IQ que responde a cada IQ que a lib emite na operação normal (upload/fetch de prekey, usync,media-conn, sincronização de app-state, grupos, privacidade, perfil, blocklist, …), além de registries de estado para peers e grupos.FakePeer— um contato simulado com cripto Signal real:peer.sendConversation(text)/peer.sendGroupConversation(groupJid, text)empurram mensagens para o client, epeer.expectMessage()captura e descriptografa o que o client envia.- Pareamento —
server.runPairing(pipeline, { deviceJid }, materialFn)conduz o handshake completo de pareamento por QR; depois a lib reconecta com o handshake IK (capture-o viawaitForNextAuthenticatedPipeline()).
CLI standalone
Rode como um servidor standalone para experimentos manuais:Benchmarking
O pacote inclui um profiler de mensagens (send/recv × 1:1/grupo) usado para acompanhar a performance da biblioteca, além de suÃtes focadas para connect lifecycle, history sync, bulk usync, provisionamento de grupo, upload de mÃdia, receipts flood, reconnect/resume, app-state, mÃdia no envio, e o round-trip do retry Signal:bench:media:messaging varre todos os tipos de mÃdia (image / video / audio / ptt / document / sticker) em 1:1 send, fan-out de grupo (SKDM + SKMSG) e receive + download. Default é input streaming (Readable.from(...)) pra lib percorrer o caminho de upload streaming; troque para modo in-memory com ZAPO_BENCH_MEDIA_INPUT=buffer pra A/B.
bench:retry valida o round-trip completo de retry contra o parser de referência do wa-web: incoming retry, recovery e replay de retry outbound depois que o peer rotaciona o bundle de prekeys.
Ajuste a carga com variáveis ZAPO_BENCH_* (ZAPO_BENCH_CONTACTS, ZAPO_BENCH_GROUP_MEMBERS, ZAPO_BENCH_MESSAGES, ZAPO_BENCH_SCENARIOS, …) e adicione --cpu / --heap / --separate-process para profiles. Com --separate-process, o bench roda o fake server em um processo filho através de uma ponte RPC e emite um CPU profile e um heap snapshot do lado do servidor junto com os do lado da lib.
Escolha o backend de store com ZAPO_BENCH_STORE (memory, sqlite, postgres, mysql, redis ou mongo) — valem as mesmas variáveis ZAPO_TEST_* de conexão usadas pelo harness cross-store. Para varrer todos os benches em vários stores de uma vez:
--start-docker para subir os serviços Postgres/MySQL/Redis/Mongo empacotados em portas efêmeras e derrubá-los ao final. Veja packages/fake-server/README.md para a referência completa de flags.
bench:all-stores só varre as oito suÃtes de cenários (connect-lifecycle, history-sync, bulk-usync, group-provision, media-upload, receipts-flood, reconnect-resume, appstate) mais messaging. Os mais novos bench:media:messaging e bench:retry ainda não estão no conjunto --benches= dele; rode-os diretamente quando precisar.O fake server é um harness de teste in-process, não um runtime que você faz deploy. Combine-o com a store memory para testes rápidos e isolados que resetam a cada execução.
