Google Ads MCP server, with a policy gate.
Gentkey connects Google Ads to Claude, Claude Code, Cursor, and any MCP client over one OAuth-protected URL — with the deepest constraint model of any connector: dollar-capped budget grants enforced by arithmetic, not prompts.
https://app.gentkey.com/mcpclaude.ai (web & mobile) · Claude Code · Cursor · any MCP clientWhat’s free, what needs a grant.
Reads: Account discovery, campaign performance reporting, and custom GAQL queries work with no grant.
Writes: Budget changes go through a curated tool gated by google-ads.write.budget, capped per call (max $ change per call) and per day (max total $ moved). Raw mutates are typed per resource from the operation itself — the field Google dispatches on — and every budget movement, daily or lifetime, is priced against your caps.
| Grant | What it governs |
|---|---|
google-ads.read | Account discovery, campaign reporting, GAQL queries — on by default |
google-ads.write.budget | Campaign daily budgets through the curated tool — max $ change per call, plus hourly and daily total caps |
google-ads.campaignBudgets.mutate | Budget operations in raw mutates — priced against your dollar caps |
google-ads.campaigns.mutate | Campaign create/update/pause operations |
google-ads.adGroups.mutate | Ad group operations |
google-ads.adGroupAds.mutate | Ad create/update/pause operations |
google-ads.adGroupCriteria.mutate | Keyword and audience criteria at the ad-group level |
google-ads.campaignCriteria.mutate | Targeting criteria at the campaign level |
google-ads.write | Everything the typed grants don't cover — mixed-family or unclassifiable calls fail closed to this |
Bounds the gate enforces with arithmetic.
google-ads.write.budget · max $ change/call = 50An agent raising a campaign budget by $30 is allowed; the same agent raising it by $500 is denied by policy — nothing changes upstream, and both decisions land in the audit log. Hourly and daily total caps bound repeated changes.
Official Google Ads MCP server vs. Gentkey
| Official server | Gentkey | |
|---|---|---|
| Writes | None — read-only reporting (as of mid-2026) | Typed mutate grants with dollar-capped budget changes |
| Hosting | Self-hosted (runs on your machine) | Hosted — one OAuth URL, works from claude.ai web and mobile |
| Spend safety | N/A (no writes) | max $ change per call plus hourly/daily totals, enforced by arithmetic; every denial logged |
| Audit trail | None | Every call, allowed or denied, attributed per agent |
Connect once, use everywhere.
Sign in at gentkey.com, add Google Ads (google oauth), then point each client at your endpoint. Every client completes a standard OAuth flow and lands in your Gentkey — your connections, nobody else’s.
claude.ai (web & mobile)
- Settings → Connectors
- Add custom connector
- Paste
https://app.gentkey.com/mcpand finish the OAuth prompt
Claude Code
claude mcp add --transport http \
gentkey https://app.gentkey.com/mcpCursor
// .cursor/mcp.json
{
"mcpServers": {
"gentkey": { "url": "https://app.gentkey.com/mcp" }
}
}Things agents do with Google Ads here.
- How did my campaigns perform last week compared to the week before?
- Which keywords spent the most with zero conversions this month?
- Raise the Summer Sale campaign budget by $30.
- Pause every ad group with CTR under 0.5% in the Brand campaign.
- Write a GAQL query for search terms that triggered my ads yesterday.
Custody, gating, and audit — built in.
The model never sees a credential
Your Google Ads token is encrypted at rest and injected server-side at call time. Your stored credential never enters a context window.
Writes need a grant
Anything that changes state needs a capability you granted explicitly — revoke it and the next call is denied.
A trail you can act on
Every decision is attributed to the agent that made it — allowed, denied, or denied by constraint.
Fair questions.
How are dollar caps enforced on budget changes?
The policy gate prices every budget movement — daily and lifetime budgets both — before it reaches Google, and sums deltas across batched operations. Each change is checked against your max $ change per call and your hourly and daily moved-total caps; anything over is denied upstream of Google Ads, and the denial is logged.
Is this Google's official Google Ads MCP server?
No. Gentkey is a native connector built on the Google Ads API over your own OAuth. Google's official MCP server is read-only reporting as of mid-2026; Gentkey adds governed writes with typed, dollar-capped grants.
What happens when an agent calls a Google Ads write tool it hasn't been granted?
The call is denied at the gateway — nothing reaches Google Ads — and the denial is recorded in the audit log along with the grant that would have authorized it, so you can decide deliberately instead of finding out later.
Where are my credentials stored?
Encrypted at rest (AES-256-GCM) on Gentkey's server and injected server-side at call time. No credential you store with Gentkey ever enters a model's context window or an agent's config file.
Can I use this from claude.ai's free plan?
Yes — and it's the strongest case for a gateway: free claude.ai accounts currently get a single custom connector, so pointing that one slot at Gentkey puts every connector you've linked behind it.
How do I revoke an agent's access?
Revoke the grant (the next write is denied) or revoke the agent's tokens entirely in one click. Other agents and their grants are untouched — no shared key to rotate.
Is Gentkey affiliated with Google Ads?
No. Gentkey is an independent MCP gateway. Trademarks belong to their owners; where an official Google Ads MCP server exists, Gentkey proxies it and adds custody, gating, and audit on top.
Often connected together.
Cut Google Ads a smaller key.
Sign in, connect Google Ads, and grant your first scoped capability in under a minute.