google-ads-mcp
This server is a read-only MCP gateway to the Google Ads API, letting AI agents discover accounts, run GAQL reports, and access planning/change-history data without ever mutating ads data.
Account discovery: list accessible customer IDs and walk the full MCC hierarchy with
google_ads_list_accessible_customersandgoogle_ads_list_customer_clients.GAQL querying: run read-only Google Ads Query Language queries against any linked customer account with
google_ads_query, including micros-to-units conversion and row limits.Schema exploration: list all GAQL resources and describe selectable/filterable fields, metrics, and segments via
google_ads_list_resourcesandgoogle_ads_describe_resource.Recommendations: read Google's optimization recommendations (keywords, budgets, ads, extensions, etc.) with
google_ads_recommendations.Keyword planning: generate keyword ideas, historical search-volume metrics, and forecast KPIs with
google_ads_keyword_ideas,google_ads_keyword_historical_metrics, andgoogle_ads_keyword_forecast_metrics.Change history: audit who changed what over the last 30 days with
google_ads_change_events, or get lightweight per-resource last-modified info withgoogle_ads_change_status.
Provides read-only access to Google Ads, enabling GAQL queries across accounts, along with tools for retrieving account hierarchy, keyword ideas, historical metrics, forecasts, recommendations, and change history.
Click on "Install 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., "@google-ads-mcpShow me my top campaigns by clicks this month"
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.
Google Ads MCP
Read-only MCP server for the Google Ads API. Eleven tools cover discovery, GAQL reporting, resource schema, recommendations, keyword planning and forecasts, and change history for any account reachable under a manager account (MCC). We run this server in production for every ads client. Read-only is enforced at three layers: no mutate or apply service imports, an SDK method allowlist, and a GAQL-starts-with-SELECT guard.
Install
Claude Code:
claude mcp add google-ads \
-e GOOGLE_ADS_DEVELOPER_TOKEN=your-token \
-e GOOGLE_ADS_CLIENT_ID=your-client-id \
-e GOOGLE_ADS_CLIENT_SECRET=your-client-secret \
-e GOOGLE_ADS_REFRESH_TOKEN=your-refresh-token \
-e GOOGLE_ADS_LOGIN_CUSTOMER_ID=1234567890 \
-- uvx scalably-google-ads-mcpCodex:
codex mcp add google-ads \
--env GOOGLE_ADS_DEVELOPER_TOKEN=your-token \
--env GOOGLE_ADS_CLIENT_ID=your-client-id \
--env GOOGLE_ADS_CLIENT_SECRET=your-client-secret \
--env GOOGLE_ADS_REFRESH_TOKEN=your-refresh-token \
--env GOOGLE_ADS_LOGIN_CUSTOMER_ID=1234567890 \
-- uvx scalably-google-ads-mcpClaude Desktop: download google-ads-mcp.mcpb from the latest GitHub release and open it.
Related MCP server: Google Ads MCP
Setup
This is the heaviest setup in the gallery: expect up to two days waiting on developer token approval. One set of credentials, rooted at a manager account (MCC), can read any customer account linked under it, so there is no per-client configuration beyond linking an account to the MCC.
Google Ads developer token. Sign in at ads.google.com under your manager account, go to Tools and Settings, API Center, and apply for a developer token. A new token starts on the Explorer access level, which Google grants after a review that can take a few days; discovery, query and recommendation tools work there. Basic access (a separate application) is needed for higher quotas and may be needed for the keyword-planning tools.
Google Cloud OAuth client. In a Google Cloud project, enable the Google Ads API, then create an OAuth client ID of type Desktop app under APIs and Services, Credentials. Note the client ID and client secret, and add the
https://www.googleapis.com/auth/adwordsscope to the OAuth consent screen.Refresh token. Generate a refresh token once, as an admin user of the manager account, using Google's
oauth2ltool or thegenerate_user_credentials.pyexample shipped with thegoogle-adsPython library. Save the refresh token; it does not expire from normal use.Login customer ID. Use the 10-digit customer ID of the manager account itself (no hyphens) as
GOOGLE_ADS_LOGIN_CUSTOMER_ID. Any client account accepts an invite to link under this manager account in its own Google Ads UI, after whichgoogle_ads_list_customer_clientssees it.
Tools (11)
Tool | What it does |
| List every customer_id the OAuth user has direct access to |
| Walk the MCC hierarchy and return every child account |
| Run a GAQL query against a specific customer account |
| Schema (fields, metrics, segments) for a GAQL resource |
| Return the full catalog of GAQL resources |
| Read Google's optimization recommendations for a customer account |
| Generate keyword ideas with search volume, competition and CPC estimates |
| Historical monthly search-volume and competition metrics for specific keywords |
| Forecast KPIs for a proposed keyword plan |
| Audit trail of who changed what, last 30 days |
| Lightweight last-modified change tracker per resource |
Configuration
Variable | Required | Purpose |
| yes | Google Ads API developer token from the Ads API Center |
| yes | OAuth2 client_id for a Desktop-app credential |
| yes | OAuth2 client_secret paired with the client_id |
| yes | Long-lived OAuth2 refresh_token for the adwords scope |
| yes | 10-digit customer ID of the manager account (MCC), no hyphens |
| no | Google Ads API version to target, default v25 |
| no | Use proto-plus message types, default true |
| no | Python log level, default WARNING |
Reply shape
Every tool returns JSON with status (succeeded, partial, no_op), operation, summary, target, result, proof, warnings, recovery. Failures surface as a tool error whose text is google_ads_request_failed: <message> <hint>. proof.apiVersion names the Google Ads API version used. proof.microsConverted is set on google_ads_query. A partial status means the result hit its configured bound (max_rows, page_size or limit); recovery.nextAction says how to continue.
Limits
google_ads_query responses are capped at 64 MB per call by the Google Ads API; split large date ranges across calls. KeywordPlanIdeaService (keyword ideas, historical metrics, forecasts) is rate-limited to 1 query per second and may require Basic Access if you get a permission error on the Explorer tier. google_ads_change_events covers up to 30 days back; google_ads_change_status covers up to 14 days back. metrics.cost_micros and other *_micros fields are 1 unit = $0.000001; google_ads_query emits a matching *_units field alongside when convert_micros is true (the default).
Verify
Each release lists the package version, the .mcpb sha256 and the production commit it was derived from in CHANGELOG.md. CI runs the tests and a clean install of the built wheel on every push.
Privacy Policy
This server runs locally, on your machine, under your own credentials. It collects no personal data, contains no telemetry, stores nothing persistently, and talks only to the vendor API it wraps. No third party, including Scalably, receives your data. Contact: hello@scalably.io. Canonical copy: https://scalably.io/connector-privacy.html
License
MIT. Copyright Scalably.
Available Tools
11 toolsgoogle_ads_change_eventsARead-only
Audit trail: who changed what in the last 30 days.
Max window is 30 days back. Returns: change_date_time, user_email, change_resource_type (CAMPAIGN|AD_GROUP|AD_GROUP_CRITERION|CAMPAIGN_BUDGET| AD|AD_GROUP_BID_MODIFIER|…), old_resource, new_resource, changed_fields, client_type (GOOGLE_ADS_WEB_CLIENT|GOOGLE_ADS_API|…).
Args: customer_id: 10-digit customer_id. days_back: 1–30. resource_types: optional filter to specific change_resource_type enum values. limit: max rows (default 10000, capped 100000).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| days_back | No | ||
| customer_id | Yes | ||
| resource_types | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and open-world, and the description adds valuable behavior details: maximum 30-day lookback, returned fields, resource/client type enums, and the 100,000 row cap. It does not mention pagination or rate limiting, but the disclosed constraints go well 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 well-structured: a one-line purpose, then return fields, then parameter definitions. Each section is labelled and every sentence carries useful information without redundancy or filler.
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 purpose, constraints, return fields, and parameter semantics comprehensively. Given the output schema exists and the tool is read-only, nothing critical is missing for an agent to decide whether and how to invoke it.
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%, and the description fully compensates by explaining every parameter: customer_id format, days_back range, resource_types as an optional enum filter, and limit with default and cap. This is exactly the semantic context the agent needs beyond raw schema types.
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 identifies the tool as an audit trail ('who changed what') with a specific 30-day scope and enumerates return fields. It is distinct in meaning from siblings like google_ads_change_status, but it does not explicitly name or differentiate itself from related 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 clearly implies use when an audit trail of changes is needed and specifies limits such as the 30-day max window and optional resource_types filtering. It does not explicitly state when to prefer a sibling tool, so it stops short of full alternative routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
google_ads_change_statusARead-only
Lightweight change tracker: last-modified-at timestamps for resources.
Unlike change_event, this is a per-resource "last modified" view rather than a change-diff log. Covers up to 14 days.
Args: customer_id: 10-digit customer_id. days_back: 1–14. resource_types: optional filter by change_status.resource_type enum. limit: max rows.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| days_back | No | ||
| customer_id | Yes | ||
| resource_types | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and openWorldHint=true, covering safety and world-openness. The description adds useful behavioral context beyond that: the tool is 'lightweight,' returns per-resource last-modified timestamps, and is limited to a 14-day window. These operational characteristics are not visible in the annotations and help an agent set expectations.
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 tightly written: a one-sentence summary, a clarifying comparison to change_event, and a short parameter list. Every line contributes value, and the structure front-loads the core purpose before diving into details.
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 read-only tool with an output schema, the description covers everything needed to call it correctly: purpose, key behavioral traits, the 14-day limitation, and all four parameters with constraints. The sibling contrast addresses the main alternative. No significant gaps remain.
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 carries the full burden of parameter documentation, and it succeeds. Each parameter gets a concise semantic: customer_id is a 10-digit identifier, days_back has a 1–14 range, resource_types is an optional enum filter, and limit caps row count. This meaningfully compensates for the bare schema and enables correct argument construction.
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's function with a specific verb and resource: 'Lightweight change tracker: last-modified-at timestamps for resources.' It explicitly differentiates itself from change_event by describing itself as a per-resource 'last modified' view rather than a change-diff log, making it immediately distinguishable from its closest sibling.
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 names the sibling tool change_event and draws a direct contrast: 'Unlike change_event, this is a per-resource last modified view rather than a change-diff log.' This strongly implies when to use this tool versus the alternative, and the 'covers up to 14 days' note sets clear scope boundaries. It stops short of explicitly stating 'use change_event for change-diff logs,' but the implication is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
google_ads_describe_resourceARead-only
Schema (fields, metrics, segments) for a GAQL resource.
Queries GoogleAdsFieldService for every selectable field on a resource
plus its data type, selectability, filterability, sort-ability, and
selectable_with (which other fields can coexist in a single SELECT).
Args: resource_name: the GAQL resource, e.g. "campaign", "ad_group", "shopping_performance_view", "change_event", "recommendation".
Returns: {resource, fields: [{name, category: ATTRIBUTE|METRIC|SEGMENT, data_type, selectable, filterable, sortable, enum_values, type_url, selectable_with}]}.
Essential before composing GAQL on an unfamiliar resource; prevents FIELD_NOT_COMPATIBLE and FIELD_NOT_FOUND errors.
| Name | Required | Description | Default |
|---|---|---|---|
| resource_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as readOnlyHint=true, so the agent knows it is safe. The description adds behavioral detail by explaining it queries GoogleAdsFieldService and returns a comprehensive field list with selectability, filterability, etc. It also mentions the purpose of preventing specific errors, adding context beyond the annotation. No contradictions.
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 long but well-structured with Args and Returns sections. The opening line immediately conveys the core purpose. Each sentence adds value: it explains the service call, the return structure, and the use case. It is not overly verbose, though the Returns section could be condensed without losing key information.
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 tool with a single parameter and an existing output schema (which we don't see but the description covers), the description is complete. It details the return format explicitly, provides usage context (essential before querying), and gives examples. An agent can call this tool correctly without missing critical information. The output schema already exists, so the description need not explain return values beyond what it does.
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 no description for resource_name (0% coverage), so the description must compensate. It does so by providing examples ('campaign', 'ad_group', etc.) and stating it is the GAQL resource name. This is helpful, though it doesn't specify format constraints or enumerate all valid values. The examples give enough meaning for correct usage.
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's purpose: it retrieves the schema (fields, metrics, segments) for a GAQL resource, listing each field's properties. It is specific about the resource type and the data returned, which distinguishes it from sibling tools like google_ads_query (executes queries) and google_ads_list_resources (likely lists resources). The description is not a tautology and adds meaningful detail.
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 advises that this tool is 'Essential before composing GAQL on an unfamiliar resource,' which gives clear context for when to use it. However, it does not explicitly name alternative tools or state when not to use it, so it falls short of a perfect 5 but provides solid guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
google_ads_keyword_forecast_metricsARead-only
Forecast KPIs (impressions, clicks, cost, conversions) for a proposed keyword plan.
Args: customer_id: 10-digit customer_id. campaign_spec: a KeywordPlanCampaign forecast spec. Minimum shape: { "bidding_strategy": "MANUAL_CPC", "daily_budget_micros": 10000000, "keyword_match_type": "BROAD" | "PHRASE" | "EXACT", "language_id": "1000", "geo_target_ids": ["2840"], "keywords": ["running shoes", "trail running shoes"] }
Returns: {campaign_forecast: {impressions, clicks, cost_micros, conversions, average_cpc_micros}, weekly_time_series: [...]}.
Rate limit: 1 QPS. Requires Basic Access.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | Yes | ||
| campaign_spec | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds rate limit (1 QPS) and access requirements (Basic Access) beyond the annotations. It also outlines the return structure, which is not in annotations. Since annotations already declare readOnlyHint=true, the description adds complementary behavioral context without contradicting them.
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 well-organized into purpose, args, returns, and rate limit sections. It is not overly verbose, though it includes a fair amount of detail. The structure is logical and front-loads the 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?
The description covers all essential aspects: what it does, how to structure both parameters, what it returns, and operational limits. An output schema exists, so return format details are additionally covered, making the description sufficient for correct invocation.
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 0%, so the description fully compensates. It explains customer_id as a 10-digit string and provides a detailed example of campaign_spec with required fields, types, and an illustrative snippet. This is far more informative than the bare 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 a specific verb (Forecast) and resource (KPIs for a proposed keyword plan). It distinguishes from siblings by focusing on forecasting metrics, but it does not explicitly mention alternatives like keyword_ideas or keyword_historical_metrics, so it lacks explicit differentiation.
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 its purpose but does not state when to use it over alternatives or when not to use it. There is no explicit guidance on context or exclusions, leaving the agent to infer based on the tool's name and purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
google_ads_keyword_historical_metricsARead-only
Historical monthly search-volume + competition metrics for specific keywords.
Args: customer_id: 10-digit customer_id. keywords: list of keyword strings (max 10,000 per call). language_id / geo_target_ids / keyword_network: same shape as keyword_ideas. year_month_start / year_month_end: optional date range as {year: 2025, month: 1..12}. Defaults to last 12 months.
Returns: {results: [{text, approximate_monthly_searches, monthly_search_volumes: [{year, month, monthly_searches}], competition, high/low_top_of_page_bid_micros}]}.
Rate limit: 1 QPS. May require Basic Access.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | ||
| customer_id | Yes | ||
| language_id | No | 1000 | |
| include_adult | No | ||
| geo_target_ids | No | ||
| year_month_end | No | ||
| keyword_network | No | GOOGLE_SEARCH | |
| year_month_start | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description adds value by disclosing the rate limit (1 QPS), access requirement (Basic Access), and the default date range (last 12 months). It also specifies the return structure. No contradictions with annotations. It does not mention side effects (none expected) but covers operational behavior 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 well-structured with an Args/Returns/Rate limit format, front-loads the purpose, and uses compact bullet-like lines. Every sentence provides necessary information without fluff. It is concise yet comprehensive.
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 has 8 parameters and zero schema description coverage, the description covers nearly all of them, explains the return format, rate limits, and access constraints. The only minor gap is include_adult, which is a boolean with a default. Overall, an agent can call the tool correctly with this description.
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 explains customer_id, keywords, language_id/geo_target_ids/keyword_network, and the year_month_start/end object format. It omits include_adult, but that parameter has a default and is self-explanatory. The return structure is also explained, aiding parameter interpretation.
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 'historical monthly search-volume + competition metrics for specific keywords', which is specific and distinct from siblings like keyword_ideas (ideas) and forecast_metrics (forecasts). It identifies the resource (keywords) and the action (retrieve historical metrics). However, it does not explicitly contrast with sibling tools, so a slight deduction.
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 explicit guidance on when to use this tool versus alternatives like google_ads_keyword_ideas or google_ads_keyword_forecast_metrics. It mentions 'same shape as keyword_ideas' only for parameter structure, not for selection criteria. No exclusions or conditional usage are stated, leaving the agent to infer from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
google_ads_keyword_ideasARead-only
Generate keyword ideas with search volume + competition + CPC estimates.
Args: customer_id: customer_id to attribute the request (any Ads account under MCC works). keywords: seed keywords, list of strings. Optional if page_url is given. page_url: seed URL (crawled for keyword extraction). Optional if keywords given. language_id: Google language criterion ID. Default '1000' (English). Common: '1001' Spanish, '1002' French, '1003' German, '1007' Italian. geo_target_ids: list of geo criterion IDs. Default ['2840'] (US). Common: '2826' UK, '2124' Canada, '2036' Australia, '2276' Germany. keyword_network: GOOGLE_SEARCH (default) | GOOGLE_SEARCH_AND_PARTNERS. include_adult: include adult-category keywords (default False). page_size: max ideas to return (default 100, capped at 10000).
Returns: {ideas: [{text, avg_monthly_searches, competition, low_top_of_page_bid_micros, high_top_of_page_bid_micros, concept_group}]}.
Rate limit: 1 QPS for this service. Back off on RESOURCE_EXHAUSTED. Requires Basic Access (Explorer may 403); if you get USER_PERMISSION_DENIED, the dev_token tier is too low.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | No | ||
| page_url | No | ||
| page_size | No | ||
| customer_id | Yes | ||
| language_id | No | 1000 | |
| include_adult | No | ||
| geo_target_ids | No | ||
| keyword_network | No | GOOGLE_SEARCH |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses important behavioral details: the 1 QPS rate limit, RESOURCE_EXHAUSTED backoff guidance, Basic Access requirement, possible 403 for Explorer, and dev_token tier issues. It also clarifies defaults and the max page_size cap, adding substantial operational context.
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 appropriately sized for a tool with 8 parameters and multiple behavioral caveats. It front-loads the purpose, then organizes Args and Returns in a compact, scannable format. No sentence is wasted.
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 input semantics, defaults, output shape, rate limiting, authentication requirements, and error hints. With an output schema already present, the return-format inclusion is a bonus. There are no obvious gaps for an agent to invoke the tool correctly.
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%, and the description fully compensates by explaining every parameter: customer_id attribution, seed keywords, page_url optionality, language_id and geo_target_ids with common IDs, keyword_network values, include_adult default, and page_size cap. This goes far beyond the raw 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 opens with a specific verb and resource: 'Generate keyword ideas with search volume + competition + CPC estimates.' This clearly distinguishes the tool from siblings like historical or forecast metrics, even without naming them. The tool's purpose is unambiguous.
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 guidance on parameter alternatives, such as keywords vs page_url and language/geo defaults, but it does not explicitly state when to choose this tool over siblings like keyword_historical_metrics or keyword_forecast_metrics. Usage context is implied by the 'ideas' focus rather than stated with exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
google_ads_list_accessible_customersARead-only
List every customer_id the OAuth user has direct access to.
This is a small, cheap list, typically just the MCC itself and any standalone accounts. For the full tree of accounts under the MCC (agency use case), call google_ads_list_customer_clients instead.
Returns: {"resource_names": [...], "customer_ids": [...]}. Each customer_id is 10 digits, no hyphens.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the read-only nature is covered. The description adds valuable behavioral context beyond that: it discloses the typical content ('just the MCC itself and any standalone accounts'), the exact return shape ({"resource_names": [...], "customer_ids": [...]}), and the ID format ('10 digits, no hyphens'). This gives the agent concrete expectations about the tool's output without contradicting 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 three sentences, each earning its place: the first states the core purpose, the second adds context and the alternative tool, the third specifies the return format and ID format. It is front-loaded with the most critical information and contains zero filler. This is exemplary conciseness for a simple list tool.
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 zero-parameter read-only list tool with an output schema (as indicated by context signals) and readOnlyHint/openWorldHint annotations, the description is fully complete. It covers the tool's scope, the typical response content, the exact return shape, and the ID format. The only missing elements (e.g., error cases, rate limits) are negligible for such a simple operation, and the description already routes to the sibling for the complex use case.
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, so the input schema is trivially 100% covered. Per the rubric, a tool with 0 params receives a baseline of 4 because there is nothing for the description to explain. The description does not waste space on parameter details since none exist, and the schema itself leaves no gaps.
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: 'List every customer_id the OAuth user has direct access to.' It clearly distinguishes itself from the sibling tool google_ads_list_customer_clients by explicitly stating that this tool returns only direct-access accounts, not the full MCC tree. This makes the tool's purpose unambiguous and easily separable from its main alternative.
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 explicit usage guidance: it states the tool returns a 'small, cheap list' and then directly instructs, 'For the full tree of accounts under the MCC (agency use case), call google_ads_list_customer_clients instead.' This tells the agent exactly when to use this tool versus the sibling, including the scenario where the alternative is more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
google_ads_list_customer_clientsARead-only
Walk the MCC (Manager Account) hierarchy and return every child account.
For agency use: this is the canonical "which clients can I query?" call.
Uses GAQL on the customer_client resource. Fast: one streaming call.
Args: mcc_customer_id: MCC customer_id. Defaults to GOOGLE_ADS_LOGIN_CUSTOMER_ID (the configured MCC). Accepts 10-digit or hyphenated. include_managers: include sub-MCCs in the result (default True). include_hidden: include customer_clients marked hidden=True (default False). max_level: max hierarchy depth (default 3, hard cap 10).
Returns per account: customer_id, descriptive_name, currency_code, time_zone, manager (bool), level, status (ENABLED|CANCELED|…), hidden, resource_name.
| Name | Required | Description | Default |
|---|---|---|---|
| max_level | No | ||
| include_hidden | No | ||
| mcc_customer_id | No | ||
| include_managers | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses meaningful behavior: it walks hierarchy, includes sub-MCCs by default, excludes hidden accounts by default, enforces a default max depth of 3 with a hard cap of 10, and uses a single streaming call. These details materially help an agent predict side effects and performance.
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 well structured with a clear opening statement, a usage context sentence, and organized Args/Returns sections. Every sentence adds value; there is no filler or repetition.
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 purpose, parameters, return fields, defaults, and constraints such as the hard depth cap. Even with an output schema present, it provides enough context for an agent to invoke the tool correctly without guessing.
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 carries full responsibility for parameter semantics. It explains all four parameters clearly, including defaults, accepted formats for mcc_customer_id, and the meaning of include_managers, include_hidden, and max_level.
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's purpose: walk the MCC hierarchy and return every child account. It names the underlying resource and GAQL approach, and frames it as the canonical 'which clients can I query?' call, distinguishing it from general query 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?
It gives a clear use case ('For agency use: this is the canonical which clients can I query? call') and notes it is fast and streaming. It does not explicitly name alternatives or state when not to use it, but the intended context is obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
google_ads_list_resourcesARead-only
Return the full catalog of GAQL resources (FROM-able tables).
Useful when the agent needs to pick the right resource for a question. Each entry: name, category, selectable (whether it can be the FROM target).
Response is cacheable for the session; the catalog is stable across queries.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation is consistent with the description's 'Return the full catalog' and 'Response is cacheable' statements, implying a pure read operation with no side effects. No contradiction exists between the description and 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 three short sentences, each adding useful information: the purpose, the use case, and the output structure. It is concise without unnecessary filler, achieving a high information-to-word ratio.
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 has no parameters and a straightforward output, the description provides all necessary context: what it returns, when to use it, and a note on cacheability. No additional details are needed for an agent to invoke it correctly.
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 no parameters, so there are no parameter semantics to describe. The description adequately covers this by not mentioning any inputs, which is appropriate for a parameterless tool.
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's purpose: to return the full catalog of GAQL resources (FROM-able tables). The verb 'list' and the resource type are explicit, and the output content (name, category, selectable) is specified.
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 explicitly mentions when the tool is useful: 'when the agent needs to pick the right resource for a question.' This provides direct usage guidance, though it does not compare with sibling tools, but the scope is distinct enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
google_ads_queryARead-only
Run a GAQL (Google Ads Query Language) query against a specific customer account.
GAQL is SQL-like: SELECT ... FROM <single_resource> WHERE ... ORDER BY ... LIMIT ....
No JOINs; attribute fields from related resources by selecting them directly.
Common resources: campaign, ad_group, keyword_view, search_term_view,
shopping_performance_view, customer, customer_client, conversion_action,
change_event, change_status, recommendation, asset, asset_group.
Use google_ads_describe_resource first if unsure of field names on a new resource; saves a FIELD_NOT_FOUND roundtrip.
Args: customer_id: 10-digit customer_id (no hyphens) for the account to query. gaql: the full GAQL query string (must start with SELECT; no semicolons). max_rows: if set, stop streaming after this many rows. Defaults to unbounded (the 64 MB response cap still applies). convert_micros: if True (default), also emit _units alongside any _micros field (divided by 1,000,000). E.g. cost_micros = 12345678 → cost_units = 12.345678.
Example queries:
SELECT campaign.id, campaign.name, metrics.cost_micros FROM campaign WHERE segments.date DURING LAST_7_DAYS ORDER BY metrics.cost_micros DESC LIMIT 50
SELECT ad_group.name, ad_group_criterion.keyword.text, metrics.impressions, metrics.clicks FROM keyword_view WHERE segments.date DURING LAST_30_DAYS
SELECT segments.product_item_id, metrics.conversions_value FROM shopping_performance_view WHERE segments.date DURING LAST_30_DAYS
Gotchas (surface to user where relevant):
metrics.cost_micros: 1 unit = $0.000001. Divide by 1M for currency.
LAST_30_DAYS = 30 days ending YESTERDAY (today excluded).
Last 72h data is partial; conversions retroactively re-attribute.
Zero-metric rows are excluded when segmenting by date.
Response cap is 64 MB per call; split by date range for huge reports.
GAQL
IN (...)clause is capped at 20,000 items.
| Name | Required | Description | Default |
|---|---|---|---|
| gaql | Yes | ||
| max_rows | No | ||
| customer_id | Yes | ||
| convert_micros | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description aligns with that. It goes deeper by disclosing important behavioral traits: unbounded streaming until a 64 MB cap, the convert_micros transformation behavior, zero-metric row exclusion, LAST_30_DAYS meaning today excluded, and the 72-hour data partiality. This adds meaningful value beyond the annotations; however, it doesn't explicitly state the return format or error behavior beyond the mention of FIELD_NOT_FOUND saving a roundtrip.
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 dense but every sentence earns its place: the GAQL overview, common resources, usage tip, parameter docs, examples, and gotchas all serve a purpose. It is front-loaded with the core purpose and syntax, followed by actionable examples and edge cases. The structure makes it easy to scan.
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 complex query tool with 4 parameters and zero schema coverage, the description is remarkably complete. It covers syntax, common resources, examples, conversions, streaming limits, response caps, date semantics, and typical pitfalls. The output schema is present, so the return shape doesn't need to be described in prose. Nothing essential is missing for an agent to select and invoke this tool correctly.
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 carries the full burden, and it succeeds. Each parameter is explained with type, defaults, and behavioral consequences: customer_id format (10-digit, no hyphens), gaql syntax requirements, max_rows streaming stop behavior, and convert_micros with a concrete example. This exceeds what the schema alone provides.
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: "Run a GAQL (Google Ads Query Language) query against a specific customer account." It clearly distinguishes from siblings like google_ads_list_accessible_customers or google_ads_describe_resource, which are about listing accounts or exploring schemas rather than executing queries. The GAQL grammar explanation and examples remove ambiguity about what the tool executes.
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 explicitly instructs to use google_ads_describe_resource first if unsure of field names, which routes the agent to the correct alternative. It also provides concrete example queries, common resources, and structural rules (SELECT start, no semicolons, no JOINs), giving clear guidance on when and how to use this tool versus siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
google_ads_recommendationsARead-only
Read Google's optimization recommendations for a customer account.
Returns suggestions only; does NOT apply any. Types include: KEYWORD, CAMPAIGN_BUDGET, KEYWORD_MATCH_TYPE, TARGET_CPA_OPT_IN, MAXIMIZE_CLICKS_OPT_IN, OPTIMIZE_AD_ROTATION, RESPONSIVE_SEARCH_AD, ENHANCED_CPC_OPT_IN, SEARCH_PARTNERS_OPT_IN, SITELINK_EXTENSION, CALL_EXTENSION, CALLOUT_EXTENSION, STRUCTURED_SNIPPET_EXTENSION, DISPLAY_EXPANSION_OPT_IN, KEYWORD_MATCH_TYPE, FORECASTING_*, SHOPPING_*, MOVE_UNUSED_BUDGET. (Google adds new types over time.)
Args: customer_id: 10-digit account ID. types: optional list to filter by recommendation_type. Case-sensitive. dismissed: include dismissed recommendations (default False). limit: max rows (default 200).
Each row contains: type, impact (absolute_metrics, base_metrics, potential_metrics), campaign / ad_group ref (if applicable), dismissed flag, recommendation-specific payload (e.g. suggested_keywords, budget_increase).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| types | No | ||
| dismissed | No | ||
| customer_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clearly discloses that it returns suggestions only and does not apply them, reinforcing the readOnlyHint annotation. It also lists the recommendation types and warns that new types are added over time, adding context beyond the annotation. It does not mention rate limits or authentication, but given the annotation covers safety, this is adequate.
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 structured with a leading purpose statement, a list of types, parameter details, and output format. It is somewhat long due to the enumerated types, but each section adds necessary information and the purpose is front-loaded. No filler or redundant phrasing is present.
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 is thorough for a read-only recommendations tool. It covers the action, scope, parameter semantics, and output structure (even though an output schema exists, the description adds useful detail). It also addresses the dynamic nature of recommendation types, making it complete for an agent to call correctly.
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?
With 0% schema description coverage, the description fully compensates by detailing each parameter: customer_id as a 10-digit account ID, types as an optional case-sensitive filter, dismissed with a default, and limit with a default. It also explains the output structure, making parameter semantics very clear.
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 a specific verb ('Read') and resource ('Google's optimization recommendations for a customer account'), and further enumerates the recommendation types, making its purpose unambiguous. It stands apart from siblings like google_ads_query or google_ads_list_resources by focusing solely on recommendations.
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 makes it obvious that this tool is for reading optimization recommendations and explicitly notes it does not apply them, which is useful. However, it does not explicitly contrast with alternative tools (e.g., google_ads_query for arbitrary data, google_ads_keyword_ideas for keyword ideas), leaving the when-not-to-use guidance implicit rather than explicit.
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
google_ads_change_events - First observed
google_ads_change_status - First observed
google_ads_describe_resource - First observed
google_ads_keyword_forecast_metrics - First observed
google_ads_keyword_historical_metrics - First observed
google_ads_keyword_ideas - First observed
google_ads_list_accessible_customers - First observed
google_ads_list_customer_clients - First observed
google_ads_list_resources - First observed
google_ads_query - First observed
google_ads_recommendations
TDQS
Scored across 11 tools
Most tools are clearly separated by domain: account discovery, GAQL querying, schema introspection, keyword planning, recommendations, and change tracking. The two closest pairs (list_accessible_customers vs. list_customer_clients, and change_events vs. change_status) are explicitly differentiated in their descriptions, but their names alone could still cause an agent to hesitate.
All tools share the google_ads_ prefix and snake_case, but the verb pattern is inconsistent: list_accessible_customers, list_resources, list_customer_clients, query, and describe_resource use verbs, while recommendations, keyword_ideas, keyword_historical_metrics, keyword_forecast_metrics, change_events, and change_status are noun phrases. The convention is readable but mixed.
With 11 tools, the server is well-scoped for a Google Ads data-access MCP. Each tool covers a meaningful capability—account hierarchy, GAQL querying, schema discovery, recommendations, keyword research, and change tracking—without unnecessary redundancy or bloat.
The tool surface is strong for read-only Google Ads workflows: account discovery, arbitrary GAQL querying, schema introspection, keyword research, forecasting, recommendations, and change auditing are all covered. The main gaps are the lack of any write/mutation operations and the absence of convenience wrappers for common entities like campaigns, but the generic query tool plus schema metadata lets agents work around those limitations.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read-only Search Console analytics, URL inspection, indexing diagnostics, and sitemaps.
Provides read access to your GKE and Kubernetes resources.
Read-only MCP access to your DEXUN AdWhiz account: ad accounts, AI recommendations, savings.
Read-only access to your Reporting Ninja marketing and analytics data across 20+ ad platforms.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceProvides read-only access to Google Ads account data including campaigns, ad groups, keywords, and performance reports. Enables querying via GAQL through an MCP interface.MIT
- AlicenseNot gradedqualityCmaintenanceEnables reading and modifying Google Ads accounts, including campaign management, ad status changes, budget updates, and more.MIT
- FlicenseNot gradedqualityCmaintenanceEnables read-only access to Google Analytics 4 and Google Search Console data, allowing users to run reports, query search analytics, and generate combined snapshots for reporting.-
- FlicenseAqualityCmaintenanceEnables AI clients to read Google Ads account data through reporting tools for campaigns, ad groups, keywords, and raw GAQL queries, with no write or mutate capabilities.7-