Klaviyo MCP
Klaviyo MCP is a read-only server for inspecting and reporting on Klaviyo accounts — campaigns, flows, segments, metrics, profiles, and more — across one or multiple accounts.
Account discovery: list all configured accounts and view account metadata (org, timezone, currency, industry).
Campaigns: list campaigns, get full campaign details, pull performance metrics, and compare A/B variations.
Flows: list flows, inspect flow structure/actions, and get flow performance or time-series metrics.
Segments and lists: list segments/lists and view segment performance metrics.
Forms: list form performance (views, submissions, submit rate).
Metrics and events: list available metrics, aggregate any metric (count, revenue, unique), and list recent events.
Profiles: look up profiles by email or ID and list suppressed profiles by reason.
Templates and tags: list templates, fetch template HTML/text, and list account tags.
Custom reporting: run arbitrary Klaviyo values/series reports with full control over statistics, grouping, filters, intervals, and timeframes.
Multi-account summaries: pull unified campaign performance reports across all configured Klaviyo accounts.
Safety and reliability: all tools are read-only; responses include status, summaries, and warnings; rate limits and data floor/range constraints are handled automatically.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Klaviyo MCPshow me campaign performance for the last 30 days"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Klaviyo MCP
Klaviyo MCP server. 24 read-only tools cover campaigns, flows, segments, metrics, reports, and profiles across many accounts.
Install
Claude Code:
claude mcp add klaviyo -e KLAVIYO_KEY_MAIN=pk_your_key -- npx -y @scalably-io/klaviyo-mcpCodex:
codex mcp add klaviyo --env KLAVIYO_KEY_MAIN=pk_your_key -- npx -y @scalably-io/klaviyo-mcpClaude Desktop: download klaviyo-mcp.mcpb from the latest GitHub release and open it. Claude Desktop's install form only accepts one account (KLAVIYO_KEY_MAIN).
Related MCP server: google-ads-mcp
Setup
Create a private API key in Klaviyo under Settings > API Keys.
Set one
KLAVIYO_KEY_<name>=pk_xxxenvironment variable per account, for exampleKLAVIYO_KEY_MAINorKLAVIYO_KEY_STOREONE. The server auto-discovers everyKLAVIYO_KEY_*variable at startup;list_accountsshows what it found.Multiple Klaviyo accounts (agencies, multi-brand portfolios) work only through Claude Code or Codex, since both let you pass arbitrary extra environment variables. Add as many
KLAVIYO_KEY_<name>variables as you have accounts, then call tools with the matchingaccountargument (the name afterKLAVIYO_KEY_, lowercased).All 24 tools are read-only.
Tools (24)
Tool | What it does |
| List all configured Klaviyo accounts. Use this first to see which brands are available. |
| List recent email campaigns for a specific Klaviyo account. Returns campaign IDs, names, status, and send dates. |
| Get email campaign performance metrics for a Klaviyo account. Returns opens, clicks, revenue, bounce rate, unsubscribes for the specified time period. |
| List available metrics for a Klaviyo account. Use this to find the 'Placed Order' metric ID needed for revenue reporting. |
| Pull campaign performance summary from ALL configured Klaviyo accounts. Returns a unified cross-brand report. |
| Get email flow (automation) performance for a Klaviyo account. Returns metrics for welcome series, abandoned cart, post-purchase, etc. |
| Get per-variation (A/B arm) email/SMS campaign metrics for a Klaviyo account. Splits results by variation so you can compare arms. |
| Time-series flow (automation) metrics for a Klaviyo account. Buckets by interval. |
| Segment performance metrics for a Klaviyo account: member counts, additions, removals. |
| Sign-up form performance for a Klaviyo account: views, submissions, submit rate. |
| List all segments in a Klaviyo account with name, member count, and creation date. |
| List all email lists in a Klaviyo account with name, opt-in process, and creation date. |
| List all flows (automations) in a Klaviyo account with name, status, trigger type, and last updated. |
| Get full details for a single campaign by ID: name, status, send_time, subject, preview text, channel, and message IDs. |
| List profiles suppressed from email marketing for a single reason. Klaviyo only allows |
| Aggregate values for any Klaviyo metric (e.g. opens, clicks, revenue) over a custom timeframe and interval. |
| Fetch an email template by ID, including HTML/text content. Use for audit/preview. |
| List recent events for a Klaviyo account, optionally filtered by metric_id (e.g. Placed Order). Returns up to 100 most recent. |
| Get Klaviyo account metadata: org name, timezone, currency, contact email, industry. |
| List all tags in a Klaviyo account (used to label campaigns, flows, segments, lists). |
| List email templates in a Klaviyo account (name, editor type, dates). Use |
| Look up a customer profile by email or profile ID: name, location, and email-marketing consent/suppression status. |
| Get a flow's structure by ID: status, trigger, and its actions/steps (type, message channel). Use |
| Expert escape hatch: run any Klaviyo values or series report with full control over statistics, group_by, filter, interval, and timeframe. |
Configuration
Variable | Required | Purpose |
| yes | Private API key for one Klaviyo account. One variable per account; the name after |
| no | Override the Klaviyo API base URL (default |
| no | Base delay in milliseconds for the retry backoff (default 1000) |
Reply shape
Every tool returns plain JSON with status (succeeded, partial, no_op), operation, summary, target, result, proof, warnings, recovery. Failures throw a plain error string: <code>: <message> <hint>.
Limits
Reporting endpoints (campaign_report, flow_report, campaign_ab_report, flow_series_report, segment_report, form_report, custom_report for values/series reports) are rate limited by Klaviyo to 2 requests per minute per account. Reporting data is only available from 2023-06-01 onward; a custom range starting earlier is clamped to that floor. A single reporting request cannot span more than one calendar year, so a longer custom range is auto-windowed into consecutive yearly chunks with a spacing delay between them.
Verify
Each release lists the package version, the .mcpb sha256 and the production commit it was derived from in CHANGELOG.md. CI runs the tests and a clean install of the packed tarball on every push.
Privacy Policy
This server runs locally, on your machine, under your own credentials. It collects no personal data, contains no telemetry, stores nothing persistently, and talks only to the vendor API it wraps. No third party, including Scalably, receives your data. Contact: hello@scalably.io. Canonical copy: https://scalably.io/connector-privacy.html
License
MIT. Copyright Scalably.
Available Tools
24 toolsaccount_infoBRead-only
Get Klaviyo account metadata: org name, timezone, currency, contact email, industry.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name |
campaign_ab_reportARead-only
Get per-variation (A/B arm) email/SMS campaign metrics for a Klaviyo account. Splits results by variation so you can compare arms. Rate limited: 2/min.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Custom range end, YYYY-MM-DD. Defaults to today. | |
| year | No | Year for quarter, e.g. 2024. | |
| start | No | Custom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped). | |
| account | Yes | Account name | |
| quarter | No | Quarter 1-4 (with year) - convenience for a full quarter. | |
| timeframe | No | ||
| campaign_id | No | Filter to a single campaign ID. | |
| conversion_metric_id | Yes | Placed Order metric ID. Get from list_metrics. |
campaign_reportARead-only
Get email campaign performance metrics for a Klaviyo account. Returns opens, clicks, revenue, bounce rate, unsubscribes for the specified time period. Rate limited: 2/min.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Custom range end, YYYY-MM-DD. Defaults to today. | |
| year | No | Year for quarter, e.g. 2024. | |
| start | No | Custom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped). | |
| account | Yes | Account name | |
| quarter | No | Quarter 1-4 (with year) - convenience for a full quarter. | |
| timeframe | No | Preset period. Default: last_30_days. Ignored if a custom range is given. | |
| conversion_metric_id | Yes | Metric ID for revenue tracking (Placed Order). REQUIRED by Klaviyo API. Get from list_metrics tool first. |
custom_reportARead-only
Expert escape hatch - run ANY Klaviyo values or series report with full control over statistics, group_by, filter, interval, and timeframe (preset OR custom range, auto-windowed into 1-year chunks back to the 2023-06-01 floor). Returns raw JSON results so you can analyze like a Klaviyo analyst. Use when the specialized report tools do not expose a statistic, dimension, or filter you need.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Custom range end, YYYY-MM-DD. Defaults to today. | |
| year | No | Year for quarter, e.g. 2024. | |
| start | No | Custom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped). | |
| filter | No | Raw Klaviyo filter expression, e.g. equals(campaign_id,"01ABC"). You own its correctness. | |
| account | Yes | Account name | |
| quarter | No | Quarter 1-4 (with year) - convenience for a full quarter. | |
| group_by | No | Grouping dimensions, e.g. ["campaign_id","send_channel"]. | |
| interval | No | For *-series-report only: hourly/daily/weekly/monthly. Default daily. | |
| timeframe | No | Preset period, OR use start/end/quarter/year. | |
| statistics | Yes | Statistics to fetch, e.g. ["recipients","open_rate","conversion_value"]. Must be valid for the chosen report_type. | |
| report_type | Yes | Which Klaviyo report to run. NOTE: there is no campaign-series-report - campaign reports are values-only; use metric_aggregate or per-period campaign-values for campaign trends. | |
| conversion_metric_id | No | Required whenever you request a revenue/conversion statistic (e.g. conversion_value, conversion_rate). |
flow_reportBRead-only
Get email flow (automation) performance for a Klaviyo account. Returns metrics for welcome series, abandoned cart, post-purchase, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Custom range end, YYYY-MM-DD. Defaults to today. | |
| year | No | Year for quarter, e.g. 2024. | |
| start | No | Custom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped). | |
| account | Yes | Account name | |
| quarter | No | Quarter 1-4 (with year) - convenience for a full quarter. | |
| timeframe | No | Preset period. Default: last_30_days. Ignored if a custom range is given. | |
| conversion_metric_id | Yes | Metric ID for revenue tracking (Placed Order). REQUIRED. Get from list_metrics tool first. |
flow_series_reportARead-only
Time-series flow (automation) metrics for a Klaviyo account. Buckets by interval. Rate limited: 2/min.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Custom range end, YYYY-MM-DD. Defaults to today. | |
| year | No | Year for quarter, e.g. 2024. | |
| start | No | Custom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped). | |
| account | Yes | Account name | |
| quarter | No | Quarter 1-4 (with year) - convenience for a full quarter. | |
| interval | No | ||
| timeframe | No | ||
| conversion_metric_id | Yes | Placed Order metric ID. |
form_reportARead-only
Sign-up form performance for a Klaviyo account: views, submissions, submit rate. Rate limited: 2/min.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Custom range end, YYYY-MM-DD. Defaults to today. | |
| year | No | Year for quarter, e.g. 2024. | |
| start | No | Custom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped). | |
| account | Yes | Account name | |
| quarter | No | Quarter 1-4 (with year) - convenience for a full quarter. | |
| timeframe | No |
get_campaign_detailARead-only
Get full details for a single campaign by ID: name, status, send_time, subject, preview text, channel, and message IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name | |
| campaign_id | Yes | Campaign ID. |
get_flow_detailARead-only
Get a flow's structure by ID: status, trigger, and its actions/steps (type, message channel). Use list_flows for IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name | |
| flow_id | Yes | Flow ID. |
get_profileARead-only
Look up a customer profile by email or profile ID: name, location, and email-marketing consent/suppression status.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Email address to look up. | ||
| account | Yes | Account name | |
| profile_id | No | Profile ID (alternative to email). |
get_templateARead-only
Fetch an email template by ID, including HTML/text content. Use for audit/preview.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name | |
| template_id | Yes | Template ID. | |
| include_html | No | Include full HTML body. Default false (truncated). |
list_accountsARead-only
List all configured Klaviyo accounts. Use this first to see which brands are available.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
list_campaignsARead-only
List recent email campaigns for a specific Klaviyo account. Returns campaign IDs, names, status, and send dates.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by campaign status (case-sensitive Klaviyo values). Default: all. | |
| account | Yes | Account name (e.g., 'my-store' or 'My Store') |
list_flowsARead-only
List all flows (automations) in a Klaviyo account with name, status, trigger type, and last updated.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by status. | |
| account | Yes | Account name |
list_listsARead-only
List all email lists in a Klaviyo account with name, opt-in process, and creation date.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name |
list_metricsARead-only
List available metrics for a Klaviyo account. Use this to find the 'Placed Order' metric ID needed for revenue reporting.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name |
list_recent_eventsBRead-only
List recent events for a Klaviyo account, optionally filtered by metric_id (e.g. Placed Order). Returns up to 100 most recent.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name | |
| metric_id | No | Filter to events for one metric. | |
| page_size | No | Default 25, maximum 100 per page. | |
| page_cursor | No | Cursor from the previous page. |
list_segmentsARead-only
List all segments in a Klaviyo account with name, member count, and creation date.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name |
list_suppressed_profilesARead-only
List profiles suppressed from email marketing for a single reason. Klaviyo only allows equals (not any) for suppression.reason, so call once per reason if you need a full picture. Up to 100 per call. Use cursor for pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Suppression reason. Required - Klaviyo allows only `equals` here. | |
| account | Yes | Account name | |
| page_cursor | No | Cursor from previous page. |
list_tagsARead-only
List all tags in a Klaviyo account (used to label campaigns, flows, segments, lists).
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name |
list_templatesARead-only
List email templates in a Klaviyo account (name, editor type, dates). Use get_template for the HTML of one.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account name |
metric_aggregateARead-only
Aggregate values for any Klaviyo metric (e.g. opens, clicks, revenue) over a custom timeframe + interval. More flexible than campaign/flow reports - use for any metric.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Custom end YYYY-MM-DD. Defaults to now. | |
| start | No | Custom start YYYY-MM-DD. Raw events have NO 2023 floor - reaches back to account inception. Max 1 year per call. | |
| account | Yes | Account name | |
| interval | No | Note: metric-aggregates uses singular (hour/day/week/month), NOT the series-report plural form. | |
| metric_id | Yes | Metric ID. Get from list_metrics. | |
| timeframe | No | Preset lookback. Use this OR start/end. Default: last_30_days. | |
| measurement | No | count, sum_value (revenue), or unique. Default count. |
multi_account_summaryARead-only
Pull campaign performance summary from ALL configured Klaviyo accounts. Returns a unified cross-brand report. Rate limited: 2/min per account - may take several minutes for many accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Custom range end, YYYY-MM-DD. Defaults to today. | |
| year | No | Year for quarter, e.g. 2024. | |
| start | No | Custom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped). | |
| quarter | No | Quarter 1-4 (with year) - convenience for a full quarter. | |
| timeframe | No | Preset period. Default: last_30_days. Ignored if a custom range is given. | |
| conversion_metric_ids | No | Map of account name → Placed Order metric ID (from the klaviyo skill table). STRONGLY recommended: accounts often have duplicate "Placed Order" metrics and auto-discovery can pick the wrong one (revenue reads $0). Keys match names from list_accounts. |
segment_reportARead-only
Segment performance metrics for a Klaviyo account: member counts, additions, removals. Rate limited: 2/min.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Custom range end, YYYY-MM-DD. Defaults to today. | |
| year | No | Year for quarter, e.g. 2024. | |
| start | No | Custom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped). | |
| account | Yes | Account name | |
| quarter | No | Quarter 1-4 (with year) - convenience for a full quarter. | |
| timeframe | No |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
24 tool updates
v1.0.0- First observed
account_info - First observed
campaign_ab_report - First observed
campaign_report - First observed
custom_report - First observed
flow_report - First observed
flow_series_report - First observed
form_report - First observed
get_campaign_detail - First observed
get_flow_detail - First observed
get_profile - First observed
get_template - First observed
list_accounts - First observed
list_campaigns - First observed
list_flows - First observed
list_lists - First observed
list_metrics - First observed
list_recent_events - First observed
list_segments - First observed
list_suppressed_profiles - First observed
list_tags - First observed
list_templates - First observed
metric_aggregate - First observed
multi_account_summary - First observed
segment_report
TDQS
Scored across 24 tools
Most tools target a distinct Klaviyo resource, but the reporting tools overlap: campaign_report, campaign_ab_report, multi_account_summary, metric_aggregate, and custom_report all provide performance data with subtle scoping differences. list_accounts and account_info also have unclear boundaries. Descriptions help, but an agent could still misselect between metric_aggregate and custom_report.
The list_ and get_ prefixes are used consistently for resource retrieval, but the reporting tools mix conventions: noun_report, noun_ab_report, noun_series_report, multi_account_summary, metric_aggregate, and custom_report. All names are readable and snake_case, but the pattern is not uniform.
24 tools is at the top of the heavy range for a single-domain server. The count is justifiable given Klaviyo's many resources, but several reporting tools (campaign_report, campaign_ab_report, flow_report, flow_series_report, metric_aggregate, custom_report) overlap in purpose and make the surface feel larger than necessary.
The tool set covers read-only reporting and retrieval across campaigns, flows, segments, lists, templates, forms, metrics, events, and profiles. Minor gaps exist, such as no list_forms tool, no profile search/list beyond get_profile, and no paginated event history, but agents can work around these with the existing tools and custom_report.
Maintenance
Related MCP Connectors
Read-only access to your Klar marketing attribution and profit data.
Read-only access to your Consequential eCommerce marketing analytics and attribution data.
Read-only access to your CodeMouse accounts, repositories, and AI pull-request reviews.
Read-only website traffic, conversions, revenue, funnels and performance analytics.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceRead-only access to Stripe data including customers, charges, subscriptions, balance, and invoices.287 npmMIT
- AlicenseAqualityBmaintenanceEnables read-only access to Google Ads data through GAQL queries, resource exploration, recommendations, keyword planning and forecasts, and change history across manager and customer accounts.1123 PyPIMIT
- AlicenseNot gradedqualityCmaintenanceEnables read-only access to customer and recurring-billing state from Recurly, including accounts, subscriptions, invoices, and payment outcomes.296 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables inspecting customer-data sources, destinations, connections, and warehouses through Segment's Public API with read-only access.299 npmMIT