Provider REST API
MarketingConnect Claude to Klaviyo
Read Klaviyo profiles, lists, segments, campaigns, flows, metrics and events. Toolspoke puts 12 of its actions behind one MCP endpoint that Claude, Cursor, and Codex all speak.
- Connection
- Provider REST API
- Authentication
- API key
- Actions exposed
- 12
- Cost per call (typical)
- 1 credit
- Adapter
- Maintained by Toolspoke
Connected in three steps
- 1
Install Klaviyo
Open the marketplace in your workspace, add Klaviyo to the project your agents work in, and it appears on the gateway immediately.
- 2
Connect the credential
Authenticate with api key. Where to get one, and what it has to be able to reach, is the next section.
- 3
Point your agent at the gateway
Give your client one address, https://toolspoke.com/mcp. Claude Code takes it as a command, Claude and Claude Desktop add it as a custom connector, and Cursor, Codex and VS Code each read it from a config file of their own.
.mcp.json{
"mcpServers": {
"toolspoke": {
"type": "http",
"url": "https://toolspoke.com/mcp"
}
}
}One block covers every tool you have installed. Klaviyo shows up in the client as soon as your policy allows it, and so does everything else you install later.
Where the address goes, per client
- Claude Code
Run it in your project, then /mcp to sign in
claude mcp add --transport http toolspoke https://toolspoke.com/mcp- Claude and Claude Desktop
Settings, then Connectors, then Add custom connector
https://toolspoke.com/mcp- Cursor
~/.cursor/mcp.json, or .cursor/mcp.json for one project
{ "mcpServers": { "toolspoke": { "url": "https://toolspoke.com/mcp" } } }- Codex
~/.codex/config.toml
[mcp_servers.toolspoke] url = "https://toolspoke.com/mcp"- VS Code
.vscode/mcp.json, or the MCP: Add Server command
{ "servers": { "toolspoke": { "type": "http", "url": "https://toolspoke.com/mcp" } } }
What Klaviyo asks for
API key. You provide it once, when you install the connector. Toolspoke encrypts it at rest and decrypts it only for the length of a single call, and the gateway attaches it to the outbound request itself, so it is never part of the arguments an agent sends.
- Private API keyRequired
- Klaviyo → Settings → API keys → Create private API key. Give it the read scopes this install needs (Profiles, Lists, Segments, Campaigns, Flows, Metrics, Events) and add Profiles write only if create_or_update_profile will be used.
- pk_…
- API revisionOptional
- Klaviyo versions its API by a dated `revision` header sent on every request, and a request without one is not accepted. 2026-07-15 is the current stable revision; each is supported for two years from release. Pin it here so an install moves deliberately rather than being moved.
- 2026-07-15
What Claude can do in Klaviyo
12 actions, each one declared and named by the connector rather than discovered at runtime. A workspace policy grants a person all of them, a hand-picked selection, everything on the read side, everything on the write side, or none.
- Reads
- 11Reads
- Writes
- 1Writes
- Destructive
- 0Destructive
Reads
11Fetches data and changes nothing.
list_profilesList profiles in the Klaviyo account. Returns real people - email addresses, phone numbers, names and custom properties - so ask for a filter rather than paging the whole account. Filters use Klaviyo's expression syntax: equals(email,'[email protected]'), any(id,["01ABC","01DEF"]), greater-than(created,2026-01-01T00:00:00Z).
get_profileFetch one profile by its Klaviyo ID, optionally with its list and segment memberships. Returns that person's contact details and properties.
list_listsList the account's lists - the manually managed audiences a person is added to or removed from, as opposed to segments, which are rule-driven. Returns list names and IDs, not their members. Klaviyo caps this endpoint at 10 per page.
get_listFetch one list by ID. Pass additional_fields ["profile_count"] to include how many people are on it - Klaviyo rate-limits that variant hard (about one call a second), so do not ask for it in a loop.
list_segmentsList the account's segments - audiences defined by rules, which Klaviyo re-evaluates continuously. Returns definitions and IDs, not the people in them. Klaviyo caps this endpoint at 10 per page.
list_campaignsList campaigns. Klaviyo rejects this endpoint without a channel filter, so `filter` always carries one and defaults to equals(messages.channel,'email'). Whatever you pass must still name a channel - combine with and(...), e.g. and(equals(messages.channel,'sms'),equals(status,'Sent')). Valid channels are email, sms and mobile_push.
get_campaignFetch one campaign by ID, with its status, schedule and audience references. Pass include to pull the campaign's messages - subject lines, preview text and template references - in the same call.
list_metricsList the metrics Klaviyo tracks for this account - Placed Order, Opened Email, Viewed Product, and anything your integrations send. Call this first to find the metric ID that query_metric_aggregates needs.
query_metric_aggregatesCount or sum a metric over a date range, optionally bucketed by interval and broken down by a property. This is the reporting action: it answers "how many orders last month", "revenue by channel", "opens per day" without returning a row per person. Get the metric ID from list_metrics. Measurements are count, sum_value, unique. Break down with group_by, e.g. ["$attributed_channel"] or ["$flow"].
list_flowsList the account's automated flows - welcome series, abandoned cart, win-back - with their status and trigger type. Returns definitions, not the people who went through them.
list_eventsList raw events - one row per thing one person did, with the event properties that came with it. Filter by metric_id or profile_id and by datetime; without a filter this is the account's whole firehose. Use query_metric_aggregates instead when the question is a total rather than a list of individual actions.
Writes
1Creates or updates something on the other side.
create_or_update_profileCreate a profile, or update one that already exists, by email, phone number or external ID. Klaviyo matches on those identifiers, so calling this twice with the same email updates rather than duplicates. Answers 201 when it created and 200 when it updated. Properties passed here replace the values already stored under those keys.
What it will not do
Enforced by the gateway rather than left to convention, which is why each of these can be stated flatly.
- It cannot call anything else
- The 12 actions above are the whole of it. A call to any other name is refused before it reaches Klaviyo rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time.
- Nothing here deletes
- This connector writes to Klaviyo, but nothing in it deletes or permanently alters anything.
- It reaches no further than your credential
- Toolspoke holds no access to Klaviyo of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either.
- It never hears from Klaviyo
- Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in Klaviyo. An agent has to ask.
- It does not smooth over provider limits
- Toolspoke does not retry, queue or back off around Klaviyo's own rate limits. A call that Klaviyo refuses comes back to the agent as a failed call.
Before you connect it
What can Claude do in Klaviyo?
12 named actions: 11 that only read and 1 that write. They include list_profiles, get_profile and create_or_update_profile. Nothing outside that list is reachable: the connector declares each operation by name rather than proxying whatever an agent asks for.
What credentials does the Klaviyo connector need?
API key. The connector asks for private api key, and optionally api revision. Values are encrypted at rest and attached to the outbound request by the gateway, so they are never part of the arguments an agent sends and never reach the audit log.
Does the Klaviyo connector work with Cursor and Codex, or only Claude?
Any client that speaks MCP, and every one of them gets the same 12 actions. There is a single address, https://toolspoke.com/mcp. Claude Code adds it with claude mcp add --transport http, Claude and Claude Desktop take it as a custom connector in settings, Cursor reads it from .cursor/mcp.json, Codex from ~/.codex/config.toml, and VS Code from .vscode/mcp.json. Each of them signs in to the gateway itself, so there is no key to paste.
What does the Klaviyo connector not do?
The 12 actions above are the whole of it. A call to any other name is refused before it reaches Klaviyo rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time. This connector writes to Klaviyo, but nothing in it deletes or permanently alters anything. Toolspoke holds no access to Klaviyo of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either. Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in Klaviyo. An agent has to ask. Toolspoke does not retry, queue or back off around Klaviyo's own rate limits. A call that Klaviyo refuses comes back to the agent as a failed call.
Can I limit which actions an agent can call?
Yes, in two places. The project switches Klaviyo's actions on and off one at a time, for everyone in the project at once, and the screen groups them by read, write and destructive so turning off everything that deletes is one click. An individual agent key can then be narrowed further, to particular toolkits in a project and to particular actions in a toolkit. Whatever it was granted, a key never reaches a project its owner cannot.
What gets recorded when an agent calls Klaviyo?
Every attempt, with the agent that made it and the person that agent belongs to, the full request payload, the response payload, the status, the duration, and the credits spent. Values whose key names a secret are masked out before the record is shown to anyone. An operation the connector marks as not retained never has its response body written at all, so the gateway keeps no second copy of what was read.