ads-mcp
Provides tools for managing and reporting on AdMob ad accounts, including listing accounts, apps, ad units, and generating network/mediation reports with full dimension, metric, filter, and sort control.
Provides tools for querying Huawei Petal Ads publisher reports, including daily earnings trends, per-app/placement breakdowns, and customizable group-by/filter/order/pagination reports.
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., "@ads-mcpHow much did I earn from AdMob and Petal Ads yesterday?"
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.
ads-mcp
A Model Context Protocol server that puts your mobile ad revenue in one conversational interface: Google AdMob and Huawei Petal Ads (Publisher Service), side by side.
Ask Claude things like:
"How much did I earn across AdMob and Petal Ads last week?"
"Which AdMob ad units are underperforming?"
"Break down my Petal Ads revenue by app"
"Compare yesterday's eCPM by country"Tools
Tool | Network | Description |
| AdMob | List publisher accounts |
| AdMob | Account details (currency, timezone) |
| AdMob | List apps (paginated) |
| AdMob | List ad units (paginated) |
| AdMob | Network report with full dimension/metric/filter/sort control |
| AdMob | Mediation report (per ad-source performance) |
| Petal Ads | Publisher report with full group-by/filter/order/pagination control |
| Petal Ads | Daily earnings trend + totals for a date range |
| Petal Ads | Per-app (and per-placement) earnings breakdown |
| Both | Combined totals + daily breakdown across both networks |
| Both | Check which networks are configured/authorized |
All tools are read-only — this server never mutates your ad accounts.
Related MCP server: AdMob MCP Server
Prerequisites
Node.js 18+
For AdMob: a Google Cloud project with the AdMob API enabled and an OAuth 2.0 Desktop app client
For Petal Ads: a HUAWEI Developers OAuth client with the Publisher Service Reporting API (Ads Kit) enabled
Setup
1. Install and build
git clone https://github.com/qalvinahmad/ads-mcp.git
cd ads-mcp
npm install
npm run build
cp .env.example .env2. Google AdMob
Open Google Cloud Console → select/create a project.
Enable the AdMob API in the API Library.
APIs & Services → Credentials → Create Credentials → OAuth client ID → Desktop app, then download the JSON.
Save it as
secrets/client_secret.json(or pointADMOB_CLIENT_SECRET_PATHin.envat it).Run the one-time authorization (opens a browser):
npm run auth:admobIf your OAuth consent screen is in "Testing" status, add your Google account as a test user (otherwise you'll get an authorization error, and refresh tokens expire after 7 days).
3. Huawei Petal Ads
Open HUAWEI Developers Console → HMS API Services → Credentials.
Create an OAuth 2.0 client ID (server type) with the Ads Kit / Publisher Service Reporting API enabled.
Put the credentials in
.env:
HUAWEI_CLIENT_ID=your_client_id
HUAWEI_CLIENT_SECRET=your_client_secretOr, if you keep them as a single combined key:
HUAWEI_ADS_API_KEY=client_id:client_secretNo browser flow is needed — Petal Ads uses OAuth client-credentials (server-to-server).
4. Verify
npm run doctor # checks both networks; tests the Huawei token endpoint
npm run smoke # boots the server and validates the MCP handshake + tool listRegister with an MCP client
Claude Code (CLI)
claude mcp add ads -- node /absolute/path/to/ads-mcp/dist/index.jsClaude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"ads": {
"command": "node",
"args": ["/absolute/path/to/ads-mcp/dist/index.js"]
}
}
}Cursor / Windsurf / Cline
"ads": {
"command": "node",
"args": ["/absolute/path/to/ads-mcp/dist/index.js"]
}Configuration is read from ads-mcp/.env automatically (the server resolves it relative to its own install directory, not the client's working directory).
Environment variables
Variable | Default | Description |
|
| Google OAuth Desktop-app client JSON |
|
| Cached authorized user token |
|
| Localhost port for the one-time OAuth flow |
| — | Huawei OAuth client (preferred) |
| — | Combined |
|
| Default report currency (CNY, USD, EUR) |
| Huawei production | Override for testing |
| Huawei production | Override for testing |
Security notes
secrets/and.envare gitignored — never commit credentials.The AdMob token file is written with
0600permissions.Huawei access tokens are cached in memory only.
All tools are read-only against both ad networks.
API references
AdMob API v1 (
admob.googleapis.com/v1)Petal Ads Publisher Service Reporting API (
ads.cloud.huawei.com/openapi/monetization/reports/v1/publisher)
Credits
AdMob client and OAuth flow adapted from willhou/admob-mcp (MIT).
Petal Ads integration follows the official HMS-Core/hms-ads-severdemo reference.
License
MIT — see LICENSE.
Available Tools
11 toolsadmob_get_accountGet AdMob accountARead-onlyIdempotent
Get details (currency, timezone) for one AdMob publisher account.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | AdMob publisher ID, e.g. "pub-1234567890123456" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds that it returns details like currency and timezone, but does not disclose any additional behavioral traits beyond what annotations provide.
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, front-loaded sentence with no unnecessary words. Every part is relevant and efficiently conveys the tool's purpose.
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?
For a simple get tool with one parameter, no output schema, and rich annotations, the description sufficiently covers what the tool does and what it returns (currency, timezone). It is complete for the tool's complexity.
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 100%, so baseline is 3. The description does not add significant meaning beyond the schema's parameter description ('account_id' as 'AdMob publisher ID'), though it hints at the response fields (currency, timezone) which are not captured in the input schema.
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 verb ('Get'), resource ('one AdMob publisher account'), and specifies what details are retrieved (currency, timezone). This distinguishes it from sibling tools like admob_list_accounts, which lists all accounts.
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 when you have a specific account_id, but does not explicitly state when to use this tool versus alternatives like admob_list_accounts. No exclusions or when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admob_list_accountsList AdMob accountsARead-onlyIdempotent
List the Google AdMob publisher accounts available to the authorized user.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description essentially restates the resource and scope, adding no behavioral traits beyond what annotations already provide (readOnlyHint, idempotentHint, openWorldHint). It does not reveal any additional behaviors like rate limits or data freshness.
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?
A single, concise sentence that conveys the tool's purpose without any extraneous words. It is efficiently front-loaded.
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 absence of parameters, output schema, and complex behavior, the description is complete enough. It sufficiently informs an agent of the tool's output (listing accounts) and its scope (accounts available to the user).
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?
There are no parameters in the input schema, so the description does not need to add parameter-specific information. The schema coverage is 100% (vacuously), meeting the baseline for 0-parameter tools.
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 verb 'List' and the specific resource 'Google AdMob publisher accounts', and the scope 'available to the authorized user'. It distinguishes this tool from siblings like 'admob_get_account' (which likely retrieves a specific account) by implying it returns all accounts.
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 when you need to see all available AdMob accounts, but it does not explicitly contrast with sibling tools. No guidance on when not to use it or alternatives is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admob_list_ad_unitsList AdMob ad unitsARead-onlyIdempotent
List ad units under an AdMob account (paginated).
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Max ad units to return (max 10000) | |
| account_id | No | AdMob publisher ID; omit for default | |
| page_token | No | Page token from a previous call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, open world, and non-destructive behavior. The description adds 'paginated', which is a key behavioral trait beyond the schema. This provides useful context without contradiction.
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 is front-loaded with the core action and resource. No wasted words.
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?
For a simple paginated list tool with comprehensive schema descriptions and annotations, the description covers the essential purpose and pagination behavior. However, it lacks details on error handling or return format, but given the simplicity, it is largely sufficient.
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 100% with clear descriptions for each parameter. The description does not add further meaning beyond stating pagination, so baseline 3 is appropriate.
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 verb 'List' and the resource 'ad units under an AdMob account', which is specific and distinguishes from sibling tools like 'admob_list_accounts' or 'admob_list_apps'.
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?
No guidance on when to use this tool versus alternatives. For example, it does not mention when to use this over 'admob_list_accounts' or 'admob_list_apps', nor does it specify prerequisites like the need for an AdMob account.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admob_list_appsList AdMob appsARead-onlyIdempotent
List apps registered under an AdMob account (paginated).
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Max apps to return (max 10000) | |
| account_id | No | AdMob publisher ID; omit for default | |
| page_token | No | Page token from a previous call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds the key behavioral trait of pagination, which is not fully captured by annotations (readOnlyHint, idempotentHint, etc.). It does not contradict annotations, and provides useful context beyond the structured fields.
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 is front-loaded with the core purpose. It contains no unnecessary words or redundant information, making it highly efficient.
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 absence of an output schema, the description should ideally explain what the tool returns (e.g., list structure, fields). It does not, leaving the agent to infer. However, parameters and annotations provide adequate context for basic use. The description is minimally adequate but not fully complete.
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 input schema has 100% description coverage for all three parameters (page_size, account_id, page_token), so the tool description adds no additional semantic meaning. The schema descriptions are sufficient, making the tool description's role minimal.
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 'List', the resource 'apps registered under an AdMob account', and notes pagination, effectively distinguishing it from sibling tools like admob_get_account (single account) or admob_list_ad_units (different resource type).
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 does not provide any guidance on when to use this tool versus alternatives, nor does it mention prerequisites or when not to use it. The context signals list sibling tools, but the description itself lacks explicit usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admob_mediation_reportAdMob mediation reportARead-onlyIdempotent
Generate an AdMob Mediation report (per ad-source revenue and performance).
Dimensions: DATE, MONTH, WEEK, AD_SOURCE, AD_SOURCE_INSTANCE, AD_UNIT, APP, MEDIATION_GROUP, COUNTRY, FORMAT, PLATFORM, MOBILE_OS_VERSION, GMA_SDK_VERSION, APP_VERSION_NAME, SERVING_RESTRICTION. Only one time dimension (DATE/MONTH/WEEK) per request.
Metrics: AD_REQUESTS, CLICKS, ESTIMATED_EARNINGS, IMPRESSIONS, IMPRESSION_CTR, MATCHED_REQUESTS, MATCH_RATE, OBSERVED_ECPM. Monetary values are returned already divided from micros into currency units.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Return the raw API JSON instead of a formatted table | |
| metrics | No | Metrics to include (defaults to IMPRESSIONS, CLICKS, ESTIMATED_EARNINGS) | |
| end_date | No | End date in YYYY-MM-DD (defaults to start_date) | |
| time_zone | No | IANA timezone, e.g. "Asia/Jakarta" | |
| account_id | No | AdMob publisher ID, e.g. "pub-1234567890123456". Omit to use the first account of the authorized user. | |
| dimensions | No | Dimensions to group by | |
| start_date | Yes | Start date in YYYY-MM-DD | |
| currency_code | No | ISO 4217 currency code for monetary metrics, e.g. "USD" | |
| max_report_rows | No | Max rows to return (1-100000) | |
| sort_conditions | No | Sort conditions | |
| dimension_filters | No | Dimension filters to apply |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, idempotent, and non-destructive behavior. The description adds useful behavioral details: monetary values are pre-divided from micros, and only one time dimension permitted. No contradictions with annotations.
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 moderately concise, front-loaded with purpose, and enumerates dimensions/metrics clearly. It could be slightly shorter but every sentence adds value.
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 complexity of 11 parameters and no output schema, the description covers key aspects: purpose, available dimensions/metrics, time dimension constraint, and monetary value format. It does not detail return structure beyond raw/table, but the 'raw' parameter addresses that.
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 100% with per-parameter descriptions. The description adds value beyond the schema by explaining constraints (only one time dimension) and data format (monetary values pre-divided), which are not obvious from the schema alone.
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 generates an AdMob Mediation report for per ad-source revenue and performance, and lists allowed dimensions and metrics. This verb+resource combination is specific and distinguishes from siblings like admob_network_report, which likely focuses on network-level data.
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 provides clear usage context by stating that only one time dimension (DATE/MONTH/WEEK) is allowed per request and defines default metrics. However, it does not explicitly exclude sibling tools or specify when to use this tool versus alternatives like admob_network_report.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admob_network_reportAdMob network reportARead-onlyIdempotent
Generate an AdMob Network report (revenue, impressions, eCPM, ...).
Dimensions: DATE, MONTH, WEEK, AD_UNIT, APP, AD_TYPE, COUNTRY, FORMAT, PLATFORM, MOBILE_OS_VERSION, GMA_SDK_VERSION, APP_VERSION_NAME, SERVING_RESTRICTION. Only one time dimension (DATE/MONTH/WEEK) per request.
Metrics: AD_REQUESTS, CLICKS, ESTIMATED_EARNINGS, IMPRESSIONS, IMPRESSION_CTR, IMPRESSION_RPM, MATCHED_REQUESTS, MATCH_RATE, SHOW_RATE. Monetary values are returned already divided from micros into currency units.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Return the raw API JSON instead of a formatted table | |
| metrics | No | Metrics to include (defaults to IMPRESSIONS, CLICKS, ESTIMATED_EARNINGS) | |
| end_date | No | End date in YYYY-MM-DD (defaults to start_date) | |
| time_zone | No | IANA timezone, e.g. "Asia/Jakarta" | |
| account_id | No | AdMob publisher ID, e.g. "pub-1234567890123456". Omit to use the first account of the authorized user. | |
| dimensions | No | Dimensions to group by | |
| start_date | Yes | Start date in YYYY-MM-DD | |
| currency_code | No | ISO 4217 currency code for monetary metrics, e.g. "USD" | |
| max_report_rows | No | Max rows to return (1-100000) | |
| sort_conditions | No | Sort conditions | |
| dimension_filters | No | Dimension filters to apply |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds behavioral details: only one time dimension per request, and monetary values are returned from micros to currency units. This supplements annotations well.
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 concise and front-loaded: a lead sentence, then lists of dimensions/metrics with relevant constraints. No fluff, every sentence adds value.
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 complexity (11 params, no output schema), the description covers purpose, available values, constraints, and output formatting. It lacks details on response structure but is otherwise complete.
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 100%, baseline 3. The description enumerates valid values for dimensions and metrics, and adds a constraint (one time dimension per request), providing meaningful extra context beyond the schema.
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 'Generate an AdMob Network report' with a specific verb and resource. It lists dimensions and metrics, differentiating it from sibling tools like admob_mediation_report.
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 provides no guidance on when to use this tool versus alternatives. It only states what it does, without exclusions or comparisons to siblings like admob_mediation_report.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ads_auth_statusAd network auth statusARead-onlyIdempotent
Check which ad networks are configured and authorized (AdMob OAuth token, Huawei credentials). Optionally performs a live Huawei token test. Never returns secret values.
| Name | Required | Description | Default |
|---|---|---|---|
| test_huawei_token | No | Actually request a Huawei OAuth token to verify the credentials (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint. The description adds that it never returns secret values and optionally performs a live Huawei token test, which are useful behavioral details beyond the annotations.
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 sentences, no filler. Front-loaded with purpose, followed by optional behavior and security note. Every sentence adds value.
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?
For a simple read-only tool with one optional parameter and no output schema needed, the description is complete. Annotations cover safety and idempotency.
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 100%, with the parameter description already explaining the default value. The tool description does not add new information about the parameter, so baseline 3 is appropriate.
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 checks which ad networks are configured and authorized, specifically naming AdMob and Huawei. It distinguishes from sibling tools that focus on data retrieval for individual networks.
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 for checking auth status but does not explicitly state when to use or when not to use. No alternative tools are mentioned. Context is clear but lacks explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ads_revenue_overviewCross-network revenue overviewARead-onlyIdempotent
Combined ad revenue overview across Google AdMob and Huawei Petal Ads for a date range (defaults to the last 7 days): totals per network, grand total, and a daily breakdown. Networks that are not configured are reported but do not block the other.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of past days to cover (default 7; ignored when start_date is set) | |
| currency | No | Currency for both networks (AdMob converts; Petal supports CNY/USD/EUR). Default USD. | |
| end_date | No | End date in YYYY-MM-DD (defaults to yesterday) | |
| start_date | No | Start date in YYYY-MM-DD | |
| include_daily | No | Include the per-day table (default true) | |
| admob_account_id | No | AdMob publisher ID; omit to auto-discover |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the agent knows it's a safe, read-only operation. The description adds behavioral details such as default date range, handling of unconfigured networks, and currency conversion behavior, which adds value beyond the annotations.
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 two well-structured sentences. The first sentence clearly states the purpose and default behavior, and the second provides a key behavioral detail about unconfigured networks. No wasted words.
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?
The description covers the output concept (totals per network, grand total, daily breakdown) and mentions behavior for unconfigured networks. With 6 optional parameters and no output schema, the description gives enough high-level context for the agent to understand what the tool returns. Minor missing details on output format are acceptable given the read-only nature.
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 100%, so the baseline is 3. The tool description provides additional context on parameter interactions, such as 'days' being ignored when 'start_date' is set, and explains the default behavior for dates and currency. This adds meaning beyond the individual parameter descriptions.
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 provides a combined ad revenue overview across Google AdMob and Huawei Petal Ads for a date range, including totals per network, grand total, and daily breakdown. It distinguishes from sibling tools like admob_network_report and petal_revenue_summary by being a cross-network overview.
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 gives useful guidance: it defaults to the last 7 days and notes that networks not configured are still reported without blocking others. While it doesn't explicitly state when not to use this tool, the context is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
petal_apps_performancePetal Ads app performanceARead-onlyIdempotent
Per-app (optionally per-placement) Petal Ads earnings breakdown for a date range, ordered by earnings. Convenience wrapper around petal_report.
| Name | Required | Description | Default |
|---|---|---|---|
| currency | No | Report currency: CNY, USD, or EUR (default USD) | |
| end_date | No | End date in YYYY-MM-DD (default yesterday) | |
| start_date | No | Start date in YYYY-MM-DD (default 7 days ago) | |
| include_placements | No | Also break down by ad placement |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, idempotent, non-destructive behavior. The description adds context about ordering by earnings and being a wrapper, which is valuable beyond annotations.
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?
Single sentence with zero waste; front-loads key information (per-app, per-placement, earnings, date range, ordering). Highly efficient.
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 no output schema and simple parameters, the description covers the main purpose and behavior. It could briefly mention return format, but overall complete for a straightforward reporting tool.
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 100%, so the schema already documents all parameters. The description adds the 'optionally per-placement' phrase but doesn't provide additional syntax or format details, warranting baseline 3.
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 provides a per-app (optionally per-placement) earnings breakdown for a date range, ordered by earnings, and explicitly notes it's a convenience wrapper around petal_report, which distinguishes it from sibling tools.
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 through naming and explanation as a convenience wrapper, but lacks explicit when-to-use or when-not-to-use guidance compared to alternatives like petal_report.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
petal_reportPetal Ads reportARead-onlyIdempotent
Query the Huawei Petal Ads Publisher Service Reporting API with full control over grouping, filtering, ordering, and pagination. Returns monetization data (earnings, ad requests, impressions, clicks, match/show/click rates).
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Return the raw API JSON instead of a formatted table | |
| page | No | Page number (default 1) | |
| app_ids | No | Filter to specific Petal Ads app IDs | |
| ad_types | No | Filter to specific ad formats | |
| currency | No | Report currency: CNY, USD, or EUR (default USD) | |
| end_date | No | End date in YYYY-MM-DD (defaults to start_date) | |
| group_by | No | Breakdown dimensions, e.g. STAT_BREAK_DOWNS_APP_ID | |
| countries | No | Filter to country codes, e.g. ["ID", "US"] | |
| page_size | No | Rows per page (default 50, max 1000) | |
| order_type | No | Order direction | |
| start_date | Yes | Start date in YYYY-MM-DD | |
| order_field | No | Field to order by | |
| placement_ids | No | Filter to specific ad placement IDs | |
| time_granularity | No | Time granularity (default STAT_TIME_GRANULARITY_DAILY) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description consistently describes a query operation (query, returns). It adds context about the API and metrics returned, which is useful beyond the annotations.
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 sentences front-load the purpose and capabilities. No redundant information. Every word adds value.
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 14 parameters with full schema descriptions and annotations indicating read-only behavior, the description covers the tool's purpose and output. It could mention pagination or rate limits, but the parameters (page, page_size) address pagination implicitly. Minor gap for 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 coverage is 100% with all parameters described. The description provides a high-level overview but does not add new meaning beyond the schema. Baseline 3 is appropriate as the schema carries the detail.
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 queries the Huawei Petal Ads reporting API with control over grouping, filtering, ordering, and pagination. It specifies the resource (reports), action (query), and expected return values (monetization data including earnings, impressions, clicks, rates). This distinguishes it from siblings like petal_apps_performance and petal_revenue_summary.
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?
No guidance on when to use this tool versus alternatives such as petal_apps_performance or petal_revenue_summary. The description implies full control but does not explicitly state contexts where this tool is preferred or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
petal_revenue_summaryPetal Ads revenue summaryARead-onlyIdempotent
Daily Petal Ads earnings trend plus totals for a date range (defaults to the last 7 days). Convenience wrapper around petal_report.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of past days to cover (default 7; ignored when start_date is set) | |
| currency | No | Report currency: CNY, USD, or EUR (default USD) | |
| end_date | No | End date in YYYY-MM-DD (defaults to yesterday) | |
| start_date | No | Start date in YYYY-MM-DD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior. Description adds context about output (daily trend plus totals), providing additional behavioral insight beyond annotations.
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 concise sentences, front-loaded with purpose, no superfluous words.
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?
Lacks output schema but describes output as 'daily trend plus totals', sufficient for a simple query tool with rich annotations.
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 100%, with defaults already documented. Description restates defaults but adds no new parameter-level information, meeting the baseline.
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 it provides 'Daily Petal Ads earnings trend plus totals for a date range' and identifies itself as a convenience wrapper around petal_report, distinguishing it from siblings.
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?
Mentions default date range and that it is a wrapper around petal_report, implicitly guiding users to use this for quick summaries and petal_report for more detailed reports.
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.
11 tool updates
v1.0.0- First observed
admob_get_account - First observed
admob_list_accounts - First observed
admob_list_ad_units - First observed
admob_list_apps - First observed
admob_mediation_report - First observed
admob_network_report - First observed
ads_auth_status - First observed
ads_revenue_overview - First observed
petal_apps_performance - First observed
petal_report - First observed
petal_revenue_summary
TDQS
Scored across 11 tools
Each tool has a distinct purpose, with clear separation between admob and petal ads operations. The two report types (mediation and network) are differentiated, and convenience wrappers are explicitly noted.
All tools use a consistent prefix (admob_, ads_, petal_) with snake_case verb_noun pattern. Verbs like get, list, report, and auth_status are uniformly applied, making the set predictable.
11 tools cover the necessary operations for ad revenue reporting: account info, ad units, apps, two report types for admob, auth status, combined overview, and three petal tools. No excess or deficiency.
The tool set fully covers read-only access to ad monetization data from both AdMob and Huawei Petal Ads. Essential operations like listing, getting details, and generating reports are present, with no obvious gaps.
Maintenance
Related MCP Connectors
- MCP AdsOAuthcom.mcp-ads
Run Google Ads, Meta Ads, GA4 and Search Console from chat: read, audit and launch campaigns.
SEO & marketing toolkit for AI agents: GA4, Search Console, AdSense, GTM, PageSpeed, Trends.
- mcp-serverOAuthco.flyweel
Access Google & Meta Ads data via AI. Analyse campaign performance in seconds.
GA4, Google Ads and Search Console in Claude. Read-only OAuth, multi-account for agencies.
Related MCP Servers
- AlicenseBqualityBmaintenanceEnables comprehensive Google Ads campaign management and analysis through natural language, including performance metrics, keyword optimization, budget management, and custom GAQL queries.10013MIT
- AlicenseNot gradedqualityDmaintenanceConnects Claude to the Google AdMob API to provide a conversational interface for managing and analyzing ad revenue data. It enables users to generate custom network reports, track performance trends, and diagnose revenue fluctuations using natural language.6MIT
- FlicenseNot gradedqualityDmaintenanceEnables natural language access to Google Ads campaigns, accounts, and performance metrics via Claude, with tools for managing ad groups, keywords, budgets, and visualizing data.1-
- AlicenseNot gradedqualityCmaintenanceProvides read access to campaign performance data from Google Ads, Meta Ads, and TikTok Ads via live API calls, enabling AI assistants to analyze and audit advertising campaigns.1MIT