@sequenzy/mcp
v0.0.210
Published
Sequenzy MCP server for AI-powered email marketing automation
Downloads
8,801
Maintainers
Readme
Sequenzy MCP Server
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.
Interactive email and sequence previews
In clients that support MCP Apps, including compatible ChatGPT and Claude connections, you can review your saved emails and sequences directly in the conversation.
render_emailopens the rendered email with Desktop (640px) and Mobile (375px) views, its subject, preview text and personalization warnings. Pass a campaign ID, template ID, or sequence ID plus node ID using the existing tool inputs. It renders your saved content through Sequenzy's email renderer. Personalization and locale options remain available through the same tool.preview_sequence({ companyId, sequenceId })opens the saved sequence as a connected diagram with triggers, delays, branches and actions. Select an email to render it, switch between available A/B variants, or use the Emails tab to browse the sequence's emails. Random splits show their configured allocation. Refresh reloads saved content, and failed requests offer an explicit retry.
Supporting workflows use compact cards in the same Sequenzy style:
open_image_upload({ companyId })opens an image picker. Choose a PNG, JPEG, GIF or WebP up to 10 MB, optionally describe it, then select Upload image. Opening the widget does not write anything. Submission usesupload_image_assetwith your existing permissions and returns the saved asset to your assistant. After an uncertain failure, check your image library before retrying; uploads are never automatically retried.monitor_subscriber_import({ companyId, importId })shows counts and progress for an existing import. It pollsget_subscriber_importevery five seconds while running, for up to five minutes. Completion, blocked status, errors or leaving the view stop polling. Refresh status restarts monitoring. This does not start or retry imports.
Both widgets pin the company explicitly. Clients without MCP Apps can use upload_image_asset and get_subscriber_import directly; the same operations are available through the existing REST API and CLI.
The sequence preview requires an explicit company ID from get_account and keeps every email render pinned to that company. Previews never activate sequences, enroll subscribers or send email. A/B previews require the existing access to variant content; unavailable variants are shown as unavailable instead of being replaced with the control email.
Email content is isolated from the widget. Scripts, forms, nested frames and link navigation are disabled; external stylesheets and fonts are not loaded. HTTPS email images may load from their original hosts, subject to the client's policy. The widget itself bundles its logo and font and uses authenticated MCP tool calls without exposing credentials. Actual email-client rendering can differ, so use test sends for final inbox verification.
Clients without MCP Apps still receive the existing rendered HTML or sequence data. The same workflows are available through the existing public render and sequence-read endpoints and CLI render/sequence commands. No new REST endpoint or CLI command is needed for this presentation layer.
What You Can Do
Use create_campaign_for_audience for a frozen group of selected contacts or all contacts matching contact/activity filters. It creates a blank draft, reports selected and currently eligible counts, and preserves existing campaign read/update/clear/schedule workflows. The limit is 100,000 contacts and 8 MiB; drafting sends no email.
- Manage subscribers, tags, lists, and dynamic segments, including bulk tag reconciliation and synthetic event testing.
- Sync segments to Meta custom audiences for Facebook and Instagram retargeting.
- Sync contacts and events from Snowflake, BigQuery, Redshift or Postgres on a schedule.
- Stream email events, custom events and subscriber snapshots to your S3 or GCS bucket for your data warehouse.
- Manage products and attach digital delivery files for purchase automations.
- Upload hosted email images with alt text and reusable responsive crop settings.
- Draft, update, schedule, and inspect campaigns, including resolved audience previews, persisted conversion goals, and From, Reply-To, CC, and BCC identities.
- Render campaigns, sequence steps, and templates to their exact email-safe HTML without sending.
- Add one-click Poll and NPS survey blocks to emails and inspect campaign response summaries.
- Create and edit email sequences, including multi-list/tag triggers, entry-audience and property-filtered stop conditions, sending identity overrides, existing graph restructuring, and direct step test sends to internal reviewers.
- Cancel, pause, resume, duplicate, or delete campaigns and enroll contacts into sequences.
- Manage transactional email templates and send transactional emails to shared To, Cc, and Bcc recipient lists.
- Supply localized template variants or queue AI translation for enabled locales.
- Create, preview, edit, publish, unpublish, and delete landing pages.
- Create list-scoped saved signup forms with responsive stack, row, grid, and single-image overlay block groups (including foreground gap controls), then return client-safe static-site embeds.
- Create, target, publish, duplicate, and deploy saved signup popups with the same recursive block layouts.
- Connect and verify custom domains for published landing pages.
- Manage team invitations, the inbox (its address, conversations, replies, forwards), and outbound webhook endpoints.
- Generate email copy, subject lines, and multi-step sequences.
- Inspect analytics, subscriber activity, deliverability health, company-level sending pauses, integrations, published event payload schemas, sending identities, tracking settings, and dashboard URLs.
- Inspect whether "Sent with Sequenzy" is visible for a workspace, why the owner subscription does or does not remove it, and open the canonical subscription page for an upgrade or renewal. Entitlement changes apply to future sends from existing live sequences without editing their blocks.
- Diagnose why sending is paused and restore eligible hard-bounce pauses after confirming list cleanup.
- Inspect exact-recipient bounce, complaint, and email-hygiene suppression, and clean up eligible stale bounces without exposing the shared SES suppression list.
- Configure company product info, account-wide sending identity defaults, rename individual sender and reply-to profiles, manage sender domains, and inspect integration examples for common frameworks.
Every published MCP tool includes explicit readOnlyHint, destructiveHint, idempotentHint, and openWorldHint annotations so compatible clients can display accurate tool-use affordances. Any write that overwrites, cancels, deletes, changes a live sequence, or can send email or SMS is marked destructive; tools that can email real contacts, publish a public link, or reach a third-party service are marked open-world. Tools also publish outputSchema definitions (except on the OpenAI-reviewed route) and return structuredContent, giving clients and models machine-readable result shapes for follow-up calls.
Tool results and recovery
Tool failures retain isError: true and readable error text, and also return
structuredContent with { success: false, error: { code, message, howToFix,
docsUrl } }. HTTP errors include statusCode; a valid API Retry-After header
adds retryAfterSeconds. These fields are omitted when unavailable. The OpenAI
profile uses safe recovery descriptions and known codes or status-derived
fallbacks, omitting raw backend diagnostics.
Use the error code and recovery guidance to choose your next step. The client
does not retry automatically. After an uncertain send_email outcome, reuse the
original idempotencyKey with unchanged input and inspect emailSendId when
available. A retry hint alone does not mean repeating a write is safe.
Segment counts and segment-filtered reads fail with
SEGMENT_REFERENCE_DEPTH_EXCEEDED or SEGMENT_REFERENCE_COUNT_EXCEEDED when
segments reference other segments too deeply or too many times. Retrying does
not help; reduce the nesting or the number of references with
update_segment first.
Successful results keep their existing shapes. Recoverable partial subscriber
event imports retain their counts and row failures without isError; inspect
those rows before retrying failed records.
Quick Setup
The easiest setup path is the Sequenzy wizard:
npx @sequenzy/setupThe wizard opens the browser login flow, creates a personal API key, detects supported AI clients, and configures them automatically when possible.
Hosted Remote MCP
For clients that support Streamable HTTP MCP, use Sequenzy's hosted endpoint instead of running a local stdio process:
https://api.sequenzy.com/v1/mcpChatGPT and the OpenAI plugin directory use the reviewed hosted surface:
https://api.sequenzy.com/v1/mcp/openaiThat surface shares the same implementation and keeps the standard tool set
except for operations that accept or manage credentials, or return unprojected
payloads: connect_integration, create_api_key, list_api_keys,
update_api_key, revoke_api_key, delete_api_key,
request_api_key_handoff, create_data_export, update_data_export,
create_warehouse_connection, update_warehouse_connection,
preview_warehouse_query, create_webhook, list_webhook_deliveries,
list_capture_submissions, replay_webhook_delivery, and
rotate_sequence_inbound_webhook_secret. It also omits add_website, a
compatibility alias of add_sending_domain, and submit_feedback. API keys, including the one behind
the ChatGPT connection, are managed in the dashboard. The surface also omits
subscription and upgrade links: subscriptionUrl fields, the
get_app_urls subscription URL, and the emailBranding tier and upgrade
action are removed, and get_app_urls rejects the billing and
subscription settings tab aliases. The surface also omits the push credential
tools set_apns_credentials and set_fcm_credentials, which take customer
private keys as input.
Three tools use clearer names on this surface; standard MCP and the stdio package keep the original names:
| Standard MCP | OpenAI-reviewed route |
| -------------------------------- | -------------------------------- |
| list_websites | list_sending_domains |
| check_website | get_sending_domain |
| resend_campaign_to_non_openers | create_non_opener_resend_draft |
edit_sequence_graph is listed there as four single-operation tools with the
same validation and behavior: move_sequence_step (move_node),
duplicate_sequence_step (duplicate_node), delete_sequence_step
(delete_node) and replace_sequence_paths (replace_edges).
The preview widget on this surface lists the image origins it may load
(https://images.sequenzy.com and the Pexels and Unsplash image hosts), so
other external images in an email preview show their alt text instead.
Tool annotations disclose supported replacement and irreversible-delivery modes, including automation-triggering actions. Public content and provider changes are marked open-world; private draft creation and additive notes remain non-destructive. Feedback goes to the Sequenzy team through Telegram with the authenticated company name/ID and account email added for attribution, which clients must disclose before sending.
To keep its tool list small, this surface publishes no output schemas (results
still include structuredContent).
On every surface, sequence tools describe repeated nested step schemas once and
point later fields at the first copy ("Same schema as branches[].steps in this
tool."). Those fields accept the same input as before; the server validates
nested steps.
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:
- MCP server manifest:
server.json - Agent card:
.well-known/agent-card.json - Agent capability manifest:
agent-capability.json - OpenClaw skill metadata:
openclaw/skill.json
Data and privacy
Sequenzy sends an MCP client only the data needed for the tool the user asks it to run, within the selected workspace and the key or OAuth scopes granted to that client. Depending on the requested tool, this can include workspace names and IDs; subscriber contact, consent, audience, attribute, event, engagement, reply, survey, and commerce data; campaign and automation content; delivery analytics; and integration or webhook status. See the Sequenzy Privacy Policy for the full categories, purposes, recipients, retention periods, and user controls.
Do not use open-ended custom attributes, events, notes, forms, webhook samples, email variables, or feedback to submit payment-card data, health or medical data, government identifiers, biometric or genetic data, authentication credentials, sensitive demographic data, or precise geolocation.
The OpenAI-reviewed route states and enforces those restrictions on relevant
open-ended inputs, including nested attribute paths such as profile.ssn,
coordinate pairs such as lat/lng, and labelled prose such as
Religion: ... or GPS coordinates: .... It rejects a credential-bearing URL
in any argument, whether the credential sits in the userinfo, path, query, or
fragment, such as a form or popup redirectUrl with an access token or URL
signature. Restricted attribute selectors inside merge tags are rejected
without blocking ordinary authored copy about the same topic. On this surface,
render_email accepts sample data or a policy-checked inline subscriber, but
not subscriberId, so it cannot resolve uninspected stored custom attributes.
Its results remove restricted fields, raw API errors, debug payloads, internal
request/trace/session identifiers, unnecessary account or credential
identifiers, stored credential-bearing URLs, and inbound-webhook URLs. Standard
remote MCP and the local stdio package retain the complete contract for trusted
clients, including credential-based integration setup, one-time API-key and
webhook secrets, inbound-webhook URLs, and detailed API errors. Prefer the
dashboard or local CLI when secrets should stay outside an AI conversation.
What the reviewed surface guarantees is bounded. It recognizes restricted data
by shape: English field-name words such as passport_id, user.ssn, or
api_secret at any nesting depth, labelled prose such as Diagnosis: ...,
known credential shapes, decimal coordinate pairs, and credential-bearing URLs
inside any string, including HTML. It does not interpret unlabelled prose,
non-English field names, or values a client deliberately obfuscates; those
remain covered by the usage restriction above rather than by the filter.
Manual Setup
All stdio MCP clients use the same command:
- Command:
npx - Args:
-y @sequenzy/mcp - Required env:
SEQUENZY_API_KEY=seq_user_your_key_here
Optional environment variables:
SEQUENZY_API_URL- Sequenzy API base URL. Defaults tohttps://api.sequenzy.com.SEQUENZY_APP_URL- Sequenzy dashboard base URL used by app URL helpers. Defaults tohttps://sequenzy.com.
Claude Desktop
Add this to your Claude Desktop config:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%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 Code
claude mcp add --scope user --env=SEQUENZY_API_KEY=seq_user_your_key_here sequenzy -- npx -y @sequenzy/mcpOn 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/mcpFor 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
codex mcp add sequenzy --env SEQUENZY_API_KEY=seq_user_your_key_here -- npx -y @sequenzy/mcp
codex mcp listManual 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"Cursor
Install Sequenzy from the Cursor Marketplace for a hosted connection with Sequenzy OAuth. The plugin connects to:
https://api.sequenzy.com/v1/mcpAfter 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"
}
}
}
}Windsurf
Use the same JSON shape as Cursor.
- macOS:
~/Library/Application Support/Windsurf/mcp.json - Windows:
%APPDATA%\Windsurf\mcp.json
VS Code Copilot
VS Code uses a servers object:
{
"servers": {
"sequenzy": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@sequenzy/mcp"],
"env": {
"SEQUENZY_API_KEY": "seq_user_your_key_here"
}
}
}
}Other MCP Clients
For OpenClaw, Hermes, and other MCP-compatible clients, point the client at npx -y @sequenzy/mcp and set SEQUENZY_API_KEY.
Getting an API Key
- Open the Sequenzy dashboard.
- Use the MCP setup flow to create a personal key, or open Settings -> API Keys to create a company key.
- Choose a permission preset or the exact custom scopes the integration needs.
- Add the key to your MCP client config.
Personal keys start with seq_user_. You can revoke them any time in the dashboard.
If the local server starts without SEQUENZY_API_KEY, it still starts and
lists its tools, but every tool call returns MCP_AUTH_REQUIRED with a link to
create a free account at
sequenzy.com/sign-up
and the steps above. Add the key and restart the client to continue.
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.
Recover from missing API key permissions
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. The OpenAI-reviewed route returns the same permissions
without the user's account ID or the active key's identity. 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. For a company key, use
list_api_keys and its isCurrent flag to identify the active key before
editing it, then 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. add_subscriber uses subscribers:write
for explicit listIds; imports into explicit lists and dedicated list membership tools still
need lists:write. Sequence enrollment or double-opt-in delivery additionally
needs automations:trigger. The two data ingest presets omit lists:write
and support explicit list placement through add_subscriber. Use custom
permissions for imports into explicit lists.
Tools
The standard surface currently exposes 341 MCP tools. The OpenAI-reviewed surface exposes 323; the omitted, renamed and split operations are listed above.
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.
Account, Companies, Setup
| 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 company with a website or without one, optionally with a description and generated welcome sequence. |
| 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 a company API key and return its one-time secret on standard MCP; omitted from the OpenAI-reviewed route. |
| 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. Named list_sending_domains on the OpenAI-reviewed route. |
| add_sending_domain | Add a sending domain and return its cohort-specific DNS setup records. |
| add_website | Compatibility alias for add_sending_domain; omitted from the OpenAI-reviewed route. |
| check_website | Read a sending domain's stored SPF, DKIM, MAIL FROM, and aggregate verification details. Named get_sending_domain on the OpenAI-reviewed route. |
| verify_sending_domain | Run a fresh sending-domain DNS/provider verification and return current status and diagnostics. |
| configure_sending_domain | Deprecated: set <label>.<domain> as the company tracking domain when none is set; prefer set_tracking_domain. |
| get_tracking_domain | Read the company tracking domain, its status, whether links use it now, and its CNAME record. |
| set_tracking_domain | Set or change the company tracking domain every sending domain uses for tracked links, and return its CNAME. |
| verify_tracking_domain | Check the company tracking domain's CNAME and HTTPS certificate now. |
| remove_tracking_domain | Remove the company tracking domain; links in emails already sent through it stop working. |
| 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_frequency_cap | Read the company frequency cap: most marketing emails per contact in a rolling window, or null when off. |
| set_frequency_cap | Set the company frequency cap (maxEmails per windowHours) that opted-in sequences respect. |
| clear_frequency_cap | Turn the company frequency cap off. |
| 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 on standard MCP; omitted from the OpenAI-reviewed route. |
| 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. |
| disconnect_integration | Disconnect Lemon Squeezy locally and remove its managed webhook; repeat after cleanupWarning to retry cleanup. Requires integrations:manage. |
| 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. |
| delete_sender_profile | Permanently delete an unused sender profile, with guards for live sending surfaces and the last remaining sender. |
| get_notification_preferences | Read the current user's per-company account notification settings and supported modes, including the Monday weekly report. |
| update_notification_preferences | Update the current user's account notification delivery modes, including weekly-report opt-out, without affecting teammates. |
| render_email | Render final email-safe HTML and diagnose unresolved merge tags, including typos hidden by defaults. The OpenAI-reviewed route accepts sample data or a policy-checked inline subscriber, not a stored subscriber ID. |
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.
The OpenAI-reviewed route rejects restricted custom-attribute selectors inside
merge tags. It also omits the subscriberId argument; use a policy-checked
inline subscriber, or omit subscriber data for a sample preview.
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.
Webflow requires an explicit choice: pass [] for no lists or specific list
IDs; null is rejected. Native form selection, field allowlists, required
double opt-in, and sequence enrollment are configured in Settings →
Integrations → Webflow. Authorization alone never starts capture; with no
selected forms, no contacts are created.
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 on standard MCP 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. On the OpenAI-reviewed route, which omits connect_integration,
connect Segment in the dashboard or local CLI instead. Use sync_integration
to retry with the saved credentials.
For Attio, connect_integration on standard MCP accepts a workspace access
token without a webhook secret, with optional 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.
On the OpenAI-reviewed route, connect Attio in the dashboard or local CLI, then
use update_attio_settings for the same settings. 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 DKIM, DMARC and
bounce records it returns (see website.bounceRecords below), wait for DNS
propagation, and then call verify_sending_domain. Optional mailFromPrefix (default send) chooses the
bounce subdomain when the domain is created. New domains publish that bounce
subdomain as one CNAME (website.bounceRecords.cnameRecord), which also works
where the DNS host blocks custom MX records; domains added earlier keep their
SPF TXT and MX records. Verification checks SPF and MX through the CNAME, so
either shape verifies. Tracked links use the company
tracking domain, which every sending domain shares: the first domain creates it
on its root (links.<root>, or trackingPrefix) and returns its CNAME as
dnsRecords.trackingRecord; website.tracking reports its status. It is
optional and never blocks verification or sending: until it verifies, links use
the shared Sequenzy domain. Use get_tracking_domain, set_tracking_domain, verify_tracking_domain
and remove_tracking_domain to manage it; configure_sending_domain is
deprecated. Publish the returned records instead of assuming a fixed provider
or record count, using website.bounceRecords for the bounce subdomain (its
cnameRecord, or spf.record and mailFrom.mxRecord, never both at the same
name): 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 legacy custom reply domains, verify_sending_domain prepares any missing
website.dnsRecords.inboundVerificationRecord TXT after the inbound MX is
verified. Publish its exact name and public value, then verify again.
check_website reads the stored record. Check inboundRoutingStatus and
inboundRoutingError separately from readyToSend; ownership status alone
does not prove reply routing is active. Existing reply addresses stay intact.
These generated fields are read-only. A pending token is reused; expired
verification can restart, so use the latest returned value.
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.
Use delete_sender_profile to permanently remove an obsolete From identity.
It refuses the last sender and any profile used by a live campaign, active
sequence (including a step override), or transactional email. Eligible drafts
and account defaults move to the returned fallbackSenderProfileId; review it
before sending. Reply-to profiles are not supported by this delete tool.
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.
Subscribers
| Tool | Description |
| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| add_subscriber | Add one subscriber, including explicit listIds, with subscribers:write; status is creation-only. |
| 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. |
| list_subscriber_attributes | List custom attribute names in use with value type, list flag, example, and sampled-contact count; use before setting attributes. |
| 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.
add_subscriber with a createdAt at most one hour old remains eligible for new-subscriber account notifications. Older dates do not notify on creation; a later double opt-in confirmation can still notify. Recipient preferences, double opt-in and daily caps still apply. Supplying createdAt continues to default sequence enrollment to false. Bulk imports do not notify on creation.
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 using subscribers:write. 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.
Accounts (B2B organizations)
Accounts are your customers' companies, workspaces or teams, not your Sequenzy
account (get_account).
| Tool | Description |
| ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| list_accounts | List accounts with search, sort and pagination. |
| get_account_by_external_id | Get one account with up to 100 members and their roles. |
| upsert_account | Create or update an account by external ID, with optional members. |
| delete_account | Delete an account and its memberships; contacts are kept. |
| list_account_members | List members, owners first. |
| add_account_member / remove_account_member | Change membership by email or contact external ID. |
| trigger_account_event / list_account_events | Record an account event for owners, admins, all or none, and read the timeline. |
| list_account_suggestions | Read-only: work email domains several contacts share (default 3+), with up to 10 sample emails, skipping personal and disposable providers, your sending domains, domains where a contact is already in an account, and domains an account uses. |
| accept_account_suggestions | Create accounts for up to 25 confirmed domains, adding the domain's unassigned contacts as members (or adding them to the one account already using the domain). Skips domains already partly grouped. Safe to retry; no sync rules or segment-entered sequences run. |
| detect_account_organization_ids | Read-only: event properties and contact attributes holding your organization ID (such as workspaceId), with organization counts and a matching name key. |
| preview_accounts_from_organization_id | Read-only: the biggest accounts a key would create, each with the name it would get (from the name key, otherwise its contacts' shared work email domain), domain, contact count and sample emails. |
| create_accounts_from_organization_id | Start a background run creating one account per organization ID with its contacts as members. Returns jobId and alreadyRunning; nothing is sent and reruns are safe. |
| get_account_organization_id_job | Check that run: queued, running, completed with counts, or failed with the error. |
Show suggestions to the user and accept only the domains they confirm. Likewise, show the organization ID preview and create accounts only after the user confirms it.
Products & Digital Delivery
| 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.
Image Assets
| 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 10MB. 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"
}Lists, Tags, Segments
| 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.
