MCP (Model Context Protocol) server for Brevo email marketing platform with comprehensive analytics
This Brevo MCP server has solid tool naming and comprehensive schema coverage, but descriptions are inconsistent in quality and some critical patterns are missing. All 15 tools are explicitly registered with input schemas in src/tools/definitions.js. Tool names follow verb_noun convention (get_, send_, create_, update_) which is strong. However, descriptions vary: some are clear and actionable (e.g., 'send_email': 'Send a transactional email using Brevo'), while others are generic (e.g., 'get_analytics_summary': 'Get comprehensive analytics summary with insights', lacks specificity on what 'comprehensive' means or when to use vs other analytics tools). Parameter schemas are well-defined with types, enums, and format constraints (email, pattern for dates), but parameter descriptions themselves are minimal and generic. No output schemas are documented, the tools return 'text' content without specifying structure, forcing LLMs to guess at response fields. Error handling exists in mcp-server.js (401, 429 status codes mapped to specific errors) but lacks recovery guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present despite clear read/write distinctions in the data. Security: API key is injected via BREVO_API_KEY env var (correct pattern), but no per-tool scope declarations exist.
Create a new email campaign in Brevo
Get Brevo account information including plan and credits
Get comprehensive analytics summary with insights
Get detailed analytics for a specific campaign including recipient-level data
Get recipient list for a specific campaign
Get performance metrics for multiple campaigns
No output schemas documented. Tools return generic 'text' type without specifying response structure. LLMs cannot plan downstream tool calls or extract specific fields, forcing them to parse unstructured output.
Tool descriptions lack specificity and context. Many are generic (e.g., 'Get comprehensive analytics summary with insights'). Missing WHEN-to-use guidance and distinction from similar tools (e.g., get_campaign_analytics vs get_campaigns_performance vs get_contact_analytics).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | C | 65 | 1.0.0+ | v1 |
Get analytics for contacts including engagement metrics
List contacts with optional filtering and pagination
List email campaigns with filtering options
Get shared URL for a campaign template
Send a campaign immediately
Send a transactional email using Brevo
Send a test email for a campaign
Update campaign status (suspend, archive, send, etc.)
Update an existing email campaign
No tool annotations present. Tools with clear read/write semantics (send_email, create_email_campaign, update_email_campaign, delete/archive operations) lack destructiveHint and idempotentHint. Prevents agents from understanding side effects and retry safety.
Parameter descriptions are minimal and generic. Most follow the pattern 'Description of field' without range context, validation rules, or usage examples. E.g., 'limit': 'Number of contacts to return (default: 50, max: 1000)' lacks guidance on selecting the right value.
Error handling exists (401, 429 mapping) but lacks recovery guidance. Example: '401 → InvalidRequest → Authentication failed. Please check your API key.' lacks next step (does user need to regenerate the key? Call support?). No suggestion for retryable vs terminal errors.
No permission or scope declarations. Tools like send_email, create_email_campaign, and update_campaign_status have write side effects but do not declare required permissions (e.g., 'write:campaigns', 'send:email'). Blocks least-privilege agent configuration.
Irreversible write operations (send_campaign_now, update_campaign_status with 'sent'/'archive') lack dry-run or confirmation capability. Agents can trigger campaigns without review, risking accidental sends to large lists.
Multiple analytics tools with overlapping names (get_campaign_analytics, get_campaigns_performance, get_contact_analytics, get_analytics_summary). LLM will struggle to choose the right one without clear WHEN-to-use distinctions in descriptions.