{
 "slug": "brevo",
 "name": "Brevo",
 "url": "https://brevo.com",
 "domain": "brevo.com",
 "category": "email-marketing",
 "category_name": "Email marketing",
 "tested_at": "2026-10-03",
 "run": "20261003T204556Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261001T192131Z",
   "date": "2026-10-01",
   "level": 3,
   "engine": {
    "runner": "omp",
    "model": null,
    "driver": null,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   },
   "drives": 2
  },
  {
   "run": "20261002T212106Z",
   "date": "2026-10-02",
   "level": 2,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   },
   "why": "product"
  },
  {
   "run": "20261003T204556Z",
   "date": "2026-10-03",
   "level": 2,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  }
 ],
 "level": 2,
 "level_name": "Gets in",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 3,
  "tries": 3,
  "self_start": true
 },
 "badges": [],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up in a browser"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "no",
   "text": "Work done: 38% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Nothing to cancel; can't delete its account",
   "at": "delete",
   "left": "stuck"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "yes",
   "text": "Docs agents can read: llms.txt, an OpenAPI and an MCP server",
   "have": [
    "llms_txt",
    "openapi",
    "mcp"
   ]
  },
  {
   "key": "access",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up in a browser",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "no",
   "text": "Work done: 38% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Nothing to cancel; can't delete its account",
   "at": "delete",
   "left": "stuck",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "browser_signup",
   "label": "Sign-up in a browser",
   "routes": [],
   "minutes": 5.9,
   "core": "3/8"
  }
 ],
 "minutes": 5.9,
 "next": {
  "to": 3,
  "text": "Next: do half of the core work (now 38%)"
 },
 "stop": "delete",
 "core": "3/8",
 "scores": {
  "coverage": 29,
  "reliability": 83,
  "resilience": 74,
  "setup": 100,
  "surface_coverage": 41,
  "docs_accuracy": 96,
  "docs_completeness": 74
 },
 "parts": {
  "holds_up": 78,
  "docs_match": 89,
  "setup": 100,
  "security": "private",
  "standards": [
   {
    "standard": "MCP",
    "state": "behind",
    "behind": 1,
    "value": "2025-11-25"
   },
   {
    "standard": "MCP discovery",
    "state": "behind",
    "behind": null,
    "value": "legacy"
   },
   {
    "standard": "MCP client registration",
    "state": "behind",
    "behind": null,
    "value": "dcr"
   },
   {
    "standard": "OpenAPI",
    "state": "behind",
    "behind": 1,
    "value": "3.1.0"
   }
  ]
 },
 "reliability_method": "pass^k",
 "resilience": {
  "parts": {
   "error_legibility": 75,
   "recovery": 46,
   "idempotency": 100
  },
  "summary": {
   "error_legibility": "mixed",
   "recovery": "partial",
   "idempotency": "safe",
   "rate_limits": "none-seen",
   "notes": "Most errors are JSON with a code and a message that says what to fix, and duplicate creates are rejected. But send-now answered 400 and sent anyway, a single order returned 204 and was not stored, some reads return 500, and MCP marks API errors isError false."
  }
 },
 "stress": [
  {
   "capability": "Create and move a deal through pipeline stages",
   "probe": "create deal with pipeline+deal_stage as the tool description says",
   "outcome": "isError:false text 'Brevo API error (400): Not valid data. : Invalid attribute: pipeline passed'",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Send a transactional email via API",
   "probe": "sandbox mode header X-Sib-Sandbox: drop on transactional send",
   "outcome": "403 'Unable to send email. Your SMTP account is not yet activated…'",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Send an email campaign",
   "probe": "error response vs real state on send now",
   "outcome": "400 'Due to DMARC policy, you cannot use this sender' but GET shows status sent, sent 1, softBounces 1",
   "grade": "silent",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Send an email campaign",
   "probe": "send_test_email to own inbox",
   "outcome": "'Success : 204 No Content' but no mail arrived in 100 s",
   "grade": "silent",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create and reuse an email template",
   "probe": "integer id where tool schema wants a string",
   "outcome": "'1 validation error for call[get_smtp_template] templateId Input should be a valid string [type=string_type, input_value=2]'",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Track custom website events and behavior",
   "probe": "valid-looking custom event create",
   "outcome": "400 invalid_parameter 'undefined source'",
   "grade": "vague",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Add a contact",
   "probe": "burst of 15 quick GET /contacts?limit=1",
   "outcome": "all 200; x-sib-ratelimit-limit 20, x-sib-ratelimit-remaining oscillating 19..16, x-sib-ratelimit-reset present; no RateLimit/RateLimit-Policy headers, no 429",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": "none-seen"
  },
  {
   "capability": "Add a contact",
   "probe": "bad credential (wrong Bearer token, wrong api-key)",
   "outcome": "401 application/json {code:unauthorized, message:'token is invalid or expired'} / {message:'Key not found'}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Add a contact",
   "probe": "create contact without any identifier",
   "outcome": "400 {code:missing_parameter, message:'Please provide at least one contact identifier value(email, ext_id, …) to create user'} (application/json, not problem+json)",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Add a contact",
   "probe": "repeat a create (same email)",
   "outcome": "400 {code:duplicate_parameter, message:'Unable to create contact, email is already associated with another Contact', metadata:{duplicate_identifiers:[email]}}",
   "grade": "clear",
   "idempotent": "yes",
   "rate_limit": null
  },
  {
   "capability": "Update or delete an existing contact",
   "probe": "well-formed id that does not exist",
   "outcome": "404 {code:document_not_found, message:'Contact does not exist'}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Send an email campaign",
   "probe": "bad enum value",
   "outcome": "400 {code:invalid_parameter, message:'Type is invalid'} (does not list valid values)",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Add a contact",
   "probe": "MCP bad credential",
   "outcome": "401 {error:invalid_token, error_description:'Invalid or expired OAuth session'}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Update or delete an existing contact",
   "probe": "MCP error signalling",
   "outcome": "result.isError false, text 'Brevo API error (404): {code: document_not_found, message: Contact does not exist}'",
   "grade": "vague",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create and move a deal through pipeline stages",
   "probe": "partial failure on a multi-step deal flow",
   "outcome": "first create rejected cleanly (400, nothing created: deals list showed only the name-only deal); state consistent",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  }
 ],
 "surface_audit": {
  "totals": {
   "items": 626,
   "documented": 620,
   "safe": 537,
   "exercised": 513,
   "passed": 218,
   "skipped": 85,
   "blocked": 25,
   "not_run": 0,
   "match": 235,
   "drift": 10,
   "broken_doc": 0,
   "docs_complete": 302,
   "docs_partial": 318,
   "docs_missing": 0,
   "errors_clear": 216,
   "errors_vague": 67,
   "errors_silent": 2
  }
 },
 "coverage_core": 38,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": null,
  "prompt_sha": "f9ae61c1d6ff",
  "kb_version": "2",
  "identity": null
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 2,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "start"
 },
 "same_level_drives": 2,
 "drives": 4,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": null,
 "agent_pass": {
  "rung": "signup",
  "vendor": "Google reCAPTCHA (invisible)",
  "signed": true
 },
 "who_gets_in": {
  "server": {
   "state": "in"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-10-12"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "developers.brevo.com/llms.txt, every page as .md, 13 OpenAPI 3.1.0 specs (286 operations), a docs MCP server (the older 25 Nov 2025 spec)."
  },
  "signup": {
   "status": "browser",
   "note": "Web form only (email + password) at onboarding.brevo.com; invisible reCAPTCHA let our agent's browser through. No sign-up API."
  },
  "verify": {
   "status": "headless",
   "note": "Confirmation link arrived in ~1 min; a plain GET of the link activated it. Login from a new device then needs a 6-digit code from email (also readable headless)."
  },
  "credentials": {
   "status": "browser",
   "note": "API keys and MCP tokens are made in the web app, which stays behind an onboarding step asking for an organization postal address we cannot truthfully give. The MCP server's OAuth (RFC 9728 metadata, DCR, PKCE) worked with one browser consent; refresh tokens then keep access headless. The CLI's browser login gives a REST Bearer token the same way.",
   "via": ""
  },
  "first_call": {
   "status": "headless",
   "note": "MCP tools/call accounts_get_account (282 tools); REST GET /v3/account with the OAuth Bearer token."
  },
  "first_action": {
   "status": "headless",
   "note": "Created a contact via MCP and read it back."
  },
  "pay": {
   "status": "",
   "grade": "P1",
   "rails": [
    "card via Adyen",
    "PayPal"
   ],
   "rail_ids": [
    "card",
    "other"
   ],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "note": "No 402, x402, MPP, UCP or billing API; not in the x402 Bazaar or mpp.dev. The pricing FAQ says payment is by card through Adyen or PayPal, in the web app, which this account cannot open before the address step. Not reached: not reached (a human-pays-by-card rail is inferred from the FAQ, not observed).",
   "reached": false
  },
  "cancel": {
   "status": "n/a",
   "grade": "n/a",
   "note": "Nothing to cancel: our agent used the free plan.",
   "docs_note": "Free plan; nothing recurring was started. The help center describes cancelling in the web UI.",
   "nothing": "free_plan"
  },
  "delete": {
   "status": "blocked",
   "note": "No delete-account API, MCP tool or CLI command. Help center: Settings > General > 'Definitively close your account' in the web app, which redirects to the onboarding address step for this account. Inactive free accounts are deleted after 4 months.",
   "left": "stuck",
   "account": true
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-03",
  "source": "drive",
  "options": [
   {
    "id": "card",
    "name": "Card checkout",
    "kind": "checkout",
    "first_party": false,
    "lead": false,
    "networks": [],
    "testnet": false
   }
  ],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": null,
   "card_required": null,
   "free_plan": true
  },
  "owner_fixes": [
   {
    "title": "Accept x402 or MPP on your API",
    "how": "Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card."
   },
   {
    "title": "List your plans on Stripe Projects",
    "how": "Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev)."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": true,
  "cli": true,
  "sdk": true,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": true,
  "sandbox": true
 },
 "surface_notes": {
  "api": "REST v3, 286 documented operations in 13 OpenAPI files; JSON errors with code+message (not problem+json); X-Sib-RateLimit-* headers",
  "openapi": "3.1.0, split per area; /openapi.json is an HTML index",
  "mcp": "official, 282 tools (main server) plus 27 per-module servers; the older 25 Nov 2025 spec",
  "cli": "@getbrevo/cli 2.3.0: OAuth apps and Brevo Functions only, browser or API-key login",
  "llms_txt": "developers.brevo.com/llms.txt, every page as .md"
 },
 "can_do": [
  "Create, update and delete contacts, lists, folders and contact attributes",
  "Import and export contacts in bulk and track the background process",
  "Create CRM companies, deals, tasks, notes and files, link them, and move deals between pipeline stages",
  "Create and edit email templates and webhooks",
  "Activate eCommerce and sync products, categories and batch orders",
  "Add a sender domain and read the DNS records it needs",
  "Read campaign and transactional statistics"
 ],
 "cannot_do": [
  {
   "what": "Send an email campaign or a transactional email",
   "why": "New accounts need Brevo's manual activation ('SMTP account is not yet activated', 'account under validation'), and the only sender (our own domain, DMARC p=reject) needs an authenticated domain"
  },
  {
   "what": "Schedule a campaign",
   "why": "Only one campaign can be created while the account is under validation"
  },
  {
   "what": "Create an API key, use the drag-and-drop editor, build segments or forms",
   "why": "Web app only, and it stays behind an onboarding step asking for an organization postal address"
  },
  {
   "what": "Track custom events",
   "why": "POST /events answers 400 'undefined source' with an OAuth token"
  },
  {
   "what": "Delete the account",
   "why": "Web UI only"
  }
 ],
 "blockers": [
  "Sending (campaign and transactional) needs Brevo's manual account activation",
  "The web app requires an organization postal address before anything else",
  "No headless credential path: every key or token needs a browser"
 ],
 "tips_for_owner": [
  "Let agents request sending activation via API",
  "Let agents set the organization address via API",
  "Add device-code login to CLI and MCP",
  "Add an account deletion endpoint",
  "Fix deal stage moves on new accounts",
  "Make failed calls fail, and successes stick",
  "Mark MCP tool errors with isError true",
  "Support MCP (the 28 Jul 2026 spec) and document its OAuth",
  "Document onboarding gates and error codes",
  "Fix broken links and the OpenAPI index",
  "Offer a billing API or agent payment rail"
 ],
 "tips_for_agents": [
  "Use the MCP server's OAuth: GET the 401's resource_metadata, register with DCR at mcp.brevo.com/oauth/register, authorize once with PKCE, then refresh headless; it works before the web app's profile step is done.",
  "MCP errors come back with isError false: read the text for 'Brevo API error (NNN)'.",
  "Several MCP tools want string ids (templateId) or lists (contact_id); a pydantic error tells you which.",
  "eCommerce needs POST /ecommerce/activate and about 5 minutes; use /orders/status/batch, single orders were not stored.",
  "On a brand-new account deal stage changes failed with 400 'Invalid attribute' for about 30 minutes, then worked; if GET /crm/attributes/deals returns 500, wait and retry.",
  "A template must be set inactive (PUT isActive:false) before DELETE.",
  "The Python SDK accepts an OAuth token if api_key='' and an Authorization: Bearer header."
 ],
 "selfhost": null,
 "summary": "An agent can sign up for Brevo's free plan in a browser, verify by email headless, and get an MCP or REST token through OAuth with one browser consent, then manage contacts, lists, CRM deals and records, templates, webhooks and eCommerce data over a 282-tool MCP server and a 286-operation REST API. It cannot send: new accounts need Brevo's manual activation and an authenticated sender domain, and the web app stays behind an organization-address step, so API keys, the editor and account deletion are out of reach.",
 "wall": "Sending needs Brevo's manual account activation",
 "plan_scope": "free plan",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Brevo is an email marketing and CRM tool. An agent could sign up, confirm its email, and get API/MCP access entirely on its own (with one browser click to approve access), then manage contacts, CRM records, templates and webhooks. It got stuck because new accounts need Brevo staff to manually turn on email sending, and the web dashboard demands a company mailing address the agent couldn't honestly provide.",
  "can_do": [
   "Create, update and delete contacts and contact lists",
   "Import and export contacts in bulk",
   "Create and manage CRM deals, companies, tasks, notes and files",
   "Create email templates and webhooks",
   "Set up an online store and sync products and orders",
   "Read campaign and email statistics"
  ],
  "cannot_do": [
   {
    "what": "Send a marketing or transactional email",
    "why": "New accounts need manual activation by Brevo staff first"
   },
   {
    "what": "Create an API key or use the visual email editor",
    "why": "Both sit behind a dashboard step asking for a company address"
   },
   {
    "what": "Upgrade to a paid plan",
    "why": "Only a card checkout in the dashboard, which the agent couldn't open"
   },
   {
    "what": "Delete the account",
    "why": "Only possible from the dashboard, which the agent couldn't open"
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "Send an SMS campaign",
   "plan": "paid SMS credits",
   "evidence": "'SMS credit sold separately' (pricing); create answered 'complete your profile first'"
  },
  {
   "capability": "Send a WhatsApp campaign",
   "plan": "paid",
   "evidence": "403 'plan not eligible for using whatsapp'"
  },
  {
   "capability": "Build a multi-step automation workflow",
   "plan": "Standard",
   "evidence": "pricing: Standard 'Marketing automation… multi-step workflows'; no API"
  },
  {
   "capability": "Live chat",
   "plan": "paid",
   "evidence": "Conversations API 402 'Upgrade your plan to use REST API'"
  },
  {
   "capability": "Landing pages",
   "plan": "Standard",
   "evidence": "pricing page"
  },
  {
   "capability": "A/B testing",
   "plan": "Standard",
   "evidence": "pricing page"
  },
  {
   "capability": "AI send time optimization",
   "plan": "Standard",
   "evidence": "pricing page"
  },
  {
   "capability": "Contact scoring",
   "plan": "Professional",
   "evidence": "pricing page"
  },
  {
   "capability": "Push notifications",
   "plan": "paid",
   "evidence": "pricing page"
  },
  {
   "capability": "Loyalty",
   "plan": "paid",
   "evidence": "401 'Loyalty application is inactive'"
  },
  {
   "capability": "Chatbot",
   "plan": "paid",
   "evidence": "map; Conversations API 402"
  },
  {
   "capability": "VoIP phone",
   "plan": "paid",
   "evidence": "map"
  },
  {
   "capability": "RSS feeds",
   "plan": "Enterprise",
   "evidence": "403 'only available to customers with an Enterprise plan'"
  },
  {
   "capability": "Teammates",
   "plan": "paid",
   "evidence": "403 'User Management API is not enabled for this account'"
  },
  {
   "capability": "Dedicated IP",
   "plan": "paid add-on",
   "evidence": "GET /senders/ips empty"
  },
  {
   "capability": "Remove branding",
   "plan": "Starter",
   "evidence": "pricing page"
  },
  {
   "capability": "Sub-accounts",
   "plan": "Enterprise",
   "evidence": "403 'Current account is not a corporate user'"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Email Marketing",
   "capability": "Send an email campaign",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /emailCampaigns",
    "mcp": "email_campaign_management",
    "cli": null,
    "ui": "Campaigns > Email"
   },
   "check": "GET /emailCampaigns/{id} shows status sent with statistics populated",
   "source": "https://developers.brevo.com/docs/send-a-transactional-email; https://www.brevo.com/features/email-marketing/"
  },
  {
   "id": "cap-02",
   "group": "Email Marketing",
   "capability": "Design an email with drag-and-drop editor",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Campaigns > Email > Editor"
   },
   "check": "Open campaign in UI and confirm htmlContent reflects drag-and-drop blocks via GET /emailCampaigns/{id}",
   "source": "https://www.brevo.com/pricing/ (Drag & Drop email editor)"
  },
  {
   "id": "cap-03",
   "group": "Email Marketing",
   "capability": "Schedule a campaign for later delivery",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /emailCampaigns with scheduledAt",
    "mcp": "email_campaign_management",
    "cli": null,
    "ui": "Campaigns > Email > Schedule"
   },
   "check": "GET /emailCampaigns/{id} shows status queued with matching scheduledAt",
   "source": "https://developers.brevo.com/docs/send-a-transactional-email"
  },
  {
   "id": "cap-04",
   "group": "Transactional Messaging",
   "capability": "Send a transactional email via API",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /smtp/email",
    "mcp": "transac_templates",
    "cli": null,
    "ui": "Transactional > Email"
   },
   "check": "GET /smtp/emails/{messageId} or activity log shows the message delivered",
   "source": "https://developers.brevo.com/docs/send-a-transactional-email; https://www.brevo.com/products/transactional-email/"
  },
  {
   "id": "cap-05",
   "group": "SMS Marketing",
   "capability": "Send an SMS campaign",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": "POST /smsCampaigns",
    "mcp": "sms_campaigns",
    "cli": null,
    "ui": "Campaigns > SMS"
   },
   "check": "GET /smsCampaigns/{id} shows status sent",
   "source": "https://www.brevo.com/features/sms-marketing/; https://www.brevo.com/pricing/"
  },
  {
   "id": "cap-06",
   "group": "WhatsApp Marketing",
   "capability": "Send a WhatsApp campaign",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": "POST /whatsappCampaigns",
    "mcp": "whatsapp_campaigns",
    "cli": null,
    "ui": "Campaigns > WhatsApp"
   },
   "check": "GET /whatsappCampaigns/{id} shows status sent",
   "source": "https://www.brevo.com/features/whatsapp-campaigns; https://www.brevo.com/pricing/ (Professional: WhatsApp channel)"
  },
  {
   "id": "cap-07",
   "group": "Marketing Automation",
   "capability": "Build a multi-step automation workflow",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Automation > Workflows"
   },
   "check": "Automation dashboard shows workflow with status active and step history for a test contact",
   "source": "https://www.brevo.com/pricing/ (Marketing automation, Standard plan); https://brevo.com/products/marketing-platform"
  },
  {
   "id": "cap-08",
   "group": "CRM",
   "capability": "Create and move a deal through pipeline stages",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /crm/deals, PATCH /crm/deals/{id}",
    "mcp": "deals",
    "cli": null,
    "ui": "CRM > Deals"
   },
   "check": "GET /crm/deals/{id} attributes.deal_stage reflects the new stage",
   "source": "https://developers.brevo.com/docs/getting-started; https://mcp.brevo.com (deals module)"
  },
  {
   "id": "cap-09",
   "group": "Contacts",
   "capability": "Add a contact",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /contacts",
    "mcp": "contacts",
    "cli": null,
    "ui": "Contacts > Add a contact"
   },
   "check": "GET /contacts/{identifier} returns the created contact with submitted attributes",
   "source": "https://developers.brevo.com/docs/synchronise-contact-lists"
  },
  {
   "id": "cap-10",
   "group": "Contacts",
   "capability": "Update or delete an existing contact",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PUT /contacts/{identifier}, DELETE /contacts/{identifier}",
    "mcp": "contacts",
    "cli": null,
    "ui": "Contacts > contact detail"
   },
   "check": "GET /contacts/{identifier} reflects updated attributes, or returns 404 after delete",
   "source": "https://developers.brevo.com/docs/synchronise-contact-lists"
  },
  {
   "id": "cap-11",
   "group": "Live Chat & Conversations",
   "capability": "Chat with website visitors via live chat widget",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "Conversations API",
    "mcp": null,
    "cli": null,
    "ui": "Conversations"
   },
   "check": "Conversations inbox shows new thread with messages matching widget exchange",
   "source": "https://developers.brevo.com/docs/getting-started-with-conversations-api; https://www.brevo.com/features/live-chat"
  },
  {
   "id": "cap-12",
   "group": "Segmentation",
   "capability": "Build a contact segment with filters",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "segments",
    "cli": null,
    "ui": "Contacts > Segments"
   },
   "check": "GET contact count for the segment matches contacts meeting the filter criteria",
   "source": "https://www.brevo.com/pricing/ (Advanced segmentation); MCP segments module (https://developers.brevo.com/docs/mcp-protocol)"
  },
  {
   "id": "cap-13",
   "group": "Lists",
   "capability": "Create a contact list and add/remove members",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /contacts/lists, POST /contacts/lists/{listId}/contacts/add",
    "mcp": "lists",
    "cli": null,
    "ui": "Contacts > Lists"
   },
   "check": "GET /contacts/lists/{listId}/contacts shows the added contact",
   "source": "https://developers.brevo.com/docs/synchronise-contact-lists"
  },
  {
   "id": "cap-14",
   "group": "Forms",
   "capability": "Create a signup form to capture leads",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Contacts > Forms"
   },
   "check": "Submitting the published form creates a new contact visible via GET /contacts",
   "source": "https://www.brevo.com/pricing/ (Forms feature)"
  },
  {
   "id": "cap-15",
   "group": "Landing Pages",
   "capability": "Publish a landing page",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Campaigns > Landing Pages"
   },
   "check": "Published page URL returns 200 and matches the configured design",
   "source": "https://www.brevo.com/pricing/ (Landing pages, Standard plan)"
  },
  {
   "id": "cap-16",
   "group": "A/B Testing",
   "capability": "Run an A/B test on subject lines or content",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Campaigns > Email > A/B test"
   },
   "check": "Campaign report shows per-variant statistics and declared winner",
   "source": "https://www.brevo.com/pricing/ (A/B testing, Standard plan)"
  },
  {
   "id": "cap-17",
   "group": "Templates",
   "capability": "Create and reuse an email template",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /smtp/templates",
    "mcp": "templates",
    "cli": null,
    "ui": "Templates"
   },
   "check": "GET /smtp/templates/{id} returns saved template; new campaign can reference it",
   "source": "https://developers.brevo.com/docs/send-a-transactional-email; https://www.brevo.com/pricing/"
  },
  {
   "id": "cap-18",
   "group": "Analytics & Reporting",
   "capability": "View campaign performance reports (opens, clicks, heatmaps)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /emailCampaigns/{id}/report (statistics)",
    "mcp": "campaign_analytics",
    "cli": null,
    "ui": "Campaigns > Reports"
   },
   "check": "GET statistics endpoint returns non-zero opens/clicks matching dashboard numbers",
   "source": "https://www.brevo.com/pricing/ (Advanced email reporting, Standard plan)"
  },
  {
   "id": "cap-19",
   "group": "Web & Event Tracking",
   "capability": "Track custom website events and behavior",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /events (Tracker API)",
    "mcp": null,
    "cli": null,
    "ui": "Automation > Settings > Tracking"
   },
   "check": "Contact timeline shows the tracked event with submitted properties",
   "source": "https://developers.brevo.com/docs/track-custom-events-js"
  },
  {
   "id": "cap-20",
   "group": "eCommerce",
   "capability": "Sync products, categories and orders",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /orders, POST /products",
    "mcp": null,
    "cli": null,
    "ui": "eCommerce app"
   },
   "check": "GET /orders/status/{id} returns the synced order and contact timeline shows order event",
   "source": "https://developers.brevo.com/docs/add-the-ecommerce-app"
  },
  {
   "id": "cap-21",
   "group": "AI Content Generation",
   "capability": "Generate email copy/subject lines with AI",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Campaigns > Email editor > AI assistant"
   },
   "check": "Editor populates subject/body text from the AI prompt, verifiable in campaign content via GET /emailCampaigns/{id}",
   "source": "https://www.brevo.com/pricing/ (AI content generator, Starter plan); https://www.brevo.com/ai/"
  },
  {
   "id": "cap-22",
   "group": "AI Send Time Optimization",
   "capability": "Auto-send at each contact's optimal engagement time",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Campaigns > Email > Send time optimization"
   },
   "check": "Delivery logs show send timestamps varying per recipient rather than one fixed time",
   "source": "https://www.brevo.com/pricing/ (AI send time optimization, Standard plan)"
  },
  {
   "id": "cap-23",
   "group": "Contact Scoring",
   "capability": "Score contacts by engagement/purchase behavior",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Contacts > Scoring"
   },
   "check": "Contact profile shows a computed score (e.g. RFM/CLV) usable as a segment filter",
   "source": "https://www.brevo.com/pricing/ (Contact scoring, Professional plan)"
  },
  {
   "id": "cap-24",
   "group": "Push Notifications",
   "capability": "Send web or mobile push notifications",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Campaigns > Push"
   },
   "check": "Push campaign report shows delivered/clicked counts for the sent notification",
   "source": "https://www.brevo.com/features/push/; https://www.brevo.com/pricing/ (Professional: Mobile & Web Push)"
  },
  {
   "id": "cap-25",
   "group": "Loyalty",
   "capability": "Run a customer loyalty/rewards program",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Loyalty"
   },
   "check": "Contact profile shows accrued loyalty points/tier matching a recorded purchase",
   "source": "https://www.brevo.com/products/loyalty/"
  },
  {
   "id": "cap-26",
   "group": "Chatbot",
   "capability": "Deploy a chatbot to auto-answer visitor questions",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Conversations > Chatbot"
   },
   "check": "Chatbot transcript in Conversations shows automated reply to a test visitor message",
   "source": "https://www.brevo.com/features/chatbot"
  },
  {
   "id": "cap-27",
   "group": "Meetings",
   "capability": "Let prospects book a meeting via scheduling page",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Meetings"
   },
   "check": "Booking a slot on the public meeting link creates a calendar event visible in Meetings dashboard",
   "source": "https://www.brevo.com/features/meetings"
  },
  {
   "id": "cap-28",
   "group": "VoIP Phone",
   "capability": "Make and log sales calls via VoIP phone",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "CRM > Phone"
   },
   "check": "Deal/contact activity log shows a logged call with duration",
   "source": "https://www.brevo.com/features/phone"
  },
  {
   "id": "cap-29",
   "group": "Import/Export",
   "capability": "Bulk import or export contacts",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /contacts/import, POST /contacts/export",
    "mcp": "contact_import_export",
    "cli": null,
    "ui": "Contacts > Import/Export"
   },
   "check": "GET /contacts/import/{processId} shows success count matching uploaded rows",
   "source": "https://developers.brevo.com/docs/synchronise-contact-lists"
  },
  {
   "id": "cap-30",
   "group": "Webhooks",
   "capability": "Configure a webhook to receive event notifications",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /webhooks",
    "mcp": "webhooks_management",
    "cli": null,
    "ui": "Account > Webhooks"
   },
   "check": "Triggering the subscribed event (e.g. send) delivers a POST to the configured URL",
   "source": "https://developers.brevo.com/docs/how-to-use-webhooks"
  },
  {
   "id": "cap-31",
   "group": "RSS Feeds",
   "capability": "Create RSS-to-email campaigns from an external feed",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": "external_feeds",
    "cli": null,
    "ui": "Campaigns > RSS"
   },
   "check": "RSS campaign send pulls latest feed items into the email content",
   "source": "https://developers.brevo.com/docs/mcp-protocol (external_feeds module)"
  },
  {
   "id": "cap-32",
   "group": "Teammates & Permissions",
   "capability": "Invite teammates and assign roles/permissions",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": "POST /organization/invited/users",
    "mcp": "users",
    "cli": null,
    "ui": "Account > Users & Permissions"
   },
   "check": "GET /organization/invited/users lists the invited teammate with assigned role",
   "source": "https://developers.brevo.com/docs/mcp-protocol (users module); https://www.brevo.com/pricing/ (Multi-user access, Professional)"
  },
  {
   "id": "cap-33",
   "group": "Sender/Domain Management",
   "capability": "Verify a sending domain and manage sender identities",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "POST /senders, POST /senders/domains",
    "mcp": "senders",
    "cli": null,
    "ui": "Senders, Domains & Dedicated IPs"
   },
   "check": "GET /senders/domains/{domain} shows verified: true after DNS records are added",
   "source": "https://developers.brevo.com/docs/mcp-protocol (domains, senders modules)"
  },
  {
   "id": "cap-34",
   "group": "Dedicated IP",
   "capability": "Manage a dedicated sending IP",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": "GET /senders/dedicatedIps",
    "mcp": "ips",
    "cli": null,
    "ui": "Senders, Domains & Dedicated IPs"
   },
   "check": "GET /senders/dedicatedIps lists the purchased IP assigned to the account",
   "source": "https://developers.brevo.com/docs/mcp-protocol (ips module)"
  },
  {
   "id": "cap-35",
   "group": "Branding",
   "capability": "Remove the \"Sent with Brevo\" footer branding",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Account > Settings > Senders"
   },
   "check": "Sent campaign HTML no longer includes the Brevo footer snippet",
   "source": "https://www.brevo.com/pricing/ (No Brevo logo, Standard plan)"
  },
  {
   "id": "cap-36",
   "group": "Integrations Marketplace",
   "capability": "Connect third-party apps from the integrations marketplace",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Apps / Integrations"
   },
   "check": "Connected app appears in Account > Integrations with an active status",
   "source": "https://developers.brevo.com/docs/add-the-ecommerce-app"
  },
  {
   "id": "cap-37",
   "group": "Sub-accounts",
   "capability": "Manage sub-accounts under one organization",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": "POST /corporate/subAccount",
    "mcp": "accounts",
    "cli": null,
    "ui": "Account > Sub-accounts"
   },
   "check": "GET /corporate/subAccount/list includes the newly created sub-account",
   "source": "https://developers.brevo.com/docs/mcp-protocol (accounts module)"
  }
 ],
 "attempts": [
  {
   "t": "01:08",
   "cap": "discovery",
   "capability": "MCP discover (product server)",
   "task": "server/discover on https://mcp.brevo.com/v1/brevo/mcp",
   "route": "mcp",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "401 invalid_token with WWW-Authenticate resource_metadata=https://mcp.brevo.com/.well-known/oauth-protected-resource/v1/brevo/mcp; PRM 200 {authorization_servers:[https://mcp.brevo.com/oauth],scopes_supported:[all]}; AS metadata: registration_endpoint (DCR), no client_id_metadata_document_supported, PKCE S256, grants authorization_code+refresh_token, no device flow",
   "notes": "needs credentials; retry with token later. Root /.well-known/oauth-authorization-server says issuer https://mcp.brevo.com while /.well-known/oauth-authorization-server/oauth says issuer https://mcp.brevo.com/oauth (mismatch)"
  },
  {
   "t": "01:08",
   "cap": "discovery",
   "capability": "MCP discover (docs server)",
   "task": "server/discover on https://developers.brevo.com/_mcp/server",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "server/discover -> HTTP 400 code -32000 'Unsupported protocol version: 2026-07-28 (supported versions: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07)'; initialize offering 2026-07-28 -> protocolVersion 2025-11-25, serverInfo fern-docs-mcp-server 1.0.0",
   "notes": "legacy server (Fern docs MCP); error code -32000 not -32022"
  },
  {
   "t": "01:45",
   "cap": "discovery",
   "capability": "cards and well-knowns",
   "task": "AI catalog, A2A card, MCP server card, ucp, auth.md, SKILL.md",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "www.brevo.com/.well-known/{ai-catalog.json,agent-card.json,agent.json,ucp,mcp/server-card.json} -> 500 text/html (Next.js error page); mcp.brevo.com/v1/brevo/mcp/server-card 404; developers.brevo.com/.well-known/ai-catalog.json 404; auth.md/SKILL.md 404 (developers.brevo.com/SKILL.md returns 200 text/plain 'Page Not Found' soft-404); api.brevo.com/.well-known/oauth-protected-resource 404",
   "notes": "none present"
  },
  {
   "t": "01:45",
   "cap": "discovery",
   "capability": "robots/aipref",
   "task": "robots.txt Content-Usage / Content-signal",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "www.brevo.com/robots.txt: User-agent * with Disallow /*-p2/, /api/ etc; no Content-Usage or Content-signal lines; no Content-Usage response header. developers.brevo.com/robots.txt: Allow /, Disallow /api/fern-docs/",
   "notes": "no AI preferences expressed; nothing disallows our agent from docs"
  },
  {
   "t": "01:45",
   "cap": "discovery",
   "capability": "markdown docs",
   "task": "Accept: text/markdown and .md URL",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET developers.brevo.com/docs/quickstart with Accept: text/markdown -> 303 Location .../quickstart.md; .md URL -> 200 content-type text/markdown; llms.txt at developers.brevo.com/llms.txt (H1 'Brevo API Documentation'); www.brevo.com/llms.txt 404; llms-full.txt empty-ish (15 bytes)",
   "notes": "negotiation is via redirect to the .md URL, no Vary: Accept on the redirect"
  },
  {
   "t": "01:45",
   "cap": "discovery",
   "capability": "OpenAPI",
   "task": "fetch OpenAPI",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "developers.brevo.com/openapi.json is an HTML index page (not JSON) listing 13 per-area specs openapi/*.json, each openapi: 3.1.0, server https://api.brevo.com/v3, 286 operations total, securityScheme api-key",
   "notes": "llms.txt claims openapi.json is 'raw OpenAPI 3.1 specification' but it serves HTML"
  },
  {
   "t": "01:55",
   "cap": "signup",
   "capability": "sign up",
   "task": "find a headless/documented sign-up route",
   "route": "none",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "No account-creation endpoint in the 13 OpenAPI specs (286 ops) or llms.txt; MCP/OAuth need an existing account; onboarding.brevo.com/account/register is a JS SPA (200 text/html)",
   "notes": "web form only; trying browser"
  },
  {
   "t": "02:58",
   "cap": "signup",
   "capability": "sign up",
   "task": "web sign-up form with test email + password",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "onboarding.brevo.com/account/register: filled email+password, 'Create your account' -> /account/register/verify 'We sent an email with a confirmation link to the agent's inbox'. reCAPTCHA present on page (invisible, no visible challenge) and let our agent's browser through.",
   "notes": "no phone asked at this step"
  },
  {
   "t": "03:08",
   "cap": "verify",
   "capability": "verify email",
   "task": "open the confirmation link from the mail",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Mail 'Complete your registration' from contact@t.brevo.com arrived in ~1 min.",
   "notes": "plain GET link, works headless"
  },
  {
   "t": "05:38",
   "cap": "discovery",
   "capability": "MCP discover with auth",
   "task": "server/discover then initialize on https://mcp.brevo.com/v1/brevo/mcp with OAuth token",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "server/discover with Bearer token -> HTTP 400 JSON-RPC -32600 'Unsupported protocol version: 2026-07-28. Supported versions: 2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25'; initialize offering 2026-07-28 -> 200 SSE protocolVersion 2025-11-25, serverInfo MainBrevoMCPServer 2.14.7, capabilities tools/prompts/resources/tasks; tools/list -> 282 tools",
   "notes": "legacy server; error code -32600 not -32022; no Mcp-Session-Id header returned"
  },
  {
   "t": "05:53",
   "cap": "credentials",
   "capability": "get credentials",
   "task": "get an MCP token via the MCP server's OAuth (PRM -> AS metadata -> DCR -> authorize with PKCE -> token)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST mcp.brevo.com/oauth/register 201 client_id; authorize -> oauth.brevo.com consent page 'Authorize Brevo-MCP' (browser, after login + new-device 6-digit email code); Authorize -> callback code+state (no iss param); POST /oauth/token -> Bearer access_token expires_in 3600 + refresh_token",
   "notes": "API key route (Account > SMTP & API > API Keys) is behind the onboarding 'organization address' step, which we cannot truthfully fill; the OAuth consent page did not enforce that step"
  },
  {
   "t": "05:53",
   "cap": "first_call",
   "capability": "first call",
   "task": "MCP accounts_get_account",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "tools/call accounts_get_account -> email the agent's inbox, plan free, 300 credits sendLimit, address empty",
   "notes": ""
  },
  {
   "t": "06:34",
   "cap": "cap-09",
   "capability": "Add a contact",
   "task": "create contact an inbox with FIRSTNAME/LASTNAME in list 2",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "contacts_create_contact -> {id:2}; contacts_get_contact_info -> email the agent's inbox, attributes FIRSTNAME AgentDrives LASTNAME Contact1, listIds [2]",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "06:34",
   "cap": "first_action",
   "capability": "first real action",
   "task": "create a contact via MCP",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "contact id 2 created and read back",
   "notes": ""
  },
  {
   "t": "06:43",
   "cap": "cap-10",
   "capability": "Update or delete an existing contact",
   "task": "update LASTNAME then delete contact an inbox",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "contacts_update_contact -> 204; get shows LASTNAME Updated1, modifiedAt changed; contacts_delete_contact -> 204; get -> 'Brevo API error (404): document_not_found Contact does not exist'",
   "notes": "MCP returns API errors as text with isError:false",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "06:44",
   "cap": "cap-09",
   "trial": 2,
   "capability": "Add a contact",
   "task": "create contact the agent's inbox",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "create -> {\"id\": 3}; get -> {\"id\": 3, \"email\": \"the agent's inbox\", \"emailBlacklisted\": false, \"smsBlacklisted\": false, \"whatsappBlacklisted",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "06:46",
   "cap": "cap-10",
   "trial": 2,
   "capability": "Update or delete an existing contact",
   "task": "update+delete the agent's inbox",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "update Success: 204 No Content; get shows Upd2=True; delete Success: 204 No Content; get after -> Brevo API error (404): {\"code\": \"document_not_found\", \"message\": \"Contact does n",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "06:47",
   "cap": "cap-09",
   "trial": 3,
   "capability": "Add a contact",
   "task": "create contact the agent's inbox",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "create -> {\"id\": 4}; get -> {\"id\": 4, \"email\": \"the agent's inbox\", \"emailBlacklisted\": false, \"smsBlacklisted\": false, \"whatsappBlacklisted",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "06:48",
   "cap": "cap-10",
   "trial": 3,
   "capability": "Update or delete an existing contact",
   "task": "update+delete the agent's inbox",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "update Success: 204 No Content; get shows Upd3=True; delete Success: 204 No Content; get after -> Brevo API error (404): {\"code\": \"document_not_found\", \"message\": \"Contact does n",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "07:32",
   "cap": "cap-08",
   "capability": "Create and move a deal through pipeline stages",
   "task": "create deal in Deals Pipeline then move New -> Qualifying",
   "route": "mcp",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "deals_post_crm_deals with attributes {pipeline,deal_stage} -> 400 'Invalid attribute: pipeline passed' (and 'deal_stage passed' without pipeline); name-only create -> id 6ac16b464c7536c4e9db2b1b in stage New (read back via deals_get_crm_deals); deals_patch_crm_deals_by_id {attributes:{pipeline,deal_stage:Qualifying}} -> 400 'Invalid attribute: pipeline passed'; {deal_stage} only -> 400 'Invalid attribute: deal_stage passed'; rename -> 204 works; attributes_get_crm_attributes_deals -> 500 'get all deal attributes: add is required field to attributes: no config details found'",
   "notes": "deal could be created but not moved between stages: deal attribute config missing on this new account (500 on the deal attributes read). The tool description says to use pipeline/deal_stage attributes.",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "vague",
    "docs_match": "drift",
    "recoverable": "no"
   }
  },
  {
   "t": "07:47",
   "cap": "cap-04",
   "capability": "Send a transactional email via API",
   "task": "send transactional email from account sender to our inbox an inbox",
   "route": "mcp",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "transac_templates_send_transac_email -> 'Brevo API error (403): Unable to send email. Your SMTP account is not yet activated. Please contact us at contact@brevo.com to request activation' code permission_denied",
   "notes": "new free account: transactional sending needs manual activation by Brevo support",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "09:50",
   "cap": "cap-01",
   "capability": "Send an email campaign",
   "task": "create campaign to own list (an inbox) and send now",
   "route": "mcp",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "create_email_campaign -> id 1 (status draft, read back); send_email_campaign_now -> 'Brevo API error (400): invalid_parameter Unable to create/update campaign. Due to DMARC policy, you cannot use this sender. Please choose another sender.'",
   "notes": "our only sender is the sign-up address on agentdrives.com (DMARC p=reject); Brevo requires an authenticated domain (DNS records) for such a sender; we cannot change DNS in this drive. send_test_email returned 204.",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "clear",
    "docs_match": "match",
    "recoverable": "no"
   }
  },
  {
   "t": "10:11",
   "cap": "cap-01",
   "capability": "Send an email campaign",
   "task": "read back campaign 1 after the failed send_now",
   "route": "mcp",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "get_email_campaign 1 -> status 'sent', sentDate 2026-10-03T22:54:21+02:00, campaignStats list 3: sent 1, delivered 0, softBounces 1",
   "notes": "the send_now call answered 400 DMARC error, yet the campaign was sent anyway (state contradicts the error); the one mail to our own inbox soft-bounced (sender domain has DMARC p=reject and is not authenticated in Brevo), so nothing was delivered",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "silent",
    "docs_match": "drift",
    "recoverable": "no"
   }
  },
  {
   "t": "10:11",
   "cap": "cap-03",
   "capability": "Schedule a campaign for later delivery",
   "task": "create a second campaign with scheduledAt +2 days (and schedule campaign 1)",
   "route": "mcp",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "create_email_campaign with scheduledAt -> 'Brevo API error (402): account_under_validation Your account is under validation. You can not create another campaign.'; update campaign 1 scheduledAt -> 405 'already been processed/sent'",
   "notes": "a new free account can create only one campaign until Brevo validates the account",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "10:48",
   "cap": "cap-05",
   "capability": "Send an SMS campaign",
   "task": "create SMS campaign draft to own list",
   "route": "mcp",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "sms_campaigns_create_sms_campaign -> 400 'To create your first SMS campaign, you need to complete your profile here first - https://app.brevo.com/profile/information'; pricing page: 'SMS credit sold separately'; we hold no SMS credits and no phone number",
   "notes": "also behind the profile (organization address) step",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "10:48",
   "cap": "cap-06",
   "capability": "Send a WhatsApp campaign",
   "task": "read WhatsApp config before creating a campaign",
   "route": "mcp",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "whatsapp_campaigns_get_whats_app_config -> 403 'plan not eligible for using whatsapp'",
   "notes": "free plan",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "10:48",
   "cap": "cap-07",
   "capability": "Build a multi-step automation workflow",
   "task": "look for an automation route",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "no automation/workflow operation in the 13 OpenAPI specs or the 282 MCP tools; pricing page: Standard plan 'Marketing automation: Create an unlimited number of automated, multi-step workflows'",
   "notes": "UI only and paid plan",
   "quality": {}
  },
  {
   "t": "10:48",
   "cap": "cap-02",
   "capability": "Design an email with drag-and-drop editor",
   "task": "open the campaign editor in the web app",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "app.brevo.com/* redirects to onboarding.brevo.com/account/register/complete-profile asking for organization Address, Postal code, City, Country (required); we have no address we can truthfully give",
   "notes": "no API/MCP route for the drag-and-drop editor",
   "quality": {}
  },
  {
   "t": "11:11",
   "cap": "cap-13",
   "capability": "Create a contact list and add/remove members",
   "task": "create list, add an inbox, remove it",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "lists_create_list -> id 4; add_contact_to_list success [an inbox]; get_contacts_from_list shows id 6 an inbox; remove -> success; list then count 0",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "11:28",
   "cap": "cap-17",
   "capability": "Create and reuse an email template",
   "task": "create template, read back, update, reuse in a campaign",
   "route": "mcp",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "templates_create_smtp_template -> id 2; templates_get_smtp_template('2') returns it; update name -> 204; reuse: create_email_campaign with templateId 2 -> 402 account_under_validation; preview tool -> 403 'Cookie auth cookie missing'",
   "notes": "template CRUD works; reuse in a campaign blocked by account validation; templates_post_preview_smtp_email_templates broken over MCP (cookie auth error)",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "vague",
    "docs_match": "drift",
    "recoverable": "no"
   }
  },
  {
   "t": "11:34",
   "cap": "cap-18",
   "capability": "View campaign performance reports",
   "task": "read the report of campaign 1 and the transactional aggregate report",
   "route": "mcp",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "get_email_campaign 1 statistics: campaignStats sent 1, delivered 0, softBounces 1, opens/clicks 0, statsByDevice/Browser present; campaign_analytics_get_aggregated_smtp_report -> all zeros for 2026-07-05|2026-10-03",
   "notes": "report API works and agrees with the credit count (300 -> 299); no opens/clicks possible because nothing was delivered; dashboard comparison impossible (web app behind profile step)",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "12:14",
   "cap": "cap-29",
   "capability": "Bulk import or export contacts",
   "task": "import 2 contacts by CSV body into a new list, then export the list",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "import_contacts -> processId 7; processes_get_process 7 status completed; get_contacts_from_list 5 shows an inbox Import1 and an inbox Import2; request_contact_export -> processId 8 completed with export_url; CSV downloaded with the 2 rows",
   "notes": "export_url is a plain unsigned S3 URL (no auth, no expiry seen)",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "12:27",
   "cap": "cap-30",
   "capability": "Configure a webhook to receive event notifications",
   "task": "create marketing webhook to our URL, read back, update",
   "route": "mcp",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "create_webhook -> id 2220072; get_webhook shows url/events; update -> 204; get_webhooks shows new description and events",
   "notes": "delivery not exercised: no receiver we can read in this sandbox, and sending is blocked anyway",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "12:40",
   "cap": "cap-33",
   "capability": "Verify a sending domain and manage sender identities",
   "task": "create sender on own address; add domain brevo-drive.agentdrives.com, read DNS config, authenticate",
   "route": "mcp",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "senders_create_sender(the agent's inbox) -> 400 'Your DMARC policy requires your domain to be authenticated before creating a sender'; domains_create_domain -> id 6ac16c89…, DNS records (2 DKIM CNAME, brevo-code TXT, DMARC); get_domain_configuration verified:false; authenticate_domain -> 400 'cannot be authenticated. Check your domain DNS panel…'",
   "notes": "the API side works and errors say what to fix; verification needs DNS records we did not add (out of scope for the drive)",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "clear",
    "docs_match": "match",
    "recoverable": "yes"
   }
  },
  {
   "t": "12:45",
   "cap": "cap-12",
   "capability": "Build a contact segment with filters",
   "task": "find a route to create a segment",
   "route": "mcp",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "only GET /contacts/segments exists in the OpenAPI specs and segments_get_segments in MCP (returns '{}' on this account); no create route; web app behind the profile (address) step",
   "notes": "segment builder is UI-only",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "13:05",
   "cap": "cap-19",
   "capability": "Track custom website events and behavior",
   "task": "create a custom event for contact an inbox",
   "route": "mcp",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "events_create_event {event_name:'agentdrives_test', identifiers:{email_id:an inbox@…}} (with and without event_properties) -> 'Brevo API error (400): invalid_parameter undefined source'",
   "notes": "'source' appears nowhere in the events OpenAPI spec; error does not say what to fix",
   "quality": {
    "error_legibility": "vague",
    "recoverable": "no",
    "docs_match": "drift"
   }
  },
  {
   "t": "13:35",
   "cap": "cap-31",
   "capability": "Create RSS-to-email campaigns from an external feed",
   "task": "create an external feed",
   "route": "mcp",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "external_feeds_create_external_feed -> 403 permission_denied 'This feature is only available to customers with an Enterprise plan.'",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "13:51",
   "cap": "cap-32",
   "capability": "Invite teammates and assign roles/permissions",
   "task": "invite our own inbox an inbox with contacts:view",
   "route": "mcp",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "users_inviteuser -> 403 'User Management API is not enabled for this account'; users_get_invited_users_list works (owner only)",
   "quality": {
    "error_legibility": "vague"
   }
  },
  {
   "t": "13:51",
   "cap": "cap-34",
   "capability": "Manage a dedicated sending IP",
   "task": "list dedicated IPs",
   "route": "mcp",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "ips_get_ips -> {ips: []}; dedicated IPs are a paid add-on (map: paid)",
   "quality": {}
  },
  {
   "t": "13:51",
   "cap": "cap-37",
   "capability": "Manage sub-accounts under one organization",
   "task": "list sub-accounts",
   "route": "mcp",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "accounts_get_corporate_sub_account -> 403 'Current account is not a corporate user'",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "13:59",
   "cap": "cap-11",
   "capability": "Chat with website visitors via live chat widget",
   "task": "send an agent message to our own visitor id",
   "route": "mcp",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "conversations_post_messages -> 402 not_enough_credits 'Upgrade your plan to use REST API'",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "14:08",
   "cap": "cap-25",
   "capability": "Run a customer loyalty/rewards program",
   "task": "create a loyalty program",
   "route": "mcp",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "loyalty_create_new_lp -> 401 'Loyalty application is inactive' (loyalty_get_lp_list -> items [])",
   "notes": "status 401 used for a feature that is not enabled, not for bad credentials",
   "quality": {
    "error_legibility": "vague"
   }
  },
  {
   "t": "14:26",
   "cap": "cap-14",
   "capability": "Create a signup form to capture leads",
   "task": "find and use a route on the free plan",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "no form API in OpenAPI/MCP; web app (Contacts > Forms) redirects to the onboarding profile step that requires an organization postal address we cannot truthfully give",
   "quality": {}
  },
  {
   "t": "14:26",
   "cap": "cap-15",
   "capability": "Publish a landing page",
   "task": "find and use a route on the free plan",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "pricing page https://www.brevo.com/pricing/ (fetched this run): 'Landing pages … 1 page included' listed under Standard ('Everything in Starter, plus')",
   "quality": {}
  },
  {
   "t": "14:26",
   "cap": "cap-16",
   "capability": "Run an A/B test on subject lines or content",
   "task": "find and use a route on the free plan",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "pricing page https://www.brevo.com/pricing/ (fetched this run): A/B testing listed under Standard; also create_email_campaign returns 402 account_under_validation on this account",
   "quality": {}
  },
  {
   "t": "14:26",
   "cap": "cap-21",
   "capability": "Generate email copy/subject lines with AI",
   "task": "find and use a route on the free plan",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "no AI-content operation in OpenAPI or MCP tools; editor UI behind the onboarding profile (address) step",
   "quality": {}
  },
  {
   "t": "14:26",
   "cap": "cap-22",
   "capability": "Auto-send at each contact's optimal engagement time",
   "task": "find and use a route on the free plan",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "pricing page https://www.brevo.com/pricing/ (fetched this run): 'AI send time optimization' under Standard",
   "quality": {}
  },
  {
   "t": "14:26",
   "cap": "cap-23",
   "capability": "Score contacts by engagement/purchase behavior",
   "task": "find and use a route on the free plan",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "pricing page https://www.brevo.com/pricing/ (fetched this run): 'Contact scoring' under Professional ('Everything in Standard, plus')",
   "quality": {}
  },
  {
   "t": "14:26",
   "cap": "cap-24",
   "capability": "Send web or mobile push notifications",
   "task": "find and use a route on the free plan",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "pricing page https://www.brevo.com/pricing/ (fetched this run): web push under Starter/Standard, web & mobile push Professional; no push API in the specs",
   "quality": {}
  },
  {
   "t": "14:26",
   "cap": "cap-26",
   "capability": "Deploy a chatbot to auto-answer visitor questions",
   "task": "find and use a route on the free plan",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "map: paid; Conversations REST API itself answered 402 'Upgrade your plan to use REST API' on the free plan",
   "quality": {}
  },
  {
   "t": "14:26",
   "cap": "cap-27",
   "capability": "Let prospects book a meeting via scheduling page",
   "task": "find and use a route on the free plan",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "no Meetings API in OpenAPI/MCP; web app behind the onboarding profile (address) step",
   "quality": {}
  },
  {
   "t": "14:26",
   "cap": "cap-28",
   "capability": "Make and log sales calls via VoIP phone",
   "task": "find and use a route on the free plan",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "map: paid; no phone API in the specs",
   "quality": {}
  },
  {
   "t": "14:26",
   "cap": "cap-35",
   "capability": "Remove the 'Sent with Brevo' footer branding",
   "task": "find and use a route on the free plan",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "pricing page https://www.brevo.com/pricing/ (fetched this run): 'No Brevo logo' is a Starter feature / 'Remove Brevo branding' add-on",
   "quality": {}
  },
  {
   "t": "14:26",
   "cap": "cap-36",
   "capability": "Connect third-party apps from the integrations marketplace",
   "task": "find and use a route on the free plan",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "no integrations API; web app behind the onboarding profile (address) step",
   "quality": {}
  },
  {
   "t": "17:22",
   "cap": "credentials",
   "capability": "get REST credentials",
   "task": "brevo CLI (@getbrevo/cli 2.3.0) 'brevo login' (browser OAuth) and use its Bearer token on api.brevo.com/v3",
   "route": "cli",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "brevo login printed https://oauth-cli.brevo.com/login?port=…; consent 'Authorize Brevo-CLI' in browser; callback page posts {access_token, refresh_token, expires_in 3600, scope all} to http://localhost:<port>/callback; with that Bearer token GET /v3/account -> 200 (x-sib-ratelimit-limit 5000)",
   "notes": "our sandboxed browser could not reach the CLI's localhost port (we), so we took the token from the callback page's request; the CLI has no device-code or paste-a-code login, only browser or API key"
  },
  {
   "t": "18:51",
   "cap": "pay",
   "capability": "pay step",
   "task": "probe for agent payment rails and billing API",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "api.brevo.com/v3 unauthenticated -> 401 JSON, no 402/PAYMENT-REQUIRED/WWW-Authenticate Payment; x402./mpp./agents.brevo.com have no DNS; no /.well-known/ucp (500 HTML); no x-payment-info in the 13 OpenAPI specs; Brevo absent from x402 Bazaar (CDP discovery) and mpp.dev/api/services; docs llms.txt has no x402/MPP/ACP/UCP/AP2/L402 terms; no billing/upgrade operation for the own account (only corporate sub-account plan updates, 403 'not a corporate user'); pricing FAQ: 'All payments are made by credit card, through our secure payment processor, Adyen, or by Paypal'",
   "notes": "upgrade is in the web app, which this account cannot open before the onboarding address step; free plan needs no card"
  },
  {
   "t": "22:26",
   "cap": "cap-20",
   "capability": "Sync products, categories and orders",
   "task": "activate eCommerce, create category, products and orders, read back",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "MCP ecommerce_post_activate -> 'db creation in process, wait 5 minutes' (403 'not yet activated' until then); POST /categories 201, GET /categories/ad-cat-1 ok; POST /products 201, GET /products/ad-prod-2 ok; POST /orders/status/batch 202 batch_id, GET /orders lists ad-order-3 for contact 7",
   "notes": "single-order POST /orders/status answered 204 twice (ad-order-1 via MCP, ad-order-2 via REST) but neither order appears in GET /orders; only the batch order does. Works on the free plan although the map marks it paid.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "drift",
    "error_legibility": "silent"
   }
  },
  {
   "t": "32:08",
   "cap": "cleanup",
   "capability": "clean up created objects",
   "task": "delete every object we created",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "deleted via REST/MCP and read back 404/empty: contacts (5), lists 3/4/5/9, folders, contact attributes AD_TEST/AD_CHOICE/AD_MULTI, CRM deals/companies/tasks/notes/file, CRM attribute, templates 2 and 3 (template 2 only after PUT isActive:false, as the 405 said), webhooks 2220072/2220090, domain brevo-drive.agentdrives.com, blocked domains",
   "notes": "survives: campaign 1 (archived; DELETE -> 403 'Campaign once scheduled can not be deleted'), eCommerce products ad-prod-1..4, categories ad-cat-1..4 and orders (no delete operation), 2 gallery images (no delete operation), the exported CSV on S3"
  },
  {
   "t": "32:08",
   "cap": "delete",
   "capability": "delete account",
   "task": "find a headless or browser route to close the account",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "no account-deletion operation in the OpenAPI specs, MCP tools or CLI; help article 'Permanently close your Brevo account': Settings > General > 'Definitively close your account' (web only); app.brevo.com/account/delete and settings redirect to the onboarding complete-profile address step for this account; help article: inactive Free accounts are deleted after 4 months",
   "notes": "left the account in place; it will be removed by Brevo's 4-month inactivity rule unless someone logs in"
  },
  {
   "t": "32:08",
   "cap": "cancel",
   "capability": "cancel plan",
   "task": "nothing to cancel",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "free plan, no paid plan started; help article 'Cancel your subscription' describes the web UI",
   "notes": ""
  },
  {
   "t": "33:15",
   "cap": "credentials",
   "capability": "refresh MCP credentials",
   "task": "refresh_token grant at https://mcp.brevo.com/oauth/token",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST grant_type=refresh_token -> new access_token (3600 s) + rotated refresh_token; tools/call accounts_get_account works with it",
   "notes": "once a human has consented once in a browser, an agent can keep MCP access headless"
  },
  {
   "t": "36:52",
   "cap": "cap-08",
   "capability": "Create and move a deal through pipeline stages",
   "task": "retry ~35 min after sign-up: create deal in stage New, move to Qualifying",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "create -> 6ac172346defcb8d316a1bd7; patch -> Success: 204 No Content; get deal_stage=Qualifying; GET /crm/attributes/deals now 200 (was 500); deleted after: Success: 204 No Content",
   "notes": "the same calls that failed at 07:32 now work: the deal attribute config appeared some time after sign-up (cause unknown). First attempt stays failed.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "36:53",
   "cap": "cap-08",
   "trial": 2,
   "capability": "Create and move a deal through pipeline stages",
   "task": "create deal in New, move to Qualifying, delete",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "create -> 6ac1723c71c18c259415a2b2; patch -> Success: 204 No Content; get deal_stage=Qualifying; delete Success: 204 No Content",
   "quality": {
    "verify_route": "yes"
   }
  },
  {
   "t": "36:58",
   "cap": "cap-08",
   "trial": 3,
   "capability": "Create and move a deal through pipeline stages",
   "task": "create deal in New, move to Qualifying, delete",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "create -> 6ac1723e71c18c259415a2b4; patch -> Success: 204 No Content; get deal_stage=Qualifying; delete Success: 204 No Content",
   "quality": {
    "verify_route": "yes"
   }
  }
 ],
 "stale": false,
 "icon": "/logos/brevo.png",
 "monitored": false,
 "verdict": "Gets in on its own: L2 · Gets in, signing up in a browser past an invisible reCAPTCHA. Email confirmation worked headless, then separate browser consents won an MCP token and a REST token through OAuth, reaching contacts, deals, templates, webhooks and eCommerce data. Through MCP it created a contact and read it back. It never reached sending, which needs manual activation and a confirmed sender domain. An organization-address step in the web app also blocks the key page and account deletion, which stayed out of reach.",
 "page": "https://agentdrives.com/tools/brevo?via=api"
}