“Which of my tracked prompts lost the most visibility this month, and what did ChatGPT actually say?”It’s the same data as the External API, over a different transport, authenticated with the same personal API key.
Like the REST API, the MCP server is not read-only. It includes one write
tool,
create_prompt, which adds tracked prompts to a campaign. Any key that
connects to MCP can use it — see Permissions and scope.Before you start
You need an API key. If you already have one from the REST API it works here — the MCP server accepts the same tokens.1
Create a key
In the app, go to Settings → API and choose Create key. Name it
after the client you’re connecting, e.g.
Claude Desktop.2
Copy it once
The full key is shown only once, right after creation. You can’t view it
again, only revoke it.
3
Copy your server URL
The same page shows your MCP Server URL under the MCP SERVER
section:
Connect a client
The server is a Streamable HTTP MCP server and supports two ways to authenticate:- OAuth — you click “Connect”, sign in, and approve access. No key to copy. This is what browser-based clients such as claude.ai use, and it is the only option there, since they cannot send a static header.
- Bearer token — an API key sent as
Authorization: Bearer <your-key>. Used by clients you configure yourself: Claude Code, Claude Desktop, Cursor.
- Claude.ai (OAuth)
- Claude Code
- Claude Desktop
- Cursor
- Raw HTTP
Go to Settings → Connectors → Add custom connector and enter the MCP
server URL:Leave the client id and secret blank — the connector registers itself
automatically. You’ll be sent to AI Tracker to sign in (if you aren’t
already) and asked to approve access, then returned to Claude with the
connection live.
No API key is involved here. If you’re prompted for one, you’re on the
bearer-token path — clear the field and use the URL alone.
Available tools
Start withlist_campaigns to get a campaign uuid; every other tool takes
one.
Adding prompts
create_prompt accepts a single prompt or a list. To add several at once, put
one per line in text; numbered and bulleted markers are stripped for you, so
you can paste a list straight out of a chat:
topic, location_code and tags apply to every prompt in the call.
string
required
Topic to file the prompts under. Matched case-insensitively against the
campaign’s existing topics; created if there’s no match — so check your
spelling, or you’ll end up with a near-duplicate topic.
string
default:"us"
Two-letter market code the prompts are tracked in, e.g.
us, gb.string[]
Up to 8 tags, max 24 characters each. Lowercased on save.
- 2,000 characters per prompt. Over-long ones are skipped and reported in the response; the rest of the batch is still created.
- 50 prompts per call. Over that, the call is rejected and nothing is created.
- The active-prompt cap. A campaign only tracks a limited number of
active prompts. Anything past the cap is saved but left inactive — it
won’t run until a slot frees up. The response returns
remaining_slotsso you can see where you stand.
A prompt that itself spans multiple lines would be split by the
line-per-prompt rule. Pass a JSON array of strings instead — array elements
are never split.
Permissions and scope
Every tool resolves campaigns through the key owner’s own campaigns, so a key can only ever reach data belonging to the user who created it. There is no way to widen that scope, and no tool that reaches another account’s data. Revoking a key in Settings → API immediately cuts off any client using it.Rate limits
Two throttles apply, in this order:
Exceeding either returns
429 Too Many Requests. An AI client exploring your
data can be chatty — if you hit this, it’s usually a client looping over
prompt runs rather than a genuine need for more throughput.
Troubleshooting
The client connects but lists no tools
The client connects but lists no tools
Confirm the client is configured for Streamable HTTP, not stdio or SSE.
A stdio-only entry connects to nothing.
'Campaign not found or not accessible'
'Campaign not found or not accessible'
The
campaign_uuid doesn’t belong to your account, or it’s wrong. Call
list_campaigns to get valid uuids — the tools deliberately don’t
distinguish “doesn’t exist” from “isn’t yours”.Prompts were added but aren't running
Prompts were added but aren't running
They were saved inactive because the campaign is at its active-prompt
limit. Check
remaining_slots in the response, then deactivate an existing
prompt to free a slot. See
Managing prompts.A browser-based client says the redirect domain isn't permitted
A browser-based client says the redirect domain isn't permitted
Redirect URIs are restricted to an allow-list, which is what stops a rogue
client registering an attacker-controlled callback. If you’re connecting a
legitimate client that isn’t on it,
contact support with the client name.
The tools return no data at all
The tools return no data at all
Check the campaign actually has results yet. A brand-new campaign has no
prompt runs until its first daily run completes, and
get_traffic returns
nothing until an integration is connected.