ConvertFlow ConvertFlow
Open ConvertFlow →

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.

ParameterTypeDescription
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.

ParameterTypeDescription
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.

ParameterTypeDescription
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.

ParameterTypeDescription
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.

ParameterTypeDescription
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.

ParameterTypeDescription
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.

ParameterTypeDescription
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.

ParameterTypeDescription
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.

ParameterTypeDescription
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