{
  "markdown": "# Sequenzy MCP Server\n\nOfficial MCP server for [Sequenzy](https://sequenzy.com), the AI-powered email marketing platform.\n\nConnect 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.\n\n## What You Can Do\n\n- Manage subscribers, tags, lists, and dynamic segments, including bulk tag reconciliation and synthetic event testing.\n- Sync segments to Meta custom audiences for Facebook and Instagram retargeting.\n- Manage products and attach digital delivery files for purchase automations.\n- Upload hosted email images with alt text and reusable responsive crop settings.\n- Draft, update, schedule, and inspect campaigns, including resolved audience previews, persisted conversion goals, and From, Reply-To, CC, and BCC identities.\n- Render campaigns, sequence steps, and templates to their exact email-safe HTML without sending.\n- Add one-click Poll and NPS survey blocks to emails and inspect campaign response summaries.\n- 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.\n- Cancel, pause, resume, duplicate, or delete campaigns and enroll contacts into sequences.\n- Manage transactional email templates and send transactional emails to shared To, Cc, and Bcc recipient lists.\n- Supply localized template variants or queue AI translation for enabled locales.\n- Create, preview, edit, publish, unpublish, and delete landing pages.\n- Create list-scoped saved signup forms with responsive stack, row, grid, and\n  single-image overlay block groups (including foreground gap controls), then\n  return client-safe static-site embeds.\n- Create, target, publish, duplicate, and deploy saved signup popups with the\n  same recursive block layouts.\n- Connect and verify custom domains for published landing pages.\n- Manage team invitations, inbox conversations, and outbound webhook endpoints.\n- Generate email copy, subject lines, and multi-step sequences.\n- Inspect analytics, subscriber activity, deliverability health, company-level sending pauses, integrations, published event payload schemas, sending identities, tracking settings, and dashboard URLs.\n- 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.\n- Diagnose why sending is paused and restore eligible hard-bounce pauses after confirming list cleanup.\n- Inspect exact-recipient bounce, complaint, and email-hygiene suppression, and clean up eligible stale bounces without exposing the shared SES suppression list.\n- 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.\n\nEvery 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.\n\n## Quick Setup\n\nThe easiest setup path is the Sequenzy wizard:\n\n```bash\nnpx @sequenzy/setup\n```\n\nThe wizard opens the browser login flow, creates a personal API key, detects supported AI clients, and configures them automatically when possible.\n\n## Hosted Remote MCP\n\nFor clients that support Streamable HTTP MCP, use Sequenzy's hosted endpoint instead of running a local stdio process:\n\n```text\nhttps://api.sequenzy.com/v1/mcp\n```\n\nChatGPT and the OpenAI plugin directory use the reviewed hosted surface:\n\n```text\nhttps://api.sequenzy.com/v1/mcp/openai\n```\n\nThat surface shares the same implementation and keeps the standard tool set\nexcept for six operations: `connect_integration`, `create_api_key`,\n`create_webhook`, `list_webhook_deliveries`, `replay_webhook_delivery`, and\n`rotate_sequence_inbound_webhook_secret`. Feedback stays available with a\nreduced schema for generalized, explicitly requested product feedback.\n\nRemote 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`.\n\nThe hosted endpoint and the stdio package support MCP specification\n`2026-07-28` while remaining compatible with 2025-era clients. Modern HTTP\nclients use per-request discovery and method headers; existing clients keep\nworking through the same endpoint and package command.\n\nMachine-readable discovery files:\n\n- MCP server manifest: [`server.json`](server.json)\n- Agent card: [`.well-known/agent-card.json`](.well-known/agent-card.json)\n- Agent capability manifest: [`agent-capability.json`](agent-capability.json)\n- OpenClaw skill metadata: [`openclaw/skill.json`](openclaw/skill.json)\n\n### Data and privacy\n\nSequenzy sends an MCP client only the data needed for the tool the user asks it\nto run, within the selected workspace and the key or OAuth scopes granted to\nthat client. Depending on the requested tool, this can include workspace names\nand IDs; subscriber contact, consent, audience, attribute, event, engagement,\nreply, survey, and commerce data; campaign and automation content; delivery\nanalytics; and integration or webhook status. See the\n[Sequenzy Privacy Policy](https://sequenzy.com/privacy) for the full categories,\npurposes, recipients, retention periods, and user controls.\n\nDo not use open-ended custom attributes, events, notes, forms, webhook samples,\nemail variables, or feedback to submit payment-card data, health or medical\ndata, government identifiers, biometric or genetic data, authentication\ncredentials, sensitive demographic data, or precise geolocation.\n\nThe OpenAI-reviewed route states and enforces those restrictions on relevant\nopen-ended inputs, including nested attribute paths such as `profile.ssn`,\ncoordinate pairs such as `lat`/`lng`, and labelled prose such as\n`Religion: ...` or `GPS coordinates: ...`. It rejects a credential-bearing URL\nin any argument, whether the credential sits in the userinfo, path, query, or\nfragment, such as a form or popup `redirectUrl` with an access token or URL\nsignature. Restricted attribute selectors inside merge tags are rejected\nwithout blocking ordinary authored copy about the same topic. On this surface,\n`render_email` accepts sample data or a policy-checked inline `subscriber`, but\nnot `subscriberId`, so it cannot resolve uninspected stored custom attributes.\nIts results remove restricted fields, raw API errors, debug payloads, internal\nrequest/trace/session identifiers, unnecessary account or credential\nidentifiers, stored credential-bearing URLs, and inbound-webhook URLs. Standard\nremote MCP and the local stdio package retain the complete contract for trusted\nclients, including credential-based integration setup, one-time API-key and\nwebhook secrets, inbound-webhook URLs, and detailed API errors. Prefer the\ndashboard or local CLI when secrets should stay outside an AI conversation.\n`submit_feedback` runs only when the user explicitly asks; its OpenAI schema is\nlimited to a generalized message, category, and optional workflow context, and\nthe route rejects feedback text that contains an email address or resource ID.\n\nWhat the reviewed surface guarantees is bounded. It recognizes restricted data\nby shape: English field-name words such as `passport_id`, `user.ssn`, or\n`api_secret` at any nesting depth, labelled prose such as `Diagnosis: ...`,\nknown credential shapes, decimal coordinate pairs, and credential-bearing URLs\ninside any string, including HTML. It does not interpret unlabelled prose,\nnon-English field names, or values a client deliberately obfuscates; those\nremain covered by the usage restriction above rather than by the filter.\n\n## Manual Setup\n\nAll stdio MCP clients use the same command:\n\n- Command: `npx`\n- Args: `-y @sequenzy/mcp`\n- Required env: `SEQUENZY_API_KEY=seq_user_your_key_here`\n\nOptional environment variables:\n\n- `SEQUENZY_API_URL` - Sequenzy API base URL. Defaults to `https://api.sequenzy.com`.\n- `SEQUENZY_APP_URL` - Sequenzy dashboard base URL used by app URL helpers. Defaults to `https://sequenzy.com`.\n\n### Claude Desktop\n\nAdd this to your Claude Desktop config:\n\n- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`\n- Windows: `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"sequenzy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@sequenzy/mcp\"],\n      \"env\": {\n        \"SEQUENZY_API_KEY\": \"seq_user_your_key_here\"\n      }\n    }\n  }\n}\n```\n\nRestart Claude Desktop after editing the config.\n\n### Claude Code\n\n```bash\nclaude mcp add --scope user --env=SEQUENZY_API_KEY=seq_user_your_key_here sequenzy -- npx -y @sequenzy/mcp\n```\n\nOn native Windows, wrap `npx` with `cmd /c`:\n\n```bash\nclaude mcp add --scope user --env=SEQUENZY_API_KEY=seq_user_your_key_here sequenzy -- cmd /c npx -y @sequenzy/mcp\n```\n\nFor a shared project config, use `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"sequenzy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@sequenzy/mcp\"],\n      \"env\": {\n        \"SEQUENZY_API_KEY\": \"seq_user_your_key_here\"\n      }\n    }\n  }\n}\n```\n\n### Codex\n\n```bash\ncodex mcp add sequenzy --env SEQUENZY_API_KEY=seq_user_your_key_here -- npx -y @sequenzy/mcp\ncodex mcp list\n```\n\nManual Codex config in `~/.codex/config.toml`:\n\n```toml\n[mcp_servers.sequenzy]\ncommand = \"npx\"\nargs = [\"-y\", \"@sequenzy/mcp\"]\n\n[mcp_servers.sequenzy.env]\nSEQUENZY_API_KEY = \"seq_user_your_key_here\"\n```\n\n### Cursor\n\nInstall **Sequenzy** from the Cursor Marketplace for a hosted connection with Sequenzy OAuth. The plugin connects to:\n\n```text\nhttps://api.sequenzy.com/v1/mcp\n```\n\nAfter installing, complete the browser sign-in flow. Cursor's agent can then use Sequenzy tools from chat, including when Grok is the selected model.\n\nFor a manual local stdio setup instead, add this to `~/.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"sequenzy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@sequenzy/mcp\"],\n      \"env\": {\n        \"SEQUENZY_API_KEY\": \"seq_user_your_key_here\"\n      }\n    }\n  }\n}\n```\n\n### Windsurf\n\nUse the same JSON shape as Cursor.\n\n- macOS: `~/Library/Application Support/Windsurf/mcp.json`\n- Windows: `%APPDATA%\\Windsurf\\mcp.json`\n\n### VS Code Copilot\n\nVS Code uses a `servers` object:\n\n```json\n{\n  \"servers\": {\n    \"sequenzy\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@sequenzy/mcp\"],\n      \"env\": {\n        \"SEQUENZY_API_KEY\": \"seq_user_your_key_here\"\n      }\n    }\n  }\n}\n```\n\n### Other MCP Clients\n\nFor OpenClaw, Hermes, and other MCP-compatible clients, point the client at `npx -y @sequenzy/mcp` and set `SEQUENZY_API_KEY`.\n\n## Getting an API Key\n\n1. Open [the Sequenzy dashboard](https://sequenzy.com/dashboard).\n2. Use the **MCP** setup flow to create a personal key, or open **Settings ->\n   API Keys** to create a company key.\n3. Choose a permission preset or the exact custom scopes the integration needs.\n4. Add the key to your MCP client config.\n\nPersonal keys start with `seq_user_`. You can revoke them any time in the dashboard.\n\nCompany keys can also be cleaned up without exposing secrets. Call\n`list_api_keys` to compare the key ID, name, non-secret prefix, permissions,\nlast-use timestamp, and `isCurrent` marker, then pass the exact ID to\n`revoke_api_key`. `delete_api_key` is a compatibility alias for the same\npermanent operation. List and revoke responses never contain the plain key or\nstored key hash.\n\n### Recover from missing API key permissions\n\nIf a tool reports a missing scope such as `campaigns:read` or\n`templates:write`, call `get_account`. Its `apiKeyPermissions` field lists the\ncurrent key identity and type, scopes, common missing marketing read scopes, and\na direct `manageUrl`. The OpenAI-reviewed route returns the same permissions\nwithout the user's account ID or the active key's identity. Personal keys open\nAccount API Keys; company keys open the selected workspace's API Keys settings.\nIf the key does not include\n`account:read`, open the\n[Sequenzy dashboard](https://sequenzy.com/dashboard) directly and choose the\nmatching API Keys page.\n\nPermissions are editable in place, so open `manageUrl`. For a company key, use\n`list_api_keys` and its `isCurrent` flag to identify the active key before\nediting it, then retry the failed tool without replacing the credential or\nrestarting the client. An agent using a company key with `api_keys:manage` can\ninstead call `update_api_key`; personal keys must be edited on the account-level\npage because that tool only manages company keys. Its `scopes` and `preset`\ninputs replace the whole permission selection rather than merging, so preserve\nevery existing scope that is still needed. Hosted OAuth connections can\nalternatively disconnect and reauthorize with broader permissions.\n\nWhen the active key itself lacks `api_keys:manage`, call\n`request_api_key_handoff` instead of retrying `update_api_key`. It requires\n`account:read` and returns an owner-review URL with the requested key name,\npermissions, and optional predecessor prefilled. It never creates or returns a\nkey; the workspace owner reviews the form, creates the replacement in the\nbrowser, and copies it into the client. Pass `replaceApiKeyId: \"current\"` to\noffer revocation of the active key after the replacement is created. If the\nactive key also lacks `account:read`, use the dashboard directly.\n\nThe default **Safer agent access** preset includes `lists:write` and\n`tags:write`, so agents can create and update list and tag definitions, and it\nincludes `subscribers:tag` for applying tags to existing contacts. It also\nincludes `ab_tests:read`, `ab_tests:write`, and `sequences:write`, so agents can\naudit and edit sequence A/B variant copy, including cart and browse abandonment\nmessages. It does not include `subscribers:write`, so it cannot add contacts to\nlists or remove them from lists. Deleting a list or tag still requires the\nmatching `lists:delete` or `tags:delete` permission.\n\nThe AI drafting preset includes `subscribers:write`, so drafting agents can\nbuild a list as well as create it. Imports that apply `listIds` also need\n`lists:write`; sequence enrollment or double-opt-in delivery additionally needs\n`automations:trigger`.\n\n## Tools\n\nThe standard surface currently exposes 243 MCP tools. The OpenAI-reviewed\nsurface exposes 237; only the six operations listed above are omitted.\n\nTools reject arguments they do not declare instead of silently ignoring them.\nErrors name the unsupported fields, list the supported arguments, and provide\nfocused guidance for common mistakes such as invented subscriber filters or\nsort options.\n\n### Account, Companies, Setup\n\n| Tool                                 | Description                                                                                                                                                                                                                                                                    |\n| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `get_account`                        | Get account info, available companies, current key permissions, and the API Keys management URL.                                                                                                                                                                               |\n| `select_company`                     | Set the active company for future tool calls.                                                                                                                                                                                                                                  |\n| `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.                                                                        |\n| `create_company`                     | Create a new company or brand.                                                                                                                                                                                                                                                 |\n| `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. |\n| `update_company`                     | Edit product info, brand context, email theme, reply tracking, and account-wide From/Reply-To profile defaults or names.                                                                                                                                                       |\n| `get_sync_rules`                     | Read the company's event-to-tag rules and whether it uses the inherited platform preset.                                                                                                                                                                                       |\n| `update_sync_rules`                  | Replace all sync rules; pass `[]` to disable them or `null` to opt into the SaaS/ecommerce platform preset.                                                                                                                                                                    |\n| `get_shopify_automation_settings`    | Read browse-abandonment, cart-abandonment, and price-drop settings for the connected Shopify store.                                                                                                                                                                            |\n| `update_shopify_automation_settings` | Partially update Shopify automation settings or reset an individual section to its platform defaults.                                                                                                                                                                          |\n| `create_api_key`                     | Create a company API key and return its one-time secret on standard MCP; omitted from the OpenAI-reviewed route.                                                                                                                                                               |\n| `request_api_key_handoff`            | Prepare an owner-reviewed create/rotation URL when the active key cannot manage API keys itself.                                                                                                                                                                               |\n| `list_api_keys`                      | List company API keys as non-secret metadata for safe identification and cleanup.                                                                                                                                                                                              |\n| `update_api_key`                     | Rename a company API key or replace its permission preset or scopes without changing the key value.                                                                                                                                                                            |\n| `revoke_api_key`                     | Permanently revoke an exact company API key by ID after checking it with `list_api_keys`.                                                                                                                                                                                      |\n| `delete_api_key`                     | Compatibility alias for `revoke_api_key`.                                                                                                                                                                                                                                      |\n| `list_websites`                      | List sending domains with stored aggregate, SPF, DKIM, and MAIL FROM status.                                                                                                                                                                                                   |\n| `add_sending_domain`                 | Add a sending domain and return its cohort-specific DNS setup records.                                                                                                                                                                                                         |\n| `add_website`                        | Compatibility alias for `add_sending_domain`.                                                                                                                                                                                                                                  |\n| `check_website`                      | Read a sending domain's stored SPF, DKIM, MAIL FROM, and aggregate verification details.                                                                                                                                                                                       |\n| `verify_sending_domain`              | Run a fresh sending-domain DNS/provider verification and return current status and diagnostics.                                                                                                                                                                                |\n| `list_integrations`                  | List connected integrations with connection and sync health, without returning credentials.                                                                                                                                                                                    |\n| `get_sending_status`                 | Diagnose active, paused, or suspended sending, including enforcement denominators, review gates, and remediation steps.                                                                                                                                                        |\n| `resume_sending`                     | Restore an eligible hard-bounce pause after explicitly confirming the list has been sanitized.                                                                                                                                                                                 |\n| `get_tracking_settings`              | Read account-wide and Transactional API open/click defaults, unsubscribe, attribution, UTM, click-domain, reply-tracking, and double-opt-in settings.                                                                                                                          |\n| `update_tracking_settings`           | Update account-wide and Transactional API tracking defaults, attribution, UTM, and account-wide double opt-in.                                                                                                                                                                 |\n| `get_integration_guide`              | Get framework-specific integration examples.                                                                                                                                                                                                                                   |\n| `get_integration`                    | Inspect one connected integration, its event wiring, list targeting, recent activity, and recommendations.                                                                                                                                                                     |\n| `list_integration_capabilities`      | Compare provider capabilities whether or not they are connected.                                                                                                                                                                                                               |\n| `connect_integration`                | Connect supported API-key or webhook-secret providers on standard MCP; omitted from the OpenAI-reviewed route.                                                                                                                                                                 |\n| `get_event_schema`                   | Inspect published event payload examples, property paths, types, and merge tags by provider.                                                                                                                                                                                   |\n| `list_integration_activity`          | Read the retained integration-specific webhook and sync activity log.                                                                                                                                                                                                          |\n| `set_integration_sync_enabled`       | Enable or disable bulk imports and backfills while leaving live webhooks connected.                                                                                                                                                                                            |\n| `set_integration_list_targeting`     | Choose which lists contacts created by a supported integration join on future provider writes.                                                                                                                                                                                 |\n| `sync_integration`                   | Queue payment revenue, Supabase users, or a PostHog/Segment event-history import using the saved integration configuration.                                                                                                                                                    |\n| `get_integration_pixel`              | Read Shopify's live pixel/configuration state and distinguish confirmed dark events from an unknown read.                                                                                                                                                                      |\n| `activate_integration_pixel`         | Install or repoint Shopify's storefront pixel; idempotent when it is already current.                                                                                                                                                                                          |\n| `list_web_tracking_keys`             | List publishable website-tracking keys, origin restrictions, usage state, and install snippets.                                                                                                                                                                                |\n| `get_web_tracking_key`               | Get one website-tracking key with its exact install snippet and ingest endpoint.                                                                                                                                                                                               |\n| `create_web_tracking_key`            | Create a publishable tracking key for a non-Shopify storefront or website.                                                                                                                                                                                                     |\n| `update_web_tracking_key`            | Rename, restrict, revoke, or re-enable a website-tracking key.                                                                                                                                                                                                                 |\n| `delete_web_tracking_key`            | Permanently delete a website-tracking key after its snippet has been removed.                                                                                                                                                                                                  |\n| `list_sender_profiles`               | List sender and reply-to profiles, defaults, and sending-domain readiness.                                                                                                                                                                                                     |\n| `update_sender_profile`              | Rename one sender or reply-to profile without changing the account defaults.                                                                                                                                                                                                   |\n| `delete_sender_profile`              | Permanently delete an unused sender profile, with guards for live sending surfaces and the last remaining sender.                                                                                                                                                              |\n| `get_notification_preferences`       | Read the current user's per-company account notification settings and supported modes, including the Monday weekly report.                                                                                                                                                     |\n| `update_notification_preferences`    | Update the current user's account notification delivery modes, including weekly-report opt-out, without affecting teammates.                                                                                                                                                   |\n| `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.                                                          |\n\n`get_sending_status` keeps the Postgres-backed pause state, review gates, and\nremediation available when sender-health analytics are temporarily unavailable;\nin that degraded case `senderHealth` is `null`.\n\n`render_email` returns `unresolvedMergeTags` so callers can distinguish an\nunknown name from a recognized tag that is merely blank for the previewed\ncontact. Unknown names are reported even when a `default` filter supplied text:\nfor example, `{{ subscriber.frstName | default: \"there\" }}` renders a plausible\ngreeting for every contact while bypassing stored first names. A recognized\nname that is blank for one contact is not reported when its default is used.\nThe OpenAI-reviewed route rejects restricted custom-attribute selectors inside\nmerge tags. It also omits the `subscriberId` argument; use a policy-checked\ninline `subscriber`, or omit subscriber data for a sample preview.\n\nTo render a sequence step whose `nodeType` is `action_ab_test`, pass the\nstep's `sequenceId` and `nodeId` together with a `variantId` from\n`get_sequence.sequence.emails[].abTest.variants`. These steps have no email of\ntheir own, so the variant is required; reading and rendering their competing\ncopy also requires the `ab_tests:read` scope.\n\nFor Supabase, `sync_integration` reuses the project, schema, table, list\nselection, and consent mappings saved in the dashboard. It cannot target an\narbitrary table. Run it after installing the live database trigger to import\nusers who existed before the trigger was installed, then poll `get_integration`\nand `list_integration_activity` for progress and row-level outcomes.\n\n`set_integration_sync_enabled` controls bulk imports and backfills only; it\ndoes not stop a provider's live webhook from creating contacts. Use\n`set_integration_list_targeting` to choose their future list memberships:\n`null` follows workspace defaults, `[]` joins no list, and a populated array\ntargets those lists. The change is not retroactive and never removes existing\nmemberships. It also does not stop default `any_contact` sequences, which\nenroll list-less contacts; explicit `any_list` and specific-list sequences\nrequire a matching membership. Pair list targeting with\n`pause_sequence_enrollments` when those default enrollments must stop too.\nSupabase, Stripe, Shopify, Wix, and Webflow support this control.\n\nFor PostHog, `sync_integration` restarts the event-history import from the\nbeginning with the stored personal API key. Imported events are deduplicated, so\nretrying a failed import does not create duplicates.\n\nFor Segment, `connect_integration` on standard MCP can optionally import recent\nevent history from Unify after the live webhook is connected. The import walks\nexisting contacts through the Profile API, covers the API's most recent 14 days,\nskips contacts without a matching profile, and safely deduplicates retries and\nlive webhook overlap. New connections skip automatic page/screen calls unless\nthose names are explicitly allowlisted. Segment webhook secrets must be 16-153\nUTF-8 bytes. On the OpenAI-reviewed route, which omits `connect_integration`,\nconnect Segment in the dashboard or local CLI instead. Use `sync_integration`\nto retry with the saved credentials.\n\nFor Attio, `connect_integration` on standard MCP accepts a workspace access\ntoken without a webhook secret, with optional `settings.listMap` as a map of\nSequenzy list IDs to Attio people-list UUIDs or API slugs, plus\n`syncCompanyFromDomain` to control company matching from non-free-mail domains.\nOn the OpenAI-reviewed route, connect Attio in the dashboard or local CLI, then\nuse `update_attio_settings` for the same settings. The integration is\noutbound-only:\nnew joins to mapped Sequenzy lists upsert the person and add them to the Attio\nlist; list removals do not remove records from Attio.\n\nCall `get_event_schema` before writing an `{{event.*}}` merge tag or an event\nproperty filter. Omit `eventName` to list documented built-in events; provide\nan event name to receive provider-specific example payloads and property paths,\nand optionally filter by `provider`. Custom event names remain valid even when\nthe result reports `documented: false`; that only means no reference sample is\npublished. Use integration activity or sequence enrollments for actual delivery\ndata because this tool returns static reference data.\n\nFor a new sending domain, call `add_sending_domain`, publish the DNS records in\nthe returned `website.dnsRecords`, wait for DNS propagation, and then call\n`verify_sending_domain`. Publish every returned record instead of assuming a\nfixed provider or record count: unified domains include required DMARC, while\nlegacy domains can return Amazon SES MAIL FROM and inbound-reply records. If\nverification is attempted before creation, the error points back to\n`add_sending_domain` with the requested domain.\n\nFor Shopify, call `get_integration_pixel` before relying on product views,\ncart activity, or browse-abandonment triggers. The result is read live from\nShopify because merchants can remove the pixel independently. If\n`pixel.healthy` is false, `dependentEvents` names the triggers that cannot\narrive; call `activate_integration_pixel` to install or repoint the pixel.\nActivation is idempotent, and events begin on the next storefront visit rather\nthan being backfilled.\n\nFor custom, headless, ticketing, or SaaS websites, use\n`list_web_tracking_keys` before relying on product-view or cart triggers. Create\na key with an explicit origin allowlist, install the returned `installSnippet`,\nthen have the customer's authenticated backend mint a short-lived proof through\n`POST /api/v1/web-tracking-identities` and call\n`sequenzy.identify(email, identityToken)` at sign-in or checkout. A publishable\nkey alone only records anonymous activity and cannot trigger subscriber\nautomation. The returned snippet installs synchronous method stubs before its\nasync loader, so identity and event calls made during page bootstrap are queued\nuntil the SDK is ready. Prefer revoking a key with `update_web_tracking_key`\nbefore permanently deleting it.\n\nNew companies start with no sync rules. The inherited preset remains available\nfor SaaS/ecommerce companies by passing `null` to `update_sync_rules`; services\nand consulting companies should normally keep `[]` or define explicit rules.\n\nUse `list_sender_profiles` to find the profile ID, then call\n`update_sender_profile` to change only its display name. Pass `type: \"reply\"`\nfor a reply-to profile; sender is the default. The address, sending domain, and\naccount-wide default From/Reply-To selections remain unchanged. Renaming\nrequires the `companies:manage` scope.\n\nUse `delete_sender_profile` to permanently remove an obsolete From identity.\nIt refuses the last sender and any profile used by a live campaign, active\nsequence (including a step override), or transactional email. Eligible drafts\nand account defaults move to the returned `fallbackSenderProfileId`; review it\nbefore sending. Reply-to profiles are not supported by this delete tool.\n\nShopify cart abandonment is enabled by default. It fires\n`ecommerce.cart_abandoned` after one hour of cart inactivity, with a 24-hour\nper-subscriber cooldown. Use `update_shopify_automation_settings` to change the\n`cartAbandonment.enabled`, `delayHours`, or `cooldownHours` fields; pass\n`cartAbandonment: null` to restore those defaults without changing browse\nabandonment or price-drop settings. Timing values must be positive;\n`delayHours` is capped at 168 and `cooldownHours` at 720.\n\n### Subscribers\n\n| Tool                          | Description                                                                                                                                        |\n| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `add_subscriber`              | Add one subscriber; status is creation-only, so use `update_subscriber` for an existing contact.                                                   |\n| `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. |\n| `get_subscriber_import`       | Read progress, row outcome counts, and failure summaries for a queued import.                                                                      |\n| `update_subscriber`           | Update native profile and phone fields, SMS consent, attributes, tags, or global status.                                                           |\n| `remove_subscriber`           | Unsubscribe while preserving suppression history, or permanently delete only with `hardDelete: true`.                                              |\n| `get_subscriber`              | Fetch subscriber details by email or external ID.                                                                                                  |\n| `search_subscribers`          | Search by query, tags, list, status, segment, or one custom attribute, with automatic or resumable pagination.                                     |\n| `trigger_subscriber_event`    | Emit one custom event exactly as an integration would, applying sync rules and matching sequence triggers.                                         |\n| `trigger_subscriber_events`   | Emit several ordered custom events for one subscriber.                                                                                             |\n| `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.                  |\n| `bulk_add_subscriber_tags`    | Add tags to up to 500 existing subscribers; requires `subscribers:tag` and may also require `tags:write`.                                          |\n| `bulk_remove_subscriber_tags` | Remove tags from up to 500 existing subscribers; requires `subscribers:tag` or `subscribers:write`.                                                |\n\nUse `create_subscriber_import` for CRM onboarding instead of looping over\n`add_subscriber`. One call accepts 5,000 full records and returns an asynchronous\nimport ID; poll it with `get_subscriber_import`. A `completed` import can still\ncontain row failures, so inspect `failedCount` and `failedReasons`. Every\nexcluded row is accounted for: `skippedReasons` sums to `skippedCount`, and\n`failedReasons` sums to `failedCount`. Report any shortfall with the import ID\ninstead of guessing which rows were omitted. When email hygiene is enabled,\ndeliverability checks continue separately after ingestion and results appear\nin List health; import status does not wait for or include those verdicts.\nInvalid verdicts are suppressed from later sends. Use `optInMode: \"confirmed\"`\nonly when consent was already verified.\n\nFor `import_subscriber_events`, email is required when a row may create a new\ncontact; `externalId` can stand alone only for an existing contact. Supply a\nstable `eventId` on every row. Retrying reuses the original receipt and\nidempotently re-attempts downstream recovery. Historical classification is per\ncontact: if any row for a contact is recent, that contact's whole group uses\nthe live side-effect path.\n\nFor compliance suppression, call `update_subscriber` with\n`status: \"unsubscribed\"` (or use `remove_subscriber` without `hardDelete`). Do\nnot retry `add_subscriber` with a different status: status on that tool applies\nonly when the contact is first created, and a mismatched skipped result is\nreported as an error.\n\nWhen `add_subscriber` omits `listIds`, a contact created by the call follows\nthe workspace default lists while an existing contact keeps its current list\nmemberships. Pass list IDs explicitly when an existing contact should join\nspecific lists; pass `[]` to target no lists.\n\n`update_subscriber.phone` writes the native phone field shown on the contact,\nnot a custom attribute. Pass `smsConsent: true` only after verifying express\nwritten consent, or `false` to opt the contact out. Changing the phone without\n`smsConsent` resets SMS consent because consent belongs to the old number.\n\n`add_subscriber`, `update_subscriber`, and `create_subscriber_import` accept an\nIANA `timezone` such as `America/New_York`. The value is stored on the native\ncontact profile and enables recipient-local campaign delivery. Pass an empty\ntimezone to `update_subscriber` to clear it; invalid import-row values are\nignored without rejecting the rest of the import.\n\n### Products & Digital Delivery\n\n| Tool                  | Description                                                                           |\n| --------------------- | ------------------------------------------------------------------------------------- |\n| `list_products`       | List synced products from Stripe, Shopify, WooCommerce, manual, or Commerce API data. |\n| `upsert_products`     | Create or update up to 100 Commerce API products keyed by your product ID.            |\n| `delete_product`      | Delete a product previously pushed through the Commerce API.                          |\n| `attach_product_file` | Attach a hosted or locally uploaded delivery file to a product.                       |\n| `remove_product_file` | Remove an attached product delivery file.                                             |\n| `sync_products`       | Queue a Stripe product catalog sync, optionally selecting an integration by ID.       |\n\nAfter 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}}`.\n\nFor 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.\n\n### Image Assets\n\n| Tool                 | Description                                                                                  |\n| -------------------- | -------------------------------------------------------------------------------------------- |\n| `upload_image_asset` | Upload an email image and return its hosted media record plus a ready-to-insert image block. |\n\nThe tool accepts PNG, JPEG, GIF, and WebP images up to 5MB. Local stdio clients\ncan pass `filePath`. Hosted/remote clients that can access attachment bytes can\npass `imageBase64` with `filename`. Provide `altText` for accessibility, then\nuse `displayWidthPercent`, `cropHeight`, `objectFit` (`cover` or `contain`), and\n`align` to standardize screenshot presentation. The returned `imageBlock` can\nbe copied directly into the block array accepted by campaign, sequence,\ntemplate, and transactional-email tools.\n\nAuthenticated image bytes are always uploaded to the origin configured by\n`SEQUENZY_API_URL`, even if a reverse proxy returns an equivalent upload URL\nunder another host. API credentials are never forwarded to that alternate\norigin.\n\n```json\n{\n  \"filePath\": \"/Users/me/Desktop/product-results.png\",\n  \"altText\": \"Product results dashboard\",\n  \"displayWidthPercent\": 100,\n  \"cropHeight\": 320,\n  \"objectFit\": \"cover\",\n  \"align\": \"center\"\n}\n```\n\n### Lists, Tags, Segments\n\n| Tool                           | Description                                                 |\n| ------------------------------ | ----------------------------------------------------------- |\n| `list_tags`                    | List all tags.                                              |\n| `create_tag`                   | Create a tag definition with an optional color.             |\n| `update_tag`                   | Update a tag color.                                         |\n| `delete_tag`                   | Delete a tag and remove it from subscribers.                |\n| `list_lists`                   | List subscriber lists.                                      |\n| `create_list`                  | Create a subscriber list.                                   |\n| `update_list`                  | Rename or describe a subscriber list.                       |\n| `delete_list`                  | Delete a subscriber list.                                   |\n| `add_subscribers_to_list`      | Add up to 500 subscribers to a list from an email array.    |\n| `remove_subscribers_from_list` | Remove up to 500 subscribers from a list.                   |\n| `list_segments`                | List saved segments and counts.                             |\n| `create_segment`               | Create nested or same-element array-filtered segments.      |\n| `update_segment`               | Update segment name, filters, root group, or join operator. |\n| `delete_segment`               | Delete a segment (requires `segments:delete`).              |\n| `get_segment_count`            | Preview the active subscriber count for a segment.          |\n\nFor subscriber exports, `search_subscribers` accepts `listId`, exact `listName`,\nor `list` (ID first, then exact name). It also accepts `attribute` plus\n`attributeValue`, with `attributeOperator` for `contains`, numeric comparisons,\nor `is_not_empty`; the combined `\"attributeName:value\"` form remains supported.\nFilters combine with AND; use a saved segment for OR logic, nested groups,\nexclusions, engagement, or event conditions. If `limit` is omitted, the tool\nfetches every matching page automatically. For chunked reads, pass `limit` and\nfollow `pagination.nextCursor` (or `pagination.nextOffset`) while `hasMore` is\ntrue. `offset` and `page` are supported below 1,000,000 skipped matches; use the\ncursor for deeper audiences.\n\nFor bulk list population, use `add_subscribers_to_list`; the backing API endpoint is `POST /api/v1/lists/{listId}/subscribers` with no `/bulk` suffix:\n\n```json\n{\n  \"emails\": [\"ada@example.com\", \"grace@example.com\"],\n  \"duplicateStrategy\": \"skip\",\n  \"enrollInSequences\": false,\n  \"optInMode\": \"default\"\n}\n```\n\nSend 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.\n\nSegment 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.\n\nFor array-of-object attributes, use wildcard paths such as\n`history_events[].eventvenue_id:2103`. When an AND group also filters\n`history_events[].showing_date`, both conditions must match one shared\n`history_events[]` element; values from unrelated history entries are not\ncombined. Deleting a segment requires `segments:delete`; `segments:write` is\nnot sufficient.\n\nEach segment filter field validates its own operators:\n\n- `status`, `segment`: `is`, `is_not`\n- `tag`: `contains`, `not_contains`, `is_empty`, `is_not_empty`\n- `email`: `contains`, `not_contains`\n- `emailProvider`, `list`: `is`, `is_not`, `is_empty`, `is_not_empty`\n- `firstName`, `lastName`: `contains`, `not_contains`, `is_empty`, `is_not_empty`\n- `added`: `less_than`, `more_than`\n- `attribute`: `is`, `is_not`, `is_empty`, `is_not_empty`, `gte`, `lte`, `gt`, `lt`, `contains`, `not_contains`\n- `event`, email engagement fields: `is`, `is_not`, `at_least`, `less_than_count`\n- `emailBounced`: also supports `is_temporary_bounce`, `is_permanent_bounce`\n- `stripeProduct`: `is`, `is_not`, `at_least`, `less_than_count`\n- `stripeCurrentProduct`, `stripeTrialProduct`: `is`, `is_not`, `gte`, `lte`, `gt`, `lt`\n- `commerceProduct`: `is`, `is_not`, `at_least`, `less_than_count`\n\nStripe product filter examples:\n\n```json\n{ \"field\": \"stripeProduct\", \"operator\": \"is\", \"value\": \"prod_pro\" }\n{ \"field\": \"stripeProduct\", \"operator\": \"is_not\", \"value\": \"prod_pro\" }\n{ \"field\": \"stripeProduct\", \"operator\": \"at_least\", \"value\": \"prod_pro:3\" }\n{ \"field\": \"stripeProduct\", \"operator\": \"less_than_count\", \"value\": \"prod_pro:3\" }\n```\n\nCommerce 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:\n\n```json\n{ \"field\": \"commerceProduct\", \"operator\": \"is\", \"value\": \"api:starter-kit\" }\n{ \"field\": \"commerceProduct\", \"operator\": \"at_least\", \"value\": \"shopify:42:2\" }\n```\n\nEngagement 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.\n\n### Audience Syncs (Meta Ads)\n\n| Tool                   | Description                                                          |\n| ---------------------- | -------------------------------------------------------------------- |\n| `list_audience_syncs`  | List segment-to-audience syncs with schedule and last sync status.   |\n| `list_ad_accounts`     | List the Meta ad accounts available for syncing.                     |\n| `create_audience_sync` | Push a segment to a Meta custom audience on a schedule.              |\n| `update_audience_sync` | Change sync frequency (`hourly`, `daily`, `weekly`) or pause/resume. |\n| `delete_audience_sync` | Remove a sync mapping; the Meta audience itself is kept.             |\n| `sync_audience_now`    | Trigger an immediate upload outside the regular schedule.            |\n\nRequires 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.\n\nAudiences 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.\n\n### Templates\n\n| Tool                          | Description                                                                                                        |\n| ----------------------------- | ------------------------------------------------------------------------------------------------------------------ |\n| `list_templates`              | List templates with localization status, label and `isTemplate` filtering, and pagination.                         |\n| `get_template`                | Read template details, content, and localized variants.                                                            |\n| `create_template`             | Create templates from a prompt, HTML, or Sequenzy blocks; use `isTemplate: true` to save a reusable master design. |\n| `update_template`             | Update template metadata, inbox preview text, labels, HTML, or blocks; mark or unmark a master with `isTemplate`.  |\n| `set_template_localization`   | Create or replace a caller-supplied localized variant.                                                             |\n| `sync_template_localizations` | Queue AI translation for selected or all enabled non-primary locales.                                              |\n| `delete_template`             | Delete a template.                                                                                                 |\n\n`list_templates` returns 50 email bodies newest first by default and accepts a\n`limit` up to 100. Advance `offset` by `pagination.count` while\n`pagination.hasMore` is true; `pagination.total` reports the full matching\ncount, including campaign and transactional-email bodies.\n\nSet `isTemplate: true` on `list_templates` to return only saved master designs,\nor `false` to return ordinary email bodies. Marked masters are offered as\nstarting points for dashboard sequence steps and campaigns; starting from one creates\nan independent copy so edits leave the master intact.\n\nStandalone/sequence source-design copying and AI rewriting within a selected layout are currently\ndashboard-only. This release intentionally keeps those workflows in interactive\nauthoring, where users can review the source, translations, and any fallback copy\nbefore saving a sequence step. REST, CLI, and MCP expose no equivalent standalone/sequence source-design\noperation. `create_template` with `prompt` generates new content without preserving\nan existing layout; supplied HTML or blocks create a new body without automatically\ncopying localized variants. See the [interface availability documentation](https://docs.sequenzy.com/concepts/email-templates#availability-across-interfaces).\n\nCampaign copies already work through REST `POST /api/v1/campaigns` and MCP\n`create_campaign` with `templateId`; it cannot be combined with `prompt` for an AI rewrite.\n\nFor net-new content requested in natural language, pass `prompt` so Sequenzy\ngenerates branded native blocks server-side. Use `blocks` only for finished\ncaller-supplied Sequenzy content, and use `html` only when preserving supplied\nor explicitly requested markup. `prompt`, `blocks`, and `html` are mutually\nexclusive; `style` and `tone` are valid only with `prompt`.\n\nUse `set_template_localization` when translated copy comes from your own\nlocalization workflow. It requires an enabled non-primary `locale`, a localized\n`subject`, and exactly one of `html` or `blocks`. Use\n`sync_template_localizations` to ask Sequenzy to translate selected locales;\nomit `locales` to sync every enabled non-primary locale. Explicit sync works\neven when automatic on-save localization is disabled.\n\n### Reusable Email Components\n\n| Tool                          | Description                                                                    |\n| ----------------------------- | ------------------------------------------------------------------------------ |\n| `list_email_components`       | List saved sections and footers, optionally limited to pinned defaults.        |\n| `get_email_component`         | Read one component's blocks, metadata, version, and default-slot state.        |\n| `get_default_email_component` | Read the component currently pinned to a default slot such as `footer`.        |\n| `set_default_email_component` | Create or replace the company default footer used by newly built block emails. |\n| `create_email_component`      | Save a reusable section or footer from a block list.                           |\n| `update_email_component`      | Update component metadata or replace its blocks and increment its version.     |\n| `delete_email_component`      | Delete a component without changing emails that already copied its blocks.     |\n\nComponents are copied into emails when those emails are built, so later edits\naffect newly built emails rather than rewriting existing content. The default\nfooter keeps its unsubscribe link enabled, while transactional rendering hides\nthat link. Raw HTML emails keep their own markup and do not receive block\ncomponents; their send-time unsubscribe handling remains unchanged.\n\n### A/B Tests\n\n| Tool                     | Description                                                                    |\n| ------------------------ | ------------------------------------------------------------------------------ |\n| `list_ab_tests`          | List A/B tests and variants, optionally scoped by sequence.                    |\n| `get_ab_test`            | Get effective settings, variants, localization status, and sequence-step copy. |\n| `get_ab_test_stats`      | Get aggregate and per-variant stats.                                           |\n| `restart_ab_test`        | Restart a stopped or completed A/B test.                                       |\n| `select_ab_test_winner`  | Select a campaign test winner and queue remaining delivery.                    |\n| `update_ab_test`         | Update campaign or sequence winner-selection settings.                         |\n| `update_ab_test_variant` | Update campaign draft or sequence variant copy.                                |\n| `create_ab_test`         | Create a campaign test or convert a sequence email step.                       |\n| `add_ab_test_variant`    | Add a variant to an existing A/B test.                                         |\n| `delete_ab_test_variant` | Delete a draft A/B test variant.                 ",
  "bytes": 60000,
  "sha": "7fc220506ab68a9ba36b9b429683bdb42c067b86d98f5230c7ea5f3adf4f8430",
  "repo_slug": "sequenzy/mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_polnikale_sequenzy_mcp_d7358659/readme"
}