
This connects Sequenzy's email marketing platform to your AI assistant so you can manage subscribers, campaigns, sequences, and transactional templates without writing API calls. You get 59 tools covering the full lifecycle: add and segment subscribers, draft and schedule campaigns, build multi-step automations triggered by events or segment entry, inspect analytics and deliverability, and generate email copy. Setup is a one-liner with npx and an API key. The segment builder supports nested AND/OR logic, attribute filters, engagement events, and Stripe product rules. Reach for this when you're running email marketing ops from Claude and want structured tooling instead of curl scripts.
Official MCP server for Sequenzy, the AI-powered email marketing platform.
Connect Sequenzy to Claude Desktop, Claude Code, Codex, Cursor, Windsurf, VS Code Copilot, OpenClaw, and other MCP clients so your AI assistant can manage email operations with structured tools instead of hand-written API calls.
Every published MCP tool includes explicit readOnlyHint, destructiveHint, and openWorldHint annotations so compatible clients can display accurate tool-use affordances. Tools also publish outputSchema definitions and return structuredContent, giving clients and models machine-readable result shapes for follow-up calls.
The easiest setup path is the Sequenzy wizard:
npx @sequenzy/setup
The wizard opens the browser login flow, creates a personal API key, detects supported AI clients, and configures them automatically when possible.
For clients that support Streamable HTTP MCP, use Sequenzy's hosted endpoint instead of running a local stdio process:
https://api.sequenzy.com/v1/mcp
Remote clients should authenticate with the Sequenzy OAuth flow when supported. Local and automation clients can still use the stdio package below with SEQUENZY_API_KEY.
The hosted endpoint and the stdio package support MCP specification
2026-07-28 while remaining compatible with 2025-era clients. Modern HTTP
clients use per-request discovery and method headers; existing clients keep
working through the same endpoint and package command.
Machine-readable discovery files:
server.json.well-known/agent-card.jsonagent-capability.jsonopenclaw/skill.jsonAll stdio MCP clients use the same command:
npx-y @sequenzy/mcpSEQUENZY_API_KEY=seq_user_your_key_hereOptional environment variables:
SEQUENZY_API_URL - Sequenzy API base URL. Defaults to https://api.sequenzy.com.SEQUENZY_APP_URL - Sequenzy dashboard base URL used by app URL helpers. Defaults to https://sequenzy.com.Add this to your Claude Desktop config:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json{
"mcpServers": {
"sequenzy": {
"command": "npx",
"args": ["-y", "@sequenzy/mcp"],
"env": {
"SEQUENZY_API_KEY": "seq_user_your_key_here"
}
}
}
}
Restart Claude Desktop after editing the config.
claude mcp add --scope user --env=SEQUENZY_API_KEY=seq_user_your_key_here sequenzy -- npx -y @sequenzy/mcp
On native Windows, wrap npx with cmd /c:
claude mcp add --scope user --env=SEQUENZY_API_KEY=seq_user_your_key_here sequenzy -- cmd /c npx -y @sequenzy/mcp
For a shared project config, use .mcp.json:
{
"mcpServers": {
"sequenzy": {
"command": "npx",
"args": ["-y", "@sequenzy/mcp"],
"env": {
"SEQUENZY_API_KEY": "seq_user_your_key_here"
}
}
}
}
codex mcp add sequenzy --env SEQUENZY_API_KEY=seq_user_your_key_here -- npx -y @sequenzy/mcp
codex mcp list
Manual Codex config in ~/.codex/config.toml:
[mcp_servers.sequenzy]
command = "npx"
args = ["-y", "@sequenzy/mcp"]
[mcp_servers.sequenzy.env]
SEQUENZY_API_KEY = "seq_user_your_key_here"
Install Sequenzy from the Cursor Marketplace for a hosted connection with Sequenzy OAuth. The plugin connects to:
https://api.sequenzy.com/v1/mcp
After installing, complete the browser sign-in flow. Cursor's agent can then use Sequenzy tools from chat, including when Grok is the selected model.
For a manual local stdio setup instead, add this to ~/.cursor/mcp.json:
{
"mcpServers": {
"sequenzy": {
"command": "npx",
"args": ["-y", "@sequenzy/mcp"],
"env": {
"SEQUENZY_API_KEY": "seq_user_your_key_here"
}
}
}
}
Use the same JSON shape as Cursor.
~/Library/Application Support/Windsurf/mcp.json%APPDATA%\Windsurf\mcp.jsonVS Code uses a servers object:
{
"servers": {
"sequenzy": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@sequenzy/mcp"],
"env": {
"SEQUENZY_API_KEY": "seq_user_your_key_here"
}
}
}
}
For OpenClaw, Hermes, and other MCP-compatible clients, point the client at npx -y @sequenzy/mcp and set SEQUENZY_API_KEY.
Personal keys start with seq_user_. You can revoke them any time in the dashboard.
Company keys can also be cleaned up without exposing secrets. Call
list_api_keys to compare the key ID, name, non-secret prefix, permissions,
last-use timestamp, and isCurrent marker, then pass the exact ID to
revoke_api_key. delete_api_key is a compatibility alias for the same
permanent operation. List and revoke responses never contain the plain key or
stored key hash.
If a tool reports a missing scope such as campaigns:read or
templates:write, call get_account. Its apiKeyPermissions field lists the
current key identity and type, scopes, common missing marketing read scopes, and
a direct manageUrl. Personal keys open Account API Keys; company keys open the
selected workspace's API Keys settings. If the key does not include
account:read, open the
Sequenzy dashboard directly and choose the
matching API Keys page.
Permissions are editable in place, so open manageUrl, update the active key,
and retry the failed tool without replacing the credential or restarting the
client. An agent using a company key with api_keys:manage can instead call
update_api_key; personal keys must be edited on the account-level page because
that tool only manages company keys. Its scopes and preset inputs replace
the whole permission selection rather than merging, so preserve every existing
scope that is still needed. Hosted OAuth connections can alternatively
disconnect and reauthorize with broader permissions.
When the active key itself lacks api_keys:manage, call
request_api_key_handoff instead of retrying update_api_key. It requires
account:read and returns an owner-review URL with the requested key name,
permissions, and optional predecessor prefilled. It never creates or returns a
key; the workspace owner reviews the form, creates the replacement in the
browser, and copies it into the client. Pass replaceApiKeyId: "current" to
offer revocation of the active key after the replacement is created. If the
active key also lacks account:read, use the dashboard directly.
The default Safer agent access preset includes lists:write and
tags:write, so agents can create and update list and tag definitions, and it
includes subscribers:tag for applying tags to existing contacts. It also
includes ab_tests:read, ab_tests:write, and sequences:write, so agents can
audit and edit sequence A/B variant copy, including cart and browse abandonment
messages. It does not include subscribers:write, so it cannot add contacts to
lists or remove them from lists. Deleting a list or tag still requires the
matching lists:delete or tags:delete permission.
The AI drafting preset includes subscribers:write, so drafting agents can
build a list as well as create it. Imports that apply listIds also need
lists:write; sequence enrollment or double-opt-in delivery additionally needs
automations:trigger.
This server currently exposes 239 MCP tools.
Tools reject arguments they do not declare instead of silently ignoring them. Errors name the unsupported fields, list the supported arguments, and provide focused guidance for common mistakes such as invented subscriber filters or sort options.
| Tool | Description |
|---|---|
get_account | Get account info, available companies, current key permissions, and the API Keys management URL. |
select_company | Set the active company for future tool calls. |
get_app_urls | Build dashboard URLs for campaigns, landing pages, sequences, emails, settings, subscription management, domains, and sent email details. settingsTab: "billing" resolves to Account -> Subscription. |
create_company | Create a new company or brand. |
get_company | Read company details, product info, brand context, localization, reply-tracking settings, current From/Reply-To defaults, and the effective read-only emailBranding entitlement with plan/status reason and subscription URL; STO is explicitly identified as campaign-only. |
update_company | Edit product info, brand context, email theme, reply tracking, and account-wide From/Reply-To profile defaults or names. |
get_sync_rules | Read the company's event-to-tag rules and whether it uses the inherited platform preset. |
update_sync_rules | Replace all sync rules; pass [] to disable them or null to opt into the SaaS/ecommerce platform preset. |
get_shopify_automation_settings | Read browse-abandonment, cart-abandonment, and price-drop settings for the connected Shopify store. |
update_shopify_automation_settings | Partially update Shopify automation settings or reset an individual section to its platform defaults. |
create_api_key | Create an API key for a company, with optional permission preset or explicit scopes. |
request_api_key_handoff | Prepare an owner-reviewed create/rotation URL when the active key cannot manage API keys itself. |
list_api_keys | List company API keys as non-secret metadata for safe identification and cleanup. |
update_api_key | Rename a company API key or replace its permission preset or scopes without changing the key value. |
revoke_api_key | Permanently revoke an exact company API key by ID after checking it with list_api_keys. |
delete_api_key | Compatibility alias for revoke_api_key. |
list_websites | List sending domains with stored aggregate, SPF, DKIM, and MAIL FROM status. |
add_sending_domain | Add a sending domain and return its cohort-specific DNS setup records. |
add_website | Compatibility alias for add_sending_domain. |
check_website | Read a sending domain's stored SPF, DKIM, MAIL FROM, and aggregate verification details. |
verify_sending_domain | Run a fresh sending-domain DNS/provider verification and return current status and diagnostics. |
list_integrations | List connected integrations with connection and sync health, without returning credentials. |
get_sending_status | Diagnose active, paused, or suspended sending, including enforcement denominators, review gates, and remediation steps. |
resume_sending | Restore an eligible hard-bounce pause after explicitly confirming the list has been sanitized. |
get_tracking_settings | Read account-wide and Transactional API open/click defaults, unsubscribe, attribution, UTM, click-domain, reply-tracking, and double-opt-in settings. |
update_tracking_settings | Update account-wide and Transactional API tracking defaults, attribution, UTM, and account-wide double opt-in. |
get_integration_guide | Get framework-specific integration examples. |
get_integration | Inspect one connected integration, its event wiring, list targeting, recent activity, and recommendations. |
list_integration_capabilities | Compare provider capabilities whether or not they are connected. |
connect_integration | Connect supported API-key or webhook-secret providers, including outbound-only Attio and optional PostHog/Segment history import. |
get_event_schema | Inspect published event payload examples, property paths, types, and merge tags by provider. |
list_integration_activity | Read the retained integration-specific webhook and sync activity log. |
set_integration_sync_enabled | Enable or disable bulk imports and backfills while leaving live webhooks connected. |
set_integration_list_targeting | Choose which lists contacts created by a supported integration join on future provider writes. |
sync_integration | Queue payment revenue, Supabase users, or a PostHog/Segment event-history import using the saved integration configuration. |
get_integration_pixel | Read Shopify's live pixel/configuration state and distinguish confirmed dark events from an unknown read. |
activate_integration_pixel | Install or repoint Shopify's storefront pixel; idempotent when it is already current. |
list_web_tracking_keys | List publishable website-tracking keys, origin restrictions, usage state, and install snippets. |
get_web_tracking_key | Get one website-tracking key with its exact install snippet and ingest endpoint. |
create_web_tracking_key | Create a publishable tracking key for a non-Shopify storefront or website. |
update_web_tracking_key | Rename, restrict, revoke, or re-enable a website-tracking key. |
delete_web_tracking_key | Permanently delete a website-tracking key after its snippet has been removed. |
list_sender_profiles | List sender and reply-to profiles, defaults, and sending-domain readiness. |
update_sender_profile | Rename one sender or reply-to profile without changing the account defaults. |
get_notification_preferences | Read the current user's per-company account notification settings and supported modes. |
update_notification_preferences | Update the current user's account notification delivery modes without affecting teammates. |
render_email | Render final email-safe HTML and diagnose unresolved merge tags, including typos hidden by defaults. |
get_sending_status keeps the Postgres-backed pause state, review gates, and
remediation available when sender-health analytics are temporarily unavailable;
in that degraded case senderHealth is null.
render_email returns unresolvedMergeTags so callers can distinguish an
unknown name from a recognized tag that is merely blank for the previewed
contact. Unknown names are reported even when a default filter supplied text:
for example, {{ subscriber.frstName | default: "there" }} renders a plausible
greeting for every contact while bypassing stored first names. A recognized
name that is blank for one contact is not reported when its default is used.
To render a sequence step whose nodeType is action_ab_test, pass the
step's sequenceId and nodeId together with a variantId from
get_sequence.sequence.emails[].abTest.variants. These steps have no email of
their own, so the variant is required; reading and rendering their competing
copy also requires the ab_tests:read scope.
For Supabase, sync_integration reuses the project, schema, table, list
selection, and consent mappings saved in the dashboard. It cannot target an
arbitrary table. Run it after installing the live database trigger to import
users who existed before the trigger was installed, then poll get_integration
and list_integration_activity for progress and row-level outcomes.
set_integration_sync_enabled controls bulk imports and backfills only; it
does not stop a provider's live webhook from creating contacts. Use
set_integration_list_targeting to choose their future list memberships:
null follows workspace defaults, [] joins no list, and a populated array
targets those lists. The change is not retroactive and never removes existing
memberships. It also does not stop default any_contact sequences, which
enroll list-less contacts; explicit any_list and specific-list sequences
require a matching membership. Pair list targeting with
pause_sequence_enrollments when those default enrollments must stop too.
Supabase, Stripe, Shopify, Wix, and Webflow support this control.
For PostHog, sync_integration restarts the event-history import from the
beginning with the stored personal API key. Imported events are deduplicated, so
retrying a failed import does not create duplicates.
For Segment, connect_integration can optionally import recent event history
from Unify after the live webhook is connected. The import walks existing
contacts through the Profile API, covers the API's most recent 14 days, skips
contacts without a matching profile, and safely deduplicates retries and live
webhook overlap. New connections skip automatic page/screen calls unless those
names are explicitly allowlisted. Segment webhook secrets must be 16-153 UTF-8
bytes. Use sync_integration to retry with the saved credentials.
For Attio, connect_integration accepts a workspace access token without a
webhook secret. Optionally pass settings.listMap as a map of Sequenzy list IDs
to Attio people-list UUIDs or API slugs, plus syncCompanyFromDomain to control
company matching from non-free-mail domains. The integration is outbound-only:
new joins to mapped Sequenzy lists upsert the person and add them to the Attio
list; list removals do not remove records from Attio.
Call get_event_schema before writing an {{event.*}} merge tag or an event
property filter. Omit eventName to list documented built-in events; provide
an event name to receive provider-specific example payloads and property paths,
and optionally filter by provider. Custom event names remain valid even when
the result reports documented: false; that only means no reference sample is
published. Use integration activity or sequence enrollments for actual delivery
data because this tool returns static reference data.
For a new sending domain, call add_sending_domain, publish the DNS records in
the returned website.dnsRecords, wait for DNS propagation, and then call
verify_sending_domain. Publish every returned record instead of assuming a
fixed provider or record count: unified domains include required DMARC, while
legacy domains can return Amazon SES MAIL FROM and inbound-reply records. If
verification is attempted before creation, the error points back to
add_sending_domain with the requested domain.
For Shopify, call get_integration_pixel before relying on product views,
cart activity, or browse-abandonment triggers. The result is read live from
Shopify because merchants can remove the pixel independently. If
pixel.healthy is false, dependentEvents names the triggers that cannot
arrive; call activate_integration_pixel to install or repoint the pixel.
Activation is idempotent, and events begin on the next storefront visit rather
than being backfilled.
For custom, headless, ticketing, or SaaS websites, use
list_web_tracking_keys before relying on product-view or cart triggers. Create
a key with an explicit origin allowlist, install the returned installSnippet,
then have the customer's authenticated backend mint a short-lived proof through
POST /api/v1/web-tracking-identities and call
sequenzy.identify(email, identityToken) at sign-in or checkout. A publishable
key alone only records anonymous activity and cannot trigger subscriber
automation. The returned snippet installs synchronous method stubs before its
async loader, so identity and event calls made during page bootstrap are queued
until the SDK is ready. Prefer revoking a key with update_web_tracking_key
before permanently deleting it.
New companies start with no sync rules. The inherited preset remains available
for SaaS/ecommerce companies by passing null to update_sync_rules; services
and consulting companies should normally keep [] or define explicit rules.
Use list_sender_profiles to find the profile ID, then call
update_sender_profile to change only its display name. Pass type: "reply"
for a reply-to profile; sender is the default. The address, sending domain, and
account-wide default From/Reply-To selections remain unchanged. Renaming
requires the companies:manage scope.
Shopify cart abandonment is enabled by default. It fires
ecommerce.cart_abandoned after one hour of cart inactivity, with a 24-hour
per-subscriber cooldown. Use update_shopify_automation_settings to change the
cartAbandonment.enabled, delayHours, or cooldownHours fields; pass
cartAbandonment: null to restore those defaults without changing browse
abandonment or price-drop settings. Timing values must be positive;
delayHours is capped at 168 and cooldownHours at 720.
| Tool | Description |
|---|---|
add_subscriber | Add one subscriber; status is creation-only, so use update_subscriber for an existing contact. |
create_subscriber_import | Queue up to 5,000 full CRM records with an optional retry-safe idempotencyKey; enabled email-hygiene checks continue separately after ingestion. |
get_subscriber_import | Read progress, row outcome counts, and failure summaries for a queued import. |
update_subscriber | Update native profile and phone fields, SMS consent, attributes, tags, or global status. |
remove_subscriber | Unsubscribe while preserving suppression history, or permanently delete only with hardDelete: true. |
get_subscriber | Fetch subscriber details by email or external ID. |
search_subscribers | Search by query, tags, list, status, segment, or one custom attribute, with automatic or resumable pagination. |
trigger_subscriber_event | Emit one custom event exactly as an integration would, applying sync rules and matching sequence triggers. |
trigger_subscriber_events | Emit several ordered custom events for one subscriber. |
import_subscriber_events | Import up to 25 source-identified events across contacts; silent history requires every row for a contact to be over an hour old. |
bulk_add_subscriber_tags | Add tags to up to 500 existing subscribers; requires subscribers:tag and may also require tags:write. |
bulk_remove_subscriber_tags | Remove tags from up to 500 existing subscribers; requires subscribers:tag or subscribers:write. |
Use create_subscriber_import for CRM onboarding instead of looping over
add_subscriber. One call accepts 5,000 full records and returns an asynchronous
import ID; poll it with get_subscriber_import. A completed import can still
contain row failures, so inspect failedCount and failedReasons. Every
excluded row is accounted for: skippedReasons sums to skippedCount, and
failedReasons sums to failedCount. Report any shortfall with the import ID
instead of guessing which rows were omitted. When email hygiene is enabled,
deliverability checks continue separately after ingestion and results appear
in List health; import status does not wait for or include those verdicts.
Invalid verdicts are suppressed from later sends. Use optInMode: "confirmed"
only when consent was already verified.
For import_subscriber_events, email is required when a row may create a new
contact; externalId can stand alone only for an existing contact. Supply a
stable eventId on every row. Retrying reuses the original receipt and
idempotently re-attempts downstream recovery. Historical classification is per
contact: if any row for a contact is recent, that contact's whole group uses
the live side-effect path.
For compliance suppression, call update_subscriber with
status: "unsubscribed" (or use remove_subscriber without hardDelete). Do
not retry add_subscriber with a different status: status on that tool applies
only when the contact is first created, and a mismatched skipped result is
reported as an error.
When add_subscriber omits listIds, a contact created by the call follows
the workspace default lists while an existing contact keeps its current list
memberships. Pass list IDs explicitly when an existing contact should join
specific lists; pass [] to target no lists.
update_subscriber.phone writes the native phone field shown on the contact,
not a custom attribute. Pass smsConsent: true only after verifying express
written consent, or false to opt the contact out. Changing the phone without
smsConsent resets SMS consent because consent belongs to the old number.
add_subscriber, update_subscriber, and create_subscriber_import accept an
IANA timezone such as America/New_York. The value is stored on the native
contact profile and enables recipient-local campaign delivery. Pass an empty
timezone to update_subscriber to clear it; invalid import-row values are
ignored without rejecting the rest of the import.
| Tool | Description |
|---|---|
list_products | List synced products from Stripe, Shopify, WooCommerce, manual, or Commerce API data. |
upsert_products | Create or update up to 100 Commerce API products keyed by your product ID. |
delete_product | Delete a product previously pushed through the Commerce API. |
attach_product_file | Attach a hosted or locally uploaded delivery file to a product. |
remove_product_file | Remove an attached product delivery file. |
sync_products | Queue a Stripe product catalog sync, optionally selecting an integration by ID. |
After a product delivery file is attached, matching purchase events include download.url and download.name, so purchase-triggered emails can use merge tags like {{event.download.url}}.
For Stripe products, list_products returns every active price as a variant, with the Stripe price ID in variantId. Use that ID to target an exact price in a purchase sequence even when it is not the product's default price.
| Tool | Description |
|---|---|
upload_image_asset | Upload an email image and return its hosted media record plus a ready-to-insert image block. |
The tool accepts PNG, JPEG, GIF, and WebP images up to 5MB. Local stdio clients
can pass filePath. Hosted/remote clients that can access attachment bytes can
pass imageBase64 with filename. Provide altText for accessibility, then
use displayWidthPercent, cropHeight, objectFit (cover or contain), and
align to standardize screenshot presentation. The returned imageBlock can
be copied directly into the block array accepted by campaign, sequence,
template, and transactional-email tools.
Authenticated image bytes are always uploaded to the origin configured by
SEQUENZY_API_URL, even if a reverse proxy returns an equivalent upload URL
under another host. API credentials are never forwarded to that alternate
origin.
{
"filePath": "/Users/me/Desktop/product-results.png",
"altText": "Product results dashboard",
"displayWidthPercent": 100,
"cropHeight": 320,
"objectFit": "cover",
"align": "center"
}
| Tool | Description |
|---|---|
list_tags | List all tags. |
create_tag | Create a tag definition with an optional color. |
update_tag | Update a tag color. |
delete_tag | Delete a tag and remove it from subscribers. |
list_lists | List subscriber lists. |
create_list | Create a subscriber list. |
update_list | Rename or describe a subscriber list. |
delete_list | Delete a subscriber list. |
add_subscribers_to_list | Add up to 500 subscribers to a list from an email array. |
remove_subscribers_from_list | Remove up to 500 subscribers from a list. |
list_segments | List saved segments and counts. |
create_segment | Create nested or same-element array-filtered segments. |
update_segment | Update segment name, filters, root group, or join operator. |
delete_segment | Delete a segment (requires segments:delete). |
get_segment_count | Preview the active subscriber count for a segment. |
For subscriber exports, search_subscribers accepts listId, exact listName,
or list (ID first, then exact name). It also accepts attribute plus
attributeValue, with attributeOperator for contains, numeric comparisons,
or is_not_empty; the combined "attributeName:value" form remains supported.
Filters combine with AND; use a saved segment for OR logic, nested groups,
exclusions, engagement, or event conditions. If limit is omitted, the tool
fetches every matching page automatically. For chunked reads, pass limit and
follow pagination.nextCursor (or pagination.nextOffset) while hasMore is
true. offset and page are supported below 1,000,000 skipped matches; use the
cursor for deeper audiences.
For bulk list population, use add_subscribers_to_list; the backing API endpoint is POST /api/v1/lists/{listId}/subscribers with no /bulk suffix:
{
"emails": ["ada@example.com", "grace@example.com"],
"duplicateStrategy": "skip",
"enrollInSequences": false,
"optInMode": "default"
}
Send at most 500 emails per request. Standard API rate limits still apply: 100 requests per minute per API key and 20 requests per second burst. For CSV-driven CLI imports, accepted email headers include email, e-mail, email address, and mail; if no recognized header exists, the CLI reads the first column.
Segment filters support attributes, events, saved segment membership, engagement events, Stripe product purchase rules, and commerce product purchase rules. Use filterJoinOperator: "or" for match-any segments, or pass a v2 root group for nested logic.
For array-of-object attributes, use wildcard paths such as
history_events[].eventvenue_id:2103. When an AND group also filters
history_events[].showing_date, both conditions must match one shared
history_events[] element; values from unrelated history entries are not
combined. Deleting a segment requires segments:delete; segments:write is
not sufficient.
Each segment filter field validates its own operators:
status, segment: is, is_nottag: contains, not_contains, is_empty, is_not_emptyemail: contains, not_containsemailProvider, list: is, is_not, is_empty, is_not_emptyfirstName, lastName: contains, not_contains, is_empty, is_not_emptyadded: less_than, more_thanattribute: is, is_not, is_empty, is_not_empty, gte, lte, gt, lt, contains, not_containsevent, email engagement fields: is, is_not, at_least, less_than_countemailBounced: also supports is_temporary_bounce, is_permanent_bouncestripeProduct: is, is_not, at_least, less_than_countstripeCurrentProduct, stripeTrialProduct: is, is_not, gte, lte, gt, ltcommerceProduct: is, is_not, at_least, less_than_countStripe product filter examples:
{ "field": "stripeProduct", "operator": "is", "value": "prod_pro" }
{ "field": "stripeProduct", "operator": "is_not", "value": "prod_pro" }
{ "field": "stripeProduct", "operator": "at_least", "value": "prod_pro:3" }
{ "field": "stripeProduct", "operator": "less_than_count", "value": "prod_pro:3" }
Commerce product filters match products purchased through commerce orders. Values can be provider:productId for provider-scoped IDs (shopify, woocommerce, or api), a bare product ID to match any provider, or provider:productId:count for threshold operators:
{ "field": "commerceProduct", "operator": "is", "value": "api:starter-kit" }
{ "field": "commerceProduct", "operator": "at_least", "value": "shopify:42:2" }
Engagement fields such as emailSent, emailDelivered, emailOpened, emailClicked, emailBounced, and emailComplained accept rolling windows like 7d, 30d, 90d, 180d, or all. Presence operators can scope by delivery policy with marketing:<timeRange> (marketing-policy campaign, automation, and Send API traffic) or transactional:<timeRange> (transactional-policy sends); policy scopes require a send-time policy snapshot, so ambiguous older automation and Send API events remain available only through unscoped filters. emailBounced also supports scoped values with is_temporary_bounce and is_permanent_bounce. With at_least and less_than_count, use count:timeRange, such as 10:30d or 10:all. Presence operators can instead use a campaign scope like campaign:cmp_123; campaign and email-type scopes cannot be combined with count operators.
| Tool | Description |
|---|---|
list_audience_syncs | List segment-to-audience syncs with schedule and last sync status. |
list_ad_accounts | List the Meta ad accounts available for syncing. |
create_audience_sync | Push a segment to a Meta custom audience on a schedule. |
update_audience_sync | Change sync frequency (hourly, daily, weekly) or pause/resume. |
delete_audience_sync | Remove a sync mapping; the Meta audience itself is kept. |
sync_audience_now | Trigger an immediate upload outside the regular schedule. |
Requires the Meta Ads integration to be connected in the Sequenzy dashboard (Settings -> Integrations). create_audience_sync accepts an existing segment (segmentId) or a ready-made template (predefinedSegmentId, for example zero-ltv, no-purchase-1y, recent-buyers, high-spenders-ecom, non-buyers, engaged) - the template segment is created automatically on first use, and the first upload runs immediately.
Audiences are add-only: subscribers who later leave the segment stay in the Meta audience. Meta requires 100+ matched people before an audience can be used for ad delivery.
| Tool | Description |
|---|---|
list_templates | List templates with localization status, label filtering, and pagination. |
get_template | Read template details, content, and localized variants. |
create_template | Create templates from a prompt, HTML, or Sequenzy blocks. |
update_template | Update template metadata, inbox preview text, labels, HTML, or blocks. |
set_template_localization | Create or replace a caller-supplied localized variant. |
sync_template_localizations | Queue AI translation for selected or all enabled non-primary locales. |
delete_template | Delete a template. |
list_templates returns 50 email bodies newest first by default and accepts a
limit up to 100. Advance offset by pagination.count while
pagination.hasMore is true; pagination.total reports the full matching
count, including campaign and transactional-email bodies.
For net-new content requested in natural language, pass prompt so Sequenzy
generates branded native blocks server-side. Use blocks only for finished
caller-supplied Sequenzy content, and use html only when preserving supplied
or explicitly requested markup. prompt, blocks, and html are mutually
exclusive; style and tone are valid only with prompt.
Use set_template_localization when translated copy comes from your own
localization workflow. It requires an enabled non-primary locale, a localized
subject, and exactly one of html or blocks. Use
sync_template_localizations to ask Sequenzy to translate selected locales;
omit locales to sync every enabled non-primary locale. Explicit sync works
even when automatic on-save localization is disabled.
| Tool | Description |
|---|---|
list_email_components | List saved sections and footers, optionally limited to pinned defaults. |
get_email_component | Read one component's blocks, metadata, version, and default-slot state. |
get_default_email_component | Read the component currently pinned to a default slot such as footer. |
set_default_email_component | Create or replace the company default footer used by newly built block emails. |
create_email_component | Save a reusable section or footer from a block list. |
update_email_component | Update component metadata or replace its blocks and increment its version. |
delete_email_component | Delete a component without changing emails that already copied its blocks. |
Components are copied into emails when those emails are built, so later edits affect newly built emails rather than rewriting existing content. The default footer keeps its unsubscribe link enabled, while transactional rendering hides that link. Raw HTML emails keep their own markup and do not receive block components; their send-time unsubscribe handling remains unchanged.
| Tool | Description |
|---|---|
list_ab_tests | List A/B tests and variants, optionally scoped by sequence. |
get_ab_test | Get effective settings, variants, localization status, and sequence-step copy. |
get_ab_test_stats | Get aggregate and per-variant stats. |
restart_ab_test | Restart a stopped or completed A/B test. |
select_ab_test_winner | Select a campaign test winner and queue remaining delivery. |
update_ab_test | Update campaign or sequence winner-selection settings. |
update_ab_test_variant | Update campaign draft or sequence variant copy. |
create_ab_test | Create a campaign test or convert a sequence email step. |
add_ab_test_variant | Add a variant to an existing A/B test. |
delete_ab_test_variant | Delete a draft A/B test variant. |
delete_ab_test | Delete an A/B test. |
Use get_sequence.sequence.emails[].abTest.variants to discover sequence variant IDs, subjects, preview text, and block counts; call get_ab_test to audit every variant's full blocks, effective settings, localization status, or stats. Campaign settings use testPercentage, testDurationMinutes, and winnerCriteria; sequence settings use testType, winnerThreshold, and winnerCriteria. The legacy sequence values testPercentage: 100 and testDurationMinutes: 0 are compatibility sentinels, not runtime settings. select_ab_test_winner applies only to a campaign test that is currently testing and immediately queues the winning variant for the remaining audience. update_ab_test changes the appropriate settings model and requires confirmLiveChange: true when sequence settings affect an active or already-used test. Variant updates accept either html or blocks, not both.
create_ab_test accepts exactly one of campaignId or automationNodeId; the latter requires one to four extra variants and converts a sequence email node into action_ab_test. The conversion moves the step's subject, preview text, and blocks onto independent variant emails. Get the test and variant IDs from get_sequence, read every variant's copy with get_ab_test, and edit each one with update_ab_test_variant; update_sequence_node and update_template cannot edit variant copy, and a change intended for the whole step must be repeated for every variant. If update_ab_test_variant is not in the MCP tool list, enable it on the Sequenzy connector rather than writing through another email tool. The full workflow requires ab_tests:read, ab_tests:write, and sequences:write, all included in Safer agent access. With only sequences:read, get_sequence keeps the A/B step and control copy visible but redacts test-record fields and returns an empty variant list. An explicit sequence winnerCriteria overrides the testType default, so content variants can still be judged by opens. Pass confirmLiveChange: true when converting a node in an active sequence. Together with control A, an A/B test supports at most five variants. Sequence variants receive independent email templates and can be edited after creation; once the sequence is active or the test has activity, update_ab_test_variant requires confirmLiveChange: true. Variants can only be added or removed while the test is a draft, and live-sequence changes also require confirmation because they immediately change the rotation.
SEQUENZY_API_KEY*secretYour Sequenzy API key (get one from the Sequenzy dashboard under Settings > API Keys)
SEQUENZY_APP_URLOptional Sequenzy app base URL for dashboard links. Defaults to https://sequenzy.com.