MCP server linking a personal WhatsApp account to Claude Desktop
WhatsApp MCP demonstrates solid naming conventions (verb_noun pattern across all 22 tools) and comprehensive parameter schemas using Zod validation. All tools have descriptions and input schemas are visible in src/tools.ts. However, descriptions are often terse (many under 100 chars), parameter descriptions lack detail about constraints and formats, and output schemas are not documented. Error handling is basic (guard wrapper catches errors but provides minimal recovery guidance). Tool composition is reasonable but some tools combine multiple concerns (e.g., broadcast_message handles both sending and rate limiting). No tool annotations visible in the code sample provided, though the rubric indicates toolAnnotations=true.
Send a message to multiple recipients with rate limiting to avoid WhatsApp bans.
Check the status of an ongoing or completed broadcast.
Create a new WhatsApp community.
Create a new WhatsApp group with specified participants.
Download media (image, video, audio, document) from a message.
Get detailed information about a group including members, description, and settings.
Returns the QR code to link this device to a WhatsApp account. Only needed the first time, or after being logged out.
Output schemas not documented. Tools return text responses via guard() wrapper, but LLMs cannot see what fields/structure to expect from list_chats, get_messages, search_messages, or other discovery tools. This forces LLMs to parse unstructured text and plan downstream calls blindly.
Parameter descriptions lack constraint details. 'query' params say 'Name fragment or phone digits' but do not specify min/max length, character restrictions, or format. 'limit' params have min/max but no guidance on performance implications. LLMs cannot self-correct invalid input.
Error handling is minimal. guard() wrapper catches errors and returns fail() with error.message, but does not categorize errors as retryable/user-fixable/fatal or provide recovery guidance. E.g., 'User not found' should suggest search_contacts; 'Invalid group' should list available groups.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Read messages from one chat, newest last. Page further back with `before` (a unix timestamp or ISO date).
Get or reset the invite link for a group.
Leave a group.
Link a group to a community or unlink it.
Recent WhatsApp chats with unread counts and last message preview.
List all communities the account is part of.
Add, remove, or promote/demote participants in a group.
Mark messages in a chat as read.
Refresh the list of groups and their metadata from WhatsApp.
Find people or groups by name or phone number.
Search for messages by text content across all chats or within one chat.
Send a file (image, video, audio, document) to a contact or group.
Send a text message to a contact or group.
Update group settings such as name, description, and permissions.
Connection state of the linked WhatsApp account, the number it is linked to, and how many chats/contacts/messages are stored locally.
Destructive operations lack confirmation step. send_message, broadcast_message, delete operations (leave_group, manage_group_participants remove action) execute immediately without dry-run or confirmation. Agents can accidentally send to wrong recipients or delete groups.
Tool composition: broadcast_message combines sending + rate limiting + status tracking. Should split into send_broadcast (returns broadcast_id) and check_broadcast_status (polls progress). Agents cannot compose rate-limited sends with other operations.