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 todayAgent Planners MCP
Ad Manager toolsCommunity, thin13 reads, 3 writes
Async report handlingUsually unhandledPolled and bounded
Ad unit creation / changesRareAvailable, approval-gated
Review Center blockingRareAvailable, argument-fenced
AdSense + AdMob in the same sessionNoBoth 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

  1. 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.
  2. 2Connect Google Ad Manager under Integrations — that OAuth step is why the MCP key never carries platform credentials.
  3. 3Add the server to Claude Code, Claude Desktop or Codex using the snippet below.
  4. 4Have the agent call `describe_permissions` first — it reports the key's mode, scopes, plan entitlement and connected accounts.
  5. 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.
Put a human-approved agent on your ad ops

Start free — 2,500 credits a month, no credit card. Reads are free; every write waits for you.

Related reading