MCP server for the Google AdMob API β apps, ad units, mediation, and revenue reports
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
English | νκ΅μ΄
Ask your AI assistant about your AdMob apps and earnings β in plain language:
- "How much did my apps earn in the last 7 days, broken down by country?"
- "Which mediation ad source had the best eCPM this month?"
- "Compare the RPM of my banner vs. rewarded ad units."
- "List my apps and their ad units."

This is a Model Context Protocol (MCP) server for the Google AdMob API.
It works with Claude Code, Claude Desktop, Cursor, Gemini CLI, and any other MCP-capable AI client.
Credentials and revenue data travel only between your machine and Google β there is no third-party server in between.
--toolsets reports,accountsnpx admob-mcp-server auth), environment-variable refresh token, or gcloud Application Default CredentialsOne-time setup, roughly 10 minutes:
| Step | What you do | Where |
|---|---|---|
| 1. Google Cloud setup | Register a personal "app" so Google lets you access your own data | browser |
| 2. Sign in | Run one command and log in with Google | terminal |
| 3. Connect your AI client | Add one config entry and restart the client | terminal |
node --version; if missing, install from nodejs.orgWhy is this needed?
The AdMob API has no simple API keys β Google requires every program that accesses your data to be registered as an "OAuth app".
Here you register a personal one that only you will use.
It's free and needs no billing setup.
admob-mcp), and your email as the support/contact email[!WARNING] While the consent screen is in Testing mode, Google expires sign-ins after 7 days, so you'll need to re-run the sign-in weekly.
To stop that, publish the app (Audience β Publish app).
Publishing for your own use doesn't require Google's verification β you'll just see an "unverified app" warning during sign-in, which is expected.
Move the JSON file you downloaded to where the server looks for it, then run the sign-in command:
(On Windows, move the file to C:\Users\<you>\.admob-mcp\oauth_client.json in Explorer, then run the npx command.)
Your browser opens.
Pick the Google account that owns your AdMob account and allow access.
If you see a "Google hasn't verified this app" warning, that's your own app from Part 1 β click "Continue".
When the terminal prints Setup complete, your sign-in is saved to ~/.admob-mcp/token.json and reused from then on.
The sign-in requests the admob.readonly and admob.report scopes β read access only.
What the auth command does:
If you already have a refresh token, no files are needed:
The same pattern Google's official Analytics/Ads MCP servers use:
Credential resolution order: environment variables β token.json (from auth) β ADC.
Pick your client below.
MCP servers are loaded when the client starts, so restart the client after adding the config.
Claude Code
Verify with claude mcp list β you should see admob: ... - β Connected.
Claude Desktop β open Settings β Developer β Edit Config, which opens claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), and add:
Restart the app; the admob tools appear in the tools menu of the chat input.
Cursor β add the same mcpServers block to ~/.cursor/mcp.json, then check Settings β MCP shows admob as enabled.
Gemini CLI β add the same mcpServers block to ~/.gemini/settings.json, then check with /mcp inside the CLI.
[!TIP] If you used the environment-variable sign-in, pass the variables through your client's
envblock (Claude Code: repeat--env KEY=valuebefore--; JSON configs: add an"env": { ... }object next to"args").
You don't call tools yourself β just ask in plain language and the assistant picks the right tools.
Some starters:
Most clients ask for your permission before each tool call, so nothing runs without your approval.
All configuration is optional β the defaults work for a single AdMob account.
| Variable | Description | Default |
|---|---|---|
ADMOB_ACCOUNT | Publisher ID (pub-XXXXXXXXXXXXXXXX). Only needed when your login can access multiple accounts | auto-discovered |
ADMOB_TOOLSETS | Comma-separated toolsets to enable | all |
ADMOB_CREDENTIALS_DIR | Directory for oauth_client.json / token.json | ~/.admob-mcp |
ADMOB_OAUTH_CLIENT_FILE | Path to the OAuth client JSON used by auth | <credentials dir>/oauth_client.json |
GOOGLE_CLIENT_ID | OAuth client ID (env sign-in; also used by auth instead of the JSON file) | β |
GOOGLE_CLIENT_SECRET | OAuth client secret (env sign-in) | β |
GOOGLE_REFRESH_TOKEN | OAuth refresh token (env sign-in) | β |
| Flag | Description |
|---|---|
--toolsets <names> | Same as ADMOB_TOOLSETS, e.g. --toolsets reports,apps |
--account <pub-id> | Same as ADMOB_ACCOUNT |
--client-file <path> | Same as ADMOB_OAUTH_CLIENT_FILE (for auth) |
CLI flags take precedence over environment variables.
Flags go after the command in your client config, e.g. npx -y admob-mcp-server --toolsets reports.
A "tool" is a function the AI assistant can call on your behalf.
Tools are grouped into five toolsets; all are enabled by default:
| Toolset | Tools |
|---|---|
accounts | list_accounts, get_account |
apps | list_apps |
adunits | list_ad_units |
reports | generate_network_report, generate_mediation_report, generate_campaign_report |
mediation | list_ad_sources, list_adapters |
All tools are read-only and require the admob.readonly / admob.report scopes.
The AdMob API does expose write methods (adUnits.create, apps.create, the whole mediationGroups resource), but Google marks each of them limited access:
This method has limited access. If you see a 403 permission denied error, please reach out to your account manager for access.
A normal publisher account gets PERMISSION_DENIED from all of them even with a valid admob.monetization token β and the same wall blocks mediationGroups.list and adUnitMappings.list, which are reads. Since these tools cannot work without an allowlisted account, they are not shipped: an assistant that sees them will try them and fail. Create ad units and mediation groups in the AdMob console instead.
| Tool | Description |
|---|---|
list_accounts | List accessible publisher accounts β use to find your pub-... ID |
get_account | Get account details: publisher ID, reporting currency, reporting time zone |
| Tool | Description |
|---|---|
list_apps | List registered apps with app ID, platform, store link, and approval state |
| Tool | Description |
|---|---|
list_ad_units | List ad units with their IDs, formats, and owning apps |
All report tools take startDate / endDate (YYYY-MM-DD), metrics, and optional dimensions, dimensionFilters, sortConditions, maxReportRows (default 1000), currencyCode.
Responses are flat tables; monetary metrics are converted from micros to currency units.
| Tool | Description |
|---|---|
generate_network_report | AdMob Network performance: earnings, impressions, clicks, match rate, RPM, ... |
generate_mediation_report | Mediation performance across ad sources: earnings, observed eCPM per AD_SOURCE / MEDIATION_GROUP |
generate_campaign_report | Cross-promotion campaign stats (last 30 days only): impressions, clicks, installs, cost |
Valid dimensions/metrics per report are exposed as MCP resources (reference documents the assistant can read): admob://reference/network-report-spec, mediation-report-spec, campaign-report-spec.
| Tool | Description |
|---|---|
list_ad_sources | List available mediation ad sources (ad networks) and their IDs |
list_adapters | List adapters of an ad source, incl. required configuration keys |
Mediation groups and ad unit mappings are not covered β see Why there are no write tools.
Prompts are ready-made analysis requests.
Your client surfaces them as slash commands or a prompt picker (e.g. /top_performing_apps in Claude Code).
All take an optional days argument:
| Prompt | What it does |
|---|---|
top_performing_apps | Ranks your apps by revenue with RPM and match-rate context |
revenue_summary | Daily revenue trend with anomaly call-outs |
compare_ad_formats | Compares earnings and efficiency across ad formats |
~/.admob-mcp/oauth_client.json (your OAuth app) and ~/.admob-mcp/token.json (your sign-in).~/.admob-mcp/token.json, and optionally revoke the app's access at myaccount.google.com/permissions.command not found: npx / spawn npx ENOENTclaude mcp list, Gemini CLI: /mcp), and make sure npx -y admob-mcp-server runs in a terminal without errors.invalid_grant / "token has been expired or revoked"npx admob-mcp-server auth.access_denied during browser sign-innpx admob-mcp-server auth and pick the account that owns your AdMob account in the account chooser.PERMISSION_DENIEDadmob.readonly and admob.report β re-run npx admob-mcp-server auth to refresh itRESOURCE_EXHAUSTEDADMOB_ACCOUNT=pub-... (find IDs with list_accounts).To run a local build in a client, point it at the built entry instead of npx: node /path/to/admob-mcp-server/dist/index.js.
Releases: pushing a v* tag runs CI and publishes to npm with provenance (see .github/workflows/release.yml).
Issues and pull requests are welcome.
For larger changes, please open an issue first to discuss the direction.
Make sure npm run lint, npm run format:check, and npm test pass.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/admob-mcp-server)<a href="https://allmcps.com/mcp/admob-mcp-server"><img src="https://allmcps.com/api/badge/admob-mcp-server?style=directory" alt="Admob Mcp Server on AllMCPs" /></a>