WACrew
Provides tools to view, create, edit, and delete Google Calendar events, allowing agents to manage the user's calendar from within the WACrew panel.
Provides tools for reading and searching WhatsApp chats and messages, transcribing media, preparing and sending replies, managing triage and CRM actions, and otherwise operating client conversations through the WACrew MCP server.
Why
If you sell or deliver work over WhatsApp, you know the scene: forty client groups, a four-minute voice note in the middle of a thread, the bug screenshot lost in the scroll, and the client who wrote three days ago that nobody saw.
A chatbot does not fix that. Canned answers read like a robot, clients notice, and the relationship cools down. What you need is someone who reads everything, answers the way you would, and never lets anyone wait. WACrew is that someone, and you stay in control of every message.

The engine that makes it read like a person:
2 | 25+ | 60 | ~30 s |
writing skills: your voice and client conduct | code rules that block robot tells | history messages read before replying | median until typing starts in a live chat |
Related MCP server: wa-mcp
What it does
Nobody waits. Every group and direct chat lands in one queue sorted by waiting time. A client's group and their private chats show up together, back-to-back messages collapse into one block, and voice notes arrive transcribed.
Writes like you, delivers like a person. The AI reads the history and writes with your punctuation, openings and rhythm, measured on your own past messages. Before anything leaves, a deterministic review blocks robot clichés, repeated apologies and duplicate bubbles. Delivery comes with read receipt, typing indicator and pauses, and it stops on its own if the client writes again or you answer from your phone.
You stay in control. In Confirm mode (the default) nothing is sent without your OK. Autonomous mode is turned on per chat. Every message records who wrote it: you on the phone, you on the panel, a teammate, or the AI.
|
|
|
|
|
|
More screens in docs/screenshots/: org chart, team access, notifications, project links, settings and the command palette.
How it works
┌────────────────────────────┐
WhatsApp ─► collector ─►│ data/<chat>/ │◄─► web panel (Next.js, :3000)
(Baileys) (daemon) │ messages.jsonl + media │
│ transcripts, notes, state │◄─► MCP server (your coding agent)
└─────────────┬──────────────┘
transcriber (MLX on Apple Silicon, or an API)Collector (
src/): a Baileys daemon (WhatsApp Web multi-device, no browser). Baileys is isolated behind ports and adapters insrc/whatsapp/. It writes every message, reaction and media file todata/<chat>/and runs the delivery queue that sends replies at a human pace.Panel (
web/): Next.js 16 + React 19. Inbox, conversation view, clients, dashboard, calendar, team, 2D office, settings. Live updates over SSE.MCP server (
web/mcp/server.ts): 36 tools over the same data, for Claude Code, Codex, Qwen Code or any MCP client.Transcriber (
transcriber/): Whisper large-v3 via MLX, loaded on demand and released when idle. Off a Mac, setTRANSCRIBE_BACKEND=openrouter.Local or cloud. Run everything on your machine, or deploy the collector and panel 24/7 with the included
Dockerfile(arailway.jsonis provided). The local MCP can read straight from the cloud panel (WAC_MCP_REMOTE=1), downloading media on demand.
Quick start
Requirements: Node.js 20+, ffmpeg, and a WhatsApp account to pair. Local transcription needs Apple Silicon (uv tool install mlx-whisper).
git clone https://github.com/sumioshi/wacrew && cd wacrew
npm install && npm --prefix web install
cp .mcp.json.example .mcp.json
npm run dev # collector + panel + transcriber + notifierOpen http://localhost:3000/config, scan the QR code (WhatsApp › Linked devices › Link a device), pick the groups to follow and mark who is on your team. The session is saved in auth/ and reconnects on its own.
Run it 24/7 on a VPS. WACrew only records what arrives while it is running: if your computer is off, messages from that period never reach the history or the queue. The repo ships a docker-compose.yml with a persistent volume for the WhatsApp session and data:
cp .env.example .env # set PANEL_USER and PANEL_PASS
docker compose up -d --buildReferral link: you get a discount on the VPS and the project earns a commission that helps keep it maintained.
Other clouds. Build the Dockerfile on any host (Railway works out of the box) with a volume at /data. Set PANEL_USER and PANEL_PASS to protect the panel with login; without them the panel is open, which is only fine on localhost.
MCP tools
The server is registered by .mcp.json (project scope). Claude Code and Qwen Code read it and ask for approval on first use.
Area | Tools |
Read |
|
Media |
|
Reply |
|
Triage and CRM |
|
Calendar |
|
Highlights:
buscarfinds text inside transcripts too.ver_imagemandver_videohand the media to the model, which is handy for bug screenshots.assistir_videohas a Gemini model watch a video with its audio, attached or from a link.responderreturns a ticket. The message leaves later at a human pace: seconds in a live chat, minutes to hours in a cold one. The ticket is interrupted if the client writes or you answer by hand.status_enviotracks it andcancelar_enviocancels it.preparar_respostareturns your recent style and what the client left open. Pass 2 or 3candidatostoresponderand the least out-of-character one is sent.
Tool names are in Portuguese because the project started in Brazil. Descriptions are clear enough for any model.
Configuration
Everything has a default. Copy .env.example to .env and adjust what you need.
Variable | What it does |
| Panel login. Required when the panel is reachable from the internet. |
| Posture check before sending, video watching and API transcription. |
| The in-panel copilot (Anthropic or any OpenAI-compatible API). |
|
|
| Point the local MCP and sync at your cloud panel. |
| Your first name and the voice skill the AI loads before writing. |
| Calendar and Google sign-in. |
| Bearer token for the external control API. |
| Where data and the session live, and log verbosity. |
There is also a public REST API documented in docs/api-v1.md.
What gets stored
data/<chat>/
messages.jsonl one line per message (the AI's "database")
reactions.jsonl emoji reactions
log.md the same conversation, human-readable
audio/ video/ image/ document/ transcripts/data/, auth/, .env and groups.config.json are git-ignored. Never commit them.
Read this before using it
This is not the official WhatsApp API. WACrew links to your account as one more device, through Baileys. It is built to answer people who already talk to you. Bulk messaging and cold outreach can get your number banned.
No old history. Capture starts when you pair the number.
Sending is real. The panel and the control API send messages as you. Keep them on localhost or behind login.
WACrew is an independent project, not affiliated with WhatsApp or Meta.
Contributing
If WACrew saves you time, consider sponsoring the project. It pays for the hours that keep it maintained.
Issues and pull requests are welcome.
npm test # Vitest
npx tsc --noEmit # typecheckShared logic between the panel and the MCP lives in web/lib/. See CONTRIBUTING.md.
License
Apache 2.0 © Rodrigo Sumioshi. See NOTICE.
Available Tools
36 toolsagenda_apagarA
Apaga um evento do Google Agenda. Só apague o que o operador pediu explicitamente. Se o evento tiver convidados, o Google avisa o cancelamento por e-mail.
Inputs: id (required), agenda (required).
agenda_editarA
Altera um evento (só os campos passados). Início sem fim mantém a duração. convidados SUBSTITUI a lista. CONVIDADOS: o Google manda e-mail de convite na hora. Só inclua convidados quando o operador pedir, e antes mostre a ele o evento (título, quando, quem) e espere o OK. Sem convidados, ninguém recebe nada. Em evento recorrente, muda só esta ocorrência.
Inputs: id (required), agenda (required), fim, meet, +7 more.
agenda_marcarA
Cria um evento no Google Agenda do operador. Marque só o que foi combinado de fato (data e hora claras) ou o que o operador pediu. CONVIDADOS: o Google manda e-mail de convite na hora. Só inclua convidados quando o operador pedir, e antes mostre a ele o evento (título, quando, quem) e espere o OK. Sem convidados, ninguém recebe nada. Devolve o evento criado com id, agenda, hora_brt, link e o link do Meet.
Inputs: inicio (required), titulo (required), fim, meet, +6 more.
agenda_verA
Lê o Google Agenda do operador (todas as agendas da conta) numa janela de datas; padrão hoje até daqui a 7 dias. Cada evento traz agenda e id (use em agenda_editar/agenda_apagar) e hora_brt em horário de Brasília; organizador = reunião de outra pessoa, que só ela altera. Desconectado = erro pedindo para reconectar em /agenda no painel.
Inputs: de, ate, agendas.
alertar_chatA
Liga/desliga a NOTIFICAÇÃO NO MAC (pro humano) quando chega mensagem de cliente num chat — grupo OU DM — por slug. NÃO acorda o agente nem faz o Claude reagir sozinho: é só um aviso de tela pro operador. (Pra o AGENTE ser acordado por mensagem nova — modo monitor/autônomo — arme um Monitor no data/<slug>/messages.jsonl, ver CLAUDE.md.) Opt-in por conversa. Depois de notificado, use novidades pra puxar o que chegou.
Inputs: grupo (required), ativar (required).
anotarA
Salva/atualiza a nota livre (mini-CRM) de um grupo. Nota vazia remove a nota.
Inputs: nota (required), grupo (required).
assistir_videoA
Assiste um vídeo com o Gemini (imagem e áudio juntos) e devolve o que aparece e o que é falado, com tempos MM:SS. Use quando o conteúdo do vídeo importa: cliente mostrando erro na tela, explicando algo em vídeo, ou mandando LINK de vídeo (YouTube, Instagram, TikTok). Custa ~US$ 0,03–0,05 por minuto de vídeo (OpenRouter): chame sob demanda, nunca em lote. GIF/meme ou só uma olhada rápida: prefira 'ver_video' (grátis). Vídeo do chat: grupo + id (campo 'id' de ler_mensagens) ou mediaPath; sem os dois, o ÚLTIMO vídeo do grupo. Link: url (grupo opcional). pergunta foca a resposta. Teto: 20 min de vídeo.
Inputs: id, url, grupo, pergunta, +1 more.
buscarA
Busca um texto nas mensagens e transcrições. Sem 'grupo', procura em todos. Retorna os trechos que casam (mais recentes primeiro), limitado a 'limite' (default 50) pra não estourar — se truncar, o retorno avisa em 'truncado'.
Inputs: texto (required), grupo, limite.
caixa_de_entradaA
Quem está esperando resposta e de qual projeto, em todos os chats coletados (o operador não precisa abrir o WhatsApp). Use pra 'quem me mandou mensagem?', 'tem cliente esperando?', 'o que rolou hoje?'. Cada item traz o chat, o projeto (cliente, pasta do repo e GitHub, quando o chat está linkado) e, se alguém espera, esperando (quem, prévia, desde quando, há quanto tempo); pendentes vêm primeiro, quem espera há mais tempo no topo. Esperando = a última fala é de cliente (ou te mencionaram) e ninguém da conta respondeu depois; chat silenciado ou marcado resolvido não entra. Só lê: não marca nada como visto (ao contrário de novidades). todos: true inclui os chats em que cliente escreveu desde desde mesmo já respondidos, com do_cliente_desde. Conversa que o cliente fechou ("ok", "combinado", "valeu", figurinha) não entra: vem só a contagem em encerrados. Espera cuja última fala do cliente passou de dias (default 7) vem resumida em antigos (nome e tempo). Ao responder o operador, agrupe por projeto, diga em uma linha o que cada um quer e ainda descarte o que for só social; cite os antigos numa linha. Num repositório ligado a um chat (.claude/whatsapp.json, bloco wa-link no CLAUDE.md), passe grupos com o(s) slug(s) dele em vez de ler a caixa inteira; pra 'teve mensagem nova?' esta tool basta, e ler_mensagens (bem mais caro) só entra se precisar do conteúdo. Se vier avisos (serviço de IA falhando), mostre ANTES de tudo, numa linha cada. Mostre a data e hora de Brasília da última mensagem (ultima_brt) com quanto tempo faz em relação a agora_brt (ex: "28/10 09:34, há 2h"). Pra ler a conversa, ler_mensagens(grupo).
Inputs: dias, desde, todos, grupos.
cancelar_envioA
Cancela uma entrega humanizada AGENDADA ou EM ANDAMENTO: o balão que ainda não saiu não sai; o que já saiu fica. Use na hora, SEM confirmar, quando o operador disser 'cancela'/'para'/'não manda'. Por chat (grupo) ou por ticket. Depois chame ler_mensagens no chat pra ver o que chegou a sair antes de reenviar.
Inputs: grupo, ticket.
dashboardA
Visão de negócio por cliente: atividade 30 d, contrato, entregas 30 d/total, mensagens e valor por entrega, e SINAIS (encerrado-ativo, sem-contrato-ativo, pausado-ativo, renovacao-30d, sem-entrega-30d) com uma frase explicando cada um. Use pra responder 'quem está ativo demais pro contrato', 'quem renova este mês', 'quantas entregas o cliente X recebeu'. so_sinais: true devolve só as linhas com sinal. Contratos e entregas refletem na hora; atividade de mensagens pode ter até 60 s de atraso.
Inputs: so_sinais.
definir_contratoA
Define o estado comercial de um chat: estado (ativo/encerrado/pausado/sem), início e fim (YYYY-MM-DD), valor mensal e nota. Só os campos passados mudam. O dashboard cruza isso com a atividade pra apontar cliente ativo demais pro contrato, renovação próxima e custo por entrega. Pra ler, use a tool dashboard. limite_mensagens = mensagens do cliente em 30 dias que o plano comporta (null tira o limite); acima dele o dashboard aponta acima-do-contrato.
Inputs: grupo (required), fim, nota, estado, +3 more.
definir_modoA
Define se um chat está em modo AUTÔNOMO (a IA envia sem confirmar) ou CONFIRMAR (default: a IA mostra o texto e espera OK do operador antes de enviar). Persiste por chat — você liga uma vez e vale até desligar, sem depender de re-combinar a cada msg. O responder lê esse modo. É convenção respeitada pela IA, não trava de código. Também liga o agente de triagem do chat (agente: off/issue/pr) e escolhe o executor (claude/copilot).
Inputs: grupo (required), typos, agente, autonomo, +2 more.
editar_mensagemA
Edita uma mensagem JÁ ENVIADA por você/pela IA (o WhatsApp marca 'editada'). Use pra corrigir erro ou atualizar info numa msg recente. Só funciona em mensagem PRÓPRIA (fromMe) — ATENÇÃO: mensagens que o OPERADOR mandou do celular também são fromMe (mesma conta) e são editáveis por esta tool. Por isso NUNCA escolha o msgId por posição ('a última'): pegue via ler_mensagens e CONFIRA que o texto da msg alvo é exatamente o que você quer substituir antes de chamar. CONFIRMAÇÃO: mesma convenção do responder — no modo 'confirmar', mostre o texto novo e espere OK antes de chamar.
Inputs: grupo (required), msgId (required), texto (required), operador_pediu.
editar_perfilA
Edita o PERFIL do WhatsApp do operador: nome, recado/'sobre' (status) e/ou foto. Passe só os campos que quer mudar. 'foto' é caminho absoluto de imagem OU o mediaPath de uma mensagem recebida. CONFIRMAÇÃO: o perfil é PÚBLICO (todo contato vê). Você DEVE mostrar ao operador o que vai mudar e ter o OK ANTES de chamar — mesma convenção do 'responder'. Não é trava de código; não burle. LIMITE: catálogo, localização, link e horário-oficial do business são read-only no WhatsApp (não editáveis por aqui).
Inputs: foto, nome, recado.
estado_triagemA
Retorna o estado de triagem inteiro (resolved/muted/notes/lastSeen/copilot/alertar/autonomo/etiquetas/agente/executor) pra IA saber o que já foi tratado, quais chats acompanha (copilot), quais alertam, e o modo de envio de cada um (autonomo: true = envia direto; ausente = confirmar antes). Contrato de cliente não vem aqui: ele fica nas tools dashboard e definir_contrato.
Inputs: no named parameters.
etiquetarA
Define as ETIQUETAS de um chat (empresa/contrato/pessoal — ex.: 'Empresa A', 'Freelance'). É o rótulo que diz de qual contexto de trabalho aquele grupo/contato é — use pra saber COM QUEM está falando antes de redigir. Lista vazia remove todas. Pra LER as etiquetas de todos os chats, use estado_triagem (campo etiquetas).
Inputs: grupo (required), etiquetas (required).
ler_documentoA
Lê o conteúdo de texto de um documento que o cliente mandou (PDF, .docx, .txt, .csv...). Use quando precisar entender o que diz um arquivo recebido — ex.: contrato, orçamento, planilha exportada. Se vier 'note' avisando que não há texto extraível (PDF escaneado), tente 'ver_imagem' no mesmo arquivo. Sem mediaPath, lê o ÚLTIMO documento do grupo.
Inputs: grupo (required), mediaPath.
ler_mensagensA
Lê as mensagens de um grupo (texto + transcrições já feitas). Filtra por data inicial e limita a quantidade. Default: as 50 mais recentes (passe 'limite' maior, ou 'desde', pra ir além) — evita despejar o grupo inteiro quando você só quer o contexto recente. Cada msg traz timestamp (UTC) e hora_brt (hora de Brasília já convertida) — use a hora_brt pra falar de horário com o operador, NÃO leia o UTC como se fosse local. Mídia com texto junto traz esse texto em legenda (descreve a mídia), não em texto (que é msg de texto solta) — assim você sabe que a legenda se refere ÀQUELE vídeo/imagem, e não confunde com um texto enviado depois. Mensagens coladas do mesmo remetente (rajada: vídeo+texto+áudio numa tacada) compartilham um rajada (id) — trate-as como um bloco do mesmo assunto, não itens soltos.
Inputs: grupo (required), desde, limite.
ler_notasA
Lê as notas dos grupos. Com 'grupo', traz só a dele; sem, traz todas.
Inputs: grupo.
listar_contatosA
Acha QUEM é quem: nome, papel (me = você, team = seu time, client = cliente), jid de DM e o slug da DM pronto pra ler_mensagens. Telefone e LID da mesma pessoa vêm numa linha só. PASSE busca (pedaço do nome ou o número, com ou sem formatação/nono dígito) — a conta pode ter milhares de contatos e sem filtro só vêm os 100 primeiros. Se você JÁ TEM o número, nem precisa: a DM é o slug dm-<55DDDnúmero> direto em ler_mensagens/responder.
Inputs: busca, limite.
listar_gruposA
Lista os grupos coletados (slug, nome, nº de mensagens, data da última). Use o slug nas outras ferramentas.
Inputs: no named parameters.
marcar_resolvidoB
Marca o grupo como resolvido (tira da fila de pendências) até o momento dado. Sem 'ate', usa agora.
Inputs: grupo (required), ate.
novidadesA
Puxa as mensagens novas dos chats marcados com alerta desde a última vez que você viu. FILTRA só mensagens de CLIENTE (descarta as suas e as do time) — em grupo interno isso pode voltar vazio mesmo tendo msg nova; nesse caso o retorno traz ignoradas_por_papel e uma nota sugerindo ler_mensagens. Use ao ser notificado de mensagem nova. Avança o checkpoint (não repete na próxima) a menos que marcar=false. Com 'grupo', restringe a um chat.
Inputs: grupo, marcar.
preparar_respostaA
Chame ANTES de redigir qualquer mensagem pra um chat. Devolve o que a conta já usou nas últimas 5 mensagens ali (aberturas, verbos, pontuação, tamanhos), o estado da conversa (ativa/fria, o que o cliente deixou em aberto, se o operador já respondeu na mão) e instrucoes numéricas pra variar. Escreva seguindo as instruções; o responder revisa e recusa o que estourar.
Inputs: grupo (required).
reagirA
Reage com um emoji a uma mensagem (👍, ❤️, 😂...). Às vezes a resposta humana é SÓ uma reação — prefira isso a um balão de 'ok!' quando couber. Emoji vazio ('') REMOVE a reação. O msgId vem do ler_mensagens. A tool resolve sozinha a key completa (autor/fromMe) pelo histórico — participant/fromMe manuais só como override raro.
Inputs: emoji (required), grupo (required), msgId (required), fromMe, +1 more.
registrar_featureA
Registra uma funcionalidade ENTREGUE pra um cliente (chame ao concluir uma entrega). Alimenta o contador de entregas por cliente do dashboard. Se passar ref (URL do PR/issue) e ela já estiver registrada NESTE chat, não duplica (a mesma ref em outro cliente é outra entrega). PRs mergeados que fecham issues da triagem entram sozinhos; use esta tool pro que não passou por PR.
Inputs: nome (required), grupo (required), ref.
responderA
Envia uma mensagem de texto no WhatsApp — para um GRUPO (slug/nome/jid) ou um CONTATO em DM (dm-<55DDDnúmero>). PRIMEIRO CONTATO funciona: o número NÃO precisa estar em listar_contatos nem ter conversa anterior — passe dm-<55DDDnúmero> do jeito que o número veio (com ou sem o nono dígito) e o coletor confirma no WhatsApp qual é a conta antes de enviar. Se o retorno trouxer jid_corrigido_de, use o slug_correto dali em diante; número fora do WhatsApp é recusado com motivo, nada sai. Primeiro contato SEMPRE passa pelo OK do operador no texto, mesmo se outros chats rodam em modo autônomo (conduta na skill comunicacao-cliente). VOZ: carregue a skill de voz do operador (voz-do-operador ou a preenchida desta máquina) ANTES de redigir — ela define grafia, registro e a camada de venda do operador, medidos no texto real dele. Depois comunicacao-cliente (conduta: o que responder, três modos, erro sem se rebaixar, urgencia). CONFIRMAÇÃO: cada chat tem um modo (definir_modo). No modo 'confirmar' (DEFAULT), você DEVE ter mostrado o texto e recebido OK do operador antes de chamar. No modo 'autonomo', pode enviar direto. O retorno traz o modo do chat. (Isto é convenção que você respeita, não trava de código — não burle o 'confirmar'.) BALÕES: por default o texto é fatiado em até 3 balões (parágrafos em branco = quebras explícitas suas). Use um_balao: true quando a mensagem deve chegar INTEIRA num balão só — texto coeso/técnico (changelog, lista, instruções passo a passo), ou quando o operador pedir 'manda numa mensagem só'. Quando VOCÊ já decidiu a quebra (4, 5 balões…), passe baloes (lista, um item = um balão, até 8) em UMA chamada — NUNCA chame responder várias vezes pra simular balões: cada chamada é uma entrega separada com visto/digitando. Conversa curta e informal fica melhor em balões. REVISÃO: antes de enviar, o texto passa por revisão (repetição contra as últimas mensagens do chat, dois-pontos e tells, auto-incriminação, desculpa). Recusa devolve hits e sugestões; reescreva e chame de novo. Chame preparar_resposta ANTES de redigir. ENTREGA: devolve um TICKET na hora; a mensagem sai depois com latência humana (segundos numa conversa ativa, minutos a horas numa fria), visto antes do digitando, digitação na velocidade do operador. Novo responder no mesmo chat SUBSTITUI o ticket anterior. Acompanhe com status_envio; cancelar_envio cancela. Se o plantão avisar 'Entrega interrompida', releia o chat e responda de novo.
Inputs: grupo (required), citar, texto, baloes, +7 more.
responder_midiaA
Envia um arquivo para um grupo no WhatsApp: imagem com legenda, documento/PDF, áudio (nota de voz) ou vídeo. REGRA: só chame DEPOIS de confirmar com o usuário o destinatário e o arquivo. Se houver legenda (caption), o texto deve passar pela skill de voz do operador e ser confirmado, igual ao 'responder'. O 'path' pode ser absoluto (arquivo novo no disco) OU o mediaPath de uma mensagem já recebida (campo 'midia') para reenviar.
Inputs: kind (required), path (required), grupo (required), caption, +3 more.
resumo_do_diaA
Retorna todo o conteúdo de um grupo num dia (texto + transcrições) para a IA resumir. Default: hoje (UTC).
Inputs: grupo (required), data.
revisar_textoA
Revisa um rascunho SEM enviar: repetição contra as últimas mensagens do chat, dois-pontos e outros tells, auto-incriminação, desculpa, tratamento. Devolve ok/score/hits/sugestoes. No modo 'confirmar', revise, corrija e só então mostre o texto ao operador.
Inputs: grupo (required), baloes (required).
silenciar_grupoB
Silencia/dessilencia um grupo (coleta mas não alerta).
Inputs: grupo (required), silenciar (required).
status_envioA
Estado de uma entrega humanizada: por chat (grupo) ou por ticket. Devolve estado (agendado/entregando/entregue/cancelado/interrompido), motivo, balões enviados/total e previsão.
Inputs: grupo, ticket.
transcreverA
Transcreve áudio/vídeo (MLX local, large-v3) e devolve o texto; reusa cache. UMA mídia específica: passe mediaPath (campo 'midia' de ler_mensagens) OU id (campo 'id' da mensagem) — os dois funcionam; qualquer outro nome de parâmetro é ignorado. SEM os dois: transcreve um lote dos pendentes do grupo (até 8 NOVOS por chamada; o que já tem transcrição não ocupa vaga e vem em em_cache; os que só estão na nuvem baixam em paralelo). Se sobrar além do teto, o retorno traz restantes — chame de novo e o lote AVANÇA. Em modo remoto a transcrição é publicada na nuvem, então ler_mensagens passa a trazer transcricao.
Inputs: grupo (required), id, mediaPath.
ver_imagemA
Mostra de fato uma imagem (print/screenshot/sticker) de um grupo para a IA enxergar. Use quando precisar entender o conteúdo visual — ex.: print de um bug que o cliente mandou. Sem mediaPath, mostra a ÚLTIMA imagem/figurinha do grupo (atalho pra 'vê a imagem que acabou de chegar', sem precisar de ler_mensagens antes).
Inputs: grupo (required), mediaPath.
ver_videoA
Mostra um vídeo ou GIF pra IA enxergar, amostrando alguns frames (via ffmpeg). Use pra entender o conteúdo visual de um GIF (reação/meme) ou de um vídeo mudo. Para o áudio do vídeo, use 'transcrever'; pra entender imagem e fala juntos (ex.: cliente mostrando um erro), use 'assistir_video'. Sem mediaPath, mostra o ÚLTIMO vídeo/GIF do grupo.
Inputs: grupo (required), frames, mediaPath.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 36 tools
Most tools target genuinely different actions, and the descriptions work hard to separate them (e.g. caixa_de_entrada vs novidades vs ler_mensagens). But several near-pairs remain easy to mix up: ver_video vs assistir_video, preparar_resposta vs revisar_texto, and the four read-the-chat tools all overlap enough that an agent must read long descriptions to choose correctly.
Naming is uniformly Portuguese and mostly infinitive verbs, but the structure varies: verb_noun (ler_mensagens, listar_grupos), object_prefix (agenda_ver, agenda_marcar, agenda_editar, agenda_apagar), bare verbs (responder, buscar, anotar, reagir, etiquetar), and bare nouns (dashboard, novidades, caixa_de_entrada, estado_triagem, resumo_do_dia). Readable, but no single predictable pattern.
36 tools is heavy for a single server, well past the comfortable 3-15 range. Most tools do earn their place in a rich domain (messaging, media, calendar, CRM, dashboard), but the surface is large enough that discovery and selection cost is significant.
The surface covers read/send/edit/react/media/transcription plus triage state, notes, contracts, features, delivery status, and a clean calendar CRUD cycle. Gaps are minor and workable around: no group administration (create group, add/remove participants), no poll/sticker sending, no contact creation.
Maintenance
Related MCP Connectors
Free WhatsApp MCP server for ChatGPT and Claude: read and search chats, every send you approve.
WhatsApp for Claude, ChatGPT or any AI agent: search, reply and send. Personal or Business API.
Hosted WhatsApp MCP for Claude and ChatGPT: read chats, find who awaits a reply.
Ask questions across your WhatsApp inbox from Claude, ChatGPT, Cursor or any MCP client.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceMCP server exposing WhatsApp Cloud API operations as tools for AI agents like Claude Code, Cursor, and Codex.MIT
- AlicenseNot gradedqualityCmaintenanceSelf-hosted WhatsApp management over Model Context Protocol, exposing a streamable HTTP MCP endpoint with 30 tools for session/QR pairing, messaging, media storage, and optional on-CPU voice note transcription via whisper.cpp.MIT
- FlicenseNot gradedqualityDmaintenanceOpenWA MCP server that bridges AI agents to the OpenWA WhatsApp API, exposing 40 tools for sessions, messages, contacts, groups, and webhooks so agents can read and send WhatsApp messages through a self-hosted OpenWA gateway.-
- AlicenseNot gradedqualityCmaintenanceA secure, zero-setup WhatsApp MCP server that lets AI assistants read, search, summarize, and (with user confirmation) act on personal WhatsApp chats via a safety-focused toolset, built as a maintained successor to the abandoned whatsapp-mcp.5MIT
Today. Who is waiting and for how long, what the AI is doing, signals and today's agenda.
2D office. One desk per project. When a client writes, the desk turns red right away, with sound.
Dashboard. Volume, first-reply time, who answered, busiest clients and deliveries per month.
Clients. Table and board views with contract, deliveries and waiting time per client.
Agent bridge (optional). If you use
Calendar. Your Google Calendar inside the panel, editable by you or by the AI.