Go from a fresh install to a fully built (and safely PAUSED) Meta campaign in about 30 minutes. AdStack runs end-to-end inside Claude Code: buyer research, audience personas, copy, funnel design, image and video creative, campaign build, optimization.
See the live EMBR demo dashboardAdStack runs inside Claude Code. If you already have Claude Code installed, skip to Step 2.
Claude Code is Anthropic's AI assistant that runs in your terminal (or desktop app). It can read files, write code, call MCP servers, and run scripts. AdStack is a "skill" that tells Claude Code how to plan, build, launch, and optimize Meta campaigns end-to-end.
npm install -g @anthropic-ai/claude-code
Or download the desktop app.
claude --version # Download from nodejs.org if not installed node --version
# Mac / Linux: python3 --version # Windows: python --version
# Mac / Linux: pip3 install pyyaml # Windows: pip install pyyaml
AdStack works on Windows, Mac, and Linux. A few Windows notes:
python instead of python3 and pip instead of pip3curl against the Meta Graph API. Use Git Bash or WSL so curl is on your PATH.Drop the AdStack folder into your Claude Code project's .claude/skills/ directory.
adstack-template.zip from your Skool delivery email# Mac / Linux: mv adstack-template ~/your-project/.claude/skills/adstack # Windows: move adstack-template C:\Users\you\your-project\.claude\skills\adstack
your-project/.claude/skills/adstack/SKILL.mdmkdir ~/adstack-work && cd ~/adstack-work), run claude in it, and put the skill at ./.claude/skills/adstack/. The folder becomes your AdStack workspace.
# Mac / Linux: cd ~/your-project claude # Windows: cd C:\Users\you\your-project claude
Or in the desktop app: File > Open Folder > select your project folder.
Inside Claude Code, type:
/ads You should see AdStack's command list appear. If nothing happens, double-check the folder path and that SKILL.md exists at the root of the skill folder.
AdStack uses two MCP servers. Connect both before running any /ads command other than setup.
Meta ships an official, free MCP server. From your terminal (or Claude Code's built-in shell) run:
claude mcp add --transport http meta-ads https://mcp.facebook.com/ads This registers the MCP endpoint with Claude Code. The server itself handles auth via OAuth.
/mcp to view connected serversmeta-ads and follow the OAuth prompt — it opens a browser window where you log into Facebook and authorize the appAsk Claude:
list my Meta ad accounts If the MCP is wired up, you'll see your ad accounts and pages.
Higgsfield runs its MCP as a custom connector accessible through the Claude.ai web UI.
higgsfieldOnce connected on the web side, Claude Code picks it up automatically. Run /mcp inside Claude Code — you should see higgsfield listed.
Ask Claude:
show my higgsfield workspaces You should see your workspace list. AdStack will use this in /ads setup to wire one workspace to each business config.
Once both MCPs are connected, in Claude Code run:
/ads setup --business yourbrand The setup module verifies both MCPs are responding, lets you pick the right Meta ad account + Facebook Page, picks a Higgsfield workspace, and creates configs/yourbrand.yaml from the brand template. After this you can start running the rest of the /ads commands.
Only needed if you want to push video ads to Meta or create Meta Custom Audiences from inside the skill. Image-only campaigns work without it.
POST /act_<id>/advideos (video upload) or POST /act_<id>/customaudiences (Custom Audience create). AdStack bridges those two gaps via direct Graph API calls in scripts/upload-meta-videos.py and scripts/manage-audiences.py. When Meta ships these to the MCP, the helper scripts become obsolete and AdStack will auto-detect the new tools.
Go to developers.facebook.com/tools/explorer and sign in with the Facebook account that admins your Business Manager.
ads_managementads_readbusiness_managementEAA...).envIn the root of your project (not the skill folder), create or edit .env:
META_ACCESS_TOKEN=EAAxxx... The helper scripts (upload-meta-videos.py, manage-audiences.py) read this single env var. Both scripts run via Claude Code's Bash tool — you never paste the token into chat.
In Claude Code:
/ads setup --business yourbrand The setup module detects META_ACCESS_TOKEN in your .env, runs a quick read-only call against the Graph API, and confirms the token is valid + which ad accounts it can reach. If the token works you'll see a green "video upload + audience CRUD enabled" line in the output.
If you're running image-only campaigns or you're fine creating Custom Audiences manually in Ads Manager, you can skip this entirely. AdStack runs all of /ads research, /ads audience, /ads copy, /ads funnel, /ads creative, and /ads launch with image creative through the MCPs alone.
Here's the full flow from blank business to fully built (and PAUSED) Meta campaign.
/ads setup --business yourbrand Walks you through brand name, colors, voice, the Meta ad account + Page to use, and the Higgsfield workspace. Creates configs/yourbrand.yaml and starts the local dashboard at http://localhost:8080/preview/.
/ads research --business yourbrand Claude pulls verbatim language from Reddit, reviews, and forums for your category. Output: a buyer-voice document with pain points, objections, desire statements, and source citations. This feeds copy and personas later.
/ads audience --business yourbrand 3–5 personas built from the research, plus an exclusion strategy: which Custom Audiences (purchasers, current subscribers, refund requesters, etc.) to recommend excluding per campaign goal. You confirm or override at launch time.
/ads copy --business yourbrand 12 ads × A/B variants across four frameworks (PAS, AIDA, BAB, 4Ps) using language pulled straight from research. Output: a copy markdown file plus headline + hook bank.
/ads funnel --business yourbrand Campaign structure (acquisition + retargeting), budget split, KPIs, and the exclusion logic per ad set. The dashboard preview updates so you can review before generating creative.
/ads creative --business yourbrand Higgsfield generates ad images and videos (UGC-style, product hero, Marketing Studio presets) referenced to your product or brand. AdStack writes a creative manifest mapping each asset to a planned ad slot.
/ads launch --business yourbrand AdStack shows you the campaign dashboard preview (everything in one screen: structure, ads, copy, creative, audiences, exclusions), waits for your explicit approval, then creates the entire campaign / ad set / ad tree in your real Meta ad account — all in PAUSED state. Nothing activates without you saying go.
Open Meta Ads Manager, do a final visual review of each ad in preview mode, then flip the toggle to ACTIVE. Or ask Claude:
activate the yourbrand acquisition campaign AdStack confirms the entity, double-checks the budget and ad set details, and asks for explicit approval before flipping anything live.
/ads optimize --business yourbrand Pulls live performance from ads_insights_*, applies industry benchmarks, surfaces winners + losers, and recommends actions (scale, kill, refresh). You approve every change before it runs.
/ads report --business yourbrand Performance report with industry-benchmark context. Good for weekly check-ins or client reviews.
Everything you can say to Claude with AdStack installed.
| /ads setup | One-time business config: connect MCPs, validate token, set up the live dashboard |
| /ads preview | Open the local dashboard at http://localhost:8080/preview/ |
| /ads publish | Generate a deployable demo dashboard with CDN-hosted assets (for marketing pages) |
| /ads research | Mine Reddit, reviews, and forums for verbatim buyer voice |
| /ads audience | Build 3–5 personas + recommend Custom Audience exclusions per goal |
| /ads copy | Generate ad copy variations using real buyer language (PAS / AIDA / BAB / 4Ps) |
| /ads funnel | Design campaign architecture, budget split, KPIs |
| /ads creative | Generate ad images + videos via Higgsfield |
| /ads launch | Build the full campaign in Meta — always PAUSED — with a dashboard preview first |
| /ads audiences | Create or list Meta Custom Audiences for exclusion-aware retargeting (requires Meta token) |
| /ads optimize | Pull live performance, surface winners + losers, execute approved changes |
| /ads report | Performance report with industry benchmark context |
| /ads status | Quick performance snapshot |
| /ads pause <name> | Pause a campaign, ad set, or ad |
| /ads scale <name> | Increase budget on a winner (default +20%, you confirm) |
You don't have to use slash commands. Any of these route to the right module automatically:
AdStack is designed to never spend a dollar without an explicit "go" from you.
claude mcp list and confirm meta-ads is in the list pointing at https://mcp.facebook.com/adsclaude mcp add --transport http meta-ads https://mcp.facebook.com/ads/mcpA few known Higgsfield quirks AdStack handles automatically — but if you're poking manually:
show_generations before retrying. The job often completed and a retry burns credits.job_display. Job status from job_display can lag. Use show_generations for the source of truth.Meta requires every video ad to include an image_url thumbnail when the creative is built. AdStack pulls a thumbnail from the matching Higgsfield CDN image automatically — but if you're constructing creative manually, make sure video_data.image_url is set.
User access tokens last about 60 days. To refresh:
ads_management, ads_read, business_management)META_ACCESS_TOKEN in .env with the new tokenscripts/generate-preview.py is running. /ads setup starts it; you can also start it manually with python3 .claude/skills/adstack/scripts/generate-preview.pyPyYAML is installed: pip3 install pyyaml