{
 "slug": "klaviyo",
 "name": "Klaviyo",
 "url": "https://klaviyo.com",
 "domain": "klaviyo.com",
 "category": "email-marketing",
 "category_name": "Email marketing",
 "tested_at": "2026-10-06",
 "run": "20261006T080937Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261001T230457Z",
   "date": "2026-10-01",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": null,
    "driver": null,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  },
  {
   "run": "20261006T080937Z",
   "date": "2026-10-06",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": null,
    "robots": "start"
   }
  }
 ],
 "level": 1,
 "level_name": "Needs a person",
 "level_selfhost": null,
 "entry": "closed",
 "door": {
  "passed": 0,
  "tries": 2,
  "self_start": false
 },
 "badges": [],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "no",
   "text": "Can't get in on its own",
   "at": "signup"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "unreached",
   "text": "Work not measured"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "unreached",
   "text": "Leaving not reached",
   "how": "no-account"
  }
 ],
 "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": "no",
   "text": "Can't get in on its own",
   "at": "signup",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "unreached",
   "text": "Work not measured",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "unreached",
   "text": "Leaving not reached",
   "how": "no-account",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "person",
   "label": "A person sets it up",
   "routes": [],
   "minutes": null,
   "core": null
  }
 ],
 "minutes": null,
 "next": {
  "to": 2,
  "text": "Next: let an agent sign up on its own"
 },
 "stop": "signup",
 "core": "0/7",
 "scores": {
  "coverage": null,
  "reliability": null,
  "resilience": null,
  "setup": 100,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 100,
  "security": null,
  "standards": [
   {
    "standard": "MCP",
    "state": "behind",
    "behind": 1,
    "value": "2025-11-25"
   },
   {
    "standard": "MCP client registration",
    "state": "current",
    "behind": null,
    "value": "cimd"
   },
   {
    "standard": "OpenAPI",
    "state": "behind",
    "behind": 2,
    "value": "3.0.2"
   }
  ]
 },
 "reliability_method": null,
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": null,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": null,
  "prompt_sha": "f3d0adeeb256",
  "kb_version": "2+overlay-9e43028a2c",
  "identity": null
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 2,
  "signed": true,
  "inbox": null,
  "robots": "start"
 },
 "same_level_drives": 2,
 "drives": 2,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": {
  "rung": "signup",
  "vendor": "reCAPTCHA",
  "visible": true,
  "type": "network",
  "human": null,
  "how": "Check the Web Bot Auth signature on the sign-up request and skip reCAPTCHA (or lower the score threshold) for signed agents; or offer a documented sign-up API with email verification.",
  "hows": {
   "reCAPTCHA": "Check the Web Bot Auth signature on the sign-up request and skip reCAPTCHA (or lower the score threshold) for signed agents; or offer a documented sign-up API with email verification."
  },
  "signed": true
 },
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "form"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-10-12"
  },
  "browser": {
   "state": "through",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "llms.txt at www.klaviyo.com/llms.txt (Agent & Headless Access section); developer docs answer Accept: text/markdown with text/markdown + Vary: Accept, and .md URLs work; OpenAPI 3.0.2 on github.com/klaviyo/openapi."
  },
  "signup": {
   "status": "human",
   "note": "No sign-up API or agent registration. The web form (3 steps, reCAPTCHA script, no visible challenge) requires a phone number in its last step ('Required' / 'All fields required'); our agent has none, so the drive stops here."
  },
  "verify": {
   "status": "",
   "note": "Not reached: no account (phone required at sign-up).",
   "reached": false
  },
  "credentials": {
   "status": "",
   "note": "Not reached. Private API keys are made in a logged-in account; remote MCP OAuth (CIMD or DCR) needs a signed-in Owner/Admin/Manager to approve in a browser. No device flow.",
   "via": "",
   "reached": false
  },
  "first_call": {
   "status": "",
   "note": "Not reached: every /api call answers 401 not_authenticated without a key.",
   "reached": false
  },
  "first_action": {
   "status": "",
   "note": "Not reached: no account.",
   "reached": false
  },
  "pay": {
   "status": "",
   "grade": "P1",
   "rails": [],
   "rail_ids": [],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "note": "Free plan (up to 250 profiles, 500 emails/month). No 402 anywhere, x402./mpp./agents. subdomains do not resolve, no x-payment-info in the OpenAPI, not in x402 Bazaar or mpp.dev, no billing API (MCP billing tools are read-only usage). Upgrading happens in the web app behind a sign-up that needs a phone number, so a human is needed; the checkout itself was not observed.",
   "reached": false
  },
  "cancel": {
   "status": "",
   "grade": "n/a",
   "note": "No plan started (no account).",
   "reached": false
  },
  "delete": {
   "status": "",
   "note": "No account was created, so there was nothing to delete.",
   "account": false,
   "reached": false
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-06",
  "source": "drive",
  "options": [],
  "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": false,
  "sdk": true,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": true,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST JSON:API at a.klaviyo.com, dated REVISION header, 345 operations",
  "openapi": "3.0.2 on GitHub (klaviyo/openapi), not served from a.klaviyo.com",
  "mcp": "official remote (OAuth, CIMD) and local stdio (API key); local answers the 25 Nov 2025 MCP spec, 28 default tools",
  "llms_txt": "www.klaviyo.com/llms.txt with an Agent & Headless Access section; none on developers.klaviyo.com"
 },
 "can_do": [
  "Read Klaviyo's docs as Markdown (Accept: text/markdown or .md URLs) and the llms.txt",
  "Fetch the full OpenAPI spec from GitHub",
  "Discover the remote MCP server's OAuth setup (PRM, AS metadata with CIMD)",
  "Install the official local MCP server and list its tools without an account"
 ],
 "cannot_do": [
  {
   "what": "Create a Klaviyo account",
   "why": "The sign-up form requires a phone number; there is no sign-up API or agent registration."
  },
  {
   "what": "Get an API key or MCP OAuth token",
   "why": "Both need a logged-in human account; no device flow or claim flow."
  },
  {
   "what": "Any core capability (campaigns, flows, segments, profiles, events, forms)",
   "why": "No account, so every API call answers 401."
  },
  {
   "what": "Buy a paid plan",
   "why": "No agent payment rail or billing API; upgrade is in the web app only."
  }
 ],
 "blockers": [
  "Phone number required on the sign-up form"
 ],
 "tips_for_owner": [
  "Let signed agents past the bot check on sign-up: Check the Web Bot Auth signature on the sign-up request and skip reCAPTCHA (or lower the score threshold) for signed agents; or offer a documented sign-up API with email verification.",
  "Make the sign-up phone number optional",
  "Add an agent sign-up with human claim",
  "Offer device flow for API credentials",
  "Support MCP (the 28 Jul 2026 spec) server/discover",
  "Serve OpenAPI 3.1+ from a.klaviyo.com",
  "Add a billing API for plan changes"
 ],
 "tips_for_agents": [
  "Without a human-made account nothing works: ask the human for a private API key (Settings > API keys) and use the REST API or the local MCP server with PRIVATE_API_KEY.",
  "Every API call needs a dated 'revision' header (YYYY-MM-DD); without it the API answers 400 invalid_revision.",
  "The local MCP server needs Python 3.13+ (uvx klaviyo-mcp-server@latest) and speaks MCP 2025-11-25 via initialize; server/discover fails with -32602.",
  "The remote MCP server (https://mcp.klaviyo.com/mcp) supports CIMD client registration but needs an Owner/Admin/Manager to approve in a browser.",
  "Docs pages return Markdown with Accept: text/markdown or a .md suffix."
 ],
 "selfhost": null,
 "summary": "Klaviyo has a strong agent surface on paper: a 345-operation REST API with an OpenAPI spec, Markdown docs, an llms.txt, and an official MCP server (remote with OAuth/CIMD, local with an API key). An agent cannot get in on its own: the free sign-up form makes a phone number mandatory and there is no API or agent sign-up, so no capability could be driven. The local MCP server still speaks MCP (the 25 Nov 2025 spec) and there is no agent payment rail.",
 "wall": "Phone number required on sign-up form",
 "plan_scope": "",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Klaviyo is an email/SMS marketing platform with strong technical documentation for AI agents: machine-readable docs, an API spec, and an official MCP connector. But the free sign-up form requires a phone number and there is no other way to create an account, so the agent could not get in and could not test any actual marketing feature.",
  "can_do": [
   "Read all of Klaviyo's documentation and API reference automatically",
   "Find how Klaviyo's login and automation systems are set up",
   "Download and inspect Klaviyo's official AI-connector tool without an account"
  ],
  "cannot_do": [
   {
    "what": "Create a Klaviyo account",
    "why": "The sign-up form requires a phone number and there is no other way to register."
   },
   {
    "what": "Get API access or send any campaign, message, or data",
    "why": "Every feature requires a logged-in account first."
   },
   {
    "what": "Pay for or cancel a paid plan",
    "why": "No account could be created, so no plan could be reached."
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "Generate a campaign/flow from a prompt (Composer)",
   "plan": "paid",
   "evidence": "capability map plan: paid; pricing page lists Composer usage separately"
  },
  {
   "capability": "Autonomous customer service responses (Customer Agent)",
   "plan": "paid",
   "evidence": "capability map plan: paid"
  },
  {
   "capability": "WhatsApp marketing messaging",
   "plan": "paid",
   "evidence": "capability map plan: paid"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Marketing / Campaigns",
   "capability": "Create and send an email campaign",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/campaigns, POST /api/campaign-send-jobs",
    "mcp": "create_campaign, send_campaign",
    "cli": null,
    "ui": "Campaigns > Create campaign"
   },
   "check": "GET /api/campaigns/{id} shows status 'Sent' and GET /api/campaign-send-jobs/{id} shows completed",
   "source": "https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools; https://www.klaviyo.com/products/email-marketing"
  },
  {
   "id": "cap-02",
   "group": "Marketing / Campaigns",
   "capability": "Send SMS/MMS campaigns",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/campaigns (channel: sms)",
    "mcp": "create_campaign",
    "cli": null,
    "ui": "Campaigns > Create campaign > SMS"
   },
   "check": "GET /api/campaigns/{id} shows channel 'sms' and status 'Sent'",
   "source": "https://www.klaviyo.com/products/sms-marketing; https://www.klaviyo.com/pricing"
  },
  {
   "id": "cap-03",
   "group": "Marketing / Automation",
   "capability": "Build and activate automated flows (triggers, actions, branches)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/flows, PATCH /api/flows/{id}",
    "mcp": "create_flow, update_flow, update_flow_action",
    "cli": null,
    "ui": "Flows > Create flow"
   },
   "check": "GET /api/flows/{id} shows status 'live'",
   "source": "https://www.klaviyo.com/solutions/marketing-automation; https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-04",
   "group": "Marketing / AI Agents",
   "capability": "Generate a campaign/flow from a prompt (Composer)",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Composer panel"
   },
   "check": "New campaign/flow appears in UI matching the prompted brief (manual verification; no documented API)",
   "source": "https://www.klaviyo.com/composer; https://www.klaviyo.com/pricing"
  },
  {
   "id": "cap-05",
   "group": "Service / AI Agents",
   "capability": "Autonomous customer service responses (Customer Agent)",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Helpdesk > Customer Agent"
   },
   "check": "Ticket in Helpdesk shows an automated agent reply and resolution status",
   "source": "https://www.klaviyo.com/solutions/ai/customer-agent"
  },
  {
   "id": "cap-06",
   "group": "Marketing / Audience",
   "capability": "Segment customers with dynamic conditions",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/segments",
    "mcp": "create_segment, update_segment",
    "cli": null,
    "ui": "Lists & Segments > Create segment"
   },
   "check": "GET /api/segments/{id} returns definition; GET /api/segments/{id}/profiles lists matching profiles",
   "source": "https://www.klaviyo.com/features/segmentation"
  },
  {
   "id": "cap-07",
   "group": "Marketing / Audience",
   "capability": "Collect sign-ups via on-site forms (popups, embeds, flyouts)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /api/forms (read only)",
    "mcp": "create_form, get_forms",
    "cli": null,
    "ui": "Sign-up Forms > Create form"
   },
   "check": "GET /api/forms/{id} shows the new form; query_form_values shows submission count > 0",
   "source": "https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools; https://www.klaviyo.com/pricing"
  },
  {
   "id": "cap-08",
   "group": "Data / CDP",
   "capability": "Manage customer profiles (create/update/merge)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/profiles, PATCH /api/profiles/{id}, POST /api/profile-merge",
    "mcp": "create_profile, update_profile, merge_profiles",
    "cli": null,
    "ui": "Profiles"
   },
   "check": "GET /api/profiles/{id} returns updated attributes",
   "source": "https://www.klaviyo.com/features/customer-profiles"
  },
  {
   "id": "cap-09",
   "group": "Data / Analytics",
   "capability": "Track behavioral/custom events per profile",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/events, POST /client/events",
    "mcp": "create_event, bulk_create_events",
    "cli": null,
    "ui": "Analytics > Events (view only)"
   },
   "check": "GET /api/events?filter=equals(profile_id,'{id}') includes the new event",
   "source": "https://developers.klaviyo.com/en/reference/api_overview; https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-10",
   "group": "Marketing / Channels",
   "capability": "WhatsApp marketing messaging",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Campaigns/Flows > WhatsApp channel"
   },
   "check": "Campaign/flow message configured with channel WhatsApp shows delivered status in reporting",
   "source": "https://www.klaviyo.com/products/whatsapp"
  },
  {
   "id": "cap-11",
   "group": "Marketing / Content",
   "capability": "Design emails with drag-and-drop or HTML templates",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/templates",
    "mcp": "create_email_template, create_dnd_email_template, update_dnd_email_template",
    "cli": null,
    "ui": "Content > Templates"
   },
   "check": "GET /api/templates/{id} returns html/definition matching edits",
   "source": "https://www.klaviyo.com/features/email-templates; https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-12",
   "group": "Marketing / Content",
   "capability": "Reusable universal content blocks",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /api/template-universal-content",
    "mcp": "create_universal_content, update_universal_content",
    "cli": null,
    "ui": "Content > Universal content"
   },
   "check": "GET /api/template-universal-content/{id} returns the saved block",
   "source": "https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-13",
   "group": "Marketing / Content",
   "capability": "Localize campaigns/flows/templates (translations)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /api/translations (beta)",
    "mcp": "create_translation, update_translation",
    "cli": null,
    "ui": "Content > Translations"
   },
   "check": "GET /api/translations/{id} returns localized values for added locale",
   "source": "https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-14",
   "group": "Commerce / Catalog",
   "capability": "Manage product catalog (items, variants, categories)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /api/catalog-items, POST /api/catalog-variants, POST /api/catalog-categories",
    "mcp": "create_catalog_item, create_catalog_variant, create_catalog_category",
    "cli": null,
    "ui": "Catalog"
   },
   "check": "GET /api/catalog-items/{id} returns created item attributes",
   "source": "https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-15",
   "group": "Commerce / Promotions",
   "capability": "Create and distribute discount coupons",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /api/coupons, POST /api/coupon-codes, POST /api/coupon-code-bulk-create-jobs",
    "mcp": "create_coupon, create_coupon_code, bulk_create_coupon_codes",
    "cli": null,
    "ui": "Content > Coupons"
   },
   "check": "GET /api/coupon-codes/{id} shows the code tied to the coupon and unused status",
   "source": "https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-16",
   "group": "Marketing / Lifecycle",
   "capability": "Back-in-stock subscription alerts",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /api/back-in-stock-subscriptions",
    "mcp": "create_back_in_stock_subscription",
    "cli": null,
    "ui": "Flows > Back in stock trigger"
   },
   "check": "Subscription created triggers a flow event when the item restocks (metric query shows the event)",
   "source": "https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-17",
   "group": "Service",
   "capability": "Manage support tickets (Helpdesk)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Helpdesk > Tickets"
   },
   "check": "Ticket status transitions (open -> resolved) visible in Helpdesk UI",
   "source": "https://www.klaviyo.com/products/helpdesk"
  },
  {
   "id": "cap-18",
   "group": "Service",
   "capability": "Collect and manage product reviews",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "GET /api/reviews (read only)",
    "mcp": "get_reviews",
    "cli": null,
    "ui": "Reviews"
   },
   "check": "GET /api/reviews?filter=equals(item_id,'{id}') lists the review",
   "source": "https://www.klaviyo.com/products/review-management; https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-19",
   "group": "Analytics / Reporting",
   "capability": "View campaign and flow performance reports",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/campaign-values-reports, POST /api/flow-values-reports",
    "mcp": "get_campaign_report, get_flow_report",
    "cli": null,
    "ui": "Analytics > Campaigns / Flows"
   },
   "check": "Report response contains non-null statistics (opens, clicks, revenue) for the queried id",
   "source": "https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools; https://www.klaviyo.com/solutions/analytics"
  },
  {
   "id": "cap-20",
   "group": "Analytics / Reporting",
   "capability": "Query custom metric aggregates",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /api/metric-aggregates",
    "mcp": "query_metric_aggregates",
    "cli": null,
    "ui": "Analytics > Metrics explorer"
   },
   "check": "Response returns aggregated data buckets matching the metric filter",
   "source": "https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-21",
   "group": "Analytics / Reporting",
   "capability": "Benchmark performance against industry peers",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Analytics > Benchmarks"
   },
   "check": "Benchmarks page shows account metrics plotted against industry percentile",
   "source": "https://www.klaviyo.com/features/benchmarks"
  },
  {
   "id": "cap-22",
   "group": "Data / CDP",
   "capability": "Bulk import/export/suppress profiles",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/profile-bulk-import-jobs, POST /api/profile-bulk-export-jobs, POST /api/profile-suppression-bulk-create-jobs",
    "mcp": "bulk_import_profiles, bulk_suppress_profiles, bulk_unsuppress_profiles",
    "cli": null,
    "ui": "Profiles > Import/Export"
   },
   "check": "GET /api/profile-bulk-import-jobs/{id} status 'complete'; suppressed profile shows subscription status 'suppressed'",
   "source": "https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-23",
   "group": "Personalization",
   "capability": "Personalize on-site/email content with recommendations",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Content > Personalization blocks"
   },
   "check": "Rendered email/template preview shows recommendation block populated with catalog items (render_email_template)",
   "source": "https://www.klaviyo.com/products/personalization"
  },
  {
   "id": "cap-24",
   "group": "Integrations",
   "capability": "Organize assets with tags and tag groups",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/tags, POST /api/tag-groups",
    "mcp": "create_tag, tag_campaigns, tag_flows, tag_lists, tag_segments",
    "cli": null,
    "ui": "Campaigns/Flows > Tag"
   },
   "check": "GET /api/campaigns/{id}?include=tags shows the applied tag",
   "source": "https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-25",
   "group": "Integrations",
   "capability": "Push data to external systems via webhooks",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /api/webhooks",
    "mcp": "create_webhook, get_webhook_topics",
    "cli": null,
    "ui": "Settings > Webhooks"
   },
   "check": "GET /api/webhooks/{id} shows configured topic/endpoint and a delivered test payload",
   "source": "https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-26",
   "group": "Integrations",
   "capability": "Connect e-commerce/CRM integrations (Shopify, WooCommerce, etc.)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Integrations marketplace"
   },
   "check": "Integrations page shows connected status for the installed app",
   "source": "https://www.klaviyo.com/integrations; https://www.klaviyo.com/pricing"
  },
  {
   "id": "cap-28",
   "group": "Developer Platform",
   "capability": "Authenticate and scope API access with private keys / OAuth",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "Header Authorization: Klaviyo-API-Key; OAuth flow",
    "mcp": null,
    "cli": null,
    "ui": "Settings > API Keys"
   },
   "check": "A request with the new key succeeds for its granted scope and fails (401/403) outside it",
   "source": "https://developers.klaviyo.com/en/reference/api_overview"
  },
  {
   "id": "cap-29",
   "group": "Developer Platform",
   "capability": "Upload and manage media images",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/images, POST /api/image-upload",
    "mcp": "upload_image_from_url, upload_image_from_file, update_image",
    "cli": null,
    "ui": "Content > Images"
   },
   "check": "GET /api/images/{id} returns accessible image URL",
   "source": "https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-30",
   "group": "Mobile",
   "capability": "Send mobile push notifications",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /api/push-tokens",
    "mcp": "create_push_token, get_push_tokens",
    "cli": null,
    "ui": "Campaigns > Push"
   },
   "check": "GET /api/push-tokens/{id} shows registered token; push campaign report shows delivered count",
   "source": "https://www.klaviyo.com/products/mobile-app-marketing; https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-31",
   "group": "Account Admin",
   "capability": "View account details and usage",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "GET /api/accounts",
    "mcp": "get_account_details",
    "cli": null,
    "ui": "Settings > Account"
   },
   "check": "GET /api/accounts/{id} returns account name, locale, and timezone",
   "source": "https://developers.klaviyo.com/en/docs/klaviyo_mcp_server_available_tools"
  },
  {
   "id": "cap-32",
   "group": "Account Admin",
   "capability": "Remove Klaviyo branding from emails/forms",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Branding"
   },
   "check": "Rendered template/form no longer includes Klaviyo footer branding",
   "source": "https://www.klaviyo.com/pricing"
  },
  {
   "id": "cap-33",
   "group": "Account Admin",
   "capability": "Access premium support tiers",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Help Center > Contact support"
   },
   "check": "Support ticket channel available (chat/phone) beyond free tier's 60-day email support window",
   "source": "https://www.klaviyo.com/pricing"
  },
  {
   "id": "cap-34",
   "group": "Account Admin",
   "capability": "Engage professional services / strategic consulting",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Pricing > Professional Services tab"
   },
   "check": "N/A — service engagement confirmed by contract, not product state",
   "source": "https://www.klaviyo.com/pricing"
  }
 ],
 "attempts": [
  {
   "t": "01:13",
   "cap": "discovery",
   "capability": "MCP discovery",
   "task": "server/discover on https://mcp.klaviyo.com/mcp unauthenticated",
   "route": "mcp",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "401 WWW-Authenticate: Bearer resource_metadata=\"https://mcp.klaviyo.com/.well-known/oauth-protected-resource/mcp\"; PRM 200 JSON (authorization_servers https://mcp.klaviyo.com). /mcp/server-card 401. www.klaviyo.com /.well-known/ai-catalog.json, agent-card.json, agent.json, mcp/server-card.json all 404 HTML.",
   "notes": "auth required before any MCP method; no server card"
  },
  {
   "t": "01:13",
   "cap": "discovery",
   "capability": "Docs discovery",
   "task": "llms.txt, robots.txt, markdown docs",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "www.klaviyo.com/llms.txt 200 text/plain (Agent & Headless Access section); developers.klaviyo.com/llms.txt 404; docs page with Accept: text/markdown -> 200 content-type text/markdown, vary: Accept; .md URL 200 text/markdown. robots.txt: no Content-Usage or Content-signal lines; User-agent * disallows app paths only (/campaigns, /flows, /staff/ ...).",
   "notes": ""
  },
  {
   "t": "05:24",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Find a headless sign-up route (API/CLI/agent registration)",
   "route": "none",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "No documented sign-up API; /.well-known/oauth-authorization-server on a.klaviyo.com and mcp.klaviyo.com carry no agent_auth block; https://www.klaviyo.com/sign-up is a client-rendered web form (redirects to /de/sign-up from our IP).",
   "notes": "web form only"
  },
  {
   "t": "05:24",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Create free account via web form (browser)",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "3-step form at /de/sign-up and /uk/sign-up: email+password -> company website+name -> phone number + usage select. Submitting with phone empty: inline error \"Pflichtfeld\" (DE) / \"Required\" (UK) under \"Phone number\"; UK form says \"All fields required\". No POST sent. reCAPTCHA script present, no visible challenge.",
   "notes": "Phone number is mandatory; our agent has none, so we stop here.",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "06:58",
   "cap": "discovery",
   "capability": "MCP discovery (local stdio server)",
   "task": "server/discover then initialize on official klaviyo-mcp-server 0.4.1 (PyPI, Python>=3.13) over stdio",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "server/discover -> JSON-RPC error -32602 \"Invalid request parameters\" (not -32022): legacy server. initialize offering 2026-07-28 -> protocolVersion \"2025-11-25\", serverInfo {name: klaviyo, version: 2.14.7}, capabilities tools/prompts/resources + tasks. tools/list -> 28 tools (default config), no billing/upgrade tool. tools/call klaviyo_get_account_details with an invalid key -> tool error (401 authentication_failed) returned as text content.",
   "notes": "installed in run dir venv via uv (Python 3.13.16); docs page says \"over 260 tools\" for full set"
  },
  {
   "t": "06:58",
   "cap": "discovery",
   "capability": "Agent registration / auth discovery",
   "task": "PRM + AS metadata on mcp.klaviyo.com and a.klaviyo.com",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "mcp.klaviyo.com PRM (path-suffixed /mcp) 200 JSON; AS metadata: client_id_metadata_document_supported true, registration_endpoint https://mcp.klaviyo.com/register, grants authorization_code+refresh_token, S256, authorization_response_iss_parameter_supported true. No device_authorization_endpoint, no agent_auth block. a.klaviyo.com PRM points resource https://a.klaviyo.com/staff/mcp (DCR registration_endpoint, Zitadel scopes). /auth.md, /SKILL.md, /.well-known/ucp 404 HTML.",
   "notes": "every OAuth route needs a signed-in Klaviyo user to approve in a browser"
  },
  {
   "t": "06:58",
   "cap": "pay",
   "capability": "Pay step probe",
   "task": "402 / agent payment rails / registries",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "x402./mpp./agents.klaviyo.com do not resolve (curl 6). Unauthenticated a.klaviyo.com/api/campaigns -> 401 WWW-Authenticate: Bearer, Klaviyo-API-Key (no 402). OpenAPI 3.0.2 (github.com/klaviyo/openapi stable.json, 238 paths, 345 operations): no x-payment-info, no billing paths. Not listed in x402 Bazaar or mpp.dev/api/services. MCP tools doc: Billing tools are read-only usage (list_billing_usage, get_billing_usage, beta). Pricing page: free plan (up to 250 profiles, 500 emails/month); paid upgrade only inside the web app, which we could not reach (sign-up needs a phone).",
   "notes": "no agent-native rail; checkout not observed"
  },
  {
   "t": "06:58",
   "cap": "verify",
   "capability": "verify",
   "task": "verify after sign-up",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up form requires a phone number (see signup attempt). API keys are created in Settings > API keys of a logged-in account; remote MCP OAuth needs a logged-in Owner/Admin/Manager to click Allow.",
   "notes": ""
  },
  {
   "t": "06:58",
   "cap": "credentials",
   "capability": "credentials",
   "task": "credentials after sign-up",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up form requires a phone number (see signup attempt). API keys are created in Settings > API keys of a logged-in account; remote MCP OAuth needs a logged-in Owner/Admin/Manager to click Allow.",
   "notes": ""
  },
  {
   "t": "06:58",
   "cap": "first_call",
   "capability": "The first call",
   "task": "The first call after sign-up",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up form requires a phone number (see signup attempt). API keys are created in Settings > API keys of a logged-in account; remote MCP OAuth needs a logged-in Owner/Admin/Manager to click Allow.",
   "notes": ""
  },
  {
   "t": "06:58",
   "cap": "first_action",
   "capability": "The first action",
   "task": "The first action after sign-up",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up form requires a phone number (see signup attempt). API keys are created in Settings > API keys of a logged-in account; remote MCP OAuth needs a logged-in Owner/Admin/Manager to click Allow.",
   "notes": ""
  },
  {
   "t": "06:58",
   "cap": "cap-01",
   "capability": "Create and send an email campaign",
   "task": "Attempt via POST /api/campaigns, POST /api/campaign-send-jobs",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account and no API key: sign-up requires a phone number; unauthenticated a.klaviyo.com/api/* answers 401 not_authenticated.",
   "notes": ""
  },
  {
   "t": "06:58",
   "cap": "cap-02",
   "capability": "Send SMS/MMS campaigns",
   "task": "Attempt via POST /api/campaigns (channel: sms)",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account and no API key: sign-up requires a phone number; unauthenticated a.klaviyo.com/api/* answers 401 not_authenticated.",
   "notes": ""
  },
  {
   "t": "06:58",
   "cap": "cap-03",
   "capability": "Build and activate automated flows (triggers, actions, branches)",
   "task": "Attempt via POST /api/flows, PATCH /api/flows/{id}",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account and no API key: sign-up requires a phone number; unauthenticated a.klaviyo.com/api/* answers 401 not_authenticated.",
   "notes": ""
  },
  {
   "t": "06:58",
   "cap": "cap-04",
   "capability": "Generate a campaign/flow from a prompt (Composer)",
   "task": "Attempt via documented route",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "Capability map marks plan: paid; pricing page lists it outside the free plan scope. Not reachable anyway: no account (phone required at sign-up).",
   "notes": ""
  },
  {
   "t": "06:58",
   "cap": "cap-05",
   "capability": "Autonomous customer service responses (Customer Agent)",
   "task": "Attempt via documented route",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "Capability map marks plan: paid; pricing page lists it outside the free plan scope. Not reachable anyway: no account (phone required at sign-up).",
   "notes": ""
  },
  {
   "t": "06:58",
   "cap": "cap-06",
   "capability": "Segment customers with dynamic conditions",
   "task": "Attempt via POST /api/segments",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account and no API key: sign-up requires a phone number; unauthenticated a.klaviyo.com/api/* answers 401 not_authenticated.",
   "notes": ""
  },
  {
   "t": "06:58",
   "cap": "cap-07",
   "capability": "Collect sign-ups via on-site forms (popups, embeds, flyouts)",
   "task": "Attempt via GET /api/forms (read only)",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account and no API key: sign-up requires a phone number; unauthenticated a.klaviyo.com/api/* answers 401 not_authenticated.",
   "notes": ""
  },
  {
   "t": "06:58",
   "cap": "cap-08",
   "capability": "Manage customer profiles (create/update/merge)",
   "task": "Attempt via POST /api/profiles, PATCH /api/profiles/{id}, POST /api/profile-merge",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account and no API key: sign-up requires a phone number; unauthenticated a.klaviyo.com/api/* answers 401 not_authenticated.",
   "notes": ""
  },
  {
   "t": "06:58",
   "cap": "cap-09",
   "capability": "Track behavioral/custom events per profile",
   "task": "Attempt via POST /api/events, POST /client/events",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account and no API key: sign-up requires a phone number; unauthenticated a.klaviyo.com/api/* answers 401 not_authenticated.",
   "notes": ""
  },
  {
   "t": "06:58",
   "cap": "cap-10",
   "capability": "WhatsApp marketing messaging",
   "task": "Attempt via documented route",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "Capability map marks plan: paid; pricing page lists it outside the free plan scope. Not reachable anyway: no account (phone required at sign-up).",
   "notes": ""
  }
 ],
 "stale": false,
 "icon": "/logos/klaviyo.png",
 "monitored": false,
 "verdict": "Needs a person today: an agent cannot sign up on its own, so the drive stays at L1. Our agent stopped at the sign-up form itself: a reCAPTCHA script loads but shows no visible challenge, yet the last of its steps requires a phone number, and our agent has none, so it never created an account. It never reached a key, a call or any work: no MCP connection, no API request, nothing built. Paying, cancelling and deleting were all out of reach too, since upgrading and billing live behind that same sign-up a person must complete.",
 "page": "https://agentdrives.com/tools/klaviyo?via=api"
}