MCP Integration
Sequenzy supports the Model Context Protocol (MCP), allowing AI assistants like Claude.ai, Claude Desktop, Claude Code, Codex, Cursor, and other MCP clients to manage your email marketing directly.What You Can Do
With Sequenzy MCP, AI assistants can:- Manage subscribers - Add, update, search, and remove subscribers
- Manage your audience - Create, update, and delete lists, segments, and tags, and enroll subscribers in sequences
- Create sequences - Generate and configure email automation sequences
- Draft campaigns - Create and edit campaign drafts
- Manage landing pages - Create, edit, publish, unpublish, and connect custom domains
- Control campaign delivery - Cancel, pause, resume, duplicate, and delete campaigns, and run campaign A/B tests
- Send transactional emails - Send single emails via template or HTML
- Manage your team - List members, invite teammates, and cancel invitations
- Triage your inbox - Read, reply to, and close subscriber conversations
- Manage webhooks - Create, test, and replay outbound webhook deliveries
- View analytics - Get stats for campaigns, sequences, and overall performance
- Inspect localization - Read company localization settings and localized template variants
- Generate content - AI-powered email and sequence generation
Remote Setup For Claude.ai And Mobile
Use the remote connector when you want Sequenzy tools in Claude.ai, Claude mobile, and other cloud-hosted MCP clients that cannot launch a localnpx process.
You can copy the connection details from the existing MCP button in the Sequenzy dashboard sidebar:
- Open your workspace dashboard
- Click the MCP button in the sidebar developer setup area
- Copy the Remote MCP server URL
- Paste it into your AI client’s custom connector settings
- Complete the Sequenzy OAuth approval flow
- Open Settings → Connectors
- Choose Add custom connector
- Enter a name such as
Sequenzy - Enter the remote MCP server URL above
- Complete the Sequenzy OAuth login flow
Local Setup
Use local setup for desktop and IDE clients that support local stdio MCP servers, including Claude Desktop, Claude Code, Codex, Cursor, Windsurf, and VS Code. You can also use the sidebar MCP button in the Sequenzy dashboard to copy the local setup command, create a personal key for manual local configs, and jump to the full setup docs.Quick Setup
The easiest way to set up MCP is using our setup wizard:- Open your browser to log in
- Create a personal API key
- Auto-detect supported installed AI clients, including Codex, Claude Code, Claude Desktop, Cursor, Windsurf, and VS Code
- Configure those clients automatically using their native MCP CLI when available, with config-file fallback when needed
Manual Setup
Across most MCP clients, the core server config is the same:- Command:
npx - Args:
-y @sequenzy/mcp - Env:
SEQUENZY_API_KEY=seq_user_your_key_here
Claude Desktop
-
Open Claude Desktop settings file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
- macOS:
- Add Sequenzy MCP:
- Restart Claude Desktop
Cursor
-
Open
~/.cursor/mcp.json(create if it doesn’t exist) - Add Sequenzy:
- Restart Cursor
Windsurf
Same format as Cursor, but the config is at:- macOS:
~/Library/Application Support/Windsurf/mcp.json - Windows:
%APPDATA%\Windsurf\mcp.json
Claude Code
You can add Sequenzy to Claude Code directly from the CLI:.mcp.json:
npx with cmd /c:
Codex
You can add Sequenzy to Codex from the CLI:~/.codex/config.toml:
VS Code Copilot
VS Code uses aservers object in its MCP config:
Other MCP Clients
For tools like OpenClaw, Hermes, and other MCP-compatible clients, use the same Sequenzy stdio server:- Command:
npx - Args:
-y @sequenzy/mcp - Env:
SEQUENZY_API_KEY=seq_user_your_key_here
mcpServers.sequenzy shape shown above unless its docs specify a different schema. If it provides a CLI helper, point it at npx -y @sequenzy/mcp and set the same environment variable.
Getting Your API Key
- Go to the Sequenzy dashboard
- Open Settings → API Keys
- Click “Create Personal Key”
- Copy the key (starts with
seq_user_)
npx @sequenzy/setup
Available Tools
Subscribers
add_subscriber- Add a new subscriberupdate_subscriber- Update subscriber attributes/tagsremove_subscriber- Unsubscribe or deleteget_subscriber- Get subscriber detailssearch_subscribers- Search by tags, lists, attributes, segments
Lists
list_lists- List subscriber listscreate_list- Create a subscriber listupdate_list- Update a list’s name, description, or privacydelete_list- Permanently delete a list and all of its memberships; subscribers themselves are keptadd_subscribers_to_list- Bulk add up to 500 subscribers to a list from an email arrayremove_subscribers_from_list- Remove up to 500 subscribers from a list by email; subscribers stay in your audience and unmatched emails are returned innotFound
Campaigns
list_campaigns- List all campaignsget_campaign- Get campaign details and statscreate_campaign- Create a draft campaign from raw HTML or Sequenzy blocksupdate_campaign- Edit a draft, including reply-to settings, raw HTML, or Sequenzy blocksschedule_campaign- Schedule a draft or already scheduled campaignsend_test_email- Send test to single addresscancel_campaign- Cancel a scheduled, paused, or sending campaign; remaining emails are not sent and the campaign cannot be restartedpause_campaign- Pause a campaign that is currently sendingresume_campaign- Resume a paused campaign, optionally spreading the remaining delivery over 1-72 hours withspreadOverHoursduplicate_campaign- Duplicate a campaign as a new draft.mode: "campaign"(default) copies the campaign and its email,"ab_test"also copies the A/B test with all variants, and"variant"copies a single variant’s content (requiresvariantId)delete_campaign- Permanently delete a campaign; sending, scheduled, or paused campaigns must be cancelled withcancel_campaignfirst
Landing Pages
list_landing_pages- List landing pages with status, metrics, content, and URLsget_landing_page- Get landing page details, editor content, metrics, and public URLscreate_landing_page- Create a draft landing page from default template content or supplied JSONupdate_landing_page- Edit landing page name, slug, or full editor-compatible contentpublish_landing_page- Publish a landing page, optionally saving name, slug, or content firstunpublish_landing_page- Return a landing page to draft, optionally saving edits firstdelete_landing_page- Delete a landing pageconnect_landing_page_domain- Connect a custom landing page domain and return DNS setup detailsupdate_landing_page_domain_settings- Replace or verify landing page custom domain settings
version, template, seo, theme, and blocks. The API validates CTA, pricing, footer, and form redirect URLs before saving or publishing. Custom landing page domains require a CNAME record pointing to pages.sequenzydns.com; call update_landing_page_domain_settings with verify: true after DNS changes propagate.
Company
get_company- Get company details plus effective localization settings
Sequences
list_sequences- List all sequencesget_sequence- Get sequence details plussequence.emails, which includes each step’snodeId, linkedemailId, subject, preview text, and blockscreate_sequence- Create a sequence with:trigger: "segment_entered"plussegmentIdfor saved-segment entry automationsgoal- AI generates email contentstepswithblocks- Sequenzy JSON block formatstepswithhtml- Any HTML (React Email, MJML, etc.) - auto-convertedenrollmentMode: "matching_field"for event-triggered product-, variant-, order-, or subscription-specific sequences that should block duplicate active runs only for the same resolved fieldenrollmentFieldPath, such asorder.idorproduct.providerVariantId, when you wantmatching_fieldto use a custom event propertypropertyFiltersforevent_receivedtriggers - only start the sequence when the event properties match, e.g. scope a purchase sequence to one product with{ "path": "lineItems[].providerProductId", "operator": "equals", "value": "prod_123" }(orproductIdsfor Stripesaas.purchaseevents)- For
event_receivedsequences, step content can use{{event.amount}},{{event.order.id}}, or other{{event.*}}merge tags from the event payload that enrolled the subscriber
update_sequence- Modify a sequence, targeting a specific step with theemailIdornodeIdreturned byget_sequence, or updateenrollmentMode/enrollmentFieldPathenable_sequence/disable_sequence- Control statusenroll_subscribers_in_sequence- Manually enroll up to 500 subscribers by email. Only active subscribers are enrolled: unknown emails are returned innotFound, and inactive or already enrolled subscribers are counted inskipped. PasstargetNodeId(a non-triggernodeIdfromget_sequence) to start at a specific step instead of the first step after the trigger. The sequence must be accepting entrants.cancel_sequence_enrollments- Stop active or waiting enrollments in a required sequence by eithersubscriberIdor entry-event field values. Field-value cancellation can usefieldPathor the sequence’s configuredenrollmentFieldPath, and should be run withdryRun: truebefore applying bulk changes.
Transactional
list_transactional_emails- List transactional templates and API slugsget_transactional_email- Read a transactional email by ID or slug, including body blocksupdate_transactional_email- Update transactional email metadata or body contentsend_email- Send a single email (template or HTML). Itsvariablesobject supports nested arrays for repeat blocks, such as{ "event": { "items": [...] } }.
Segments
list_segments- List saved segmentscreate_segment- Create a segment from explicit filters, including nested AND/OR groups, event filters, segment filters, Stripe product purchase filters, and optionalfilterJoinOperatorupdate_segment- Update a segment’s name and/or replace its filter rules using the samefiltersplusfilterJoinOperatoror nestedrootshapes ascreate_segmentdelete_segment- Permanently delete a segment; subscribers are not affectedget_segment_count- Preview how many active subscribers match a segment
{"id":"filter-1","field":"stripeProduct","operator":"is","value":"prod_pro"}for “bought product”{"id":"filter-1","field":"stripeProduct","operator":"is_not","value":"prod_pro"}for “didn’t buy product”{"id":"filter-1","field":"stripeProduct","operator":"at_least","value":"prod_pro:3"}for “at least 3 payments”{"id":"filter-1","field":"stripeProduct","operator":"less_than_count","value":"prod_pro:3"}for “fewer than 3 payments”{"id":"filter-1","field":"stripeCurrentProduct","operator":"is","value":"prod_pro"}for “currently has product”{"id":"filter-1","field":"stripeTrialProduct","operator":"is","value":"prod_pro"}for “currently trialing product”{"id":"filter-1","field":"stripeTrialProduct","operator":"is","value":"prod_pro:is_canceled"}for “trialing product is set to cancel”{"id":"filter-1","field":"stripeTrialProduct","operator":"gte","value":"prod_pro:start_at:7 days ago"}for “trial started in the last 7 days”{"id":"filter-1","field":"stripeTrialProduct","operator":"is","value":"prod_pro:end_at:2026-05-26"}for “trial ends on May 26, 2026”
commerceProduct field. The value is provider:productId - product IDs are provider-scoped, so the provider prefix (shopify, woocommerce, or api) tells the filter which catalog the ID belongs to. A bare product ID matches the ID on any provider:
{"id":"filter-1","field":"commerceProduct","operator":"is","value":"api:prod-starter-kit"}for “bought product”{"id":"filter-1","field":"commerceProduct","operator":"is_not","value":"api:prod-starter-kit"}for “didn’t buy product”{"id":"filter-1","field":"commerceProduct","operator":"at_least","value":"shopify:42:2"}for “placed at least 2 orders containing the product”{"id":"filter-1","field":"commerceProduct","operator":"less_than_count","value":"shopify:42:2"}for “fewer than 2 orders containing the product”
emailSent, emailOpened, emailClicked, emailBounced, emailComplained), the value can either be a rolling time window (7d, 30d, 90d, 180d, all) or a specific sent campaign via campaign:<campaign_id>. Combine two campaign-specific filters to express rules like “bounced campaign A but not campaign B”:
{"id":"filter-1","field":"emailBounced","operator":"is","value":"campaign:cmp_abc"}{"id":"filter-2","field":"emailBounced","operator":"is_not","value":"campaign:cmp_xyz"}
list_campaigns to look up the campaign IDs.
By default, segment filters use AND logic. To match any filter instead of all of them, pass filterJoinOperator: "or" when calling create_segment.
For nested logic, pass a v2 root group instead of filters:
eventName:range for is / is_not and eventName:count:range for at_least / less_than_count. Segment filter values are saved segment IDs.
list_segments returns both:
subscriberCount- all matched contacts, including unsubscribed or bounced contactsactiveSubscriberCount- contacts eligible for campaigns
get_segment_count returns the active count, because campaigns and most send flows only target active subscribers.
Audience Syncs
Push segments to Meta custom audiences for Facebook and Instagram retargeting. Requires the Meta Ads integration to be connected in the dashboard (Settings → Integrations).list_audience_syncs- List segment-to-audience syncs with schedule and last sync statuslist_ad_accounts- List the Meta ad accounts available for syncingcreate_audience_sync- Create a sync from an existing segment (segmentId) or a ready-made template (predefinedSegmentId, for examplezero-ltv,no-purchase-1y,recent-buyers); the first upload runs immediatelyupdate_audience_sync- Change the frequency (hourly,daily,weekly) or pause/resume viaisActivedelete_audience_sync- Remove a sync; the Meta audience itself is keptsync_audience_now- Trigger an immediate upload outside the schedule
Products & Digital Delivery
list_products- List synced products (Stripe, Shopify, WooCommerce, api) including any attached delivery fileupsert_products- Create or update products in the catalog (Commerce API, keyed by yourproductId, up to 100 per call)delete_product- Delete a product previously pushed viaupsert_productsattach_product_file- Attach a distributable file to a product, delivered after purchase. Passurlfor a hosted file, orfilePathto upload a local file (local MCP server only)remove_product_file- Remove the attached file from a productsync_products- Queue a sync of the Stripe product catalog
saas.purchase event with download.url and download.name, so purchase sequences can deliver the file with {{event.download.url}}. See Digital Product Delivery.
Tags
list_tags- List all tags in the accountcreate_tag- Create a tag definition. Names are normalized to lowercase with hyphens (VIP Customerbecomesvip-customer); color defaults tograyupdate_tag- Update a tag’s color; system tags cannot be changeddelete_tag- Permanently delete a tag and remove it from all subscribers; system tags and tags used by sequences cannot be deleted
Templates
list_templates- List all email templates with localization status by localeget_template- Get a template’s details, content, and localized variantscreate_template- Create a template from raw HTML or Sequenzy blocksupdate_template- Update a template with raw HTML or Sequenzy blocks
A/B Tests
list_ab_tests- List A/B tests and variants, optionally scoped by sequenceget_ab_test- Get variants, content, and localization statusget_ab_test_stats- Get aggregate and per-variant statscreate_ab_test- Create a campaign A/B test withtestPercentage(5-50, default 20),testDurationMinutes(15-1440, default 240),winnerCriteria(open_rateorclick_rate), and optional extra variants. Control variant A is created automatically from the campaign’s current emailadd_ab_test_variant- Add a variant to a draft campaign A/B testupdate_ab_test_variant- Update a draft variant’s subject, preview text, HTML, or blocksdelete_ab_test_variant- Permanently remove a variant from a draft campaign A/B test; variant A is the control and cannot be deleteddelete_ab_test- Permanently delete a campaign A/B test and all of its variants; running tests cannot be deleted
get_ab_test to discover variant IDs before editing. update_ab_test_variant accepts either html or blocks, not both, and only draft tests can be changed. create_ab_test requires a campaign in draft or rejected status that does not already have an A/B test, and variants can only be added or removed while the test is in draft status.
When you need recipient-specific content, prefer Sequenzy blocks instead of raw HTML. Campaign and template MCP tools accept a blocks array where each block can include a condition, for example:
{{ }} inside condition.variable.
Team
list_team_members- List the company owner, members with their roles, and pending or expired invitationsinvite_team_member- Invite a teammate asadminorviewer. Existing Sequenzy users are added immediately; everyone else receives an email invitation. Billing access (canManageBilling) can only be granted by the company ownercancel_team_invitation- Cancel a pending invitation; accepted invitations cannot be cancelled
Inbox
list_conversations- List subscriber reply conversations with status, search, unread, and pagination filtersget_conversation- Get a conversation with its full message history, subscriber details, and contextreply_to_conversation- Send an outbound reply (requiresbodyTextorbodyHtml) or add an internal team-only note withtype: "note". Replying to a closed conversation reopens itupdate_conversation_status- Open or close a conversationmark_conversation_read- Mark all unread inbound messages in a conversation as read
Webhooks
list_webhooks- List outbound webhook endpoints and their subscribed event typescreate_webhook- Create a webhook endpoint. The response includes asigningSecretthat is returned only once - store it immediately to verify webhook signatures. Ifeventsis omitted, a default set of event types is subscribedupdate_webhook- Update a webhook’s name, URL, subscribed events, or enabled/disabled status; providingeventsreplaces the existing listdelete_webhook- Permanently delete a webhook endpoint and stop all deliveries to ittest_webhook- Send a test event to verify the endpoint is reachable and signatures validatelist_webhook_deliveries- List recent delivery attempts, including status and response codesreplay_webhook_delivery- Re-send a previous delivery’s event payload to the endpoint
email.*, subscriber.*, and sequence.* events.
Analytics
get_stats- Overview stats (7d/30d/90d)get_campaign_stats- Campaign performanceget_sequence_stats- Sequence performanceget_subscriber_activity- Individual activity
AI Generation
generate_email- Create email from promptgenerate_sequence- Create multi-email sequence from goalgenerate_subject_lines- Generate A/B subject variants
Example Conversations
Set up email for a new SaaS
Add a subscriber
Publish a landing page
Create a Stripe product segment
Create a match-any segment
Check performance
Create a sequence with specific content
Migrate a sequence from another platform
Event-Personalized Sequences
When your AI assistant creates a sequence withtrigger: "event_received", it can place {{event.*}} merge tags directly into step subjects or body content.
Those values come from the properties payload you send to POST /api/v1/subscribers/events.
Example:
- Trigger payload:
{"event":"weather.wind_alert","properties":{"city":"Tel Aviv","alert":{"maxSpeed":75}}} - Sequence subject:
Wind alert for {{event.city}} - Sequence body:
Winds may reach {{event.alert.maxSpeed}} km/h.
Resources
MCP also provides read-only resources that AI can access:| Resource | Description |
|---|---|
sequenzy://dashboard | Live 7-day overview stats |
sequenzy://company | Currently selected company, including localization settings |
sequenzy://campaigns/recent | Last 10 campaigns |
sequenzy://subscribers/recent | Recently added subscribers |
sequenzy://sequences | All sequences with status |
sequenzy://templates | Available email templates with localization status |
sequenzy://segments | Defined segments |
sequenzy://tags | All tags with counts |
Security
- Personal API keys are tied to your user account
- Keys can only access companies you have access to
- You can revoke keys anytime in Settings → API Keys
- Keys are never shared between users
Troubleshooting
Sequenzy MCP failures now return a short explanation, a concrete recovery step, and a directdocs.sequenzy.com link so AI clients can self-correct more reliably.
Duplicate resources
If a tool call would create a duplicate segment name or sending domain, the error includes a stablecode, an agent-friendly description, a concrete resolution, and a docsUrl. For segments, call list_segments and reuse the existing segment ID or choose a different name. For websites, call list_websites; if the domain is not listed for the selected company, it belongs to another company or account and must be removed, reassigned, or replaced with a different sending domain.
”SEQUENZY_API_KEY environment variable is required”
Make sure your API key is set in the MCP config. Runnpx @sequenzy/setup to configure automatically.