ConvertFlow MCP Server
The ConvertFlow MCP server turns your funnel reports into tools an AI agent can call.
It's a remote server: Streamable HTTP, stateless, and hosted at
https://mcp.convertflow.co/mcp. There's nothing to install and
nothing to run locally. Connect a client, sign in through your browser, and ask questions about
your campaigns in plain language.
Connect
Claude Code
claude mcp add --transport http convertflow https://mcp.convertflow.co/mcp
Run any ConvertFlow tool, and Claude Code opens a browser so you can authorize it.
Claude.ai and Claude Desktop
Go to Settings → Connectors → Add custom connector and paste
https://mcp.convertflow.co/mcp. As you add it, Claude prompts you
to sign in and pick the websites you want to share.
Cursor
Add the server to .cursor/mcp.json (project) or ~/.cursor/mcp.json (global):
{
"mcpServers": {
"convertflow": {
"url": "https://mcp.convertflow.co/mcp"
}
}
}
Cursor opens the sign-in prompt the first time you use the server.
Any other Streamable HTTP client
{
"mcpServers": {
"convertflow": {
"type": "http",
"url": "https://mcp.convertflow.co/mcp"
}
}
}
Your client opens ConvertFlow in a browser. Sign in, choose which websites to share, and approve.
The token your client receives carries the reports scope and is
bound to the websites you picked.
How authorization works
The MCP server is a pure resource server, so it never issues or stores tokens. On an
unauthenticated request it returns 401 and points your client at
/.well-known/oauth-protected-resource, which names ConvertFlow as
the authorization server. Your client then registers itself dynamically, runs OAuth 2.1
authorization code + PKCE against ConvertFlow, and sends the resulting token as
Authorization: Bearer <token>. Tokens are website-bound.
If a token expires or is revoked, the next call returns 401 and
your client re-authorizes.
Available tools
Every tool maps to a v1 Reports endpoint. Start broad with
get_website_report, then drill into campaigns, variants, steps,
and elements using the ids that each response returns.
list_websites
List the websites this token grants access to. Use the returned ids as website_id on the other tools to query or compare specific websites.
No parameters.
get_website_report
Website-wide funnel performance (views, conversions, completions, subscribes, orders, revenue) for the selected window. Returns one total per metric; add group_by=day (or week/month/quarter/year) for a per-bucket breakdown, over a window of up to 92 days. Start here, then drill into campaigns.
| Parameter | Type | Description |
|---|---|---|
group_by |
string |
Adds a timeseries block: one point per bucket across the selected window, each with date, views, conversions, completions, subscribes, submissions, orders and revenue for this report's subject. Buckets with no activity come back as zeroes, so the series is complete. Use group_by=day for a daily breakdown instead of calling the tool once per day. On get_website_report the window must cover at most 92 days (the other reports take any range up to 400 buckets); a wider one is rejected — shorten it, or pull the longer series from a campaign, variant, step or element report.
one of: day, week, month, quarter, year |
website_id |
integer | Website to query. Optional for single-website tokens; required when the token grants multiple websites — call list_websites first. |
timeframe |
string |
Reporting window (default last_30_days). Use custom with range_start/range_end for any exact range, including a single day (same date on both). Windows are UTC.
one of: today, this_week, this_month, this_quarter, this_year, last_24_hours, last_7_days, last_30_days, last_90_days, last_365_days, all_time, insights_week, custom |
range_start |
string | ISO 8601 date (YYYY-MM-DD), inclusive from 00:00:00 UTC. Required when timeframe=custom. |
range_end |
string | ISO 8601 date (YYYY-MM-DD), inclusive through 23:59:59 UTC. Required when timeframe=custom. |
count_type |
string |
distinct = unique visitors via HyperLogLog (default); total = raw event counts. Orders/revenue are always summed. Distinct counts deduplicate across the whole window, so they do not add up across sub-periods — use total when separate calls or timeseries points must reconcile with a longer range.
one of: distinct, total |
previous_period |
boolean | When true, each metrics block includes the previous period of equal length and percent changes. |
get_website_insights
Latest pre-generated weekly insights snapshot (one fixed week, written by a background job). Use it for the narrative summary only — for any specific window or trend use get_website_report, which reads live per-day data. Returns 404 if no snapshot has been generated yet.
| Parameter | Type | Description |
|---|---|---|
website_id |
integer | Website to query. Optional for single-website tokens; required when the token grants multiple websites — call list_websites first. |
list_campaigns
List campaigns (CTAs) with their funnel metrics for the selected window. Returns the campaign ids used by get_campaign_report. Supports pagination, sorting and filtering by type/status.
| Parameter | Type | Description |
|---|---|---|
page |
integer | Page number (default 1). |
per_page |
integer | Results per page (default 25, max 50). |
sort |
string |
Sort field.
one of: created_at, published_at, views, conversions, completions, conversion_rate, completion_rate, revenue, aov |
cta_type |
string | Filter by campaign format. |
status |
string |
Filter by status.
one of: live, archived |
website_id |
integer | Website to query. Optional for single-website tokens; required when the token grants multiple websites — call list_websites first. |
timeframe |
string |
Reporting window (default last_30_days). Use custom with range_start/range_end for any exact range, including a single day (same date on both). Windows are UTC.
one of: today, this_week, this_month, this_quarter, this_year, last_24_hours, last_7_days, last_30_days, last_90_days, last_365_days, all_time, insights_week, custom |
range_start |
string | ISO 8601 date (YYYY-MM-DD), inclusive from 00:00:00 UTC. Required when timeframe=custom. |
range_end |
string | ISO 8601 date (YYYY-MM-DD), inclusive through 23:59:59 UTC. Required when timeframe=custom. |
count_type |
string |
distinct = unique visitors via HyperLogLog (default); total = raw event counts. Orders/revenue are always summed. Distinct counts deduplicate across the whole window, so they do not add up across sub-periods — use total when separate calls or timeseries points must reconcile with a longer range.
one of: distinct, total |
previous_period |
boolean | When true, each metrics block includes the previous period of equal length and percent changes. |
get_campaign_report
Single campaign performance with per-variant breakdown. Campaign ids come from list_campaigns; the variant ids in the response feed get_variant_report.
| Parameter | Type | Description |
|---|---|---|
id * |
integer | The campaign id. |
group_by |
string |
Adds a timeseries block: one point per bucket across the selected window, each with date, views, conversions, completions, subscribes, submissions, orders and revenue for this report's subject. Buckets with no activity come back as zeroes, so the series is complete. Use group_by=day for a daily breakdown instead of calling the tool once per day. On get_website_report the window must cover at most 92 days (the other reports take any range up to 400 buckets); a wider one is rejected — shorten it, or pull the longer series from a campaign, variant, step or element report.
one of: day, week, month, quarter, year |
website_id |
integer | Website to query. Optional for single-website tokens; required when the token grants multiple websites — call list_websites first. |
timeframe |
string |
Reporting window (default last_30_days). Use custom with range_start/range_end for any exact range, including a single day (same date on both). Windows are UTC.
one of: today, this_week, this_month, this_quarter, this_year, last_24_hours, last_7_days, last_30_days, last_90_days, last_365_days, all_time, insights_week, custom |
range_start |
string | ISO 8601 date (YYYY-MM-DD), inclusive from 00:00:00 UTC. Required when timeframe=custom. |
range_end |
string | ISO 8601 date (YYYY-MM-DD), inclusive through 23:59:59 UTC. Required when timeframe=custom. |
count_type |
string |
distinct = unique visitors via HyperLogLog (default); total = raw event counts. Orders/revenue are always summed. Distinct counts deduplicate across the whole window, so they do not add up across sub-periods — use total when separate calls or timeseries points must reconcile with a longer range.
one of: distinct, total |
previous_period |
boolean | When true, each metrics block includes the previous period of equal length and percent changes. |
list_experiments
Active A/B experiments — campaigns with live traffic-split variants and their metrics.
| Parameter | Type | Description |
|---|---|---|
limit |
integer | Max experiments returned (default 25, max 50). |
website_id |
integer | Website to query. Optional for single-website tokens; required when the token grants multiple websites — call list_websites first. |
timeframe |
string |
Reporting window (default last_30_days). Use custom with range_start/range_end for any exact range, including a single day (same date on both). Windows are UTC.
one of: today, this_week, this_month, this_quarter, this_year, last_24_hours, last_7_days, last_30_days, last_90_days, last_365_days, all_time, insights_week, custom |
range_start |
string | ISO 8601 date (YYYY-MM-DD), inclusive from 00:00:00 UTC. Required when timeframe=custom. |
range_end |
string | ISO 8601 date (YYYY-MM-DD), inclusive through 23:59:59 UTC. Required when timeframe=custom. |
count_type |
string |
distinct = unique visitors via HyperLogLog (default); total = raw event counts. Orders/revenue are always summed. Distinct counts deduplicate across the whole window, so they do not add up across sub-periods — use total when separate calls or timeseries points must reconcile with a longer range.
one of: distinct, total |
previous_period |
boolean | When true, each metrics block includes the previous period of equal length and percent changes. |
get_variant_report
Variant funnel performance with per-step breakdown. Variant ids come from get_campaign_report; the step ids in the response feed get_step_report.
| Parameter | Type | Description |
|---|---|---|
id * |
integer | The variant id. |
group_by |
string |
Adds a timeseries block: one point per bucket across the selected window, each with date, views, conversions, completions, subscribes, submissions, orders and revenue for this report's subject. Buckets with no activity come back as zeroes, so the series is complete. Use group_by=day for a daily breakdown instead of calling the tool once per day. On get_website_report the window must cover at most 92 days (the other reports take any range up to 400 buckets); a wider one is rejected — shorten it, or pull the longer series from a campaign, variant, step or element report.
one of: day, week, month, quarter, year |
website_id |
integer | Website to query. Optional for single-website tokens; required when the token grants multiple websites — call list_websites first. |
timeframe |
string |
Reporting window (default last_30_days). Use custom with range_start/range_end for any exact range, including a single day (same date on both). Windows are UTC.
one of: today, this_week, this_month, this_quarter, this_year, last_24_hours, last_7_days, last_30_days, last_90_days, last_365_days, all_time, insights_week, custom |
range_start |
string | ISO 8601 date (YYYY-MM-DD), inclusive from 00:00:00 UTC. Required when timeframe=custom. |
range_end |
string | ISO 8601 date (YYYY-MM-DD), inclusive through 23:59:59 UTC. Required when timeframe=custom. |
count_type |
string |
distinct = unique visitors via HyperLogLog (default); total = raw event counts. Orders/revenue are always summed. Distinct counts deduplicate across the whole window, so they do not add up across sub-periods — use total when separate calls or timeseries points must reconcile with a longer range.
one of: distinct, total |
previous_period |
boolean | When true, each metrics block includes the previous period of equal length and percent changes. |
get_step_report
Step funnel performance with per-element breakdown. Step ids come from get_variant_report; the element ids in the response feed get_element_report.
| Parameter | Type | Description |
|---|---|---|
id * |
integer | The step id. |
group_by |
string |
Adds a timeseries block: one point per bucket across the selected window, each with date, views, conversions, completions, subscribes, submissions, orders and revenue for this report's subject. Buckets with no activity come back as zeroes, so the series is complete. Use group_by=day for a daily breakdown instead of calling the tool once per day. On get_website_report the window must cover at most 92 days (the other reports take any range up to 400 buckets); a wider one is rejected — shorten it, or pull the longer series from a campaign, variant, step or element report.
one of: day, week, month, quarter, year |
website_id |
integer | Website to query. Optional for single-website tokens; required when the token grants multiple websites — call list_websites first. |
timeframe |
string |
Reporting window (default last_30_days). Use custom with range_start/range_end for any exact range, including a single day (same date on both). Windows are UTC.
one of: today, this_week, this_month, this_quarter, this_year, last_24_hours, last_7_days, last_30_days, last_90_days, last_365_days, all_time, insights_week, custom |
range_start |
string | ISO 8601 date (YYYY-MM-DD), inclusive from 00:00:00 UTC. Required when timeframe=custom. |
range_end |
string | ISO 8601 date (YYYY-MM-DD), inclusive through 23:59:59 UTC. Required when timeframe=custom. |
count_type |
string |
distinct = unique visitors via HyperLogLog (default); total = raw event counts. Orders/revenue are always summed. Distinct counts deduplicate across the whole window, so they do not add up across sub-periods — use total when separate calls or timeseries points must reconcile with a longer range.
one of: distinct, total |
previous_period |
boolean | When true, each metrics block includes the previous period of equal length and percent changes. |
get_element_report
Element performance with its field and product breakdown — form field values, quiz answer counts and per-product orders/revenue. Element ids come from get_step_report.
| Parameter | Type | Description |
|---|---|---|
id * |
integer | The element id. |
group_by |
string |
Adds a timeseries block: one point per bucket across the selected window, each with date, views, conversions, completions, subscribes, submissions, orders and revenue for this report's subject. Buckets with no activity come back as zeroes, so the series is complete. Use group_by=day for a daily breakdown instead of calling the tool once per day. On get_website_report the window must cover at most 92 days (the other reports take any range up to 400 buckets); a wider one is rejected — shorten it, or pull the longer series from a campaign, variant, step or element report.
one of: day, week, month, quarter, year |
website_id |
integer | Website to query. Optional for single-website tokens; required when the token grants multiple websites — call list_websites first. |
timeframe |
string |
Reporting window (default last_30_days). Use custom with range_start/range_end for any exact range, including a single day (same date on both). Windows are UTC.
one of: today, this_week, this_month, this_quarter, this_year, last_24_hours, last_7_days, last_30_days, last_90_days, last_365_days, all_time, insights_week, custom |
range_start |
string | ISO 8601 date (YYYY-MM-DD), inclusive from 00:00:00 UTC. Required when timeframe=custom. |
range_end |
string | ISO 8601 date (YYYY-MM-DD), inclusive through 23:59:59 UTC. Required when timeframe=custom. |
count_type |
string |
distinct = unique visitors via HyperLogLog (default); total = raw event counts. Orders/revenue are always summed. Distinct counts deduplicate across the whole window, so they do not add up across sub-periods — use total when separate calls or timeseries points must reconcile with a longer range.
one of: distinct, total |
previous_period |
boolean | When true, each metrics block includes the previous period of equal length and percent changes. |
get_account_performance
Cross-site funnel performance for every website bound to this token: per-site rows plus an aggregate. Omit website_id to include all bound sites; pass website_id or website_ids to zoom in. Does not require website_id on multi-website tokens.
| Parameter | Type | Description |
|---|---|---|
website_id |
integer | Optional. Zoom to one website bound to the token. Omit to aggregate every bound website. Unbound ids return 404. |
website_ids |
array<integer> | Optional subset of bound website ids. Any id outside the token binding returns 404. |
timeframe |
string |
Reporting window (default last_30_days). Use custom with range_start/range_end for any exact range, including a single day (same date on both). Windows are UTC.
one of: today, this_week, this_month, this_quarter, this_year, last_24_hours, last_7_days, last_30_days, last_90_days, last_365_days, all_time, insights_week, custom |
range_start |
string | ISO 8601 date (YYYY-MM-DD), inclusive from 00:00:00 UTC. Required when timeframe=custom. |
range_end |
string | ISO 8601 date (YYYY-MM-DD), inclusive through 23:59:59 UTC. Required when timeframe=custom. |
Notes & limits
- Reports only, for now. The server is read-only, so it can't edit campaigns or write contacts.
-
Multiple websites need
website_id. A token bound to one website doesn't need it. A token bound to several does. Calllist_websitesto get the ids. The exception isget_account_performance, which aggregates every bound website. -
Freshness matches the app. Tools read the same per-day metrics as your in-app
reports. There's one exception:
get_website_insightsreturns a pre-generated weekly snapshot, not live data.