Skip to main content
Glama

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-mcp

Codex:

codex mcp add klaviyo --env KLAVIYO_KEY_MAIN=pk_your_key -- npx -y @scalably-io/klaviyo-mcp

Claude 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

  1. Create a private API key in Klaviyo under Settings > API Keys.

  2. Set one KLAVIYO_KEY_<name>=pk_xxx environment variable per account, for example KLAVIYO_KEY_MAIN or KLAVIYO_KEY_STOREONE. The server auto-discovers every KLAVIYO_KEY_* variable at startup; list_accounts shows what it found.

  3. 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 matching account argument (the name after KLAVIYO_KEY_, lowercased).

  4. All 24 tools are read-only.

Tools (24)

Tool

What it does

list_accounts

List all configured Klaviyo accounts. Use this first to see which brands are available.

list_campaigns

List recent email campaigns for a specific Klaviyo account. Returns campaign IDs, names, status, and send dates.

campaign_report

Get email campaign performance metrics for a Klaviyo account. Returns opens, clicks, revenue, bounce rate, unsubscribes for the specified time period.

list_metrics

List available metrics for a Klaviyo account. Use this to find the 'Placed Order' metric ID needed for revenue reporting.

multi_account_summary

Pull campaign performance summary from ALL configured Klaviyo accounts. Returns a unified cross-brand report.

flow_report

Get email flow (automation) performance for a Klaviyo account. Returns metrics for welcome series, abandoned cart, post-purchase, etc.

campaign_ab_report

Get per-variation (A/B arm) email/SMS campaign metrics for a Klaviyo account. Splits results by variation so you can compare arms.

flow_series_report

Time-series flow (automation) metrics for a Klaviyo account. Buckets by interval.

segment_report

Segment performance metrics for a Klaviyo account: member counts, additions, removals.

form_report

Sign-up form performance for a Klaviyo account: views, submissions, submit rate.

list_segments

List all segments in a Klaviyo account with name, member count, and creation date.

list_lists

List all email lists in a Klaviyo account with name, opt-in process, and creation date.

list_flows

List all flows (automations) in a Klaviyo account with name, status, trigger type, and last updated.

get_campaign_detail

Get full details for a single campaign by ID: name, status, send_time, subject, preview text, channel, and message IDs.

list_suppressed_profiles

List profiles suppressed from email marketing for a single reason. Klaviyo only allows equals (not any) for suppression.reason, so call once per reason for a full picture.

metric_aggregate

Aggregate values for any Klaviyo metric (e.g. opens, clicks, revenue) over a custom timeframe and interval.

get_template

Fetch an email template by ID, including HTML/text content. Use for audit/preview.

list_recent_events

List recent events for a Klaviyo account, optionally filtered by metric_id (e.g. Placed Order). Returns up to 100 most recent.

account_info

Get Klaviyo account metadata: org name, timezone, currency, contact email, industry.

list_tags

List all tags in a Klaviyo account (used to label campaigns, flows, segments, lists).

list_templates

List email templates in a Klaviyo account (name, editor type, dates). Use get_template for the HTML of one.

get_profile

Look up a customer profile by email or profile ID: name, location, and email-marketing consent/suppression status.

get_flow_detail

Get a flow's structure by ID: status, trigger, and its actions/steps (type, message channel). Use list_flows for IDs.

custom_report

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

KLAVIYO_KEY_MAIN (or any KLAVIYO_KEY_<name>)

yes

Private API key for one Klaviyo account. One variable per account; the name after KLAVIYO_KEY_ becomes the account argument.

KLAVIYO_API_BASE

no

Override the Klaviyo API base URL (default https://a.klaviyo.com/api)

KLAVIYO_RETRY_BASE_MS

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 tools
account_infoB
Read-only

Get Klaviyo account metadata: org name, timezone, currency, contact email, industry.

NameRequiredDescriptionDefault
accountYesAccount name
campaign_ab_reportA
Read-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.

NameRequiredDescriptionDefault
endNoCustom range end, YYYY-MM-DD. Defaults to today.
yearNoYear for quarter, e.g. 2024.
startNoCustom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped).
accountYesAccount name
quarterNoQuarter 1-4 (with year) - convenience for a full quarter.
timeframeNo
campaign_idNoFilter to a single campaign ID.
conversion_metric_idYesPlaced Order metric ID. Get from list_metrics.
campaign_reportA
Read-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.

