MCP server that wraps the messagebird API as semantic tools for LLM agents
This MCP server has 20 well-named tools with consistent verb_noun patterns (get_, list_, create_, update_, delete_, send_, reply_) that clearly convey intent. However, significant gaps exist in schema completeness and parameter descriptions. All tools have descriptions (70-450 chars, within the 10-1024 range), but many parameter descriptions are minimal or missing validation details. Input schemas use Zod validation internally but are not fully documented in the tool registration for most tools. Error handling uses custom MessageBirdApiError with helpful HTTP status codes, but recovery guidance is sparse. Tool annotations (readOnlyHint, destructiveHint) are present on most tools, which is excellent. The server clearly follows the chat-data-model principle (accepting phone numbers in E.164 format, natural identifiers) and composition patterns (tools chain well via conversation_id, contact_id, template_name). Output schemas are inferred but not explicitly documented. The main limitation: parameter constraints (enums, ranges, format requirements) are declared in code but not fully surfaced to the LLM in descriptions.
Create a new contact with a phone number.
Create a new WhatsApp message template for Meta approval. Templates are required to initiate conversations outside the 24h window.
Permanently delete a contact. This action cannot be undone.
Delete a WhatsApp template and ALL its language variants. This action cannot be undone.
Delete a specific language variant of a WhatsApp template. This action cannot be undone.
Get the current balance of the MessageBird account. Returns the payment model (prepaid/postpaid), the currency type (e.g. BRL, euros), and the amount available. For postpaid accounts the amount is always 0.
list_conversations parameter descriptions lack clarity on 'proxy' field semantics and limitations. The description is overly long (450+ chars) and contains implementation details ('INCOMPLETE: only threads with ticket events...') that confuse rather than clarify. LLM may not understand when to use proxy=assigned_open vs assigned_open_waiting.
get_contact schema shows three optional parameters (contact_id, msisdn, name) with unclear mutual-exclusivity semantics. Description does not state which combinations are valid or what behavior occurs if multiple are provided.
send_template and send_interactive_buttons accept complex array/object parameters (parameters, buttons) but descriptions lack examples of structure or constraints. 'Template body parameter values in order' is vague, LLM may not know whether to pass ['value1', 'value2'] or [{'key': 'value'}].
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 57 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 55 | - | v1 |
Get details of a specific contact by ID, phone number (msisdn), or name.
Get details of a specific conversation, including messages and ticket reconstruction.
Get details of a specific WhatsApp template by name and language code.
List all contacts in the MessageBird account.
List conversations (threads) from the MessageBird Conversations API with optional filtering by status and proxy state.
List all WhatsApp message templates. Returns paginated list with status, category, and components.
Send a reply (message) to a conversation thread.
Send a WhatsApp interactive message with quick reply buttons (max 3 buttons).
Send a WhatsApp location message with coordinates.
Send a WhatsApp media message (image, video, audio, or file). Media URL must be publicly accessible.
Send a WhatsApp template (HSM) message. Required to initiate conversations outside the 24h window. Template must be pre-approved by Meta.
Send a WhatsApp text message to a phone number. Use for simple text messages within or outside the 24h window (if template not required).
Update an existing contact's information.
Update an existing WhatsApp template. Only the components can be modified.
No documented output schemas for any tool. Descriptions state what data is returned (e.g. 'Returns... payment model, currency type, amount') but structured JSON schema is not provided.
Numeric and range constraints not documented in parameter descriptions. send_interactive_buttons accepts 'buttons' array but no description of min/max length (rubric says max 3 buttons). list_contacts, list_templates accept offset/limit but no min/max guidance. LLMs may pass invalid values.
Error recovery guidance is minimal. toolError() returns a plain text message but does not categorize errors or suggest next steps (e.g., 'rate-limited, retry after 60s' or 'user not found, call list_contacts to find matching contact').
Destructive operations (delete_contact, delete_template, delete_template_variant) lack dry-run or confirmation steps. Current toolResult/toolError model does not support multi-round trips.
API secrets (MESSAGEBIRD_API_KEY) are correctly injected via environment variables, not exposed as tool parameters. However, tool responses may leak internal identifiers (conversation IDs, template namespace UUIDs) without masking. Verify response filtering to avoid secrets in prompt history.