adsense-mcp
This server provides read-only access to Google AdSense data via MCP, covering accounts, payments, alerts, policy issues, sites, inventory, ad codes, and reports.
Account management: List, get, and list child accounts; view payments, alerts, ad blocking recovery tags, policy issues, and sites.
Inventory inspection: List/get ad clients, ad units, custom channels, URL channels, and their linked resources; retrieve ad codes for ad clients and ad units.
Reporting: List and get saved reports, generate saved reports, and create ad-hoc reports with metrics, dimensions, filters, date ranges, sorting, and pagination.
Authentication: Uses read-only OAuth scope; supports access token or client ID/secret/refresh token; works with MCP clients like Claude Desktop and Codex.
Data retrieval: Returns structured JSON; paginated list tools support pageSize/pageToken.
Security: No write operations; credentials are kept private and not exposed.
Provides tools to interact with Google AdSense, allowing you to list accounts, get account details, and generate performance reports using the AdSense Management API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@adsense-mcpGenerate a report of estimated earnings by date for the last 30 days."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
AdSense MCP
An MCP server providing read-only access to the AdSense Management API v2: accounts, payments, alerts, policy issues, sites, inventory, ad code, and saved or ad-hoc reports.
The server uses the read-only https://www.googleapis.com/auth/adsense.readonly OAuth scope. It does not write to an AdSense account.
Install
Once published, run it from an MCP client with npx -y @sirmacke/adsense-mcp. Configure either ADSENSE_ACCESS_TOKEN, or all three of ADSENSE_CLIENT_ID, ADSENSE_CLIENT_SECRET, and ADSENSE_REFRESH_TOKEN.
Related MCP server: google-ads-mcp
Security
OAuth access tokens, refresh tokens, and client secrets are credentials. Keep them out of this repository, issue trackers, shell history, and MCP configuration that is shared with others. If one is exposed, revoke it in Google Cloud immediately; see SECURITY.md.
Setup
In Google Cloud, enable AdSense Management API and create an OAuth Desktop client.
Obtain a refresh token granted the
https://www.googleapis.com/auth/adsense.readonlyscope. Keep it secret.Copy
.env.exampleto your secure environment configuration and populate eitherADSENSE_ACCESS_TOKENor the OAuth client ID, secret, and refresh token.Install and build:
npm install
npm run buildOne-time OAuth authorization (without gcloud)
Download the OAuth Desktop client JSON from Google Cloud, then run:
$env:ADSENSE_OAUTH_CLIENT_FILE = "C:\secure\adsense-client.json"
$env:ADSENSE_TOKEN_FILE = "C:\secure\adsense-oauth.json"
npm run authorizeThe command opens the Google consent screen on a localhost callback and saves the client ID, client secret, and refresh token only in the private token file. Copy those values to the ADSENSE_CLIENT_ID, ADSENSE_CLIENT_SECRET, and ADSENSE_REFRESH_TOKEN fields of the MCP configuration. Do not leave an External consent screen in Testing: its refresh tokens expire after seven days.
Claude Desktop
Current Claude Desktop builds use extensions. Run npm run package, then install build/adsense-mcp.mcpb from Settings → Extensions → Advanced settings → Install extension. It securely prompts for the OAuth values. On installations that support classic configuration, add this instead:
{
"mcpServers": {
"adsense": {
"command": "node",
"args": ["/absolute/path/to/adsense-mcp/dist/index.js"],
"env": {
"ADSENSE_CLIENT_ID": "...",
"ADSENSE_CLIENT_SECRET": "...",
"ADSENSE_REFRESH_TOKEN": "..."
}
}
}
}Codex
Add the equivalent server definition to your Codex MCP configuration, using the same command, arguments, and environment variables. The server uses the standard MCP stdio transport and works in both clients.
Tools
Accounts and account status
adsense_list_accountsadsense_get_accountadsense_list_child_accountsadsense_list_paymentsadsense_list_alertsadsense_get_ad_blocking_recovery_tagadsense_list_policy_issuesadsense_get_policy_issueadsense_list_sitesadsense_get_site
Inventory
adsense_list_ad_clientsadsense_get_ad_clientadsense_get_ad_client_ad_codeadsense_list_ad_unitsadsense_get_ad_unitadsense_get_ad_unit_ad_codeadsense_list_linked_custom_channelsadsense_list_url_channelsadsense_get_url_channeladsense_list_custom_channelsadsense_get_custom_channeladsense_list_linked_ad_units
Reports
adsense_list_saved_reportsadsense_get_saved_reportadsense_generate_saved_reportadsense_generate_report
Account-level tools discover the configured or first accessible account when account is omitted. Paginated list tools accept pageSize and pageToken; pass a returned nextPageToken to continue. Resource-specific tools accept the canonical names returned by their corresponding list tools.
adsense_list_payments returns paid and unpaid earnings, including the formatted amount and, for paid earnings, the credited date. The AdSense API does not expose bank or payment-method details.
Example report request: metrics: ["ESTIMATED_EARNINGS", "PAGE_VIEWS", "CLICKS"], dimensions: ["DATE", "COUNTRY_NAME"], dateRange: "LAST_7_DAYS", orderBy: ["-ESTIMATED_EARNINGS"].
The server returns structured JSON. The API's duplicate CSV report methods are intentionally omitted because agents can transform the structured response when CSV is needed.
Verify
npm test
npm run buildLive verification also requires the OAuth values above and an AdSense account. Every exposed endpoint accepts the AdSense read-only OAuth scope.
Releasing
Releases are published to both npm and the official MCP Registry. The registry stores discovery metadata from server.json; the installable server itself is distributed through npm.
Update the version consistently in
package.json,package-lock.json,server.json(including its npm package entry),mcpb/manifest.json, and the MCP server version insrc/index.ts.Run
npm testandnpm pack --dry-runto verify the build and published package contents.Commit and push the release to GitHub.
Publish the public scoped package with
npm publish --access public.Authenticate when necessary with
mcp-publisher login github, then runmcp-publisher publishto publish the matchingserver.jsonversion.
Publish npm before the MCP Registry because registry validation requires the referenced public package version to exist. Published versions are immutable, so corrections require a new version.
License
Available Tools
3 toolsadsense_generate_reportA
Extract any ad-hoc AdSense report. Supply API v2 dimensions, metrics, filters, dates, sorting, and other report parameters. Account is discovered automatically when omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| account | No | Account resource name; optional when one account is accessible. | |
| endDate | No | Custom end date in YYYY-MM-DD. | |
| filters | No | AdSense filters, e.g. AD_CLIENT_ID==ca-pub-... | |
| metrics | Yes | Required metrics, e.g. ESTIMATED_EARNINGS, PAGE_VIEWS, CLICKS. | |
| orderBy | No | Columns to sort, e.g. -ESTIMATED_EARNINGS. | |
| dateRange | No | Preset date range such as TODAY, YESTERDAY, LAST_7_DAYS, MONTH_TO_DATE, CUSTOM. | |
| startDate | No | Custom start date in YYYY-MM-DD. | |
| dimensions | No | Report dimensions, e.g. DATE, AD_UNIT_NAME, COUNTRY_NAME. | |
| currencyCode | No | ||
| languageCode | No | ||
| reportingTimeZone | No | ACCOUNT_TIME_ZONE or GOOGLE_TIME_ZONE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. "Extract" implies a read-only data fetch, and "Account is discovered automatically when omitted" is a useful behavioral detail. However, it does not disclose response format, pagination behavior, permissions, or any side effects, leaving a meaningful transparency gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two front-loaded sentences say exactly what is needed without fluff. The first sentence gives the purpose, the second tells the caller what to supply and clarifies account optionality.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 12 parameters, no output schema, and no annotations, this description is too thin. It does not say what the report response looks like, whether results are paginated, or how ad-hoc complexity is handled. The auto-discovery note is helpful, but the tool still lacks guidance for an agent to fully anticipate the invocation outcome.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, and the description adds a high-level parameter map: dimensions, metrics, filters, dates, sorting, and other report parameters. It also notes the API version, which helps normalize parameter syntax. It does not detail every uncovered parameter such as limit, currencyCode, or languageCode, but the schema still provides most semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Extract any ad-hoc AdSense report." It clearly distinguishes this reporting tool from the sibling account tools by framing it as report extraction with flexible parameters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context: use this tool for ad-hoc AdSense reporting where the caller supplies dimensions, metrics, filters, dates, and sorting. It also removes a common prerequisite by noting that the account is discovered automatically when omitted. It does not explicitly compare to sibling alternatives, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adsense_get_accountA
Get one AdSense account by resource name, e.g. accounts/pub-123.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing side effects. It only says 'get', implying a read-only operation, but does not explicitly confirm it is non-destructive, nor does it mention permission requirements, error behavior, or return value characteristics. The minimal disclosure is insufficient for safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with an example, containing no filler. Every word adds value and it is front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (one parameter, no output schema), the description covers the basics but omits details like return value structure, error handling (e.g., what happens if account doesn't exist), and any authentication or permission notes. Since there is no output schema, explaining what is returned would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It indirectly explains the 'account' parameter by saying 'by resource name' and gives an example format ('accounts/pub-123'), which clarifies the required pattern. However, it does not explicitly name the parameter or explain its full semantics (e.g., must start with 'accounts/'), leaving some ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Get one AdSense account by resource name' with a specific example. It distinguishes from siblings (adsense_list_accounts for multiple, adsense_generate_report for reporting) by focusing on retrieving a single account by its resource identifier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the phrase 'by resource name' and the example, but there is no explicit guidance on when to use this tool versus alternatives like list_accounts. It does not state when not to use it or mention prerequisites (e.g., need a known account resource name).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adsense_list_accountsA
List AdSense accounts available to the authenticated user.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It states the tool lists accounts, which is a read operation, but does not disclose any behavioral traits such as authentication requirements, rate limits, or whether it returns all accounts or only those with certain statuses. The description is minimal but not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that fully conveys the tool's purpose. There is no wasted text, and it is front-loaded with the action and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no output schema, no annotations), the description is mostly complete. However, it could benefit from mentioning what the response contains (e.g., account IDs, names) or any prerequisites like authentication, but the lack of complexity makes this a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and schema description coverage is 100% (vacuously). The description adds no parameter details because there are none, but it correctly implies no inputs are needed. Baseline for 0 params is 4, and the description is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists AdSense accounts for the authenticated user, using a specific verb and resource. It distinguishes from siblings like adsense_get_account (which likely retrieves a single account) and adsense_generate_report (which generates reports), though it doesn't explicitly name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (listing accounts for the authenticated user) but does not explicitly state when to use this tool versus alternatives. It doesn't mention exclusions or alternatives, but the purpose is clear enough that an agent can infer when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.1- First observed
adsense_generate_report - First observed
adsense_get_account - First observed
adsense_list_accounts
TDQS
Scored across 3 tools
Each tool targets a distinct operation: listing accounts, retrieving a specific account, and generating reports. There is no overlap between these actions, and the report tool even auto-discovers the account, reducing ambiguity.
All tool names follow a consistent verb_noun pattern with the 'adsense_' prefix (list_accounts, get_account, generate_report). This makes the naming predictable and easy to navigate.
With 3 tools, the server is on the lower end of the ideal range, but it covers the core AdSense operations: account listing, account retrieval, and report generation. The count feels minimal yet sufficient for a focused server, though slightly thin.
The surface covers essential account and reporting operations, but lacks other common AdSense resources like ad units, sites, or alerts. This might be a notable gap for agents needing broader management capabilities, though it may be acceptable for a report-focused server.
Maintenance
Related MCP Connectors
MCP server for querying and analyzing data from ad platforms, analytics tools, and spreadsheets
Google Ads MCP server — manage campaigns, keywords, and metrics.
Hosted MCP server for Google Ads and LinkedIn Ads analysis.
Google Ads MCP server: 16 tools for reporting, campaigns, keywords, assets. Writes preview first.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for Google AdSense management. Create ad units, generate framework-specific ad code, manage earnings reports, and automate ads.txt — all from your AI assistant.1216 npmMIT
- AlicenseNot gradedqualityDmaintenanceMCP server for Google Ads campaign reporting and management via Claude, enabling GAQL queries, performance metrics, and campaign modifications.20 npmMIT
- AlicenseNot gradedqualityDmaintenanceMCP server for querying Google Analytics accounts, properties, reports, and realtime data using the Data API and Admin API.Apache 2.0
- AlicenseNot gradedqualityFmaintenanceMCP server that provides tools to interact with Google Analytics APIs, enabling account and property retrieval, report running, and custom dimension/metrics access.Apache 2.0