onboarding_complete
Complete onboarding
Mark the current tenant's billing as active (simulates the post-payment confirmation in stub-billing mode). Requires owner/admin role.
NewsletterMCP exposes 66 MCP tools for email marketing from Claude, ChatGPT & Cursor: migrate off Brevo/Mailchimp, manage subscribers, send campaigns, build automation flows, verify domains, DOI double opt-in, analytics — all via the Model Context Protocol, no dashboard.
Live catalogue — auto-synced from the running MCP server.
onboarding_completeComplete onboarding
Mark the current tenant's billing as active (simulates the post-payment confirmation in stub-billing mode). Requires owner/admin role.
onboarding_invite_userInvite a teammate
Add a user to the current tenant with a role (owner | admin | editor). Returns their userId and a fresh apiToken. Requires owner/admin role.
onboarding_startStart onboarding
MCP-first signup: create a new tenant with you as owner. Returns the tenantId, an apiToken for authenticated (HTTP) access and a payment link to add a card. Works WITHOUT authentication — this is the entry point.
onboarding_statusread-onlyOnboarding status
Check the current tenant's billing status (trial | active | past_due) and payment link.
tenant_getread-onlyGet tenant
Fetch the current tenant: name, billing status and member list with roles.
tenant_settings_updateUpdate tenant settings
Update tenant mail settings: mailFrom, replyTo, footerHtml (Impressum/postal address), baseUrl (public link host) and doiEnabled (double opt-in). Only the fields you pass are changed.
migrate_campaignsMigrate / import past campaigns / newsletters (Brevo → drafts)
Execute the migration/import of your PAST CAMPAIGNS — sent newsletters / broadcasts — from another email service provider (Brevo; Mailchimp/Kit not yet supported) into this workspace as DRAFTS. Each campaign's subject and HTML are preserved exactly (stored as a complete document — not re-wrapped), with provenance recorded (imported_from, source_kind, source_ref). Imported campaigns land as inert DRAFTS (status draft) — they are NEVER re-sent; no email is delivered by this import. Idempotent: safe to re-run — already-imported campaigns are skipped and create 0 new drafts. Returns per-batch counts and the number of drafts created. Run migrate_campaigns_preview first.
migrate_campaigns_previewread-onlyPreview a campaign / newsletter migration (dry-run, writes nothing)
Dry-run preview of migrating/importing your PAST CAMPAIGNS — sent newsletters / broadcasts — from another email service provider (ESP migration) — Brevo (Mailchimp/Kit not yet supported) — into this workspace's drafts. Fetches your past campaigns and shows how many would be imported, how many are skipped as already-imported duplicates or intra-batch duplicates, how many are invalid, plus sample rows (name, subject, HTML size). The imported subject and HTML are PRESERVED exactly. Campaigns are imported as DRAFTS (status draft) — they are NOT re-sent. WRITES NOTHING — the trust gate before migrate_campaigns. Idempotent: previewing/importing the same campaigns twice is safe.
migrate_flowsread-onlyMigrate automations/flows (not supported — rebuild guidance)
Migrate/import your AUTOMATIONS — flows / workflows / drip sequences — from another email service provider (Brevo). This is HONESTLY NOT SUPPORTED: Brevo's public API does not expose automations/workflows (the automation endpoints return HTTP 404), so flows CANNOT be migrated automatically off Brevo (and are not supported for other sources either). Instead, REBUILD your automations natively with flow_create (triggers: tag_added / subscribe / date) and flow_add_step (wait / send / add_tag / remove_tag), reusing your imported templates and past campaigns (migrate_templates / migrate_campaigns) as the 'send' steps. Read-only: this reports the limitation + rebuild guidance and writes nothing. Credentials are optional (never used here).
migrate_previewread-onlyPreview an ESP migration (dry-run, writes nothing)
Dry-run preview of migrating/importing your list from another email service provider (ESP migration) — Brevo, Mailchimp or Kit/ConvertKit — into this workspace. Fetches your contacts and shows the MAPPING SUMMARY: how many land confirmed / pending / unsubscribed / bounced, how many get suppressed, how many would still need double-opt-in, plus skipped duplicates and invalid emails, with sample rows. WRITES NOTHING — this is the trust gate before migrate_run. Confirmed contacts keep their consent, so there is no forced re-confirmation.
migrate_runRun an ESP migration / import (Brevo, Mailchimp, Kit)
Execute the migration/import from another email service provider (Brevo, Mailchimp or Kit/ConvertKit) into this workspace. Confirmed contacts land CONFIRMED with their original opt-in preserved — NO re-confirmation, NO double-opt-in email blast. Unsubscribed / bounced / complained contacts go straight onto the suppression list, and the full GDPR consent trail (source status, consent time, imported_from) is kept. Idempotent: safe to re-run — already-imported contacts are skipped. Returns per-status counts, suppressions added and tags created. Run migrate_preview first.
migrate_statusread-onlyMigration/import run status (history)
Read the migration/import history (import_runs ledger) for this workspace. Pass a runId to fetch one run's stored counts, status (completed/failed) and timestamps; omit it to list recent runs (newest first) with pagination. Read-only.
migrate_templatesMigrate / import email templates (Brevo → drafts)
Execute the migration/import of your email TEMPLATES from another email service provider (Brevo; Mailchimp/Kit not yet supported) into this workspace as drafts. Each template's subject and HTML are preserved exactly (stored as a complete document — not re-wrapped), with provenance recorded (imported_from, source_kind, source_ref). Idempotent: safe to re-run — already-imported templates are skipped and create 0 new drafts. Returns per-batch counts and the number of drafts created. Run migrate_templates_preview first.
migrate_templates_previewread-onlyPreview a template migration (dry-run, writes nothing)
Dry-run preview of migrating/importing your email TEMPLATES from another email service provider (ESP migration) — Brevo (Mailchimp/Kit not yet supported) — into this workspace's drafts. Fetches your templates and shows how many would be imported, how many are skipped as already-imported duplicates or intra-batch duplicates, how many are invalid, plus sample rows (name, subject, HTML size). The imported subject and HTML are PRESERVED exactly. WRITES NOTHING — the trust gate before migrate_templates. Idempotent: previewing/importing the same templates twice is safe.
segment_createCreate segment
Create a named audience segment: subscribers matching ALL given tagIds and the status (when omitted, querying defaults to the sendable statuses 'active'/'confirmed').
segment_queryread-onlyQuery segment
Resolve a segment to its current matching subscribers.
subscriber_addAdd subscriber
Add a subscriber, optionally attaching existing tags. With double-opt-in enabled (tenant default) they start 'pending' and receive a confirmation email — subscribe-triggered flows enroll on confirmation. Pass preconfirmed for imports with proven consent (status 'active' immediately, no DOI email).
subscriber_getread-onlyGet subscriber
Fetch a single subscriber including their tags.
subscriber_listread-onlyList subscribers
List subscribers with optional status/tag filter and pagination. Returns items + total.
subscriber_removeRemove subscriber
Permanently delete a subscriber (their tags and flow runs go with them).
subscriber_tag_addTag subscriber
Attach a tag to a subscriber (idempotent). May enroll them into tag-triggered flows.
subscriber_tag_removeUntag subscriber
Detach a tag from a subscriber.
subscriber_updateUpdate subscriber
Update a subscriber's email, name and/or status (pending | active | confirmed | unsubscribed | bounced). Note: the double-opt-in confirmation flow is the /c/<token> link, not this tool.
tag_createCreate tag
Create a tag (unique per tenant) for organizing subscribers.
tag_listread-onlyList tags
List all tags with their subscriber counts.
draft_createCreate draft
Create an email draft. Provide html and/or text (each is derived from the other when missing). Placeholders: {{name}}, {{email}}, {{unsubscribe_url}}. Template 'basic' wraps the body in a clean email shell; 'plain' sends the body as-is.
draft_getread-onlyGet draft
Fetch a draft by id.
draft_listread-onlyList drafts
List drafts (newest first) with pagination. Returns items + total.
draft_previewread-onlyPreview draft
Visually render a draft as the recipient would see it. Renders the fully substituted email inline via MCP Apps (a sandboxed iframe in capable hosts); a text fallback with the subject and rendered HTML source is always included. Optionally personalize with a sample name/email.
draft_updateUpdate draft
Update a draft's subject, html, text and/or template.
template_galleryread-onlyTemplate gallery
Show a visual, selectable grid of email templates (the built-in 'basic'/'plain' shells plus ready-to-edit starter layouts) via MCP Apps. Selecting a template prefills a new draft (calls draft_create) in capable hosts; a text fallback lists every template so any client can pick one and call draft_create manually.
campaign_cancelCancel campaign
Cancel a scheduled campaign before it sends.
campaign_getread-onlyGet campaign
Fetch a campaign by id (status, schedule, draft/segment refs).
campaign_listread-onlyList campaigns
List campaigns (newest first) with pagination. Returns items + total.
campaign_previewread-onlyPreview campaign
Read-only review of a campaign before you send it: shows the deliverable audience size, the send time, the segment label, and the rendered email inline via MCP Apps. Does NOT create or send a campaign. A text fallback carries subject, audience, send time and the rendered HTML source.
campaign_scheduleSchedule campaign
Schedule a campaign for a future time. Accepts an ISO-8601 date string (e.g. '2026-07-05T09:00:00Z') or a unix-ms timestamp. The worker sends it when due.
campaign_send_nowSend campaign now
Create a campaign from a draft and send it immediately to the audience (all active subscribers, or a segment's members when segmentId is given).
campaign_test_sendTest-send draft
Send ONE rendered copy of a draft to a single address (no campaign row, no events). Use this to check the real email before sending to the list.
flow_activateActivate flow
Activate a flow so its trigger enrolls subscribers and the worker advances runs. Requires at least one step.
flow_add_stepAdd flow step
Append a step to a flow. Step types: wait {days/hours/minutes}, send {draftId}, add_tag {tagId}, remove_tag {tagId}. Steps execute in the order they were added.
flow_createCreate automation flow
Create an automation flow (status 'draft'). Triggers: tag_added {tagId}, subscribe, or date {date}. Add steps with flow_add_step, then flow_activate.
flow_enrollEnroll subscriber in flow
Manually enroll a subscriber into an active flow (idempotent — a subscriber runs a given flow at most once). The worker advances the run on its next tick.
flow_getread-onlyGet flow
Fetch a flow with its steps and enrollment counts.
flow_listread-onlyList flows
List all automation flows with trigger and status.
flow_pausePause flow
Pause a flow: no new enrollments, queued runs hold until reactivation.
domain_addAdd sending domain
Register a sending domain for this tenant and get back the exact DNS records to publish (SPF/DKIM/DMARC + ownership or SES return-path, depending on the connected provider). Re-adding an existing domain returns the same records. Sends from an unverified registered domain are blocked until domain_verify passes.
domain_listread-onlyList sending domains
List this tenant's sending domains with mode (manual/ses), verification status and timestamps.
domain_verifyVerify sending domain
Poll DNS for the records domain_add asked for. Returns a per-record check list and the resulting status: all present → 'verified' (sends unblock), otherwise 'pending' — publish the missing records, wait for propagation and run again.
provider_connectConnect mail provider
Connect the tenant's own email server: type 'smtp' (host/port/user/pass) or 'ses' (AWS SESv2 keys, default region eu-central-1). Credentials are stored encrypted at rest and are never returned by any tool. Optionally sets mailFrom/replyTo in the same call.
provider_statusread-onlyProvider status
Show the tenant's mail settings: connected provider (credentials masked), mailFrom/replyTo, footer, base URL and double-opt-in flag.
provider_testTest mail provider
Send one test email through the tenant's connected provider (or the platform fallback when none is connected). Returns messageId/previewUrl.
abuse_configConfigure signup-abuse protection
Configure the guards on the public double-opt-in signup route (POST /s/<tenant>): per-IP and per-tenant signup rate limits and an optional CAPTCHA challenge (Cloudflare Turnstile / hCaptcha). Rate limits are counts per window; 0 disables a limit. Pass challengeProvider=null to disable the challenge. The challenge secret is stored encrypted and is NEVER returned — the response reports challengeConfigured only.
suppression_addSuppress an email
Add an email to the tenant's suppression list — it will never be mailed again (campaigns and flows skip it) until suppression_remove. Use it to import an existing suppression/blocklist, e.g. from Brevo: call once per blocked address with reason 'manual' and source 'brevo-import'. Idempotent.
suppression_listread-onlyList suppressions
List the tenant's suppressed emails (newest first) with optional reason filter and pagination. Returns items + total.
suppression_removeRemove a suppression
Remove an email from the suppression list so it can be mailed again. Use with care for 'bounce'/'complaint' entries — re-mailing them hurts deliverability.
warmup_startStart SES warmup
Begin (or resume) the SES reputation warmup ramp for the tenant's sending identity: a daily send cap that climbs over ~8 days (50 → 50k/day). During warmup the audience is ordered engaged-first and any recipients over the day's cap are deferred to the next day. Idempotent: an existing ramp is never reset. Pass engagedFirst to also toggle always-engaged-first ordering for this tenant.
warmup_statusread-onlySES warmup status
Report the current SES warmup ramp for the tenant's sending identity: active flag, display day, today's cap, sent-today count and remaining slots. Returns { active: false } when no warmup is running.
analytics_campaignread-onlyCampaign analytics
Per-campaign stats: sent/delivered/opens/clicks/bounces/unsubscribes, unique opens/clicks and derived rates (open, click, click-through, bounce, unsubscribe, delivery). Set visual:true for an MCP Apps inline-SVG bar chart of the headline metrics (with a JSON text fallback).
analytics_flowread-onlyFlow analytics
Per-flow performance: enrollments/active/completed/cancelled runs and sends per step.
analytics_growthread-onlyList growth
List growth per UTC day for the last N days (zero-filled): added, unsubscribed, net and cumulative.
analytics_linksread-onlyLink click breakdown
Per-link click counts (total + unique) for a campaign, sorted by clicks.
analytics_overviewread-onlyAnalytics overview
Tenant-wide headline numbers: subscriber counts by status, all-time event totals, campaign and flow counts, and last-30-days activity. Set visual:true for an MCP Apps inline-SVG bar chart of the subscriber breakdown + last-30-days activity (with a JSON text fallback).
analytics_subscriber_activityread-onlySubscriber activity
Per-subscriber engagement history (recent events, newest first) plus a sent/opens/clicks/bounces summary.
billing_simulate_paidSimulate successful payment (demo/stub)
DEMO/STUB TOOL — only available while Stripe is NOT configured: marks the current workspace as paid (billing status 'active') as if the checkout had completed. With STRIPE_TEST_SECRET_KEY set this tool refuses; pay via the real billing_start_checkout URL instead.
billing_start_checkoutStart subscription checkout (Stripe)
Create a Stripe test-mode subscription checkout session for the current workspace and return the payment link. Open the URL in a browser and pay with a Stripe test card (e.g. 4242 4242 4242 4242); the webhook then flips the workspace to 'active'. Without Stripe configured a deterministic stub link is returned (use billing_simulate_paid to complete it).
billing_statusread-onlyBilling status
Read-only: the current workspace's billing status ('trial' | 'active' | 'past_due'), which billing provider is active (stripe when STRIPE_TEST_SECRET_KEY is set, stub otherwise) and whether Stripe is configured.