MCP, the Model Context Protocol, is how Claude Desktop uses outside tools. An MCP server is a small program the app starts; it lists its tools and Claude calls them when a chat needs them.
ef mcp is the ElasticFunnels MCP server. Add it to Claude Desktop's config and Claude can list, read, create and edit the pages in your brand, read components and products, and hand you preview links. The config names a folder, never a key.
If you already work in Claude Desktop, it's where I'd start working on pages with an AI. Through MCP it edits pages well and does little else, and the one setting that matters most (draft or live) is easy to get wrong. Both are covered below, before they cost you a live page.
What you need
- Claude Desktop, signed in.
- An ElasticFunnels brand. The CLI and its MCP server are included on every plan.
- Node.js 18 or newer and the CLI:
npm i -g @elasticfunnels/cli.
Step 1: bind a folder to your brand
The MCP server reads its credential from a project folder, so make one first. ef init signs you in through the browser and stores the key in .ef/auth inside the folder, readable only by you.
mkdir ~/my-brand && cd ~/my-brand ef init
Step 2: find the full paths
Claude Desktop starts MCP servers with a short PATH. If it can't find ef, or the node that ef runs on, the server never starts. Note both paths:
which ef node
/opt/homebrew/bin/ef
/opt/homebrew/bin/node
Yours may differ (nvm, for example, puts them under ~/.nvm). Use what the command prints.
Step 3: add the server to Claude Desktop's config
In Claude Desktop open Settings → Developer → Edit Config. That opens claude_desktop_config.json: on macOS in ~/Library/Application Support/Claude/, on Windows in %APPDATA%\Claude\. Add an elasticfunnels entry:
{
"mcpServers": {
"elasticfunnels": {
"command": "/opt/homebrew/bin/ef",
"args": ["mcp", "--project", "/Users/you/my-brand"],
"env": { "PATH": "/opt/homebrew/bin:/usr/bin:/bin" }
}
}
}
--project is the folder from step 1. The env line puts the folder that holds node on the server's PATH. Nothing in this file is a secret, so it is safe in a screenshot or a support thread. I like that design a lot. The key never lives in a config file that gets pasted into chats.

ef mcp; ef mcp uses the key in your project folder to reach your pages. The app never holds the key.Step 4: restart and check the tools
Quit Claude Desktop completely and open it again. In a new chat, the tools menu lists elasticfunnels with eight tools:
| Tool | What it does |
|---|---|
ef_list_pages | Lists pages with id, title, slug and status |
ef_get_page | Reads one page's HTML, the draft or the published version |
ef_update_page_html | Replaces a page's HTML; publishes unless saved as a draft |
ef_create_page | Creates an empty page and returns its id |
ef_list_components | Lists reusable components |
ef_get_component | Reads one component's HTML |
ef_list_products | Lists products with code and price |
ef_preview_url | Returns a page's preview link |
Seven of these only read or create. The one to respect is ef_update_page_html, because it writes to a live page unless it's told otherwise. Step 5 is mostly about that tool.
Step 5: ask for a draft
Start with something you can check in a minute:
List my pages. Open the advertorial, tighten the first two paragraphs and add a reader quote before the second section. Save it as a draft, not live, and give me the preview link.
What Claude does: it calls ef_list_pages to find the page id, ef_get_page to read the HTML, then ef_update_page_html with the full new body and draft set, and finally ef_preview_url. The edit tool returns the page as the server saved it, so Claude's next edit starts from the real version.
Ask for drafts. The edit tool publishes straight away unless Claude passes draft, and it replaces the whole body, not one section. Open the preview, then publish from the app or ask Claude to save it live. I'd put "save it as a draft" in every prompt that touches a page people are paying to reach.
What Claude Desktop can't do through MCP
ef mcp covers pages, and reading components and products. Today it does not:
- set up split tests, redirects or other page events,
- read analytics or split-test results,
- edit components, assets, scripts or brand variables,
- touch your ad campaigns, which no part of ElasticFunnels' CLI does.
For those, use an agent that can run the CLI. Claude Code runs a full advertorial split test from pull to result, and Codex does the same with an AGENTS.md.
Using Claude Code? The same server connects there with one command. Watch it step by step: add an MCP server to Claude Code.
If the tools don't show up
env: node: No such file or directory. The server started but found no Node. Add the folder that holdsnodeto theenvPATH in the config.- No elasticfunnels entry at all. The JSON is invalid or the app wasn't fully restarted. Check the commas, then quit from the menu bar or tray, not just the window.
- A tool returns an error about the project. The
--projectfolder isn't bound. Runef statusin it; if it isn't bound, runef initthere. - Test the server by hand. In a terminal,
ef mcp --project ~/my-brandprints[ef mcp] starting (protocol 2024-11-05, 8 tools)to stderr and then waits for the app. Press Ctrl-C to stop it.
Everything an agent can do in ElasticFunnels, with and without a terminal, is on the AI marketing agents page.
- I'd never let Claude Desktop edit the page your ads point to without "draft" in the prompt. The edit replaces the whole body, so one bad section takes the page with it.
- Don't ask it for a "quick tweak" to one paragraph and assume the rest survived. Open the preview and read the whole page.
- Don't try to squeeze split tests or stats out of MCP with clever prompts. Those tools aren't there; use a CLI agent.
MCP in Claude Desktop is the gentlest way in. You stay in a chat window, you see a preview before anything changes, and the key never leaves your folder. When you catch yourself wanting it to read a test result or wire a split, that's the sign you've outgrown it, and the CLI agents are one step away.



