Klaviyo MCP Server community fork adding template listing, campaign cloning, template cloning, and campaign-message template traversal tools
Server has 29 tools with consistent naming (verb_noun pattern: get_, create_, update_, track_) and all have descriptions. However, critical gaps exist: (1) Parameter descriptions are minimal or generic ('The ID of X', 'Fields to include'). (2) Output schemas are not documented, LLMs cannot predict response structure for chaining. (3) Complex nested objects (campaign_message, profile, tracking_options) lack field-level documentation. (4) No error handling guidance in descriptions. (5) All tools inject a 'model' parameter via decorator, adding noise to schemas without clear value. Tool annotations present (readOnlyHint) but underutilized.
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.
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
Creates a new email template.
Creates a new list.
Creates a new profile.
Get the details of the account. Getting information about the catalog may also be useful (use the get_catalog_items tool for this). You can view and edit your account details flow in the Klaviyo UI at https://www.klaviyo.com/settings/account
Output schemas not documented. LLMs cannot predict response structure for tool chaining. E.g., get_campaigns returns fields but no schema visible; create_campaign response fields unknown.
Parameter descriptions are generic and too short. E.g., 'Fields to include in the response', 'Filters to apply', 'Pagination cursor' lack specifics on valid values, format, or constraints. Rubric baseline: avg param description 72 chars; these average ~25 chars.
Complex nested objects (campaign_message, profile, tracking_options, send_strategy) lack field-level documentation. LLMs cannot construct valid payloads without knowing required fields, types, and constraints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 45 | 2026-07-28+ | v2 |
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
Returns campaign performance data.
Returns some or all campaigns based on filters. To get performance data, use get_campaign_report. You can view and edit a campaign in the Klaviyo UI at https://www.klaviyo.com/campaign/{CAMPAIGN_ID}/wizard
Returns items from a catalog.
Returns catalogs from the account.
Returns a specific flow.
Returns flows from the account.
Returns images from the account.
Returns a specific list.
Returns lists from the account.
Returns all campaign messages for a given campaign. A campaign message is the per-channel content for a campaign (email, SMS, push). For email channels, each message has a template associated with it which can be fetched via get_template_for_campaign_message. Use this tool to enumerate campaign messages before fetching their templates or cloning workflows.
Returns metrics from the account.
Returns a specific profile.
Returns profiles from the account.
Returns a specific segment.
Returns segments from the account.
Returns subscription information.
Returns a specific email template.
Returns the template associated with a campaign message.
Returns email templates from the account.
Track an event for a profile.
Updates an existing profile.
Upload an image to the account.
No error handling guidance in tool descriptions. LLMs cannot determine if errors are retryable, user-fixable, or fatal. E.g., 'Invalid campaign_id', should the LLM retry, search for the ID, or fail?
All tools inject a 'model' parameter via decorator for telemetry. This adds noise to schemas and is not documented in tool descriptions. LLMs must pass this parameter but its purpose is unclear.