NameRequiredDescriptionDefault
endNoCustom range end, YYYY-MM-DD. Defaults to today.
yearNoYear for quarter, e.g. 2024.
startNoCustom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped).
accountYesAccount name
quarterNoQuarter 1-4 (with year) - convenience for a full quarter.
timeframeNoPreset period. Default: last_30_days. Ignored if a custom range is given.
conversion_metric_idYesMetric ID for revenue tracking (Placed Order). REQUIRED by Klaviyo API. Get from list_metrics tool first.
custom_reportA
Read-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.

NameRequiredDescriptionDefault
endNoCustom range end, YYYY-MM-DD. Defaults to today.
yearNoYear for quarter, e.g. 2024.
startNoCustom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped).
filterNoRaw Klaviyo filter expression, e.g. equals(campaign_id,"01ABC"). You own its correctness.
accountYesAccount name
quarterNoQuarter 1-4 (with year) - convenience for a full quarter.
group_byNoGrouping dimensions, e.g. ["campaign_id","send_channel"].
intervalNoFor *-series-report only: hourly/daily/weekly/monthly. Default daily.
timeframeNoPreset period, OR use start/end/quarter/year.
statisticsYesStatistics to fetch, e.g. ["recipients","open_rate","conversion_value"]. Must be valid for the chosen report_type.
report_typeYesWhich 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_idNoRequired whenever you request a revenue/conversion statistic (e.g. conversion_value, conversion_rate).
flow_reportB
Read-only

Get email flow (automation) performance for a Klaviyo account. Returns metrics for welcome series, abandoned cart, post-purchase, etc.

NameRequiredDescriptionDefault
endNoCustom range end, YYYY-MM-DD. Defaults to today.
yearNoYear for quarter, e.g. 2024.
startNoCustom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped).
accountYesAccount name
quarterNoQuarter 1-4 (with year) - convenience for a full quarter.
timeframeNoPreset period. Default: last_30_days. Ignored if a custom range is given.
conversion_metric_idYesMetric ID for revenue tracking (Placed Order). REQUIRED. Get from list_metrics tool first.
flow_series_reportA
Read-only

Time-series flow (automation) metrics for a Klaviyo account. Buckets by interval. Rate limited: 2/min.

NameRequiredDescriptionDefault
endNoCustom range end, YYYY-MM-DD. Defaults to today.
yearNoYear for quarter, e.g. 2024.
startNoCustom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped).
accountYesAccount name
quarterNoQuarter 1-4 (with year) - convenience for a full quarter.
intervalNo
timeframeNo
conversion_metric_idYesPlaced Order metric ID.
form_reportA
Read-only

Sign-up form performance for a Klaviyo account: views, submissions, submit rate. Rate limited: 2/min.

NameRequiredDescriptionDefault
endNoCustom range end, YYYY-MM-DD. Defaults to today.
yearNoYear for quarter, e.g. 2024.
startNoCustom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped).
accountYesAccount name
quarterNoQuarter 1-4 (with year) - convenience for a full quarter.
timeframeNo
get_campaign_detailA
Read-only

Get full details for a single campaign by ID: name, status, send_time, subject, preview text, channel, and message IDs.

NameRequiredDescriptionDefault
accountYesAccount name
campaign_idYesCampaign ID.
get_flow_detailA
Read-only

Get a flow's structure by ID: status, trigger, and its actions/steps (type, message channel). Use list_flows for IDs.

NameRequiredDescriptionDefault
accountYesAccount name
flow_idYesFlow ID.
get_profileA
Read-only

Look up a customer profile by email or profile ID: name, location, and email-marketing consent/suppression status.

NameRequiredDescriptionDefault
emailNoEmail address to look up.
accountYesAccount name
profile_idNoProfile ID (alternative to email).
get_templateA
Read-only

Fetch an email template by ID, including HTML/text content. Use for audit/preview.

NameRequiredDescriptionDefault
accountYesAccount name
template_idYesTemplate ID.
include_htmlNoInclude full HTML body. Default false (truncated).
list_accountsA
Read-only

List all configured Klaviyo accounts. Use this first to see which brands are available.

NameRequiredDescriptionDefault

No parameters

list_campaignsA
Read-only

List recent email campaigns for a specific Klaviyo account. Returns campaign IDs, names, status, and send dates.

NameRequiredDescriptionDefault
statusNoFilter by campaign status (case-sensitive Klaviyo values). Default: all.
accountYesAccount name (e.g., 'my-store' or 'My Store')
list_flowsA
Read-only

