AdReckon speaks MCP, an open standard. One URL turns Claude, ChatGPT, Cursor, VS Code — or anything else that speaks MCP — into something that can read and manage your Google Ads accounts, under the limits you set in the dashboard.
https://api.adreckon.com/mcp
Streamable HTTP · OAuth 2.1 with PKCE · no API key to paste, no secret to store
Settings → Connectors → Add custom connector, paste the endpoint, Add. Leave the defaults: Claude detects that we require sign-in and registers itself automatically.
Add a remote/HTTP MCP server with the same URL. Anything that implements the MCP streamable-http transport works — there is no AdReckon-specific client.
Signing in is one screen. You approve AdReckon in your browser, and your Google Ads refresh token stays encrypted on our side — it never crosses the MCP connection to your AI. Revoke it any time from the dashboard or from Google permissions.
Most Google Ads MCP servers read. Google's own is free and read-only, and so is nearly everything built on top of it. AdReckon publishes 21 tools that change the live account — budgets, bidding strategies and their targets, campaign and ad status, keywords and match types, negatives, responsive search ads, PMax asset groups, ad schedules, locations and devices, conversion actions, offline conversion uploads. So "this search term has spent R$400 and converted nothing" and "block it, then" are the same conversation, in the client you already use.
Which is not a sentence anyone should accept without knowing what stops it. Every write is checked on our side against a policy only you can set — the Limits tab in the dashboard. Your AI can read that policy (get_limits) and has no tool anywhere to change it.
The callers are not alike: you are sitting there when your own AI runs, and nobody is when the overnight review does. So each surface carries its own setting, and there are three.
The AI never approves its own proposal — the one-click token goes to your inbox or your browser session, and never enters the model's context.
Worth five minutes before you point this at a live account: open Limits and set a per-campaign budget cap and an account ceiling. They start empty, and in the default mode nothing pauses to ask before a budget moves — the cap is the thing that says no.
AdReckon publishes 60 tools — roughly 30,000 tokens of definitions that most clients load into every request. Modern clients handle that themselves: Claude and Claude Code defer tool schemas and fetch only the ones a request needs. If yours does too, change nothing — the plain endpoint gives you everything, and that is the default.
If yours does not, you can ask for a slice instead. Add ?tools= to the URL when you add the connector:
| Toolset | Tools | Tokens | What it holds |
|---|---|---|---|
| core | 7 | ~1.9k | Accounts, the data catalog, your write limits, the knowledge base, pending proposals. Always included — a narrowed connection can still see what it is missing. |
| reporting | 7 | ~7.2k | Performance at every level, period comparison, trends, anomalies, ad copy, budget pacing, change history. |
| manage | 28 | ~14k | Every write — budgets, bidding, status, keywords, negatives, ads, targeting, schedules, conversions — plus the live reads those writes check themselves against. |
| alerts | 4 | ~1.7k | Server-side alerts that watch an account and email or Slack you. |
| reports | 7 | ~2.1k | Hosted weekly/monthly reports, public links, schedules. |
| memory | 2 | ~0.7k | Writing to the account's notes — the business facts the numbers cannot show. |
| feedback | 2 | ~0.9k | Filing a bug or a feature request from inside the conversation. |
| raw | 3 | ~1.5k | Raw GAQL and raw mutations — the escape hatches, for the last 10% the curated tools do not cover. |
| everything | 60 | ~30k | What you get when you ask for nothing. This is the default and it has not changed. |
A misspelled toolset is refused with the valid names — never silently widened back to all 60. A tool outside your selection is not published and cannot be called; asking for it tells you which toolset holds it, so nothing looks like a missing capability.
Every tool answers twice: a rendered, human-readable text block, and a structuredContent object carrying the same data as fields. If your agent runs our results through code rather than reading them, add &output_schemas=1 and the reads will declare their shapes as MCP outputSchema, so you can filter rows instead of parsing a table.
It is off by default because it is not free — the declarations add about 4,000 tokens, and they buy nothing for a client that reads the text we already render.
Yes — that is the point of the thing, and the section above is the whole answer. The short version: over MCP a change you ask for executes immediately by default, inside the capabilities, money caps and protected campaigns you set in the Limits tab.
If you would rather be asked, that tab has two calmer modes — one that waits only for changes that cannot be undone, one that waits for everything — and they are set separately for your own AI and for AdReckon's, because only one of the two runs while you are watching.
The accounts in the workspace your sign-in is pinned to, and nothing else. Every tool is scoped to that workspace on our side, per request — so removing someone from a workspace takes their connection down on their next call, not whenever their token would have expired.
Your Google refresh token is encrypted at rest and used only by our sync worker and our own write path. It is never sent over the MCP connection.
Reads answer from our own warehouse, which is why they are fast and cost you no Google API quota. The sync re-fetches a 30-day trailing window, because conversions attribute backwards for about a month and an ingest-once store silently drifts from what the Google Ads UI shows.
Today is deliberately not in the reporting window — it is partial, and Google's reporting runs hours behind. When a question really is about today, the assistant pulls today and yesterday live first. A window we have not reached yet answers "we don't know yet", never zero.
OAuth 2.1 with PKCE (S256), protected-resource metadata (RFC 9728) so a client discovers the sign-in requirement on its own, dynamic client registration (RFC 7591) at /register, and client-ID metadata documents — so a client that publishes its own identity document, like Claude's, needs no registration at all. Loopback redirect URIs are supported for CLIs and never auto-followed.
In Claude's connector dialog that means both Sign in now and Register automatically show as detected, and Use Claude's published identity works too. Any of the three is fine.
Each ad account sits on its own rung — a small monthly base plus a rate on what that account spends, so twenty accounts is a normal bill rather than an impossible one. Two accounts start free for ten days each, and the clock is per account: it starts when you start it. The numbers are on the pricing table, which is the one place they live.
Ask your assistant to call describe_schema — it returns the whole catalog of levels, metrics, breakdowns and filters, plus which toolsets your connection is holding. For a Google error, get_knowledge carries the fix for every error we have seen on a real account. If neither helps, [email protected].