Skip to main content
Glama

google_ads_search_terms_report

Lists actual user search queries that triggered ads over a reporting window, with impressions, clicks, cost, conversions, and CTR, filterable by campaign or ad group.

Instructions

List actual user search queries that triggered ads in the account over a reporting window. Returns one row per search term shaped as {search_term, metrics}, where the metrics object contains impressions, clicks, cost_micros, cost (currency-formatted), conversions, and ctr. The rows are filterable by campaign_id and/or ad_group_id but those IDs are NOT echoed back in the output — scope your query before calling. Read-only. Use this for raw query logs when you need to eyeball the terms yourself. For rule-based add/exclude candidates use google_ads_search_terms_review; for intent-class distribution use google_ads_search_terms_analyze; for campaign-level aggregates without query breakdown use google_ads_performance_report.

Input Schema

NameRequiredDescriptionDefault
periodNoReporting window for the metrics. Default 'LAST_30_DAYS'. Use a shorter window (LAST_7_DAYS / LAST_14_DAYS) when diagnosing recent changes; use LAST_90_DAYS for trend baselines. Also accepts an explicit range — "YYYY-MM-DD..YYYY-MM-DD" (the spelling Meta Ads takes too) or, in GAQL spelling, "BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'" — both endpoints inclusive, in the account's time zone, for a window no trailing constant can reach (e.g. a single past calendar month). One asymmetry to know about: every constant except LAST_90_DAYS is resolved by Google Ads in the account's reporting time zone, whereas LAST_90_DAYS has no API constant and is expanded by mureo into the 90 days ending yesterday **on the server's date**, so its edges can differ by a day when the server and the account are in different zones. Pass an explicit range when the exact boundary matters.
ad_group_idNoRestrict results to a single ad group by numeric ID. Omit to include all ad groups under the campaign filter (or the entire account if campaign_id is also omitted).
campaign_idNoRestrict results to a single campaign by numeric ID. Omit to include all campaigns.
customer_idNoGoogle Ads customer ID as a 10-digit string without dashes (e.g. '1234567890'). Optional — falls back to GOOGLE_ADS_CUSTOMER_ID / GOOGLE_ADS_LOGIN_CUSTOMER_ID from the configured credentials when omitted.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changedv0.33.0
    • changedInput schema / properties / period / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "TODAY",
      -      "YESTERDAY",
      -      "THIS_WEEK_SUN_TODAY",
      -      "THIS_WEEK_MON_TODAY",
      -      "LAST_BUSINESS_WEEK",
      -      "LAST_WEEK_SUN_SAT",
      -      "LAST_WEEK_MON_SUN",
      -      "LAST_7_DAYS",
      -      "LAST_14_DAYS",
      -      "LAST_30_DAYS",
      -      "LAST_90_DAYS",
      -      "THIS_MONTH",
      -      "LAST_MONTH"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "pattern": "\\ABETWEEN '([0-9]{4}-[0-9]{2}-[0-9]{2})' AND '([0-9]{4}-[0-9]{2}-[0-9]{2})'\\Z",
      -    "type": "string"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "TODAY",
      +      "YESTERDAY",
      +      "THIS_WEEK_SUN_TODAY",
      +      "THIS_WEEK_MON_TODAY",
      +      "LAST_BUSINESS_WEEK",
      +      "LAST_WEEK_SUN_SAT",
      +      "LAST_WEEK_MON_SUN",
      +      "LAST_7_DAYS",
      +      "LAST_14_DAYS",
      +      "LAST_30_DAYS",
      +      "LAST_90_DAYS",
      +      "THIS_MONTH",
      +      "LAST_MONTH"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "\\ABETWEEN '([0-9]{4}-[0-9]{2}-[0-9]{2})' AND '([0-9]{4}-[0-9]{2}-[0-9]{2})'\\Z",
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "\\A([0-9]{4}-[0-9]{2}-[0-9]{2})\\.\\.([0-9]{4}-[0-9]{2}-[0-9]{2})\\Z",
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / period / description
      Previous value: -"Reporting window for the metrics. Default 'LAST_30_DAYS'. Use a shorter window (LAST_7_DAYS / LAST_14_DAYS) when diagnosing recent changes; use LAST_90_DAYS for trend baselines. Also accepts an explicit range in GAQL spelling — \"BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'\", both endpoints inclusive, in the account's time zone — for a window no trailing constant can reach (e.g. a single past calendar month). One asymmetry to know about: every constant except LAST_90_DAYS is resolved by Google Ads in the account's reporting time zone, whereas LAST_90_DAYS has no API constant and is expanded by mureo into the 90 days ending yesterday **on the server's date**, so its edges can differ by a day when the server and the account are in different zones. Pass an explicit range when the exact boundary matters."New value: +"Reporting window for the metrics. Default 'LAST_30_DAYS'. Use a shorter window (LAST_7_DAYS / LAST_14_DAYS) when diagnosing recent changes; use LAST_90_DAYS for trend baselines. Also accepts an explicit range — \"YYYY-MM-DD..YYYY-MM-DD\" (the spelling Meta Ads takes too) or, in GAQL spelling, \"BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'\" — both endpoints inclusive, in the account's time zone, for a window no trailing constant can reach (e.g. a single past calendar month). One asymmetry to know about: every constant except LAST_90_DAYS is resolved by Google Ads in the account's reporting time zone, whereas LAST_90_DAYS has no API constant and is expanded by mureo into the 90 days ending yesterday **on the server's date**, so its edges can differ by a day when the server and the account are in different zones. Pass an explicit range when the exact boundary matters."
  2. Changed3 schema fields changedv0.17.1
    • addedInput schema / properties / period / anyOf
      Added value: +[
      +  {
      +    "enum": [
      +      "TODAY",
      +      "YESTERDAY",
      +      "THIS_WEEK_SUN_TODAY",
      +      "THIS_WEEK_MON_TODAY",
      +      "LAST_BUSINESS_WEEK",
      +      "LAST_WEEK_SUN_SAT",
      +      "LAST_WEEK_MON_SUN",
      +      "LAST_7_DAYS",
      +      "LAST_14_DAYS",
      +      "LAST_30_DAYS",
      +      "LAST_90_DAYS",
      +      "THIS_MONTH",
      +      "LAST_MONTH"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "\\ABETWEEN '([0-9]{4}-[0-9]{2}-[0-9]{2})' AND '([0-9]{4}-[0-9]{2}-[0-9]{2})'\\Z",
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / period / description
      Previous value: -"Reporting window for the metrics. Default 'LAST_30_DAYS'. Use a shorter window (LAST_7_DAYS / LAST_14_DAYS) when diagnosing recent changes; use LAST_90_DAYS for trend baselines."New value: +"Reporting window for the metrics. Default 'LAST_30_DAYS'. Use a shorter window (LAST_7_DAYS / LAST_14_DAYS) when diagnosing recent changes; use LAST_90_DAYS for trend baselines. Also accepts an explicit range in GAQL spelling — \"BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'\", both endpoints inclusive, in the account's time zone — for a window no trailing constant can reach (e.g. a single past calendar month). One asymmetry to know about: every constant except LAST_90_DAYS is resolved by Google Ads in the account's reporting time zone, whereas LAST_90_DAYS has no API constant and is expanded by mureo into the 90 days ending yesterday **on the server's date**, so its edges can differ by a day when the server and the account are in different zones. Pass an explicit range when the exact boundary matters."
    • removedInput schema / properties / period / enum
      Removed value: -[
      -  "TODAY",
      -  "YESTERDAY",
      -  "LAST_7_DAYS",
      -  "LAST_14_DAYS",
      -  "LAST_30_DAYS",
      -  "LAST_90_DAYS",
      -  "THIS_MONTH",
      -  "LAST_MONTH"
      -]
  3. Changed1 schema field changedv0.10.37
    • addedInput schema / additionalProperties
      Added value: +false
  4. Addedv0.10.11
  5. Removedv0.10.9
  6. Addedv0.9.12
  7. Removedv0.9.6
  8. Addedv0.9.2
  9. Removedv0.9.1
  10. Addedv1.0.5

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden; it steps up by declaring "Read-only", spelling out the exact row/field shape returned, and disclosing the non-obvious quirk that campaign_id/ad_group_id filters are NOT echoed back in output. It stops short of covering pagination or row-count limits, which matter for a term-level report that can return many rows.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and return shape, then the filtering caveat, then routing alternatives. Every sentence carries distinct information — no restatement of the name or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description fully specifies the return shape ({search_term, metrics} with enumerated metric fields) and flags the filter-echo caveat, which is exactly the gap an output schema would otherwise fill. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema: it warns that the campaign_id/ad_group_id filters are not reflected in results and instructs the agent to scope before calling — context the per-parameter descriptions do not provide. It defers on period semantics, which the schema already covers in detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (List) plus a precise resource (actual user queries that triggered ads) and an explicit scope (account, reporting window). It also states the row shape up front, so an agent knows exactly what it is asking for and can distinguish it from the three named sibling reports.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ("raw query logs when you need to eyeball the terms yourself") plus three named alternatives with the condition that selects each: search_terms_review for rule-based add/exclude candidates, search_terms_analyze for intent-class distribution, performance_report for campaign-level aggregates without query breakdown. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools