Klaviyo MCP connector
OAuth 2.1/DCRMarketingCRM & SalesConnect to Klaviyo MCP. Report, strategize & create with real-time Klaviyo data
Klaviyo MCP connector
-
Install the SDK
Section titled “Install the SDK”Terminal window npm install @scalekit-sdk/nodeTerminal window pip install scalekit -
Set your credentials
Section titled “Set your credentials”Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret> -
Authorize and make your first call
Section titled “Authorize and make your first call”quickstart.ts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENV_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'klaviyomcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Klaviyo MCP:', link)process.stdout.write('Press Enter after authorizing...')await new Promise(r => process.stdin.once('data', r))// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'klaviyomcp_get_account_details',toolInput: { model: 'YOUR_MODEL' },})console.log(result)quickstart.py import osfrom scalekit.client import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENV_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "klaviyomcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Klaviyo MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={"model":"YOUR_MODEL"},tool_name="klaviyomcp_get_account_details",connection_name=connection_name,identifier=identifier,)print(result)
What you can do
Section titled “What you can do”Connect this agent connector to let your agent:
- Manage campaigns — create campaigns, assign email templates to campaign messages, and retrieve campaign details and performance reports
- Manage profiles — create, update, and retrieve customer profiles; subscribe and unsubscribe profiles from marketing channels
- Analyze flows and metrics — fetch flow details and reports; query and aggregate event metric data with custom dimensions
- Manage email templates — create and retrieve reusable email templates for campaigns
- Browse lists and segments — retrieve lists, segments, and catalog items to understand your audience
- Manage translations — create, update, delete, and list translation collections for multi-language content
Tool list
Section titled “Tool list”Use the exact tool names from the Tool list below when you call execute_tool. If you’re not sure which name to use, list the tools available for the current user first.
klaviyomcp_assign_template_to_campaign_message#Assigns an email template to a campaign message. This should be used after creating a template with the create_email_template tool and creating an email campaign.3 params
Assigns an email template to a campaign message. This should be used after creating a template with the create_email_template tool and creating an email campaign.
campaignMessageIdstringrequiredThe ID of the email campaign message to assign the template to.emailTemplateIdstringrequiredThe ID of the email template to assign to the campaign message.modelstringrequiredThe name of the LLM currently using the tool.klaviyomcp_create_campaign#Creates a new draft campaign. For email campaigns, this can be used with the create_email_template tool for template creation and then assign_template_to_campaign_message to assign the template to the email campaign. You can view and edit a campaign in the Klaviyo UI at https://www.klaviyo.com/campaign/{CAMPAIGN_ID}/wizard2 params
Creates a new draft campaign. For email campaigns, this can be used with the create_email_template tool for template creation and then assign_template_to_campaign_message to assign the template to the email campaign. You can view and edit a campaign in the Klaviyo UI at https://www.klaviyo.com/campaign/{CAMPAIGN_ID}/wizard
inputobjectrequiredCampaignCreateQuerymodelstringrequiredThe name of the LLM currently using the tool.klaviyomcp_create_email_template#Create a new email template from the given HTML. Returns the ID of the template. You can view and edit a template in the Klaviyo UI at https://www.klaviyo.com/email-editor/{TEMPLATE_ID}/edit.4 params
Create a new email template from the given HTML. Returns the ID of the template. You can view and edit a template in the Klaviyo UI at https://www.klaviyo.com/email-editor/{TEMPLATE_ID}/edit.
htmlstringrequired
The complete HTML of the template. Should include <html> and <body> tags.
To include an image, first upload the image using the upload_image_from_file or upload_image_from_url tool, then use the returned image URL.
Always include an unsubscribe link. Do this by inserting the template string "{% unsubscribe 'Unsubscribe' %}". You can replace 'Unsubscribe' with custom text.
To add an editable region to the template, ensure the has_editable_regions param is true and add the following:
<td align="center" data-klaviyo-region="true" data-klaviyo-region-width-pixels="600"></td>
To add an editable text block, add the following within that region:
<div class="klaviyo-block klaviyo-text-block">Hello world!</div>
To add an editable image block, add the following within that region:
<div class="klaviyo-block klaviyo-image-block"></div>
To add a universal content block, add the following within that region, replacing block_id with the ID of the universal content block:
<div data-klaviyo-universal-block="block_id"> <div>
modelstringrequiredThe name of the LLM currently using the tool.namestringrequiredThe name of the templatehasEditableRegionsbooleanoptionalWhether the template HTML contains editable regions. Should be false unless they explicitly request an editable/drag-and-drop/hybrid template.klaviyomcp_create_profile#Create a new profile. Must include either email, phone_number, or external_id. You can view and edit a profile in the Klaviyo UI at https://www.klaviyo.com/profile/{PROFILE_ID}2 params
Create a new profile. Must include either email, phone_number, or external_id. You can view and edit a profile in the Klaviyo UI at https://www.klaviyo.com/profile/{PROFILE_ID}
inputobjectrequiredProfileCreateQuerymodelstringrequiredThe name of the LLM currently using the tool.klaviyomcp_create_translation#Create a new translation collection for a Klaviyo resource. Exactly one relationship must be provided. Valid channel + relationship combinations: email → campaign-variation, flow-message, template, template-universal-content; sms → campaign-variation, flow-message; mobile_push → campaign-variation, flow-message; whatsapp → template only.7 params
Create a new translation collection for a Klaviyo resource. Exactly one relationship must be provided. Valid channel + relationship combinations: email → campaign-variation, flow-message, template, template-universal-content; sms → campaign-variation, flow-message; mobile_push → campaign-variation, flow-message; whatsapp → template only.
channelstringrequiredChannel for this translationfallbackLocalestringrequiredFallback locale (e.g. 'en')modelstringrequiredThe name of the LLM currently using the tool.relationshipIdstringrequiredID of the related resourcerelationshipTypestringrequiredType of related resourcesourceLocalestringrequiredSource locale (e.g. 'en')targetLocalesarrayrequiredTarget locales (e.g. ['fr', 'es']). Pass as a JSON array of values.klaviyomcp_delete_translation#Delete a translation collection by ID. This removes all localization settings and translation values for the resource.2 params
Delete a translation collection by ID. This removes all localization settings and translation values for the resource.
modelstringrequiredThe name of the LLM currently using the tool.translationIdstringrequiredThe ID of the translation to deleteklaviyomcp_get_account_details#Get the details of the account. You can view and edit your account details flow in the Klaviyo UI at https://www.klaviyo.com/settings/account1 param
Get the details of the account. You can view and edit your account details flow in the Klaviyo UI at https://www.klaviyo.com/settings/account
modelstringrequiredThe name of the LLM currently using the tool.klaviyomcp_get_campaign#Returns a specific campaign based on a required id. You can view and edit a campaign in the Klaviyo UI at https://www.klaviyo.com/campaign/{CAMPAIGN_ID}/wizard2 params
Returns a specific campaign based on a required id. You can view and edit a campaign in the Klaviyo UI at https://www.klaviyo.com/campaign/{CAMPAIGN_ID}/wizard
idstringrequiredNo description.modelstringrequiredThe name of the LLM currently using the tool.klaviyomcp_get_campaign_report#Returns metrics data for campaigns with the given filters and within the given timeframe. Can return performance data such as opens, clicks, and conversions, etc. This tool will also give you information about each campaign in the report, such as: audience names and IDs for the campaign (included audiences are audiences sent the campaign, excluded audiences are audiences not sent the campaign), campaign name, send time, send channel, and campaign ID.9 params
Returns metrics data for campaigns with the given filters and within the given timeframe. Can return performance data such as opens, clicks, and conversions, etc. This tool will also give you information about each campaign in the report, such as: audience names and IDs for the campaign (included audiences are audiences sent the campaign, excluded audiences are audiences not sent the campaign), campaign name, send time, send channel, and campaign ID.
conversionMetricIdstringrequiredID of the metric to be used for conversion statistics. You can get available metrics IDs using the get_metrics tool and just requesting the 'name' field. Do not use any additional filters on the get_metrics tool. If a specific metric is not requested, use the ID of the metric named 'Placed Order'. If it doesn't exist, use any metric.modelstringrequiredThe name of the LLM currently using the tool.statisticsarrayrequiredArray of strings to include in the response. Pass as a JSON array. Accepted values: "bounce_rate", "bounced", "bounced_or_failed", "bounced_or_failed_rate", "click_rate", "click_to_open_rate", "clicks", "clicks_unique", "conversion_rate", "conversion_uniques", "conversions", "delivered", "delivery_rate", "failed", "failed_rate", "open_rate", "opens", "opens_unique", "recipients", "spam_complaint_rate", "spam_complaints", "unsubscribe_rate", "unsubscribe_uniques", "unsubscribes". Example: ["bounce_rate", "bounced", "bounced_or_failed"]detailFiltersarrayoptionalArray of detail filter objects for breakdown rows. Each object must have fieldName (e.g. "tags", "audiences.included.name"), operator, and value. Example: [{"fieldName": "tags", "operator": "equals", "value": "promo"}]filtersarrayoptionalArray of filter objects. Each object must have fieldName (e.g. "send_channel", "campaign_id"), operator (e.g. "equals", "contains-any"), and value. Example: [{"fieldName": "send_channel", "operator": "equals", "value": "email"}]groupByarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "campaign_id", "campaign_message_id", "campaign_message_name", "group", "group_name", "send_channel", "tag_id", "tag_name", "text_message_format", "variation", "variation_name". Example: ["campaign_id", "campaign_message_id", "campaign_message_name"]groupByAudiencebooleanoptionalIf true, also return an aggregation of stats grouped by audience (list/segment) and send channel, combining data across campaigns.timeframestringoptionalThe timeframe to query for data within. The max length a timeframe can be is 1 year. If unspecified, use 1 year.valueStatisticsarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "average_order_value", "conversion_value", "revenue_per_recipient". Example: ["average_order_value", "conversion_value", "revenue_per_recipient"]klaviyomcp_get_campaigns#Returns some or all campaigns based on filters. You can view and edit a campaign in the Klaviyo UI at https://www.klaviyo.com/campaign/{CAMPAIGN_ID}/wizard. Do not use this for queries related to the status of campaigns, reporting on campaigns, or campaign performance data. For those use cases, use the get_campaign_report tool.6 params
Returns some or all campaigns based on filters. You can view and edit a campaign in the Klaviyo UI at https://www.klaviyo.com/campaign/{CAMPAIGN_ID}/wizard. Do not use this for queries related to the status of campaigns, reporting on campaigns, or campaign performance data. For those use cases, use the get_campaign_report tool.
channelstringrequiredWhich types of campaigns to return. To get all types of campaigns, call this tool for each channel.modelstringrequiredThe name of the LLM currently using the tool.campaignMessageFieldsarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "definition", "definition.channel", "definition.label", "definition.content", "definition.content.subject", "definition.content.preview_text", "definition.content.from_email", "definition.content.from_label", "definition.content.reply_to_email", "definition.content.cc_email", "definition.content.bcc_email", "definition.content.body", "definition.content.media_url", "definition.content.title", "definition.content.dynamic_image", "definition.render_options", "definition.render_options.shorten_links", "definition.render_options.add_org_prefix", "definition.render_options.add_info_link", "definition.render_options.add_opt_out_language", "definition.notification_type", "definition.kv_pairs", "definition.options", "definition.options.on_open", "definition.options.on_open.type", "definition.options.on_open.ios_deep_link", "definition.options.on_open.android_deep_link", "definition.options.badge", "definition.options.badge.display", "definition.options.badge.badge_options", "definition.options.badge.badge_options.badge_config", "definition.options.badge.badge_options.value", "definition.options.badge.badge_options.set_from_property", "definition.options.play_sound", "send_times", "created_at", "updated_at". Example: ["definition", "definition.channel", "definition.label"]fieldsarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "name", "status", "archived", "audiences", "audiences.included", "audiences.excluded", "send_options", "send_options.use_smart_sending", "tracking_options", "tracking_options.add_tracking_params", "tracking_options.custom_tracking_params", "tracking_options.is_tracking_clicks", "tracking_options.is_tracking_opens", "send_strategy", "send_strategy.method", "send_strategy.datetime", "send_strategy.options", "send_strategy.options.is_local", "send_strategy.options.send_past_recipients_immediately", "send_strategy.throttle_percentage", "send_strategy.date", "created_at", "scheduled_at", "updated_at", "send_time". Example: ["name", "status", "archived"]filtersarrayoptionalArray of filter objects. Each object must have fieldName (e.g. "status", "name", "archived"), operator (e.g. "equals", "contains", "any"), and value. Example: [{"fieldName": "status", "operator": "equals", "value": "Draft"}]pageCursorstringoptionalOnly used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.klaviyomcp_get_catalog_items#Get all catalog items in an account. (Also known as products)6 params
Get all catalog items in an account. (Also known as products)
modelstringrequiredThe name of the LLM currently using the tool.catalogVariantFieldsarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "external_id", "title", "description", "sku", "inventory_policy", "inventory_quantity", "price", "url", "image_full_url", "image_thumbnail_url", "images", "custom_metadata", "published", "created", "updated". Example: ["external_id", "title", "description"]fieldsarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "external_id", "title", "description", "price", "url", "image_full_url", "image_thumbnail_url", "images", "custom_metadata", "published", "created", "updated". Example: ["external_id", "title", "description"]filterarrayoptionalArray of filter objects. Each object must have fieldName (e.g. "title", "ids", "published"), operator (e.g. "contains", "any", "equals"), and value. Example: [{"fieldName": "title", "operator": "contains", "value": "shirt"}]pageCursorstringoptionalOnly used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.sortstringoptionalWhat to sort by.klaviyomcp_get_email_template#Get an email template with the given data. Returns attributes including the html or amp. You can view and edit a template in the Klaviyo UI at https://www.klaviyo.com/email-editor/{TEMPLATE_ID}/edit.2 params
Get an email template with the given data. Returns attributes including the html or amp. You can view and edit a template in the Klaviyo UI at https://www.klaviyo.com/email-editor/{TEMPLATE_ID}/edit.
modelstringrequiredThe name of the LLM currently using the tool.templateIdstringrequiredThe ID of the template returnklaviyomcp_get_events#Get individual event records for a given filter such as a profile ID or metric ID. For aggregated data, prefer get_campaign_report or get_flow_report (performance metrics) or query_metric_aggregates (counts, sums, unique profiles). Only use this tool to inspect specific events or when the other tools don't support the dimension you need — in that case, only a small sample of events can be processed in context, so clearly tell the user the results are based on a limited sample.8 params
Get individual event records for a given filter such as a profile ID or metric ID. For aggregated data, prefer get_campaign_report or get_flow_report (performance metrics) or query_metric_aggregates (counts, sums, unique profiles). Only use this tool to inspect specific events or when the other tools don't support the dimension you need — in that case, only a small sample of events can be processed in context, so clearly tell the user the results are based on a limited sample.
modelstringrequiredThe name of the LLM currently using the tool.fieldsarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "timestamp", "event_properties", "datetime", "uuid". Example: ["timestamp", "event_properties", "datetime"]filterarrayoptionalArray of filter objects. Each object must have fieldName (e.g. "metric_id", "profile_id", "datetime"), operator (e.g. "equals", "greater-than"), and value. Example: [{"fieldName": "metric_id", "operator": "equals", "value": "abc123"}]metricFieldsarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "name", "created", "updated", "integration". Example: ["name", "created", "updated"]pageCursorstringoptionalOnly used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.pageSizeintegeroptionalNumber of results to return per page (1-1000). Default is 10. Keep small (10-50) when processing results in context. Use larger values only when paginating to export or aggregate data outside of context.profileFieldsarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "email", "phone_number", "external_id", "first_name", "last_name", "organization", "locale", "title", "image", "created", "updated", "last_event_date", "location", "location.address1", "location.address2", "location.city", "location.country", "location.latitude", "location.longitude", "location.region", "location.zip", "location.timezone", "location.ip", "properties". Example: ["email", "phone_number", "external_id"]sortstringoptionalWhat to sort by.klaviyomcp_get_flow#Returns a flow by ID. You can view and edit a flow in the Klaviyo UI at https://www.klaviyo.com/flow/{FLOW_ID}/edit.2 params
Returns a flow by ID. You can view and edit a flow in the Klaviyo UI at https://www.klaviyo.com/flow/{FLOW_ID}/edit.
idstringrequiredNo description.modelstringrequiredThe name of the LLM currently using the tool.klaviyomcp_get_flow_report#Returns metrics data for flows with the given filters and within the given timeframe. Can return performance data such as opens, clicks, and conversions, etc. This tool will also give you information about each flow in the report, such as: flow name, trigger type, and flow ID.8 params
Returns metrics data for flows with the given filters and within the given timeframe. Can return performance data such as opens, clicks, and conversions, etc. This tool will also give you information about each flow in the report, such as: flow name, trigger type, and flow ID.
conversionMetricIdstringrequiredID of the metric to be used for conversion statistics. You can get available metrics IDs using the get_metrics tool and just requesting the 'name' field. Do not use any additional filters on the get_metrics tool. If a specific metric is not requested, use the ID of the metric named 'Placed Order'. If it doesn't exist, use any metric.modelstringrequiredThe name of the LLM currently using the tool.statisticsarrayrequiredArray of strings to include in the response. Pass as a JSON array. Accepted values: "bounce_rate", "bounced", "bounced_or_failed", "bounced_or_failed_rate", "click_rate", "click_to_open_rate", "clicks", "clicks_unique", "conversion_rate", "conversion_uniques", "conversions", "delivered", "delivery_rate", "failed", "failed_rate", "open_rate", "opens", "opens_unique", "recipients", "spam_complaint_rate", "spam_complaints", "unsubscribe_rate", "unsubscribe_uniques", "unsubscribes". Example: ["bounce_rate", "bounced", "bounced_or_failed"]detailFiltersarrayoptionalArray of detail filter objects. Each object must have fieldName ("name"), operator ("contains-any"), and value (array). Example: [{"fieldName": "name", "operator": "contains-any", "value": ["welcome"]}]filtersarrayoptionalArray of filter objects. Each object must have fieldName (e.g. "send_channel", "flow_id"), operator (e.g. "equals", "contains-any"), and value. Example: [{"fieldName": "send_channel", "operator": "equals", "value": "email"}]groupByarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "flow_id", "flow_name", "flow_message_id", "flow_message_name", "send_channel", "tag_id", "tag_name", "text_message_format", "variation", "variation_name". Example: ["flow_id", "flow_name", "flow_message_id"]timeframestringoptionalThe timeframe to query for data within. The max length a timeframe can be is 1 year. If unspecified, use 1 year.valueStatisticsarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "average_order_value", "conversion_value", "revenue_per_recipient". Example: ["average_order_value", "conversion_value", "revenue_per_recipient"]klaviyomcp_get_flows#Returns some or all flows based on filters. You can view and edit a flow in the Klaviyo UI at https://www.klaviyo.com/flow/{FLOW_ID}/edit. Do not use this for queries related to the status of flows, reporting on flows, or flow performance data. For those use cases, use the get_flow_report tool.5 params
Returns some or all flows based on filters. You can view and edit a flow in the Klaviyo UI at https://www.klaviyo.com/flow/{FLOW_ID}/edit. Do not use this for queries related to the status of flows, reporting on flows, or flow performance data. For those use cases, use the get_flow_report tool.
modelstringrequiredThe name of the LLM currently using the tool.fieldsarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "name", "status", "archived", "created", "updated", "trigger_type". Example: ["name", "status", "archived"]filtersarrayoptionalArray of filter objects to narrow results. Each object must have fieldName (e.g. "status", "name", "trigger_type"), operator (e.g. "equals", "contains", "any"), and value. Example: [{"fieldName": "status", "operator": "equals", "value": "live"}]pageCursorstringoptionalOnly used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.pageSizeintegeroptionalNumber of results to return per page (1-100)klaviyomcp_get_list#Get a list with the given list ID. You can view and edit a list in the Klaviyo UI at https://www.klaviyo.com/lists/{LIST_ID}3 params
Get a list with the given list ID. You can view and edit a list in the Klaviyo UI at https://www.klaviyo.com/lists/{LIST_ID}
idstringrequiredNo description.modelstringrequiredThe name of the LLM currently using the tool.includeProfileCountbooleanoptionalWhether to include the number of profiles. Only set to true if this is requested.klaviyomcp_get_lists#Get all lists in an account. To filter by tag, do not use the 'filters' parameter. Instead, call this and look for the 'tags' property in the response. You can view and edit a list in the Klaviyo UI at https://www.klaviyo.com/lists/{LIST_ID}5 params
Get all lists in an account. To filter by tag, do not use the 'filters' parameter. Instead, call this and look for the 'tags' property in the response. You can view and edit a list in the Klaviyo UI at https://www.klaviyo.com/lists/{LIST_ID}
modelstringrequiredThe name of the LLM currently using the tool.fieldsarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "name", "created", "updated", "opt_in_process". Example: ["name", "created", "updated"]filterarrayoptionalArray of filter objects. Each object must have fieldName (e.g. "name", "id"), operator (e.g. "equals", "any"), and value. Example: [{"fieldName": "name", "operator": "equals", "value": "My List"}]pageCursorstringoptionalOnly used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.sortstringoptionalWhat to sort by.klaviyomcp_get_metric#Get a metric with the given metric ID. You can view and edit a metric in the Klaviyo UI at https://www.klaviyo.com/metric/{METRIC_ID}/{METRIC_NAME}2 params
Get a metric with the given metric ID. You can view and edit a metric in the Klaviyo UI at https://www.klaviyo.com/metric/{METRIC_ID}/{METRIC_NAME}
metricIdstringrequiredThe ID of the metric to returnmodelstringrequiredThe name of the LLM currently using the tool.klaviyomcp_get_metrics#Get all metrics in an account. You can view and edit a metric in the Klaviyo UI at https://www.klaviyo.com/metric/{METRIC_ID}/{METRIC_NAME}4 params
Get all metrics in an account. You can view and edit a metric in the Klaviyo UI at https://www.klaviyo.com/metric/{METRIC_ID}/{METRIC_NAME}
modelstringrequiredThe name of the LLM currently using the tool.fieldsarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "name", "created", "updated", "integration". Example: ["name", "created", "updated"]filterarrayoptionalArray of filter objects. Each object must have fieldName (e.g. "integration.name", "integration.category"), operator ("equals"), and value. Example: [{"fieldName": "integration.name", "operator": "equals", "value": "Shopify"}]pageCursorstringoptionalOnly used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.klaviyomcp_get_profile#Get details of the profile with the given profile ID. Includes additional information about their subscriptions. You can view and edit a profile in the Klaviyo UI at https://www.klaviyo.com/profile/{PROFILE_ID}2 params
Get details of the profile with the given profile ID. Includes additional information about their subscriptions. You can view and edit a profile in the Klaviyo UI at https://www.klaviyo.com/profile/{PROFILE_ID}
idstringrequiredThe profile ID to retrieve.modelstringrequiredThe name of the LLM currently using the tool.klaviyomcp_get_profiles#Get all profiles in an account. You can view and edit a profile in the Klaviyo UI at https://www.klaviyo.com/profile/{PROFILE_ID}6 params
Get all profiles in an account. You can view and edit a profile in the Klaviyo UI at https://www.klaviyo.com/profile/{PROFILE_ID}
modelstringrequiredThe name of the LLM currently using the tool.fieldsarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "email", "phone_number", "external_id", "first_name", "last_name", "organization", "locale", "title", "image", "created", "updated", "last_event_date", "location", "location.address1", "location.address2", "location.city", "location.country", "location.latitude", "location.longitude", "location.region", "location.zip", "location.timezone", "location.ip", "properties". Example: ["email", "phone_number", "external_id"]filtersarrayoptionalArray of filter objects. Each object must have fieldName (e.g. "email", "id", "phone_number"), operator (e.g. "equals", "any"), and value. Example: [{"fieldName": "email", "operator": "equals", "value": "user@example.com"}]pageCursorstringoptionalOnly used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.pageSizeintegeroptionalNumber of results to return per page (1-100)sortstringoptionalWhat to sort by.klaviyomcp_get_segment#Get a segment with the given segment ID. You can view and edit a segment in the Klaviyo UI at https://www.klaviyo.com/lists/{SEGMENT_ID}3 params
Get a segment with the given segment ID. You can view and edit a segment in the Klaviyo UI at https://www.klaviyo.com/lists/{SEGMENT_ID}
modelstringrequiredThe name of the LLM currently using the tool.segmentIdstringrequiredNo description.includeProfileCountbooleanoptionalWhether to include the number of profiles. Only set to true if this is requested.klaviyomcp_get_segments#Get all segments in an account. To filter by tag, do not use the 'filters' parameter. Instead, call this and look for the 'tags' property in the response. You can view and edit a segment in the Klaviyo UI at https://www.klaviyo.com/lists/{SEGMENT_ID}5 params
Get all segments in an account. To filter by tag, do not use the 'filters' parameter. Instead, call this and look for the 'tags' property in the response. You can view and edit a segment in the Klaviyo UI at https://www.klaviyo.com/lists/{SEGMENT_ID}
modelstringrequiredThe name of the LLM currently using the tool.fieldsarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "name", "definition", "definition.condition_groups", "created", "updated", "is_active", "is_processing", "is_starred". Example: ["name", "definition", "definition.condition_groups"]filtersarrayoptionalArray of filter objects. Each object must have fieldName (e.g. "name", "id", "is_active"), operator (e.g. "equals", "any"), and value. Example: [{"fieldName": "name", "operator": "equals", "value": "Active Users"}]pageCursorstringoptionalOnly used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.sortstringoptionalWhat to sort by.klaviyomcp_get_translation#Get a translation collection by ID. Returns localization settings (source/target locales, channel, fallback). Set includeValues to true to also get the translation values (source text and translations per locale for each translatable field).4 params
Get a translation collection by ID. Returns localization settings (source/target locales, channel, fallback). Set includeValues to true to also get the translation values (source text and translations per locale for each translatable field).
modelstringrequiredThe name of the LLM currently using the tool.translationIdstringrequiredThe ID of the translationincludestringoptionalRelated resource to include in the responseincludeValuesbooleanoptionalInclude translation values (source text and translations per locale)klaviyomcp_get_translations#List all translation collections in the account. Each translation links a Klaviyo resource (campaign variation, flow message, template, etc.) to its localization settings. Supports filtering by channel, resource_type, and related_resource_id.4 params
List all translation collections in the account. Each translation links a Klaviyo resource (campaign variation, flow message, template, etc.) to its localization settings. Supports filtering by channel, resource_type, and related_resource_id.
modelstringrequiredThe name of the LLM currently using the tool.filterstringoptionalFilter string, e.g. equals(channel,"email") or equals(resource_type,"campaign-variation")pageCursorstringoptionalCursor for pagination (from previous response)pageSizenumberoptionalPage size (1-100, default 20)klaviyomcp_query_metric_aggregates#Query and aggregate event data for a specific metric, with optional grouping by dimensions such as flows, campaigns, messages, etc.
IMPORTANT: This endpoint returns data based on EVENT TIME (when events occurred), NOT send date. For campaign/flow performance data that matches the Klaviyo UI (which uses send date), use get_campaign_report or get_flow_report instead. Only use this tool when:
- You need to aggregate raw event data by dimensions not supported by the Reporting API, but supported by this endpoint
- You need time-series data broken down by hour/day/week/month
- The Reporting API tools (get_campaign_report, get_flow_report) don't fulfill your specific requirements
- You need to query custom metrics or non-standard aggregations
Results from this endpoint are not directly comparable to get_campaign_report or get_flow_report due to different time semantics and uniqueness definitions (not attribution — both use the same attribution framework). If cross-referencing, clearly caveat this to the user.
Examples of appropriate use cases:
- Sum of revenue by flow over a time period (use sum_value measurement with $attributed_flow grouping)
- Count of events per day/week/month for trend analysis
- Unique profile counts grouped by campaign or message
- Custom metric aggregations not available in standard reports12 params
Query and aggregate event data for a specific metric, with optional grouping by dimensions such as flows, campaigns, messages, etc. IMPORTANT: This endpoint returns data based on EVENT TIME (when events occurred), NOT send date. For campaign/flow performance data that matches the Klaviyo UI (which uses send date), use get_campaign_report or get_flow_report instead. Only use this tool when: - You need to aggregate raw event data by dimensions not supported by the Reporting API, but supported by this endpoint - You need time-series data broken down by hour/day/week/month - The Reporting API tools (get_campaign_report, get_flow_report) don't fulfill your specific requirements - You need to query custom metrics or non-standard aggregations Results from this endpoint are not directly comparable to get_campaign_report or get_flow_report due to different time semantics and uniqueness definitions (not attribution — both use the same attribution framework). If cross-referencing, clearly caveat this to the user. Examples of appropriate use cases: - Sum of revenue by flow over a time period (use sum_value measurement with $attributed_flow grouping) - Count of events per day/week/month for trend analysis - Unique profile counts grouped by campaign or message - Custom metric aggregations not available in standard reports
endDatestringrequiredEnd of the date range (exclusive) in ISO 8601 format without timezone offset, e.g. '2024-12-31T23:59:59'. Do not include a 'Z' suffix or timezone offset; use the timezone parameter instead. The date range must not exceed 1 year.measurementsarrayrequiredArray of strings to include in the response. Pass as a JSON array. Accepted values: "count", "sum_value", "unique". Example: ["count", "sum_value", "unique"]metricIdstringrequiredThe ID of the metric to aggregate. Use the get_metrics tool to find available metric IDs. Common metrics include 'Placed Order', 'Opened Email', 'Clicked Email', etc.modelstringrequiredThe name of the LLM currently using the tool.startDatestringrequiredStart of the date range (inclusive) in ISO 8601 format without timezone offset, e.g. '2024-01-01T00:00:00'. Do not include a 'Z' suffix or timezone offset; use the timezone parameter instead. The date range must not exceed 1 year.additionalFilterstringoptionalOptional structured filter to narrow results by a single dimension. Only one additional filter is supported by the API.groupByarrayoptionalArray of strings to include in the response. Pass as a JSON array. Accepted values: "$attributed_channel", "$attributed_flow", "$attributed_message", "$attributed_variation", "$campaign_channel", "$flow", "$flow_channel", "$message", "$message_send_cohort", "$usage_amount", "$value_currency", "$variation", "$variation_send_cohort", "Bot Click", "Bounce Type", "Campaign Name", "Client Canonical", "Client Name", "Client Type", "Email Domain", "Failure Source", "Failure Type", "From Number", "From Phone Region", "Inbox Provider", "List", "Message Name", "Message Type", "Method", "Segment Count", "Subject", "To Number", "To Phone Region", "URL", "form_id". Example: ["$attributed_channel", "$attributed_flow", "$attributed_message"]intervalstringoptionalTime interval for grouping results: 'hour', 'day' (default), 'week', or 'month'pageCursorstringoptionalOnly used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.pageSizeintegeroptionalNumber of rows per page. Must be between 500 and 10,000 (default 500).sortstringoptionalSort results by a grouping dimension. Prefix with '-' for descending order (e.g., '-$attributed_flow'). The sort value must also be included in the 'groupBy' parameter. Only dimension-based sorting is supported.timezonestringoptionalTimezone for processing the query (e.g., 'America/New_York', 'US/Eastern'). Defaults to UTC.klaviyomcp_subscribe_profile_to_marketing#Subscribe a profile to marketing for a given channel. If a profile doesn't already exist, it will be created. Returns 'Success' if successful.6 params
Subscribe a profile to marketing for a given channel. If a profile doesn't already exist, it will be created. Returns 'Success' if successful.
channelsarrayrequiredArray of strings to include in the response. Pass as a JSON array. Accepted values: "email", "sms". Example: ["email", "sms"]modelstringrequiredThe name of the LLM currently using the tool.emailAddressstringoptionalThe email address of the profile to subscribe. Required if email channel is included.listIdstringoptionalThe ID of the list to subscribe the profile to if provided.phoneNumberstringoptionalThe phone number of the profile to subscribe. Required if sms channel is included.profileIdstringoptionalThe ID of the profile to subscribe if the profile already exists and has an ID.klaviyomcp_unsubscribe_profile_from_marketing#Unsubscribe a profile from marketing for a given channel. Returns 'Success' if successful.5 params
Unsubscribe a profile from marketing for a given channel. Returns 'Success' if successful.
channelsarrayrequiredArray of strings to include in the response. Pass as a JSON array. Accepted values: "email", "sms". Example: ["email", "sms"]modelstringrequiredThe name of the LLM currently using the tool.emailAddressstringoptionalThe email address of the profile to unsubscribe. Required if email channel is included.listIdstringoptionalThe ID of the list to unsubscribe the profile to if provided.phoneNumberstringoptionalThe phone number of the profile to unsubscribe. Required if sms channel is included.klaviyomcp_update_profile#Update the profile with the given profile ID. You can view and edit a profile in the Klaviyo UI at https://www.klaviyo.com/profile/{PROFILE_ID}2 params
Update the profile with the given profile ID. You can view and edit a profile in the Klaviyo UI at https://www.klaviyo.com/profile/{PROFILE_ID}
inputobjectrequiredProfilePartialUpdateQuerymodelstringrequiredThe name of the LLM currently using the tool.klaviyomcp_update_translation#Update a translation's settings and/or import translation values. All attributes are optional — only provided fields are updated. To import values, first call get_translation with includeValues=true, then provide the values array with updated translations. Each value has an 'id' (composite key like 'scheduled_message::abc::subject') and a 'translations' object mapping locale codes to translated text.6 params
Update a translation's settings and/or import translation values. All attributes are optional — only provided fields are updated. To import values, first call get_translation with includeValues=true, then provide the values array with updated translations. Each value has an 'id' (composite key like 'scheduled_message::abc::subject') and a 'translations' object mapping locale codes to translated text.
modelstringrequiredThe name of the LLM currently using the tool.translationIdstringrequiredThe ID of the translation to updatefallbackLocalestringoptionalUpdated fallback localesourceLocalestringoptionalUpdated source localetargetLocalesarrayoptionalUpdated target locales. Pass as a JSON array of values.valuesarrayoptionalTranslation values to import. Pass as a JSON array of values.klaviyomcp_upload_image_from_url#Upload an image from a URL or data URI.3 params
Upload an image from a URL or data URI.
imageURLstringrequiredThe URL of the image to uploadmodelstringrequiredThe name of the LLM currently using the tool.namestringoptionalA name for the image. Defaults to the filename if omitted.