List all flows (automations) in a Klaviyo account with name, status, trigger type, and last updated.

NameRequiredDescriptionDefault
statusNoFilter by status.
accountYesAccount name
list_listsA
Read-only

List all email lists in a Klaviyo account with name, opt-in process, and creation date.

NameRequiredDescriptionDefault
accountYesAccount name
list_metricsA
Read-only

List available metrics for a Klaviyo account. Use this to find the 'Placed Order' metric ID needed for revenue reporting.

NameRequiredDescriptionDefault
accountYesAccount name
list_recent_eventsB
Read-only

List recent events for a Klaviyo account, optionally filtered by metric_id (e.g. Placed Order). Returns up to 100 most recent.

NameRequiredDescriptionDefault
accountYesAccount name
metric_idNoFilter to events for one metric.
page_sizeNoDefault 25, maximum 100 per page.
page_cursorNoCursor from the previous page.
list_segmentsA
Read-only

List all segments in a Klaviyo account with name, member count, and creation date.

NameRequiredDescriptionDefault
accountYesAccount name
list_suppressed_profilesA
Read-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.

NameRequiredDescriptionDefault
reasonYesSuppression reason. Required - Klaviyo allows only `equals` here.
accountYesAccount name
page_cursorNoCursor from previous page.
list_tagsA
Read-only

List all tags in a Klaviyo account (used to label campaigns, flows, segments, lists).

NameRequiredDescriptionDefault
accountYesAccount name
list_templatesA
Read-only

List email templates in a Klaviyo account (name, editor type, dates). Use get_template for the HTML of one.

NameRequiredDescriptionDefault
accountYesAccount name
metric_aggregateA
Read-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.

NameRequiredDescriptionDefault
endNoCustom end YYYY-MM-DD. Defaults to now.
startNoCustom start YYYY-MM-DD. Raw events have NO 2023 floor - reaches back to account inception. Max 1 year per call.
accountYesAccount name
intervalNoNote: metric-aggregates uses singular (hour/day/week/month), NOT the series-report plural form.
metric_idYesMetric ID. Get from list_metrics.
timeframeNoPreset lookback. Use this OR start/end. Default: last_30_days.
measurementNocount, sum_value (revenue), or unique. Default count.
multi_account_summaryA
Read-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.

NameRequiredDescriptionDefault
endNoCustom range end, YYYY-MM-DD. Defaults to today.
yearNoYear for quarter, e.g. 2024.
startNoCustom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped).
quarterNoQuarter 1-4 (with year) - convenience for a full quarter.
timeframeNoPreset period. Default: last_30_days. Ignored if a custom range is given.
conversion_metric_idsNoMap 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_reportA
Read-only

Segment performance metrics for a Klaviyo account: member counts, additions, removals. Rate limited: 2/min.

NameRequiredDescriptionDefault
endNoCustom range end, YYYY-MM-DD. Defaults to today.
yearNoYear for quarter, e.g. 2024.
startNoCustom range start, YYYY-MM-DD. Overrides timeframe. Data floor: 2023-06-01 (earlier is clamped).
accountYesAccount name
quarterNoQuarter 1-4 (with year) - convenience for a full quarter.
timeframeNo

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 24 tool updatesv1.0.0
    • First observedaccount_info
    • First observedcampaign_ab_report
    • First observedcampaign_report
    • First observedcustom_report
    • First observedflow_report
    • First observedflow_series_report
    • First observedform_report
    • First observedget_campaign_detail
    • First observedget_flow_detail
    • First observedget_profile
    • First observedget_template
    • First observedlist_accounts
    • First observedlist_campaigns
    • First observedlist_flows
    • First observedlist_lists
    • First observedlist_metrics
    • First observedlist_recent_events
    • First observedlist_segments
    • First observedlist_suppressed_profiles
    • First observedlist_tags
    • First observedlist_templates
    • First observedmetric_aggregate
    • First observedmulti_account_summary
    • First observedsegment_report

TDQS

A3.6/5.0

Scored across 24 tools

Disambiguation3/5

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.

Naming Consistency3/5

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.

Tool Count3/5

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.

Completeness4/5

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

ActivityStale
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    11
    23 PyPI
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables read-only access to customer and recurring-billing state from Recurly, including accounts, subscriptions, invoices, and payment outcomes.
    296 npm
    MIT