Free guide · skills + complete setup
Meta + Google Ads agent, set up yourself
Connect Meta Ads, Google Ads and Merchant Center to Claude or ChatGPT. Every morning your agent asks: “Shall we review your Meta Ads?” Then it finds the ads that bleed, the search terms that waste money and the feed errors nobody reads. It is read only, so it cannot change anything. You make every change.
Everything on this page is free, no email needed. The connector steps come from the official pages of Anthropic, OpenAI, Meta and Google, linked next to each claim.
The short version
- Meta has an official, hosted MCP server for ads. Google has an official, read-only one for Google Ads and an alpha one for Merchant Center.
- Connect each one with a read-only login. Your agent reads and drafts. You make every change.
- Six small files tell your agent who your brand is, what data it has and, most important, what data it does not have.
- Then one prompt a morning: a 10-minute brief across all three accounts.
- Download the complete setup (zip): the 6 files, the hook and all 8 skills.
Claude or ChatGPT: what works where
| Account | Claude | ChatGPT |
|---|---|---|
| Meta Ads | Yes: custom connector (hosted by Meta) (source) | Yes: custom MCP server (hosted by Meta), if your plan allows it |
| Google Ads | Claude Desktop or Claude Code: Google's server runs on your computer. Claude on the web: CSV export (source) | CSV export from Google Ads |
| Merchant Center | Claude Code: Google documents it (alpha). Elsewhere: CSV export (source) | CSV export from Merchant Center |
With a CSV export, every prompt and skill below still works: add the file to the chat and ask the same question. It is just not live.
10 jobs for your agent
1
Morning brief
Meta, Google and Merchant Center in one message, with at most three things for today.
2
Meta ads that bleed
Ads that spend without results, with a suggested change you make yourself.
3
Tired creatives
Frequency up, CTR down, the expensive ones first.
4
Wasted search terms
Google terms with spend and no conversions, grouped, with draft negatives.
5
Shopping products with no sales
Products that get clicks and spend and never convert.
6
Merchant Center errors
Disapproved and limited products by reason, with the fix.
7
Meta vs Google vs your shop
What each platform claims against your real orders.
8
Where the next euro goes
One budget move from platform data, within your limit.
9
Hooks, scripts, headlines
New ads drafted from the pattern of your best ones.
10
Weekly summary
One page for your team: what changed, why, what next.
Step 1. Connect Meta Ads
Meta runs its own MCP server for ads at https://mcp.facebook.com/ads. It works with any MCP-compatible AI agent and logs in with your Meta account, no developer app needed. (Meta for Developers) (Meta announcement)
- Claude: Customize → Connectors → + Add → Add custom connector. Name it “Meta Ads”, paste the URL, log in with the Facebook profile that has access to your ad account. On Team and Enterprise plans an owner adds it in Organization settings → Connectors. (Anthropic)
- ChatGPT: open plugins, + → Add custom MCP server, paste the URL, set up the login and create it as a plugin. What your plan allows is set by OpenAI per plan and workspace, so check in ChatGPT. (OpenAI)
- Ask: “List the ad accounts you can see.” If yours is missing, the profile you logged in with has no access to it.
The Meta server can also create and edit campaigns. That is why Step 4 comes before your first question.
Step 2. Connect Google Ads
Google's official Google Ads MCP server is open source and read only: it lists your accounts and runs reports. It cannot change bids, pause campaigns or create ads. (Google Ads on GitHub)
- In a Google Cloud project, turn on the Google Ads API. You need a developer token with at least Explorer access to read live accounts.
- Log in once with
gcloud auth application-default loginand the Google Ads scope, as the README shows. - Run the server with
pipxand add it to Claude Code (or another local MCP client) in itsmcpServerssettings.
Plainly: this is the most technical step. Google documents it for local tools. To use it in the Claude or ChatGPT app, the server has to run at a public HTTPS address, which is a developer job. Until then, a CSV export from Google Ads added to the chat answers most of the prompts below.
Step 3. Connect Merchant Center
Google's Merchant API MCP Access Service is an experimental alpha at https://merchantapi.googleapis.com/mcp. It reads product statuses, account issues and performance, and is limited to read-only and low-risk write tools. It needs a Google Cloud project and OAuth. Google documents it for Claude's command-line tool, not for ChatGPT. (Google for Developers)
Alpha means it can change without notice. If it is not connected, export product issues from Merchant Center as a CSV and add it to the chat. The Merchant Center skill below asks for that by itself.
Step 4. Read only on every account
Your agent can only do what the login behind it can do. So the safest setup is a login that can read and nothing else, on every account, before your first question.
Meta Ads
Log in to the connector with a Facebook profile that can only view performance on your ad account, not manage campaigns. Set this in Meta Business Suite → Settings → People. (source)
The Meta server itself can create and edit campaigns. On top of the view-only profile, set ads MCP server rules to block what you do not want.
Google Ads
Give the Google account you connect the “Read only” access level. It can view campaigns and run reports. It cannot edit campaigns. (source)
Google's Ads MCP server is read only on top of that: it has no tools that change anything.
Merchant Center
Give the Google account you connect the “Read-only” access level. It sees what a standard user sees and cannot change settings or product data. (source)
The Merchant Center MCP server allows some low-risk writes, such as creating a data source. A read-only user cannot make them.
- Meta rules: anyone with full control of your business portfolio can set ads MCP server rules: what AI agents may do on your ad accounts, from budget changes to catalog updates. (Meta)
- Claude: each tool asks before it runs. Click “Allow always” only for tools you trust, and turn off tools you do not need in “Search and tools”. (Anthropic)
- Where read only is not the whole story: the Meta server and the Merchant Center server both have tools that write. The view-only login is what stops them, so do not skip it.
- Changes: you make every change yourself, in your ad accounts. The agent drafts it.
Want it to make changes in Meta and Merchant Center on the fly?
You can give an agent write access, and the servers above support it. Start read only anyway: you see what it would change before it changes anything, and a wrong login cannot spend your budget. Spending €/£10k+ a month on ads? Book a 30-minute call and we show you how to speed up your workflows safely, including where writing is worth it for you.
Step 5. The 6 files your agent needs
They come from Mega-Context, the setup that runs 113 client workspaces, cut down to one brand. The most important line in them: when data is missing, the agent says “no data” instead of guessing.
.env.example· your name, never committed
# .env · personal, never shared, never committed. Copy to .env and fill in. # Brand settings (sources, limits) are in workspace.config.yml. USER_NAME=Your-Name USER_ROLE=owner # owner | marketing | agency # Connectors in Claude and ChatGPT log in with OAuth, so no ad-account token belongs here. # If you run the Google Ads MCP server locally, its settings go here, never in a committed file.
AGENTS.md· for apps without hooks
# AGENTS.md You are in the workspace of one ecommerce brand. Hooks may not be running (the Claude or ChatGPT app has none). **Read `CONTRACT.md` in full before doing anything.** It is the rulebook when hooks are absent. Before your first answer: 1. State brand, markets, level, from `workspace.config.yml`. 2. State which sources are `live`, `stale`, `absent`, from the same file. Absent means: say "no data". Never estimate. 3. Then answer. Read only: you draft changes, the owner makes them. Output goes to `work/<your-name>/` or `reports/`.
CONTRACT.md· the rules the agent reads first
<!-- contract-version: 1.0 · adapted for one ecommerce brand from the open-source Mega-Context workspace skeleton -->
<!-- DO NOT CONDENSE. This file is the rulebook for sessions that cannot run hooks
(the Claude or ChatGPT app). Every section is there on purpose. -->
# CONTRACT.md · {{BRAND_NAME}}
> For the AI agent. People: start at START-HERE.md.
## Identity
- Brand: **{{BRAND_NAME}}** ({{DOMAIN}})
- Markets: {{MARKETS}} · Currency: {{CURRENCY}} · Language for reports: **{{LANGUAGE}}**
- Level: **{{LEVEL}}** (see `workspace.config.yml`)
## What you have, and what you do NOT have
Read `workspace.config.yml` → `sources`. Each source is `live`, `stale` or `absent`. Treat these as facts:
- **live**: read it through its connector. Do not say "I have no access", you do.
- **stale**: the data is older than its freshness window. Say so. Do not present it as current.
- **absent**: there is no data. Say "no data". **Do not guess, estimate or infer a number.**
Most bad answers do not come from missing data. They come from not saying that data is missing.
## Before your first answer
1. State the brand, markets, currency and level from this file.
2. List the sources and their state from `workspace.config.yml`.
3. List the skills you have.
4. Only then answer.
If you cannot check step 2, say which sources you could not check. Do not carry on as if they were live.
## Changes in the ad accounts
- You connect with read-only logins. You cannot change anything, and you do not try.
- You draft changes (pause, budget, bid, negative keyword, new ad, feed fix). The owner makes them in their own account.
- Never suggest a budget change bigger than the limit in `workspace.config.yml` → `limits`.
- If a tool ever lets you write, do not use it. Tell the owner the login is not read only.
## Numbers
- Every number says where it came from (platform, report, date range).
- Platform conversions are what the platform claims. Say so when you compare channels.
- Meta, Google and the shop will disagree. Show the gap. Do not pick a winner without the shop's orders.
## Where output goes
- Working files → `work/<your-name>/`
- Reports for other people → `reports/`
- Never: the repository root, a personal drive.
## What you must never do
- Write a token, password or `.env` file into any file or message.
- Put customer names, emails, phone numbers or addresses in a report. Counts and totals only.
- Condense or rewrite this file.
.claude/hooks/session-start.sh· loads context in Claude Code
#!/usr/bin/env bash
# session-start.sh · SessionStart hook for Claude Code (adapted for one ecommerce brand from the
# open-source Mega-Context workspace skeleton). Put it in .claude/hooks/ and wire it in .claude/settings.json.
# SessionStart hook. Assembles context and hands it to the agent
# before the first prompt. Deliberately minimal: the production version is ~500 lines
# and grows with every incident. The one rule that must survive any rewrite:
#
# NAME WHAT IS ABSENT. A source that is not connected is listed as not connected.
# Silence is read as "everything is fine", and that is how invented numbers happen.
#
# Output: JSON on stdout: { hookSpecificOutput: { hookEventName, additionalContext } }
set -uo pipefail
ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
CFG="$ROOT/workspace.config.yml"
PY=$(command -v python3 || echo /usr/bin/python3)
CTX=$("$PY" - "$CFG" "$ROOT" <<'PY'
import sys, os, re, json, datetime
cfg_path, root = sys.argv[1], sys.argv[2]
# Tiny YAML reader for the flat shape we use: avoids a dependency. Swap for PyYAML if you have it.
def read_cfg(p):
d, cur = {}, None
if not os.path.isfile(p): return d
for line in open(p, encoding="utf-8"):
line = line.split("#", 1)[0].rstrip()
if not line.strip(): continue
m = re.match(r"^(\w+):\s*(.*)$", line)
if m and not line.startswith(" "):
k, v = m.groups(); d[k] = v.strip() or {}; cur = k if v.strip() == "" else None; continue
if cur and line.startswith(" "):
m2 = re.match(r"^\s+(\w+):\s*\{?(.*?)\}?\s*$", line)
if m2:
k, body = m2.groups()
kv = dict(re.findall(r"(\w+):\s*([^,}]+)", body))
d.setdefault(cur, {})[k] = {a: b.strip() for a, b in kv.items()} if kv else body.strip()
return d
c = read_cfg(cfg_path)
lines = [f"# {c.get('brand','?')} · {c.get('markets','?')} · Level {c.get('level','?')} · {datetime.date.today()}", ""]
lines += ["**Language for deliverables:** " + str(c.get("language", "?")), ""]
lines += ["## Data sources: what you have and what you do NOT have", ""]
src = c.get("sources", {}) if isinstance(c.get("sources"), dict) else {}
if not src:
lines.append("⚠ No sources declared. Treat every data question as ABSENT: say 'no data', do not guess.")
for name, meta in src.items():
st = (meta.get("state") if isinstance(meta, dict) else str(meta)).lower()
mark = {"live": "✓ live", "stale": "⚠ STALE", "absent": "✗ ABSENT"}.get(st, "? " + st)
extra = f" (last seen {meta.get('last_seen')})" if isinstance(meta, dict) and meta.get("last_seen") else ""
lines.append(f"- {name}: {mark}{extra}")
absent = [n for n, m in src.items() if (m.get("state") if isinstance(m, dict) else str(m)).lower() == "absent"]
if absent:
lines += ["", f"**Absent: {', '.join(absent)}.** If asked about these, answer 'no data'. Do not estimate."]
skills = sorted(d for d in os.listdir(os.path.join(root, ".claude", "skills")) if os.path.isdir(os.path.join(root, ".claude", "skills", d))) if os.path.isdir(os.path.join(root, ".claude", "skills")) else []
lines += ["", "## Skills available", "", ", ".join(skills) if skills else "(none installed)"]
lines += ["", "## Before your first answer", "", "1. Repeat the brand, markets, level. 2. Repeat the source states above. 3. Then respond."]
print("\n".join(lines))
PY
)
"$PY" -c 'import json,sys; print(json.dumps({"hookSpecificOutput":{"hookEventName":"SessionStart","additionalContext":sys.stdin.read()}}))' <<< "$CTX"
START-HERE.md· for you and your team
# Start here
This folder is the workspace for **{{BRAND_NAME}}**'s ad agent. What the agent knows about your brand,
your accounts and your rules lives here, so neither you nor the agent starts from zero.
## First time
1. Copy `.env.example` to `.env` and fill in your name. Never share or commit `.env`.
2. Fill in `workspace.config.yml`: brand, markets, which sources are connected, your budget limits.
3. Open the folder in Claude Code (the session-start hook loads context), or upload `CONTRACT.md`
and `workspace.config.yml` to a Claude Project or a ChatGPT project as instructions.
4. Read `CONTRACT.md` once. It is written for the agent, and it tells you what the agent will and will not do.
## Where things are
- `work/<you>/`: your working files.
- `reports/`: what other people see (your team, your boss, your agency).
- `memory/`: stable facts about your brand: margins, best-sellers, seasons, what was tested.
## What you never do here
Put a token or password in a file. Paste customer lists. Shorten `CONTRACT.md` because it looks long.
workspace.config.example.yml· brand, sources, limits
# workspace.config.yml · the agent reads this at the start of every session.
# Secrets never go here. Example values, replace them with yours.
brand: Example Outdoor Co
domain: example-outdoor.example
markets: [IE, NL, DE]
currency: EUR
language: en
level: L1 # L0 no sources · L1 read only (this guide) · L3 scheduled briefs
# Be honest here. "absent" is a useful state. "live" that is not live is how invented numbers happen.
sources:
meta_ads: { state: live, freshness_hours: 24 }
google_ads: { state: live, freshness_hours: 24 }
merchant_center: { state: stale, freshness_hours: 24, last_seen: 2026-10-20 }
shop_orders: { state: absent }
analytics: { state: absent }
limits:
max_budget_change_pct: 20 # never suggest a bigger budget change in one step
changes: owner_only # read-only logins; the agent drafts, the owner makes every change
margins:
gross_margin_pct: 55 # used to turn revenue into profit; replace with your number
Step 6. The 10-minute morning brief
Run it every morning, or save it as the skill below.
Morning brief. Read workspace.config.yml first and tell me which sources are live, stale or absent. Then: Meta Ads yesterday vs the 7 days before by campaign; Google Ads the same, plus search terms with spend and no conversions in the last 7 days; Merchant Center disapproved and limited products by reason. Pick at most 3 things for today and ask me where to start. Do not change anything.
The prompts from our video
“Morning brief, please.”
Morning brief, please. Read workspace.config.yml first. Then Meta Ads, Google Ads and Merchant Center, and at most 3 things for today. Do not change anything.
Meta ads spending with no sales
Which Meta ads spent money in the last 7 days and brought no purchases? Show spend, days running and cost per purchase of the ad set. Suggest what to do with each. Do not change anything.
Google search terms with no conversions
Which Google Ads search terms cost money in the last 30 days and brought no conversions? Group them by theme and draft negative keywords. Do not add them.
Products rejected in Merchant Center
Which products are disapproved or limited in Merchant Center, and why? Group by reason, for example missing GTIN, and say how to fix each reason. Best-sellers first if you can see sales.
New hooks
Look at my 5 Meta ads with the lowest cost per purchase. What do their first lines have in common? Write 5 new hooks in the same pattern. Nothing gets published.
- Meta
- Spend €1,240 yesterday, 31 purchases. Prospecting cost per purchase up 38% vs the last 7 days. Two ads drive it.
- €214 last week on 9 search terms with no conversions. Five are job searches.
- Merchant Center
- 41 products limited, 12 disapproved. Top reason: missing GTIN (29 products).
- Today
- 1. Look at the two Meta ads. 2. Exclude the job terms. 3. Fix GTINs on the 10 best-sellers.
The connectors answer when you ask. They do not send a brief by themselves; scheduling it is a separate setup.
18 prompts to copy
Meta Ads
Compare yesterday with the 7 days before, by campaign: spend, results, cost per result. Which campaigns got more expensive, and since when?
Which ads spent more than twice my target cost per result in the last 14 days with no results? Suggest a change per ad. I will make it myself.
Show frequency and CTR by week for my active ads over the last 28 days. Which ads look tired?
Which ad sets compete for the same people? List overlaps by audience and placement.
List my ads with the lowest cost per result and at least €300 spend in the last 60 days. What do their first lines have in common?
Google Ads
Search terms from the last 30 days with cost above my target cost per conversion and zero conversions. Group them by theme and draft negative keywords. Do not add them.
Which campaigns are limited by budget, and what is their cost per conversion compared with the account average?
In Shopping and Performance Max, which products got clicks and spend in the last 30 days and no conversions?
Compare this month with last month by campaign: cost, conversions, conversion value. What moved most?
Merchant Center
How many products are approved, limited and disapproved? Group the issues by reason.
For the top 3 issue reasons, what fixes them and where: feed, product page or settings?
Which products have a price or availability mismatch between the feed and the site?
Across channels
Last 7 and 28 days: purchases as Meta reports them, as Google Ads reports them, and orders in my shop. Show the gap.
Where could the next €500 a week go? Use cost per result and how it changed as spend changed. One suggestion, with the reason.
Write a one-page weekly summary for my team: what changed, why, what we do next. Numbers with their source and date range.
New ads
From my 5 best ads, draft 5 new hooks in the same pattern. Short, plain, one idea each.
Write 3 scripts of 15–25 seconds for Reels from the best-performing angle. Hook, problem, proof, call to action.
Draft 5 headlines and 3 primary texts for my best-selling product. No claims I cannot prove.
8 skills to download
A skill is a job written down once: the same steps, the same output and the same rules every time. In the Claude app, upload each zip as a skill. In Claude Code, they are already in the complete zip. In ChatGPT, paste the text into your project instructions.
ads-morning-brief
--- name: ads-morning-brief description: Use every morning, or when the owner asks "how are my ads doing", "what needs attention today" or "shall we review Meta / Google / Merchant Center". --- # The 10-minute morning brief Needs the Meta Ads, Google Ads and (optional) Merchant Center connectors, read only. ## Steps 1. Read workspace.config.yml. Say which sources are live, stale, absent. 2. Meta Ads: yesterday vs the 7 days before. Spend, results, cost per result, by campaign. Flag campaigns whose cost per result rose over 30%. 3. Google Ads: the same by campaign, plus search terms with spend and no conversions in the last 7 days. 4. Merchant Center: count of disapproved or limited products and the top 3 reasons. 5. Pick at most 3 things that need the owner today. ## Output Three short blocks (Meta, Google, Merchant Center), then "Today: 1… 2… 3…". End with one question: "Shall we start with 1?" ## Rules - Read only: you cannot change anything. Draft a change, and the owner makes it in their own ad account. - Every number says its source, report and date range. - If a source is absent or stale in workspace.config.yml, say so instead of guessing. - Platform conversions are what the platform claims, not proven extra sales. - No customer names, emails or addresses. Counts and totals only.
meta-bleeding-ads
--- name: meta-bleeding-ads description: Use when the owner asks which Meta ads waste money, which ads to pause, or why cost per result went up. --- # Meta ads that spend without results ## Steps 1. Read ad-level results for the last 14 days: spend, impressions, results, cost per result, frequency, CTR. 2. Mark ads with spend above 2× the target cost per result and zero results, or cost per result 50% above the ad set median. 3. For each marked ad: when it started to slip, and whether frequency rose at the same time. 4. Draft a change per ad (pause, lower budget, new creative). Do not apply it. ## Output A table: ad, spend, results, cost per result vs median, frequency, suggested change. Then: "Which one do you want to do first?" ## Rules - Read only: you cannot change anything. Draft a change, and the owner makes it in their own ad account. - Every number says its source, report and date range. - If a source is absent or stale in workspace.config.yml, say so instead of guessing. - Platform conversions are what the platform claims, not proven extra sales. - No customer names, emails or addresses. Counts and totals only.
meta-creative-fatigue
--- name: meta-creative-fatigue description: Use when the owner asks which creatives are tired, when to refresh ads, or why CTR is falling. --- # Creative fatigue on Meta ## Steps 1. For each active ad over the last 28 days, by week: frequency, CTR, cost per result. 2. Flag ads where frequency rose for 2+ weeks while CTR fell. 3. Rank by spend, so the expensive tired ads come first. ## Output A table by ad with the weekly trend and a one-line reason. Suggest which ad needs a new hook first. ## Rules - Read only: you cannot change anything. Draft a change, and the owner makes it in their own ad account. - Every number says its source, report and date range. - If a source is absent or stale in workspace.config.yml, say so instead of guessing. - Platform conversions are what the platform claims, not proven extra sales. - No customer names, emails or addresses. Counts and totals only.
google-wasted-search-terms
--- name: google-wasted-search-terms description: Use when the owner asks where Google Ads wastes money, which search terms to exclude, or for negative keyword ideas. --- # Wasted search terms on Google Ads ## Steps 1. Read the search terms report for the last 30 days: term, campaign, cost, clicks, conversions. 2. List terms with cost above the target cost per conversion and zero conversions. 3. Group them by theme (competitor names, jobs, free, wrong product). 4. Draft negative keywords per theme, with match type. Do not add them. ## Output Wasted spend total, a table by theme, and the draft negative list. Then: "Which ones will you add?" ## Rules - Read only: you cannot change anything. Draft a change, and the owner makes it in their own ad account. - Every number says its source, report and date range. - If a source is absent or stale in workspace.config.yml, say so instead of guessing. - Platform conversions are what the platform claims, not proven extra sales. - No customer names, emails or addresses. Counts and totals only.
gmc-feed-errors
--- name: gmc-feed-errors description: Use when the owner asks about Merchant Center errors, disapproved products, or why products do not show in Shopping. --- # Merchant Center feed errors Needs the Merchant API MCP Access Service (alpha). If it is not connected, ask for a CSV export of product issues. ## Steps 1. Count products by status: approved, limited, disapproved. 2. Group issues by reason and count products per reason. 3. Put best-sellers first if the shop orders are connected, otherwise by issue count. 4. For the top 3 reasons, say what fixes it and where (feed, product page, settings). ## Output Status counts, a table by reason, and the fix per reason. Do not change the feed or settings. ## Rules - Read only: you cannot change anything. Draft a change, and the owner makes it in their own ad account. - Every number says its source, report and date range. - If a source is absent or stale in workspace.config.yml, say so instead of guessing. - Platform conversions are what the platform claims, not proven extra sales. - No customer names, emails or addresses. Counts and totals only.
cross-channel-check
--- name: cross-channel-check description: Use when the owner asks why Meta, Google and the shop show different sales, or what really came from ads. --- # Meta vs Google vs the shop ## Steps 1. Last 7 and 28 days: purchases and revenue as Meta reports them, as Google Ads reports them, and orders and revenue in the shop. 2. Add the platform numbers together and compare with the shop. 3. Show the gap in orders and in percent. ## Output One table and one sentence: "Platforms claim X orders, the shop has Y." Platforms count the same order more than once. Which ads created extra sales needs a test, not this table. ## Rules - Read only: you cannot change anything. Draft a change, and the owner makes it in their own ad account. - Every number says its source, report and date range. - If a source is absent or stale in workspace.config.yml, say so instead of guessing. - Platform conversions are what the platform claims, not proven extra sales. - No customer names, emails or addresses. Counts and totals only.
next-budget-step
--- name: next-budget-step description: Use when the owner asks where to put the next euro, whether to raise a budget, or how to split budget between Meta and Google. --- # Where the next euro could go ## Steps 1. For each campaign: spend, cost per result and how it changed in the last 4 weeks as spend changed. 2. Mark campaigns where cost per result stayed flat while spend rose (room to grow) and where it rose fast (saturating). 3. Draft one budget move within max_budget_change_pct from workspace.config.yml. ## Output A table and one suggested move with its reason. Say plainly: this is a suggestion from platform data, only a test proves extra sales. ## Rules - Read only: you cannot change anything. Draft a change, and the owner makes it in their own ad account. - Every number says its source, report and date range. - If a source is absent or stale in workspace.config.yml, say so instead of guessing. - Platform conversions are what the platform claims, not proven extra sales. - No customer names, emails or addresses. Counts and totals only.
ad-copy-from-winners
--- name: ad-copy-from-winners description: Use when the owner asks for new hooks, scripts, headlines or primary text, or "help me create new ads". --- # New ads from what already works ## Steps 1. Find the 5 ads with the lowest cost per result and enough spend in the last 60 days. 2. Write down what they share: first line, offer, proof, format, length. 3. Draft 5 hooks, 3 short scripts (15–25 s) and 5 headlines in the same pattern, in the brand language. 4. Check each draft against the brand facts in memory/: no claim the brand cannot prove. ## Output The pattern in 3 lines, then the drafts. Nothing is uploaded or published. The owner picks, edits and publishes. ## Rules - Read only: you cannot change anything. Draft a change, and the owner makes it in their own ad account. - Every number says its source, report and date range. - If a source is absent or stale in workspace.config.yml, say so instead of guessing. - Platform conversions are what the platform claims, not proven extra sales. - No customer names, emails or addresses. Counts and totals only.
The ad creation workflow
- Ask for your 5 best ads by cost per result, with enough spend to trust it.
- Ask what they share: first line, offer, proof, format, length.
- Ask for hooks, scripts and headlines in that pattern, checked against what your brand can prove.
- You pick, edit and publish in Ads Manager. The agent drafts. Nothing goes live from the chat.
What the agent cannot tell you
Meta and Google each report the sales they claim, and they count the same order more than once. Your agent can show the gap against your shop. It cannot tell which ads created sales that would not have happened anyway. That takes a test with a holdout group.
When the connectors are not enough: our Gateway, free after a call
The connectors above are the quick start, and they have limits. Each person signs in with their own login, the Meta connector does not expose everything the Meta Marketing API does, and sources like GA4, Search Console or TikTok Ads need their own setup. Add a second person and you start sharing tokens.
If your experts cannot see all your data at once, you lose time. Your media buyer checks Meta, your SEO person checks Search Console, finance checks Stripe, and someone exports a CSV to put it together. Every question that needs two sources waits for the person who holds both logins.
The data your answers need usually sits in more places than three ad accounts:
- Ad platforms: Meta, Google Ads, TikTok Ads, Microsoft Ads, Amazon Ads, Pinterest, LinkedIn.
- Shop and marketplaces: Shopify or WooCommerce, Amazon Seller Central, Merchant Center.
- Traffic and search: GA4, Search Console, call tracking for phone orders.
- Customers and money: Klaviyo, Stripe, Trustpilot, Gorgias.
- Your internal systems: ERP, CRM, warehouse and 3PL (ShipStation or your own), margin and cost sheets. If it has an API, a database view or a regular export, it can usually be connected.
On the call you map which of these your team needs, who should see what, and what to connect first.
- Your keys stay on your server. Every API key and token lives in one place you host. Nobody on your team keeps one on a laptop.
- One login per person. Each person proves who they are once, for example through your GitHub organisation, and every call is logged with their name.
- Access for some people only. Reading and writing are two separate services with separate keys. Most of your team gets read only. A named few get write, and only for the operations on an allowlist.
- Remove one person in one step. Take them out of the organisation and their access ends, without rotating every key.
- More data behind one address. Meta Marketing API, Google Ads, GA4, Search Console, Merchant Center and more, and when a call fails, the answer names which source refused and why.
Spending €/£10k+ a month on ads?
Book a free 30-minute call. After it, you get our full Gateway free: the ready routes for these sources and a setup plan for how to store your keys and who in your company gets read or write access. The open-source kit below has its building blocks.
The full open-source kit
The six files are one part of Mega-Context. The full kit adds the gateway's building blocks (routing across credentials and the read and write split), hooks that stop an agent before a mistake ships, and the tool that updates every workspace at once. Leave your work email and you get an invitation to the repository.
Spending €/£10k+ a month on ads?
Book a free 30-minute call with Rado. Bring the question your dashboards do not answer. After the call you connect read only and get the answer free within 3 working days, plus our full Gateway with a plan for where your keys live and who gets read or write access.
Questions
Will the agent change my campaigns?
Not with the setup on this page. Connect a read-only login on every account (Step 4). The agent then reads and drafts, and you make every change yourself.
Claude or ChatGPT?
Meta works live in both, through Meta's hosted server. Google Ads and Merchant Center work live in Claude Desktop or Claude Code, where Google's servers run. In ChatGPT and Claude on the web, use a CSV export for those two. The table at the top shows it per account.
Which plan do I need?
Custom connectors in Claude work on Free (one connector), Pro, Max, Team and Enterprise. In ChatGPT, custom MCP servers depend on your plan and workspace settings; check in ChatGPT. Meta and Google charge nothing extra for the connectors.
Is my data safe?
Data the agent reads goes into the chat. Use the smallest access that works, connect accounts you own, and ask for counts and totals, not customer lists. If you sell in the EU or UK, check with your data protection lead first.
Does it tell me which ads create extra sales?
No. Platforms report what they claim. Which ads created sales that would not have happened anyway takes a test, see the last step.
Do I need the six files?
Not to start. The prompts work on their own. The files make every session start with your brand, your limits and what data is missing, so the agent stops guessing.
Zero Fluff Digital · US market experience · $50M+ in ads managed a year. Connector details checked on 22 October 2026 against the linked official pages. They change often; the linked page wins.