MCP
Google Ad Manager MCP server: publisher inventory and yield from Claude or Codex
TL;DR
Ad Manager is a publisher platform, which makes it the family where an agent's value is least about campaigns and most about explaining a revenue change. This page covers the setup and the GAM-specific reporting traps that produce plausible, wrong answers.
What already exists for this platform
Google has not shipped a platform-official Ad Manager MCP server at the time of writing (September 2026). GAM's API is also the one most likely to defeat a generic wrapper, because its reporting is asynchronous.
- No official server, and community coverage is thin compared with Google Ads.
- Reports are asynchronous — you request one, poll, and collect it. A naive MCP tool that expects a synchronous answer times out.
- Ad-hoc reporting needs a write scope, which surprises people: a read-only connection can run saved reports and nothing else.
What a full MCP server adds
| Typical option today | Agent Planners MCP | |
|---|---|---|
| Ad Manager tools | Community, thin | 13 reads, 3 writes |
| Async report handling | Usually unhandled | Polled and bounded |
| Ad unit creation / changes | Rare | Available, approval-gated |
| Review Center blocking | Rare | Available, argument-fenced |
| AdSense + AdMob in the same session | No | Both on the same key |
Tool counts are derived from the live catalogue rather than typed by hand: this family exposes 13 reads and 3 writes of the 384 tools on the endpoint. A key only sees the writes if it carries `tools:write`.
How to configure it
- 1Create a key in API & MCP. `tools:read` for questions; add `tools:write` if the agent should be able to change things. Tools mode needs a paid plan and fails closed.
- 2Connect Google Ad Manager under Integrations — that OAuth step is why the MCP key never carries platform credentials.
- 3Add the server to Claude Code, Claude Desktop or Codex using the snippet below.
- 4Have the agent call `describe_permissions` first — it reports the key's mode, scopes, plan entitlement and connected accounts.
- 5Call `list_accounts` for the account ids, and scope each call with one. Resolution is exact or it refuses, naming the candidates.
bash
claude mcp add --transport http agentplanners https://www.agentplanners.com/api/mcp \
--header "Authorization: Bearer ap_live_…"Claude Desktop and Codex
Claude Desktop takes the same endpoint as JSON:
json
{
"mcpServers": {
"agentplanners": {
"url": "https://www.agentplanners.com/api/mcp",
"headers": {
"Authorization": "Bearer ap_live_…"
}
}
}
}Codex uses the same endpoint from `~/.codex/config.toml`, with the key in an environment variable rather than the file: `[mcp_servers.agentplanners]` / `url = "…/api/mcp"` / `bearer_token_env_var = "AGENTPLANNERS_API_KEY"`.
Three GAM metric names that do not mean what they say
- `MATCHED_REQUESTS` is not a v1 name. The equivalent is `RESPONSES_SERVED`, and a query using the old name fails rather than silently returning something else.
- `FILL_RATE` is a 0–1 ratio, not a percentage. Rendering it without knowing that gives you a fill rate of 0.87% instead of 87%.
- MONEY values are currency units, not micros — the opposite convention to Google Ads, where a bare value is micros. Treating GAM money as micros understates revenue by a million.
- `UNMATCHED_AD_REQUESTS` is recorded against the SITE dimension's "(Not applicable)" row. Filter by site and your match rate is always exactly 100%, which looks like good news and is a measurement artefact.
Each of those was a live defect here before it was a documented rule. They are the reason a unit and vocabulary contract belongs in the tool rather than in a prompt that asks the model to remember.
Use cases
- Explaining a revenue drop across Ad Manager, AdSense and AdMob in one question, rather than three tabs and a guess.
- Inventory and placement review — which ad units and placements need attention, ranked.
- Ad unit changes proposed and approved, including the ones a read-only connection cannot reach.
- Review Center decisions, fenced by argument rather than by verb, because GAM's REST API has no delete to gate on.
Frequently asked questions
- Is there an official Google Ad Manager MCP server?
- Not from Google at the time of writing (September 2026). Community coverage is thinner than for Google Ads, and GAM's asynchronous reporting defeats wrappers that assume a synchronous call.
- Why does my Ad Manager fill rate look like 0.87%?
- FILL_RATE is a 0–1 ratio in Ad Manager's API, not a percentage. Rendered without that knowledge it reads as a fraction of a percent instead of 87%.
- Why is my match rate always 100%?
- UNMATCHED_AD_REQUESTS is recorded against the SITE dimension's "(Not applicable)" row. Filtering by site excludes exactly the rows that would lower the match rate, so it comes back at 100% every time.
- Do I need a write scope just to run a report?
- For ad-hoc reports, yes — a read-only Ad Manager connection can run saved reports only. That is a property of Google's API, not of the MCP layer.