WhatsApp integration for Claude via Model Context Protocol (MCP)
The server defines 15 WhatsApp tools with reasonable action verb naming (search_*, get_*, list_*, send_*, mark_*, download_*) and generally adequate descriptions (mostly 50-150 chars). However, critical gaps reduce the score: (1) Output schemas are NOT documented, no response structure visible for any tool, making it impossible for LLMs to plan downstream chains; (2) Parameter descriptions are present but often terse, lacking format/range constraints, especially for complex params like 'identifier' in get_contact (accepts phone, LID, or JID but doesn't explain the format clearly); (3) No input validation guidance in descriptions (e.g., list_messages 'limit' accepts 1-500 but this is not stated in description, only in source); (4) Error handling not visible, no evidence of actionable error messages or recovery guidance; (5) Tools like send_message, send_file, send_audio_message, send_reaction, and mark_messages_read are destructive but descriptions do NOT flag them as write operations or acknowledge side effects; (6) No documented pagination metadata (e.g., does list_messages return total_count for pagination?); (7) Backward-compatibility aliases (phone_number, phone) in get_contact add confusion without clear guidance on which to use. Positive: tool names follow verb_noun convention; most descriptions are non-empty; parameter counts are reasonable (2-10 per tool). The server is competent but lacks the polish and documentation maturity of production-grade tools.
Download media from a WhatsApp message.
Get WhatsApp chat metadata by JID.
Look up a WhatsApp contact by phone number, LID, or full JID. Automatically detects the identifier type and queries appropriately.
Get all WhatsApp chats involving the contact.
Get WhatsApp chat metadata by sender phone number.
Get most recent WhatsApp message involving the contact.
No documented output schemas. Tool responses are not formally defined. LLMs cannot infer which fields are returned, making downstream tool chaining error-prone. E.g., does list_messages return message_ids suitable for get_message_context? Does get_chat return chat_jid in the right format for send_message?
Destructive tools lack explicit side-effect warnings in descriptions. send_message, send_file, send_audio_message, send_reaction, and mark_messages_read all modify state but descriptions do not flag them as write operations. LLMs need explicit 'This action sends a message and cannot be undone' language to understand irreversibility.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 59 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 11 | - | v1 |
Get context around a specific WhatsApp message.
Get WhatsApp chats matching specified criteria.
Get WhatsApp messages matching specified criteria with optional context. Each message includes sender_display showing "Name (phone)" for easy identification.
Mark WhatsApp messages as read.
Search WhatsApp contacts by name or phone number.
Send an audio message to a WhatsApp chat.
Send a file to a WhatsApp chat.
Send a WhatsApp message to a chat.
Send a reaction emoji to a WhatsApp message.
Parameter 'identifier' in get_contact accepts three formats (phone, LID, JID) but description does not explain format distinctions clearly. Example: '12025551234' (phone), '35047067385985' (LID), '12025551234@s.whatsapp.net' (JID), these formats are explained in the input schema but not in the description that the LLM reads.
Numeric parameter constraints not stated in descriptions. list_messages 'limit' accepts 1-500 (per source), list_chats 'limit' accepts 1-200, but these bounds are not documented in the tool descriptions an LLM reads. Agents may pass invalid values.
No pagination metadata documented. list_messages and list_chats accept 'page' and 'limit' parameters, but the response structure is not defined, does it return total_count, has_more, or next_cursor? Without this, LLMs cannot loop through large result sets reliably.
Backward-compatibility parameter aliases without clear guidance. get_contact exposes three parameter names for the same input (identifier, phone_number, phone). Descriptions do not state which is preferred or explain when to use each.
No error handling or recovery guidance documented. What happens if send_message fails? Is it retryable? What if the chat_jid is invalid? Descriptions do not include recovery hints like 'If chat_jid is unknown, call search_contacts or list_chats first.'
Tool composition gaps. If an agent wants to 'send a message to Jack', they need: search_contacts('Jack') → extract JID → get_direct_chat_by_contact(phone) OR find the chat_jid somehow → send_message(chat_jid, text). This is a multi-step workflow not wrapped into a single 'send_message_to_contact' tool that accepts a name.