Subscribe Flow provides an MCP server (Model Context Protocol) that enables LLM agents like Claude to interact directly with the Subscribe Flow API.
Plan Requirement
MCP access requires a Starter or Professional plan. Free-tier organizations will receive a 403 Forbidden error with plan_required on the first tool call. Upgrade via GET /api/v1/billing/checkout.
The Model Context Protocol (MCP) is a protocol developed by Anthropic that securely connects LLMs with external tools. The Subscribe Flow MCP server exposes 66 tools for managing subscribers, tags, templates, emails, campaigns, triggers, webhooks, billing, the preference center, and platform administration.
All MCP tools are organization-scoped via the API key. The MCP server automatically filters all operations to the organization associated with the configured API key.
This is the internal remote connector for our own organization — not a generally available customer feature. It uses a single, shared credential (claude.ai's static_headers connector beta), not per-user OAuth. Multi-tenant OAuth for external SubscribeFlow customers is tracked separately (TF-901) and is a prerequisite before this could ever be documented publicly for customers.
Besides the local stdio process above, the SDK's MCP server also runs as a Streamable HTTP server reachable at https://api.subscribeflow.net/mcp — no local process and no local Python install needed. subscribeflow-api exposes /mcp as a thin, unauthenticated reverse proxy onto an internal mcp Fly process group running the SDK's own HTTP server; the Authorization header configured in claude.ai is a regular SubscribeFlow API key, validated the same way every other API call is. See docs/superpowers/specs/2026-09-22-tf-903-remote-mcp-connector-design.md for the full design.
Create a dedicated API key for MCP use (Admin Dashboard or just api-key). Leave allowed_ips empty — the connector's requests arrive from Anthropic's infrastructure via an internal Fly hop, not from a fixed, allowlistable address.
Per-request auth, not per-process. The local server reads SUBSCRIBEFLOW_API_KEY once at startup; the remote server reads the Authorization header on every request, so it could in principle serve multiple keys — Phase 1 just configures one, shared across the organization's claude.ai members.
Rate-limited per client IP at the /mcp proxy (120 requests/minute by default, mcp_proxy_rate_limit setting) — the only guard available before the credential itself is checked, since the proxy performs no auth of its own.
Tool listing requires a valid key too. Unlike the tier check (which only gates tools/call), tools/list over HTTP validates the API key before returning the catalog — a bogus Authorization header gets a JSON-RPC error, not the tool list.
The mcp Fly process group is pinned to exactly one machine; expect a brief interruption during a deploy.
See docs/deployment/fly-io-setup.md for the process group's operational details and docs/superpowers/plans/2026-09-22-tf-903-remote-mcp-connector.md (Task 8) for the full rollout checklist.
You: "Add max@example.com to the Weekly Newsletter"
Claude: I'll create the subscriber and assign the tag.
[create_subscriber, get_or_create_tag]
Done! max@example.com has been added to "Weekly Newsletter".
You: "How many active subscribers do we have in the 'product-updates' tag?"
Claude: [get_tag_by_name, list_subscribers]
The "product-updates" tag has 1,247 active subscribers.
The 5 most recent sign-ups:
- anna@example.com (2 hours ago)
- tom@example.com (5 hours ago)
...
You: "Generate a preference center link for support@customer.com"
Claude: [get_subscriber_by_email, generate_preference_token]
Here is the link:
https://subscribeflow.net/preferences?token=eyJ...
(Valid for 7 days)
You: "Show me an overview of all tags with subscriber counts"
Claude: [list_tags]
Tag overview:
| Tag | Subscribers | Public |
|------------------|-------------|--------|
| Newsletter | 5,234 | Yes |
| Product Updates | 1,247 | Yes |
| Internal | 42 | No |
You: "Move all subscribers from the 'old-newsletter' tag to 'new-newsletter'"
Claude: [get_tag_by_name x2, list_subscribers, update_subscriber x...]
Migration completed:
- 847 subscribers moved
- 3 already in the new tag (skipped)
- 0 errors
You: "Set up an automatic welcome email that is sent when new subscribers
sign up"
Claude: [list_templates, create_trigger]
Trigger created:
- Event: subscriber.created
- Template: "Welcome Email" (welcome-email)
- Status: active
From now on, every new subscriber will automatically receive the
welcome email.
You: "Create a campaign for the February newsletter and send it to all
newsletter subscribers"
Claude: [list_tags, list_templates, create_campaign, count_campaign_recipients,
send_campaign]
Campaign "February Newsletter 2026" created and started:
- Template: Monthly Newsletter
- Recipients: 3,421 (Tag: newsletter)
- Status: sending
Sending is running in the background. You can check the progress with
"Show the status of the February campaign".
You: "Show me a preview of the welcome email with company data for Acme AG"
Claude: [get_template_by_slug, preview_template]
Here is the preview for "Welcome Email":
- Subject: "Welcome to Acme AG!"
- HTML preview generated
The template variables have been populated:
- {{company}} -> "Acme AG"
- {{year}} -> "2026"
You: "Show me the delivery statistics for our main webhook"
Claude: [list_webhooks, get_webhook_delivery_stats]
Webhook "Main Production" (https://app.com/hook):
- Total: 12,847 deliveries
- Successful: 12,691 (98.8%)
- Failed: 156 (1.2%)
- Average response time: 142ms
Would you like me to show the failed deliveries?
You: "Export all stored data for privacy@customer.com"
Claude: [get_subscriber_by_email, generate_preference_token,
preference_center_get_info, preference_center_export_data]
Data export for privacy@customer.com created:
- Subscriber profile: active since 2025-03-15
- Subscribed tags: Newsletter, Product Updates
- Metadata: source=website, plan=premium
- Audit log: 23 entries
- Exported on: 2026-02-15, 10:30 AM
You: "How many subscribers would receive a campaign targeting 'premium'
but not 'churned'?"
Claude: [count_campaign_recipients]
Recipient check:
- Include: Tag "premium"
- Exclude: Tag "churned"
- Result: 847 active subscribers would receive the campaign
Diese Tools funktionieren ausschließlich mit API Keys von Organisationen, bei denen is_platform_admin = true gesetzt ist (aktuell nur Talent Factory GmbH). Anfragen mit regulären API Keys erhalten 403 Forbidden.
billing:read is not optional despite the short list above: every tool call runs a tier check (GET /api/v1/billing/subscription) before dispatching, regardless of which tool was actually invoked, so a key without it fails on the very first call with "Could not verify your plan" — not just on billing tools.
The tools delete_subscriber, delete_tag, delete_webhook, delete_template, delete_trigger, and cancel_campaign are marked as destructive. Claude will ask for confirmation before executing them.