MCP server for the Sendblue API, enabling iMessage and SMS messaging capabilities
Server has 7 tools with basic schemas and descriptions, but significant gaps limit production readiness. All tools have descriptions (10-100 chars, mostly adequate), and input schemas are present with type definitions. However, output schemas are completely undocumented, LLMs cannot plan downstream calls or extract structured data. Error handling is minimal (generic HTTPError catch returning {status: ERROR, error_message}). No parameter validation guidance, no enum constraints for send_style, no pagination details for get_message_history despite accepting limit/offset. Tool naming is clear and verb-based (send_*, get_*, lookup_*, add_*, upload_*), but descriptions lack context on when to use each tool vs alternatives. Missing: idempotency guidance, retry semantics, rate limits, and field-level output documentation.
Adds a new recipient to an existing group chat.
Retrieves message history for the account.
Determines if a phone number supports iMessage or SMS.
Sends a message to a group of recipients. If the group does not exist, it will be created.
Sends a message (iMessage or SMS) to a single recipient.
Sends a typing indicator (animated dots) to a recipient.
No output schemas documented for any tool. LLMs cannot infer response structure, field names, or types. Breaks tool chaining and forces agents to guess at downstream parameter mappings.
send_style parameter accepts free-form strings (e.g., 'invisible', 'fireworks', 'slam') with no enum constraint. LLMs will hallucinate invalid values. Should declare as enum with valid options.
get_message_history accepts limit/offset but no pagination guidance. No mention of max results, total count, or next_cursor. Large result sets will blow context window.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | <=2025-11-25 | v2 |
Uploads a media file from a publicly accessible URL to Sendblue's servers.
Error handling is generic: all failures return {status: ERROR, error_message: str(e)}. No recovery guidance, no categorization (retryable vs fatal), no actionable next steps for LLM.
send_group_message has mutually exclusive parameters (to_numbers vs group_id) but no explicit documentation of this constraint. LLMs may pass both, causing ambiguous API calls.