MCP server for WhatsApp integration, enabling message retrieval, sending, media handling, and contact management
The server defines 12 tools with mostly complete schemas and descriptions, but has significant gaps in error handling, parameter constraints, and output documentation. Naming follows verb_noun conventions well (search_contacts, list_messages, send_message). Descriptions are present for all tools (range 50-180 chars, within baseline 194 avg) and all parameters have descriptions. However, schemas lack comprehensive constraints (no enums, no min/max for numeric params), error handling provides no recovery guidance, and output schemas are not explicitly documented. The WRITE operations (send_message, send_file, send_audio_message) lack confirmation/dry-run patterns despite irreversible side effects. No mention of pagination limits being enforced, list_messages and list_chats accept pagination but output structure is not documented. Security concern: no evidence of credential injection, no scope declarations, no audit logging visible in the provided code. The Go backend (whatsapp-bridge) is not directly exposed but relied upon; the Python MCP server acts as a gateway. Per-tool assessment: naming is consistently strong (verb-first); descriptions adequate but generic in places; schemas present but underspecified (missing constraints, output types).
Download media from a WhatsApp message and get the local file path.
Get WhatsApp chat metadata by JID.
Get all WhatsApp chats involving the contact.
Get WhatsApp chat metadata by sender phone number.
Get most recent WhatsApp message involving the contact.
Get context around a specific WhatsApp message.
Get WhatsApp chats matching specified criteria.
Output schemas not documented. Tools return structured data but expected return types (fields, types, examples) are not specified in tool definitions. LLMs cannot determine what fields to extract from responses or plan downstream tool calls.
WRITE operations (send_message, send_file, send_audio_message) lack confirmation or dry-run patterns. These are irreversible side effects, agents should confirm before executing or have a dry-run preview mode to prevent accidental message spam.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 55 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 29 | - | v1 |
Get WhatsApp messages matching specified criteria with optional context.
Search WhatsApp contacts by name or phone number.
Send any audio file as a WhatsApp audio message to the specified recipient. For group messages use the JID. If it errors due to ffmpeg not being installed, use send_file instead.
Send a file such as a picture, raw audio, video or document via WhatsApp to the specified recipient. For group messages use the JID.
Send a WhatsApp message to a person or group. For group chats use the JID.
Pagination parameters lack documented constraints. list_messages and list_chats accept limit and page params but no min/max, no documented cap, no guidance on result set size limits.
No input validation or error recovery guidance visible. Tools accept strings like recipient, chat_jid, message_id, media_path but no validation rules, no enums, no format constraints in descriptions. Error responses likely raw API errors with no recovery hints.
Parameter type ambiguity. 'recipient' param in send_message accepts either a phone number OR a JID but no enum constraint. 'chat_jid' and 'sender_phone_number' in list_messages are optional but dependency not documented, can both be passed? Are they mutually exclusive?
No scope declarations or permission gates visible. Tools expose read (search, list, get) and write (send) operations but no documentation of required scopes (read:messages, write:messages) or permission checks. No audit trail visible.
Tool descriptions are generic. E.g. 'Send a WhatsApp message to a person or group' (send_message) does not explain WHEN to use it vs send_file, what happens on failure, whether it logs, whether it retries, or prerequisites (e.g., must be authenticated first).
No tool annotations present. WRITE operations (send_message, send_file, send_audio_message) should carry destructiveHint=true. READ-ONLY tools should carry readOnlyHint=true. This helps LLMs understand risk and plan safely.