ads-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ADS_MCP_AUDIT_LOG | No | Append-only JSONL audit path. Required when write mode is enabled. | |
| ADS_MCP_READ_ONLY | No | Set to false, 0, no, or off (case-insensitive) to register mutation tools; unknown or empty values keep read-only enabled. | true |
| ADS_MCP_ROW_LIMIT | No | Row bound before pagination tokens. | 1000 |
| ADS_MCP_MAX_FIRST_BID | No | Absolute ceiling for setting a bid where none exists. Unset means refuse first bids. | |
| GOOGLE_ADS_TOKEN_PATH | Yes | Path to refresh-token JSON (generated by ads-mcp-generate-token). | |
| GOOGLE_ADS_CUSTOMER_ID | Yes | Target Google Ads account ID, e.g. 123-456-7890 or bare. | |
| ADS_MCP_REQUIRE_DRY_RUN | No | If true, apply requires a prior dry-run preview of the same plan. | true |
| ADS_MCP_MAX_DAILY_BUDGET | No | Cap (in account currency) on any staged budget. Unset means refuse budget mutations. | |
| ADS_MCP_PLAN_TTL_SECONDS | No | Staged-plan expiry in seconds. | 900 |
| ADS_MCP_RETRY_BASE_SECONDS | No | Transport backoff base in seconds. | 1.0 |
| GOOGLE_ADS_DEVELOPER_TOKEN | No | Optional legacy developer token. Ignored for API access and never transmitted. | |
| GOOGLE_ADS_CREDENTIALS_PATH | Yes | Path to OAuth Desktop-app client JSON. | |
| ADS_MCP_MAX_BID_INCREASE_PCT | No | Maximum percentage bid increase vs the account's own or inherited bid. Unset means refuse bid increases. | |
| GOOGLE_ADS_LOGIN_CUSTOMER_ID | No | MCC/manager login ID. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| run_gaqlA | Execute a raw GAQL query and return rows in json, table, or csv format. The workhorse read: any resource, any field the API exposes, passed through faithfully. |
| health_checkA | Truthful liveness: performs a real authenticated Google Ads read and reports config, credentials, and guardrail state. OK means the API answered — never that config files merely exist. |
| get_account_infoC | Account identity: id, name, currency, time zone, auto-tagging, manager/test flags — from a live authenticated read. |
| get_campaign_performanceB | Campaign metrics for a date window (explicit range or last_n_days), with budget, bidding strategy incl. targets, and the serving/primary status trio. Money is decimal with currency. enabled_only=true filters server-side. |
| get_ad_performanceC | Ad-level metrics for a date window; bounded with pagination tokens. |
| get_keyword_performanceB | Keyword metrics (text, match type, bid, quality signals) for a date window; bounded with pagination tokens. |
| get_search_termsB | Search-term report for a date window; bounded with pagination tokens — no unbounded dumps. |
| get_geo_performanceB | Geographic performance for a date window; bounded with pagination tokens. |
| list_accountsC | Accessible accounts under the configured login customer. |
| get_conversion_actionsC | Conversion actions with category, type, status, counting type, and primary-for-goal flags. |
| get_negative_keywordsC | Campaign-level negative keywords. |
| list_extensionsC | Campaign-level extensions/assets (sitelinks, callouts, structured snippets) with status. |
| search_geo_targetsB | Search geo target constants by name (e.g. 'United States'). |
| discover_keywordsA | Keyword ideas for seed terms and/or a page URL, with average monthly searches and competition. Computed by KeywordPlanIdeaService — nothing is created in the account. Bounded by the row limit with pagination tokens. |
| get_keyword_forecastsA | Forecast clicks, cost, and average CPC for supplied keywords. Impressions are unavailable from the v25 nonpersisting API and returned as null. Other absent estimates are null; explicit zero and fractional clicks are preserved. Uses a strict YYYY-MM-DD date range. Start must be in the future and end within one calendar year of today in the requested account's time zone (February 29 clamps to February 28). Defaults to the next 30 complete account-local days; missing or invalid account time zones are refused. Money is decimal with the account currency. Computed by KeywordPlanIdeaService — no KeywordPlan is ever created. keyword_texts is an alias for keywords; both must agree if supplied. |
| get_policy_issuesA | Policy issues across ads, PMax asset-group assets, and campaign-linked sitelink assets. mode=summary returns a bounded topic histogram + entity-status breakdown; mode=full paginates with filters (enabled_only, campaign_id, topic) — never an unbounded dump. |
| list_recommendationsA | Google's active recommendations with typed impact projections (base vs potential cost and conversions). Read-only; applying or dismissing routes through the guardrail plan flow. |
| get_change_historyA | Who changed what, when, with which client: change events with actor email, client type, and old/new values per changed field. Strict YYYY-MM-DD dates, inclusive from 29 days before today through today in the verified account time zone. Includes the complete end date, including fractional seconds, up to but excluding the next calendar day's midnight. This local 30-calendar-date policy is distinct from provider sub-day retention. LIMIT 1000; a full result signals possibly_truncated on every local page with narrowing guidance. Local tokens cannot recover beyond that cap. More than 1000 events at one timestamp may need a different run_gaql query; upstream maximum LIMIT 10000. |
| get_shopping_performanceC | Product-level shopping metrics for a campaign and date window. |
| get_listing_groupsB | Listing-group trees per PMax asset group and standard Shopping ad group for the requested campaign, preserving parent links, dimensions, and exclusions. Empty trees are valid results. |
| get_product_statusA | Merchant Center feed health as visible from the Ads API: linked merchant id, product counts by eligibility status scoped to the requested campaign and linked merchant. A campaign without a feed link returns NOT_FEED_LINKED, not an error. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 21 tools
The specialized getters map cleanly to distinct resources, and run_gaql is explicitly framed as a raw GAQL escape hatch rather than a parallel typed reader. A couple of boundaries require care—run_gaql can technically produce any read result, and list_accounts vs get_account_info both concern account context—but descriptions keep the ambiguity minor.
The set overwhelmingly follows snake_case verb_noun naming, with get_* dominating and list_* used for a few collection reads. Minor deviations like run_gaql, health_check, search_geo_targets, and discover_keywords are readable but break the otherwise regular get_/list_ pattern.
At 21 tools, the surface is on the heavy side, and many get_*_performance helpers are structurally similar and could feel redundant next to run_gaql. The breadth is defensible for Google Ads reporting, but the set sits in the 16–25 range that feels borderline rather than tight.
For what appears to be a read-only/reporting server, coverage is broad: accounts, campaigns, ads, keywords, search terms, geo, conversion actions, policies, recommendations, change history, shopping, and product status are all represented. Minor gaps such as a dedicated ad-group performance or audience report exist, but run_gaql is a genuine escape hatch for arbitrary reads.