The most complete MCP Server for WhatsApp Business Cloud API — hosted on Cloudflare Workers. 43 tools across 8 modules: messaging, interactive, templates, media, webhooks, business profile, WhatsApp Flows, and analytics.
41 tools with inconsistent quality. Most have basic descriptions (50-150 chars) and parameter schemas, but lack depth, error guidance, and output documentation. Many descriptions are generic ('Send a X message via WhatsApp') without explaining WHEN to use the tool or what it returns. No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Parameter descriptions are minimal. Output schemas are not documented. Error handling is absent from tool definitions. Tool composition is poor: 15 send_*_message variants should be consolidated into fewer, more flexible tools. No pagination support visible despite tools like get_recent_messages and search_conversations that likely return lists.
Clear conversation history for a contact
Configure automatic reply settings
Create a WhatsApp Flow
Create a new message template
Delete uploaded media
Delete a message template
Export a safety and compliance report
15 send_*_message tools lack composition and flexibility. Should consolidate into send_message(to, content_type, content, metadata) with union types or a single polymorphic tool. Current design forces LLM to choose between send_text_message, send_image_message, send_video_message, etc., wasting reasoning cycles and violating single-responsibility principle.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., does send_text_message return message_id? timestamp?). Violates pattern:tool and pattern:response-shaper. Every tool needs documented return type with field descriptions.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | <=2025-11-25 | v2 |
Get the current auto-reply configuration status
Get the business profile information
Get analytics for conversations
Get message delivery statistics
Get the URL of uploaded media
Get audit log of message operations
Get status updates for sent messages
Get messaging rate limits for the account
Get list of phone numbers associated with the business
Get the quality rating of the phone number
Get recent messages from a conversation
Get the status of a message template
List all message templates
Mark a message as read
Search conversations by criteria
Send an audio message via WhatsApp
Send a message with interactive buttons
Send a contact message via WhatsApp
Send a message with a call-to-action URL button
Send a document message via WhatsApp
Send a WhatsApp Flow to a user
Send an image message via WhatsApp
Send a message with a list of options
Send a location message via WhatsApp
Send a product list message
Send a product catalog message
Send a reaction emoji to a message
Send a sticker message via WhatsApp
Send a pre-approved message template
Send a text message via WhatsApp
Send a video message via WhatsApp
Set custom rate limits for the account
Update the business profile information
Upload media to WhatsApp
Descriptions are generic and lack WHEN/WHY guidance. E.g., 'Send a text message via WhatsApp' does not explain when to use this vs send_template_message, what it returns, or what happens on failure. Descriptions should be 50-200 chars and answer: What? When? What does it return? See pattern:tool-description.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes without explicit hints. Tools like delete_template, delete_media, clear_conversation_history should be marked destructiveHint=true. Tools like get_business_profile should be marked readOnlyHint=true.
List/search tools (get_recent_messages, search_conversations, list_templates, get_delivery_stats) lack pagination parameters (limit, offset/cursor) and output documentation. Without pagination, large result sets blow context windows. Pattern:paginated-result requires limit, offset, and total_count or next_cursor.