Developers
AI control via MCP
FunnelSplit ships a Model Context Protocol server. Connect Claude — or any MCP-capable assistant — and it can build pages, publish forms, run split tests, manage your CRM and read your analytics. You stay in control: scoped keys, rate limits, audit logs.
How it works
- Endpoint:
https://app.funnelsplit.com/mcp— MCP Streamable HTTP transport, stateless (plain JSON-RPC over POST). - Auth: the same
fs_live_…API keys as the REST API, sent asAuthorization: Bearer …. Available on Pro and Scale plans. - Scoped discovery:
tools/listonly shows the tools your key's scopes permit — issue a read-only analytics key or a full content-control key, your choice. - 39 tools across pages, layouts, forms, split tests, contacts, workflows, analytics, templates and media (full reference below).
Setup
First, create a key in the dashboard: API & webhooks → Create key → check the "AI / content control (MCP)" scopes (or Select all). Copy the token — it's shown once.
Claude Code
claude mcp add --transport http funnelsplit https://app.funnelsplit.com/mcp \
--header "Authorization: Bearer fs_live_YOUR_TOKEN"
Claude Desktop / Cursor / other clients
Add to your client's MCP config (claude_desktop_config.json, Cursor's mcp.json, etc.):
{
"mcpServers": {
"funnelsplit": {
"url": "https://app.funnelsplit.com/mcp",
"headers": { "Authorization": "Bearer fs_live_YOUR_TOKEN" }
}
}
}
Smoke test with curl
curl -X POST https://app.funnelsplit.com/mcp \
-H "Authorization: Bearer fs_live_YOUR_TOKEN" \
-H "content-type: application/json" \
-H "accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'
Or interactively: npx @modelcontextprotocol/inspector → Streamable HTTP → the endpoint URL + your Authorization header.
Try it — things to ask your assistant
- "Set up my starter site" → provisions Home, Sales, About and Contact pages plus a working contact form, published.
- "Create an A/B test on my homepage: try a hero headline about speed vs one about price, and start it."
- "Add a 'webinar' tag to everyone who submitted the contact form this week."
- "Build a lead-nurture workflow: when the contact form is submitted, wait a day, then send a follow-up email."
- "How did my funnel convert in the last 30 days? Which step loses the most visitors?"
The assistant starts with get_workspace_overview to see what exists, and list_block_types before it authors page content.
Page block format
Page content ("puckData") is a JSON document rendered by the same engine as the visual editor — AI-authored pages are fully editable in the dashboard afterwards:
{
"content": [
{ "type": "Hero", "props": { "id": "hero-1", "title": "Launch faster",
"subtitle": "Pages, tests and funnels in one place.", "align": "center",
"backgroundColor": "#111827", "textColor": "#ffffff",
"ctaLabel": "Start free", "ctaHref": "/signup" } },
{ "type": "FormEmbed", "props": { "id": "form-1", "formSlug": "contact" } }
],
"root": { "props": {} },
"zones": {}
}
21 block types — core: Hero, Heading, Text, Image, Video, Columns, Button, Spacer, Html, CountdownTimer, FormEmbed; marketing sections: Navbar, Footer, FeatureGrid, Testimonials, PricingTable, FAQ, LogoStrip, Stats, SplitSection, CTABand. The list_block_types tool returns every prop, allowed values and defaults — that catalog is generated from the editor's own config, so it can't drift.
Themes
Every page can carry a theme on puckData.root.props — a designed preset (font pairing, palette, corner radius, spacing) that all blocks obey via CSS variables. Six presets ship: default, editorial, startup, bold, calm, noir, plus overrides for accent color, background, fonts and corners. Fonts are open-source and self-hosted first-party — no third-party requests.
{
"content": [ … ],
"root": { "props": { "themePreset": "startup", "themeAccent": "#4f46e5" } },
"zones": {}
}
list_block_types returns the full theme documentation (presets, fonts, override keys). Pages without a theme keep the classic look — existing pages are unaffected.
Raw HTML pages & layouts
Pages also support contentMode: "html" — a raw HTML fragment instead of blocks (created via create_page, content set via update_page.draftHtml or save_page_version.html). And every page (blocks or HTML) can attach a layout: a shared HTML shell with a [[ $pageContent ]] placeholder, managed by the list/create/update/delete_layout tools. Edit the layout once, every attached page updates. Page Meta overrides the layout's title/description tags. Embed a form in raw HTML with <div data-fs-form="slug"></div>.
Tool reference
All 39 tools, generated from the server's registry (never hand-maintained). Scopes shows what the key must have for the tool to appear; click a tool for its parameters.
Loading tool reference…
Safety & limits
- Deliberately out of reach — no MCP tool can touch billing, team members, invitations, custom domains, email integrations or API-key management. Those stay human-only in the dashboard.
- Scoped: the key decides what the AI can do; unscoped tools aren't even visible to it.
- Rate limited: 120 requests/minute per key, shared with the REST API (
429+Retry-After). - Audited: every write lands in the workspace audit log, attributed to the API actor.
- Revocable: revoke the key in the dashboard and access ends immediately. Plan downgrades below Pro also close the endpoint.
Prefer plain REST? The API reference documents the /v1 endpoints for contacts, submissions, events, test stats and webhooks.