Track your ad from Claude
Spark Ads runs an MCP server. Connect it once and Claude can read your hour, your numbers and what is still unsold, and rewrite your card for you. Five tools, four of them read only.
Five tools, scoped to your own account from Claude Desktop.
Connect it
Two minutes, once. One key, generated by you and shown a single time.
Open the dashboard, go to Settings → Claude Desktop access and press Generate a key. Nothing stores the key in readable form, so the box it appears in is the only place it will ever be. Copy it before you close the panel.
Endpoint
https://sparkads.dev/api/mcpFor Claude Code, one line adds it:
Claude Code
claude mcp add --transport http sparkads https://sparkads.dev/api/mcp --header "Authorization: Bearer YOUR_KEY"
The endpoint above is the base. A client that wants the exact transport path uses /api/mcp/mcp for streamable HTTP, or /api/mcp/sse for SSE.
For Claude Desktop, or any client that speaks local stdio, put this in the config file (Settings → Developer → Edit Config) and restart it:
claude_desktop_config.json
{ "mcpServers": { "sparkads": { "command": "npx", "args": [ "-y", "mcp-remote", "https://sparkads.dev/api/mcp/mcp", "--header", "Authorization: Bearer YOUR_KEY" ] } } }
What it looks like
Five tools, five real questions. You never type a tool name; Claude picks.
The numbers below are illustrative and modest on purpose. What is exact is the shape: each answer is read out of the response keys printed under it, and nothing else is available to report.
get_my_statsRead onlyYour own impressions and clicks for the last 30 days, three ways.
How did my card do this month?
Over the last 30 days your card took 4,120 impressions and 96 clicks, a click rate of 2.3%. Here is the split by app:
| App | Impressions | Clicks |
|---|---|---|
| sellular | 1,540 | 38 |
| quickpeek | 1,180 | 27 |
| tax-ducks | 890 | 19 |
| spark-ai | 510 | 12 |
By source, 3,940 came from carousels inside Spark apps (network) and 180 from Sellular listings (sellular). Your busiest day was 12 August at 210 impressions.
You have one creative on file, Notemill, and its status is approved.
creatives[], byDay[], byApp[], bySource[], windowDays
get_slotRead onlyThe hour you hold, the card in it, and whether it can actually run.
Is my ad set up to run, and when?
Yes. All three conditions hold, so live comes back true:
- You hold 19:00 UTC, which is 20:00 on the German clock you targeted.
- Target country DE, claimed on 2 August.
- The card, Notemill, is approved, and the subscription is active.
That hour is yours every day until you give it up. Outside it the network runs whoever holds the hour that is on.
holdsSlot, utcHour, localHour, targetCountry, claimedAt, approved, subscriptionActive, live, creative
list_free_slotsRead onlyThe unsold hours, and which of them land in your audience’s evening.
Which hours are still free? I want US evenings.
Twelve of the 24 hours are unsold. Passing US, the free ones ranked by local evening attention (18:00 to 22:00):
| UTC hour | US local |
|---|---|
| 23:00 | 18:00 |
| 00:00 | 19:00 |
| 01:00 | 20:00 |
| 02:00 | 21:00 |
| 03:00 | 22:00 |
01:00 UTC sits at 20:00 Eastern, the middle of that window, and nobody has it. $9 a month. Claiming still happens on the board; this tool only reads.
slotsTotal, slotsTaken, freeUtcHours[], priceMonthly, country, free[], suggested[], note
get_network_pulseRead onlyThe whole network over 24 hours. Public inventory, not your account.
How much traffic does the network actually carry?
Across the last 24 hours the network served 18,400 impressions and 390 clicks, over 9 apps showing the carousel.
12 of the 24 hourly slots are taken, so 12 are still for sale. These are the public figures, the same ones the landing page prints, not your own numbers.
impressions24h, clicks24h, apps24h, slotsTaken, slotsTotal
update_creativeWritesRewrite the card. Costs you the approval you already have.
Change my tagline to say it works offline.
I can set it to “Notes that work offline”, which fits the 60 character cap. One thing first: saving resets the card to pending, so it stops running until a person approves it again. Go ahead?
Saved. changed: ["tagline"]. The card now reads Notemill, “Notes that work offline”, and its status is pending.
The server’s own words: back in the review queue, it stops running until a person approves it, usually the same day.
ok, changed[], creative, note
Editing costs you your approval
The one write tool has a price, and it is not money.
update_creative merges the fields you name over the stored card, validates the whole thing against the same rules a fresh claim is held to, then saves it with its status reset to pending. Your ad stops running until a person reads it again, usually the same day.
Field caps are enforced server side: name 40 characters, tagline 60, the one-sentence body 160, the URL must be https, and the domain must be a bare hostname like myapp.com. House style is plain words, no exclamation marks, and a sentence that says what the product does rather than why it is good.
What it cannot do
Short list, and it is short by construction.
It can
- Read your impressions, clicks and creatives
- Report the hour you hold and whether it can run
- List every unsold hour, ranked for a country
- Read the network's public 24 hour pulse
- Rewrite your card, back into review
It cannot
- Claim or release an hour, which stays on the board
- Approve its own edit
- Touch billing, or start and stop a subscription
- See another advertiser's slot, card or numbers
One hour, every dashboard
Twenty four hours in the day, one advertiser in each. $9 a month while you hold yours.