MCP server for sending and reading WhatsApp messages via whatsapp-web.js
WhatsApp MCP has 5 tools with basic schemas and descriptions, but significant gaps prevent higher scores. All tools have descriptions (10 - 200 chars, within baseline range), and input schemas are present with type definitions. However, parameter descriptions are sparse or missing context. get_status and get_health lack parameters entirely (minimal complexity). send_whatsapp_message and get_messages have required params but descriptions lack format constraints, validation rules, and error recovery guidance. Output schemas are not documented, LLMs cannot infer response structure. No tool annotations (readOnlyHint/destructiveHint) despite clear risk profiles. Error handling is minimal: tools return generic 503/400 responses without actionable recovery steps. Naming is verb-first and clear (get_, send_), but descriptions do not explain WHEN to use each tool or dependencies (e.g., get_chats before get_messages). No pagination guidance despite limit params. Composition is reasonable (5 focused tools), but missing idempotency guarantees and output field documentation.
Returns a list of recent WhatsApp chats including chat ID, name, unread count, and last message preview.
Returns server health including MongoDB and WhatsApp connection status.
Returns recent messages from a specific WhatsApp chat. Requires a chatId (e.g. [email protected]).
Returns the current WhatsApp connection status. Call this first to verify the server is ready before calling other tools.
Sends a WhatsApp text message to a phone number or group. The "to" field must be a full phone number with country code (e.g. 919876543210 for India) or a group chat ID ending in @g.us.
Output schemas not documented. LLMs cannot infer response structure (fields, types, nesting). Responses include success/tool/data/count fields but no formal schema definition. Agents must guess field names for downstream calls.
Parameter descriptions lack format constraints and validation rules. 'to' in send_whatsapp_message says 'phone number with country code, no + sign' but does not specify length, regex pattern, or what happens if format is wrong. 'chatId' in get_messages lacks examples of valid formats (@c.us vs @g.us distinction).
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). send_whatsapp_message is clearly destructive (sends real messages) but lacks annotation. get_* tools are read-only but unmarked. Agents cannot determine retry safety or side effects.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 48 | 2026-07-28+ | v2 |
Error responses lack recovery guidance. 503 'WhatsApp client is not ready' does not tell LLM what to do next (retry? call get_status first? wait?). 400 errors for missing params do not suggest alternatives or valid values.
Pagination not fully specified. get_chats and get_messages accept 'limit' but no 'offset', 'cursor', or 'total_count' in response. Agents cannot iterate through large result sets or know if more results exist.