Caybl
Server Details
Connect Google Analytics 4, Google Ads and Search Console to Claude in two minutes. Hosted MCP server with Google OAuth: no Cloud project, no keys, nothing to install.
- Status
- Healthy
- Uptime
- 99.8% over 41 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- Caybl.ai
TDQS
Scored across 99 tools
The Microsoft and Google Ads surfaces mirror each other almost exactly (get_campaigns/msads_get_campaigns, add_keywords/msads_add_keywords, create_campaign/msads_create_campaign), so an agent must read descriptions carefully to pick the right platform since the Google side carries no prefix. Within each platform boundaries are mostly clear (add_negative_keywords vs add_ad_group_negative_keywords, update_campaign vs update_campaign_status vs update_campaign_budget are well-differentiated), but the sheer volume plus mirrored names creates real misselection risk.
Names are consistently verb_noun within each family, which is good, but the prefixing scheme is asymmetric: Microsoft gets msads_, GTM gets gtm_, PageSpeed gets pagespeed_, yet Google Ads/GA4/Search Console are unprefixed, and a handful of Search Console tools break the verb pattern (inspect_url, find_zero_visibility_pages, get_sitemap vs list_sitemaps). Readable, but the platform prefixing convention is not uniform.
99 tools is far past the heavy threshold for a single server, even accounting for six distinct integrations (Google Ads, Microsoft Ads, GA4, Search Console, GTM, PageSpeed). Each tool may earn its place within its platform, but the aggregate surface is large enough to overwhelm an agent's selection and context budget.
Coverage is strong: full campaign/budget/ad group/keyword/ad lifecycles on both ad platforms, targeting and negatives, performance/reporting, a GAQL escape hatch, GA4 reports, GTM editing and publishing, and Search Console plus PageSpeed diagnostics. Minor gaps remain, such as no Google Ads responsive-search-ad update tool (Microsoft has one) and limited extension removal on the Google side, but agents can work around these.
Available Tools
99 toolsadd_ad_group_negative_keywordsAdd negative keywords to one ad groupAInspect
Add negative keywords scoped to a single ad group, not the whole campaign - use this when a search term is wasteful for one ad group's theme but still relevant to another in the same campaign. For a term that's wasteful everywhere, add_negative_keywords (campaign-level) is fewer calls.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | ||
| adGroupId | Yes | ||
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false), so the bar is lower, and the description adds genuine behavioral context by spelling out blast radius: the change affects only one ad group and explicitly not the campaign. It stops short of disclosing what happens on duplicate keywords (idempotentHint=false suggests duplicates accumulate) or what the call returns.
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, zero filler, with the scope constraint front-loaded and the alternative-routing sentence placed second. Every clause earns its place.
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 5-param mutation tool with nested objects, no output schema and full annotation coverage, the description handles the routing and scope questions well. It is slightly thin on post-call expectations (e.g. whether duplicates are deduped, what errors look like), which validateOnly partially mitigates in the schema.
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 60%: customerId, extraFields and validateOnly are well documented inline, while adGroupId, keywords and matchType carry no description. The description adds nothing about parameters, but the undocumented fields are largely self-explanatory, so this sits at the moderate-coverage 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?
States a specific verb (add) and resource (negative keywords) plus a precise scope constraint ('scoped to a single ad group, not the whole campaign'), which cleanly separates it from the sibling add_negative_keywords. No schema opening is needed to tell the two apart.
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?
Explicitly gives the when-to-use condition ('a search term is wasteful for one ad group's theme but still relevant to another') and names the alternative for the opposite case (add_negative_keywords at campaign level, with the reason: fewer calls). This is exactly the routing guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_calloutsAdd callout extensions to a campaignAInspect
Add callouts (short trust/feature snippets shown under the ad, e.g. 'Read-only access', 'No card required') to a campaign. Free, and typically raises CTR/Quality Score the same way sitelinks do. Creates the assets and links them to the campaign in one atomic mutate, same as add_sitelinks.
| Name | Required | Description | Default |
|---|---|---|---|
| callouts | Yes | Max 25 characters each. | |
| campaignId | Yes | ||
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false, non-idempotent), the description adds real behavioral context: the operation is free, creates the assets and links them in one atomic mutate, and mirrors add_sitelinks. Atomicity is a useful trait not captured by the annotations. It does not mention idempotency/re-run behavior, so it falls short of a 5.
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?
Three sentences, front-loaded with the definition before the value proposition and mechanics. Efficient overall, though the sitelinks analogy is stated twice ('the same way sitelinks do' and 'same as add_sitelinks'), a slight redundancy that could be tightened.
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 campaign-level mutation with no output schema, the description covers what it does, its atomic nature, and its cost/benefit. Combined with the annotation safety profile and the richly documented schema (validateOnly, extraFields, customerId), an agent has what it needs. Return values and permissions are not addressed, keeping it short of 5.
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 80%, so the schema already carries most parameter meaning (including the 25-char/20-item limits and the detailed customerId and extraFields docs). The description adds no parameter-specific detail, which is acceptable at this coverage but earns no bonus.
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?
States a specific verb (add) and resource (callouts) and defines what callouts are with concrete examples ('Read-only access', 'No card required'). It also anchors the concept against a known sibling ('same way sitelinks do', 'same as add_sitelinks'), so an agent can place it precisely without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: this is the tool to add callout extensions at the campaign level, and it is framed as parallel to add_sitelinks. However, there is no explicit when-to-use/when-not statement or a directive telling the agent to prefer this over a sibling for a given goal, so routing 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.
add_keywordsAdd keywords to an ad groupAInspect
Add positive keywords to an ad group. Match type matters: BROAD reaches widest and spends fastest, PHRASE is narrower, EXACT is tightest. Added PAUSED by default.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | PAUSED | |
| keywords | Yes | ||
| adGroupId | Yes | ||
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false) and the description adds a genuinely useful behavioral fact not in the annotations: keywords are created PAUSED by default, so nothing starts spending immediately. It omits idempotency behavior (duplicates on retry) and the 500-keyword batch ceiling, which would have completed the picture for a non-idempotent write tool.
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?
Three short sentences, all front-loaded: the action first, then the key decision (match type), then the critical default. No filler. It is slightly terse on the operational constraints (limits, validation) rather than bloated.
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 nested-object, non-idempotent mutation with no output schema, the description covers the action, match-type trade-off, and the PAUSED default, which is a solid minimum. It leaves out what the call returns, how duplicate keywords are handled, and the 500-item batch limit — gaps an agent would want before issuing a bulk write.
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 50%, and the schema itself already carries defaults for status (PAUSED) and matchType (EXACT) as well as prose for customerId, extraFields, cpcBid, and validateOnly. The description's match-type elaboration adds real meaning to the matchType enum but does not cover the undocumented half, so this sits at 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?
States a specific verb+resource ('Add positive keywords to an ad group') and the word 'positive' explicitly separates it from the sibling negative-keyword tools (add_negative_keywords, add_ad_group_negative_keywords). An agent can pick the right tool from the name and first sentence alone.
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 clear context for choosing between match types (BROAD widest/fastest spend, PHRASE narrower, EXACT tightest), which is the main decision an agent faces here. It does not, however, name the negative-keyword siblings as the alternative when negatives are needed, nor mention validateOnly as a prerequisite step; those are left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_negative_keywordsAdd negative keywords to a campaignAInspect
Add campaign-level negative keywords, which stop ads showing for those searches. This only ever reduces reach and spend, so it is the safest write tool here and the usual first response to wasteful search terms found via get_search_terms.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | ||
| campaignId | Yes | ||
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false and the mutation nature, but the description adds real value by clarifying the direction of effect: it 'only ever reduces reach and spend,' which lets an agent reason about blast radius. It omits reversibility/permissions detail, but the safety signal is genuinely additive 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-loaded with the core action and effect, with no filler. Every clause carries 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 write tool whose annotations and schema already carry the safety profile and the tricky parameters (customerId, extraFields, validateOnly), the description covers purpose, effect direction, and use context. Given no output schema, it need not document returns; only matchType semantics are left unaddressed.
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 description says nothing about any of the five parameters, while schema description coverage sits at only 60%: keywords, its matchType enum, and campaignId carry no descriptions anywhere. The description does not compensate for that gap, so it adds no parameter meaning.
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?
States a specific verb and resource ('Add campaign-level negative keywords') and immediately explains the effect ('stop ads showing for those searches'). The 'campaign-level' qualifier explicitly distinguishes it from the sibling add_ad_group_negative_keywords.
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?
Gives clear context for use ('the usual first response to wasteful search terms found via get_search_terms'), naming both the triggering situation and the sibling tool that surfaces it. It does not state when NOT to use it (e.g. ad-group-level negatives), so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_sitelinksAdd sitelink extensions to a campaignAInspect
Add sitelinks (extra links below the main ad, e.g. to /pricing or /security) to a campaign. Free - extensions don't cost more per click - and they typically raise CTR and Quality Score, which can lower actual CPC. Creates the assets and links them to the campaign in one atomic mutate, so validateOnly validates the whole operation and a failure can't leave an orphaned, unlinked asset.
| Name | Required | Description | Default |
|---|---|---|---|
| sitelinks | Yes | ||
| campaignId | Yes | ||
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the safety profile (not read-only, not idempotent, not destructive, open world). The description adds substantial context beyond that: it discloses the atomic mutate that creates assets and links in one operation, the failure mode (no orphaned unlinked asset), and the cost behavior (free). It omits a warning that, being non-idempotent, re-runs may create duplicate sitelinks, which is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly written sentences, front-loaded with the definition of sitelinks before the benefit and atomicity details. Every clause carries information; there is no filler or repetition of the title.
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 mutation with nested objects and no output schema, the description covers the key behavioral essentials (atomicity, cost, validateOnly scope). It could be stronger by noting what the tool returns or how re-invocation behaves for a non-idempotent create, but nothing critical to correct invocation is missing.
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 60%, so the description must partly compensate. It reinforces validateOnly semantics (validates the whole atomic operation) but adds little on the sitelinks array shape or the extraFields escape hatch beyond what the schema already documents. Baseline 3 is appropriate given the schema does most of the work.
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?
States a specific verb and resource ('Add sitelinks ... to a campaign') and disambiguates what sitelinks are with concrete examples (/pricing, /security). It is clearly distinguishable from siblings like add_callouts or add_keywords. No ambiguity about the operation.
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 motivates use (raises CTR/Quality Score, lowers CPC) and mentions that validateOnly checks the whole operation, which implies a dry-run-first workflow. However, it never states when NOT to use it or names an alternative sibling (e.g. add_callouts), so usage guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ad_groupCreate an ad groupBInspect
Create a Search ad group inside a campaign. Created PAUSED by default. cpcBid is the default max CPC for keywords in this group, in account currency.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Ad group name, unique within the campaign. | |
| cpcBid | No | Default max CPC in account currency, e.g. 1.20. | |
| status | No | PAUSED | |
| campaignId | Yes | Campaign id the ad group belongs to. | |
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, and openWorldHint=true, so the mutation/safety profile is largely covered. The description adds that the object is created PAUSED by default and clarifies what cpcBid governs, which is useful context, though the PAUSED state is also encoded in the schema's status default. No auth or rate-limit detail is added.
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?
Three short sentences, front-loaded with the core action and followed by two high-value defaults. Nothing is wasted, though the cpcBid sentence is largely redundant with the schema and the whole thing could be tightened to two sentences.
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 7-parameter mutation tool with no output schema and rich annotation coverage, the description covers purpose and the key default state. The schema's unusually thorough extraFields and validateOnly descriptions carry the remaining detail, so the description is adequate without duplicating them.
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 high (86%), so the schema already documents name, cpcBid, status, campaignId, customerId, extraFields, and validateOnly. The description only lightly reinforces cpcBid's role as the default max CPC for keywords in the group, adding little beyond the schema. 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?
States a specific verb+resource+scope: 'Create a Search ad group inside a campaign.' An agent can distinguish it from create_campaign and update_ad_group by the 'Create' verb and 'ad group' resource. It does not name a sibling alternative, but the 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?
No explicit when-to-use, when-not-to-use, or prerequisite guidance is given. The PAUSED-by-default note is behavioral, not routing guidance. The agent must infer that a campaign must already exist and that this is the create-vs-update path from the verb alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_campaignCreate a Search campaignAInspect
Create a Search campaign against an existing budget. Created PAUSED by default so it cannot start spending before a human looks at it - pass status='ENABLED' only when that is intended. Create the budget first with create_campaign_budget.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Campaign name, unique within the account. | |
| status | No | Defaults to PAUSED. A campaign created ENABLED can begin serving and spending immediately. | PAUSED |
| endDate | No | YYYYMMDD. Omit to run indefinitely. | |
| budgetId | Yes | Campaign budget id from create_campaign_budget. | |
| startDate | No | YYYYMMDD. Defaults to today. | |
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. | |
| searchNetwork | No | Also serve on Google search partners. | |
| contentNetwork | No | Also serve on the Display network. | |
| biddingStrategy | No | MAXIMIZE_CONVERSIONS needs conversion tracking already working, or delivery will suffer. | MANUAL_CPC |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic profile (not read-only, open-world, non-idempotent). The description adds what they cannot: the campaign is created PAUSED as a safety default so it cannot spend before human review, and the extraFields escape hatch can never override status or other safety defaults. That is exactly the mutation-safety context an agent needs before spending money.
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?
Three short sentences, front-loaded with the action, then the safety default, then the prerequisite. No filler, and the riskiest piece of information (ENABLED is opt-in) is stated early.
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 an 11-parameter mutation tool with no output schema, the description covers purpose, prerequisite, and safety defaults well. It does not say what a successful call returns (e.g. the new campaign id), which an agent chaining into update_campaign would want, but the schema and annotations otherwise carry the load.
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 baselines to 3, and the schema already explains status defaults, extraFields, validateOnly, and customerId resolution in depth. The description restates the status default rather than adding syntax or new parameter meaning, so it does not exceed the schema 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?
States a specific verb and resource ('Create a Search campaign') plus a key constraint ('against an existing budget'), which implicitly separates it from budget-creation siblings. It explicitly names create_campaign_budget, so an agent can route correctly without opening either schema.
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?
Gives an explicit prerequisite ('Create the budget first with create_campaign_budget') and an explicit when-to-use condition for the risky path ('pass status=ENABLED only when that is intended'). The default-PAUSED guidance tells the agent which behavior to expect when it says nothing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_campaign_budgetCreate a campaign budgetAInspect
Create a shared daily campaign budget. A campaign cannot be created without one, so this is normally the first write call. amount is a daily amount in account currency (not micros).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Budget name, unique within the account. | |
| amount | Yes | Daily budget in account currency, e.g. 25 for EUR 25/day. | |
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. | |
| explicitlyShared | No | Allow more than one campaign to share this budget. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this is a non-read-only, non-idempotent, non-destructive write, and the description adds the prerequisite relationship to campaigns plus a unit caveat on amount. It does not warn about the practical consequence of idempotentHint=false (retrying on an ambiguous failure can create a duplicate budget), which is the main behavioral risk here.
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 short sentences, front-loaded with the action and immediately followed by the workflow constraint. No filler, and the amount-unit note is a brief, high-value caveat.
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 6-param write tool with full schema coverage and no output schema, the description supplies the key missing context (prerequisite ordering, units). It omits what a created budget looks like in the response and whether the shared-budget flag changes behavior for future campaigns, but those are secondary.
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% and each parameter (including validateOnly, extraFields, explicitlyShared) is well documented inline, so the baseline is 3. The description only restates the 'account currency, not micros' point already present in the amount schema, adding no new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a shared daily campaign budget') and immediately clarifies its position among siblings: it is a prerequisite for create_campaign and distinct from update_campaign_budget. An agent can place it in the workflow without opening a schema.
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?
Gives explicit sequencing guidance ('a campaign cannot be created without one, so this is normally the first write call'), which routes the agent correctly relative to create_campaign and update_campaign_budget. It stops short of naming alternatives or stating when not to call it (e.g., if a budget already exists).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_google_ads_linkLink a GA4 property to a Google Ads accountAInspect
Link a GA4 property to a Google Ads customer account (see list_google_ads_links to check what's already linked first - this errors if one already exists for that pair). Together with mark_key_event, this is what lets Google automatically sync a GA4 key event into a Google Ads conversion action - see update_ga4_conversion_action (Google Ads connector) for the one step still needed once that sync happens. Needs the analytics scope; a connection made before that scope was requested will refuse this until reconnected (see needsReconsent).
| Name | Required | Description | Default |
|---|---|---|---|
| property | No | ||
| customerId | Yes | 10-digit Google Ads customer id (dashes optional, e.g. 123-456-7890). | |
| adsPersonalizationEnabled | No | Allow Ads personalization features on this link. Defaults to Google's own default (off) if omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare a generic non-read-only open-world mutation; the description adds real behavioral detail the annotations cannot express: the duplicate-pair error condition, the required analytics scope, and that a pre-scope connection will refuse until reconnected (needsReconsent). This is substantive context beyond 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?
Front-loads the action and the duplicate-check caveat, then adds workflow and scope context. Three dense sentences with no filler, though the third sentence is run-on and could be split.
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 mutation tool with no output schema, the description covers the error condition, prerequisite scope, reconnection requirement, and adjacent workflow steps. An agent has everything needed to call it and handle failures.
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 67%: customerId and adsPersonalizationEnabled are documented in the schema, but 'property' has no description in either place. The description adds no parameter-level meaning, so it neither compensates for the gap nor documents the format expectations for property.
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?
States a specific verb (Link) and both resources (GA4 property, Google Ads customer account), which immediately distinguishes it from delete_google_ads_link and list_google_ads_links in the sibling set.
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?
Explicitly routes the agent to list_google_ads_links as a pre-check and warns that this errors if a link already exists. It also names the downstream workflow (mark_key_event, then update_ga4_conversion_action), so when-to-use and what-comes-next are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_responsive_search_adCreate a responsive search adAInspect
Create a responsive search ad in an ad group. Google requires 3 to 15 headlines (max 30 chars each) and 2 to 4 descriptions (max 90 chars each); those limits are enforced here before the call so a bad draft fails fast rather than as an opaque API error. Created PAUSED by default.
| Name | Required | Description | Default |
|---|---|---|---|
| path1 | No | First display-URL path segment. | |
| path2 | No | Second display-URL path segment. | |
| status | No | PAUSED | |
| finalUrl | Yes | Landing page URL, including https://. | |
| adGroupId | Yes | ||
| headlines | Yes | 3-15 headlines, max 30 characters each. | |
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| descriptions | Yes | 2-4 descriptions, max 90 characters each. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (openWorldHint, non-idempotent, non-destructive), the description discloses genuinely useful behavior: Google's headline/description limits are enforced before the API call for fail-fast validation, and the ad is created PAUSED by default. That 'enforced here so a bad draft fails fast rather than as an opaque API error' detail is real added 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?
Three front-loaded sentences: purpose first, then the enforcement/limits rationale, then the safety default. Tight overall, though the limits sentence partially duplicates schema constraints and could be trimmed.
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 10-parameter mutation tool with no output schema, the description covers the essential safety default (PAUSED) and the validation behavior. Parameter-level detail and the customerId/extraFields semantics are left to the schema (80% coverage), which is acceptable, so little is missing.
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 high (80%), so the schema already documents most parameters, including the headline/description counts and character limits and the PAUSED status default. The description restates those limits but adds no syntax or meaning beyond the schema; 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?
States a specific verb and resource — 'Create a responsive search ad in an ad group' — so the agent knows exactly what the tool does. It distinguishes itself from sibling create_* tools by resource type (responsive search ad vs campaign, ad group, budget), but doesn't explicitly name or contrast any 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?
Usage is only implied: the agent infers you use this to build a new RSA rather than calling an update or get tool. There is no explicit when/when-not guidance and no named alternative (though there happens to be no other ad-creation sibling to route to).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_google_ads_linkRemove a Google Ads link from a GA4 propertyADestructiveInspect
Remove the Google Ads link between a GA4 property and a customer account - e.g. to fix a link made to the wrong account (a manager instead of the actual client account, say). See list_google_ads_links to check what's currently linked first; errors if no link exists for that pair. Needs the analytics scope; a connection made before that scope was requested will refuse this until reconnected (see needsReconsent).
| Name | Required | Description | Default |
|---|---|---|---|
| property | No | ||
| customerId | Yes | 10-digit Google Ads customer id (dashes optional) of the link to remove. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, but the description adds genuinely new behavioral context: the required analytics scope, the needsReconsent/reconnect failure mode for older connections, and the error when no matching link exists. It does not state whether the removal is reversible or what is returned, which keeps it short of a 5.
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?
Front-loaded with the action and resource, followed by the reason, the sibling to consult, the error condition, and the auth caveat — each sentence carries information. The parenthetical example and the needsReconsent aside are slightly dense, but nothing 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?
For a destructive, open-world tool with no output schema, the description covers the essential prerequisites (analytics scope, reconsent), the pre-check step, and the failure mode. It leaves the return value and the required-vs-optional status of `property` unaddressed, but an agent has enough 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?
Schema coverage is 50%: customerId is documented in the schema, but `property` has no description anywhere. The description implies the two parameters form the property/account pair being removed but adds no format or validity detail for `property`, so it only marginally compensates for the coverage gap.
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?
States a specific verb+resource ('Remove the Google Ads link between a GA4 property and a customer account') and clearly distinguishes itself from create_google_ads_link and list_google_ads_links in the sibling set. An agent can identify the target object of the operation without opening the schema.
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?
Names the alternative (list_google_ads_links) and the condition that selects it ('check what's currently linked first'), and gives a concrete motivating scenario (fixing a link to the wrong account). It also states the failure condition ('errors if no link exists for that pair'), which is exactly the routing information an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_zero_visibility_pagesFind pages with zero search visibilityARead-onlyInspect
Given the page URLs you track (e.g. a marketing site's master URL list), return which got zero impressions in Search Console over the window - worth a manual indexing check (noindex tag, orphaned internal links, thin/duplicate content) rather than assuming it's simply low demand. Caybl has no notion of your tracked-URL list on its own, which is why this takes urls rather than inferring them. Matches scheme (http/https) and trailing-slash variants of each URL automatically, since Search Console may report the same page in a different form than your list uses.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | The page URLs to check. | |
| endDate | No | YYYY-MM-DD. | |
| siteUrl | No | ||
| startDate | No | YYYY-MM-DD. Omit with endDate for the last 28 days. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, non-destructive, openWorld). The description adds genuine behavioral context beyond them: it queries Search Console impressions, requires a caller-supplied URL list because Caybl tracks none, and normalizes scheme (http/https) and trailing-slash variants automatically. It omits return shape and rate/pagination limits, but those are secondary here.
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 purpose is front-loaded in the first sentence and each following clause carries information (why `urls` is required, URL-variant matching). It is somewhat dense and long-winded, but little of it is filler, so it stays efficient despite the length.
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?
With no output schema, the description usefully states what is returned (which supplied URLs got zero impressions). It justifies the required parameter and the loose URL matching, which are the non-obvious details for correct invocation. Date-window semantics are left to the schema, which is acceptable at this 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 coverage is 75%, so the schema already documents the main parameters. The description adds real meaning for `urls` (the caller's tracked page list, matched loosely against Search Console forms), but says nothing about startDate/endDate/siteUrl beyond what the schema provides. Baseline 3 is appropriate given the schema does most of the lifting.
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 names a specific verb (find/return which) and resource (tracked pages with zero Search Console impressions over a window), so an agent can tell what it produces. It stops short of naming a sibling alternative (e.g. inspect_url, run_search_analytics_report) to distinguish itself explicitly, so it lands just below the top tier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to reach for this tool: diagnosing a suspected indexing problem ('manual indexing check... rather than assuming it's simply low demand'). It also explains why the caller must supply URLs. No explicit when-not or named alternative is provided, keeping it at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_keyword_ideasKeyword ideas (Keyword Planner)ARead-onlyInspect
Keyword Planner ideas for seed keywords and/or a URL: monthly search volume, a LOW/MEDIUM/HIGH competition score, and top-of-page bid estimates. Works pre-spend. Volume is bucketed by Google.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| pageUrl | No | Seed URL to derive ideas from (used with or instead of keywords). | |
| keywords | No | Seed keywords, e.g. ['google analytics mcp']. | |
| customerId | No | ||
| languageId | No | Google language constant id (1000 = English). | 1000 |
| geoTargetIds | No | Geo target constant ids (2840 = United States, 2372 = Ireland). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/non-destructive, so the safety bar is low, yet the description adds genuine value: the output shape (volume, competition, bid estimates) and the important caveat that volume is bucketed by Google rather than exact. That bucketing note is the kind of trait annotations cannot convey.
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?
Three compact clauses, front-loaded with the tool's identity and outputs, no filler. Every sentence carries information, though the final bucketing note could be folded in slightly tighter.
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?
No output schema exists, and the description compensates by naming what is returned. For a read-only ideation tool with non-required params this is close to sufficient, with only the customerId/limit and pagination behavior left unaddressed.
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 67%, so the schema already documents pageUrl, keywords, languageId and geoTargetIds. The description adds the useful 'and/or' relationship between keywords and pageUrl, but says nothing about the undocumented customerId or limit parameters.
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?
States a specific verb+resource ('Keyword Planner ideas for seed keywords and/or a URL') and enumerates the returned metrics (volume, competition score, top-of-page bid estimates). This is clearly distinguishable from mutation siblings like add_keywords and update_keyword, though it never names a sibling explicitly.
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 phrase 'Works pre-spend' implies it can be used before a campaign exists, which is real context, but there is no explicit when-to-use guidance, no prerequisites (e.g. whether a customerId is required), and no alternatives named despite many sibling research/report tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_summariesList GA accounts & propertiesBRead-onlyInspect
List the GA accounts and properties this connection can access.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so safety and scope are covered. The description adds only the permission-scoping detail ('this connection can access') and says nothing about result shape or pagination for a listing tool with no output schema.
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 front-loaded sentence with no filler or repetition. It is slightly terse for the role it plays as the entry-point discovery call, but nothing in it 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?
With no parameters, no output schema, and annotations covering the safety profile, the description states the one thing an agent needs: that this returns the accounts/properties available to the connection. Return-field detail is not described but the tool is simple enough that this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies. There is nothing for the description to disambiguate, and it correctly does not invent parameter behavior.
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?
Specific verb (List) plus resources (GA accounts and properties), with the scope qualifier 'this connection can access'. The agent can tell it apart from list_accessible_customers and list_sites by resource type, though the description never explicitly contrasts with those 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?
No statement of when to call this versus alternatives such as run_gaql_report, get_property_details, or list_sites, and no prerequisites. The only hint of context is the phrase 'this connection can access', which implies scoped discovery but is not framed as guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_groupsList Ads ad groupsBRead-onlyInspect
List ad groups for an account (optionally filtered to one campaign): id, name, status, type, and their parent campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | No | Restrict to one campaign id. | |
| customerId | No | ||
| includeRemoved | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, non-destructive, and openWorld, so the safety profile is covered. The description adds that it returns id/name/status/type and parent campaign, which is useful, but says nothing about pagination, result limits, or what includeRemoved does to the result set.
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?
One compact sentence that front-loads the action and scope, then lists the output fields. No filler, no redundancy with the title.
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?
With no output schema, the description helpfully lists the returned fields, which covers the return-value gap. But for a three-parameter read tool it omits the meaning of includeRemoved (the only parameter that changes result scope) and any pagination or result-size expectations.
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 only 33%: campaignId is documented in the schema, and the description restates that filter, but customerId and includeRemoved have no schema description and the description never mentions them. With low coverage the description needed to compensate and largely does not, leaving two of three parameters unexplained.
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?
States a specific verb and resource ('List ad groups') plus the scoping dimension ('for an account, optionally filtered to one campaign') and enumerates the returned fields. This distinguishes it reasonably from write-oriented siblings like create_ad_group/update_ad_group, though it never names a read sibling such as get_campaigns to contrast with.
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 parenthetical 'optionally filtered to one campaign' implies when the campaignId path is appropriate, so usage is inferable. However there is no explicit when-to-use/when-not guidance and no mention of the alternative read tools (get_campaigns, get_ad_performance) an agent should consider instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_performancePer-ad performanceARead-onlyInspect
Performance broken down by individual ad, not just by campaign - which specific responsive search ad (and its headlines/descriptions) is actually winning. get_campaign_performance only reports at the campaign level. Defaults to the last 30 days; filter to one campaign or ad group with the optional ids.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| endDate | No | ||
| adGroupId | No | Restrict to one ad group. | |
| startDate | No | ||
| campaignId | No | Restrict to one campaign. | |
| customerId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so safety is covered. The description adds genuinely useful behavior beyond that: the default 30-day date window and the fact that results can be scoped by campaign or ad group id, neither of which the schema states for startDate/endDate defaults.
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?
Three front-loaded sentences with no filler; the ad-vs-campaign distinction leads and the default window trails. The parenthetical about headlines/descriptions earns its place by clarifying what the breakdown exposes, though the em-dash clause makes the opener slightly heavy.
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?
With six optional parameters, no required params, no output schema, and low schema coverage, the description supplies the key operating context (granularity, default window, scoping filters). Remaining gaps are limit default and customerId semantics, which are minor for a read-only report 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 only 33% (only campaignId and adGroupId are annotated). The description partially compensates by explaining the campaign/ad-group filter intent and implying the default date range, but leaves limit, customerId, and the date format for startDate/endDate undocumented in both places.
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?
States a specific verb and resource ('performance broken down by individual ad'), and sharply distinguishes itself from the sibling get_campaign_performance, which it names explicitly as campaign-level only. An agent can pick between the two without opening either schema.
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?
Explicitly routes the agent: use this for per-ad (responsive search ad) granularity, use get_campaign_performance for campaign-level roll-ups. It also states the default window (last 30 days) and the optional narrowing via campaign/ad group ids, so invocation conditions are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaign_criteriaCampaign targeting (locations, devices, schedule, negatives)ARead-onlyInspect
Everything that controls WHERE, WHEN, and to WHOM a campaign can serve: location targeting, excluded devices, ad schedule, and campaign-level negative keywords. get_campaigns only covers structural fields (name, status, budget) - a campaign can look perfectly configured there while having no location targeting at all, which defaults to Google's broadest reach, not 'no targeting'. Check this before enabling any campaign meant for specific markets or hours.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | Campaign id from get_campaigns. | |
| customerId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds genuine domain behavior beyond that: the trap that a campaign lacking location targeting defaults to Google's broadest reach rather than 'no targeting'. It stops short of describing the return shape/format, which matters given there is no output schema.
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?
Three sentences, front-loaded with what is retrieved, then the contrast with the sibling, then the actionable recommendation. Every sentence earns its place with no 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?
For a read-only tool whose annotations carry the safety profile and with no output schema to explain, the description is nearly complete: it covers scope, sibling contrast, and a critical default-behavior warning. The only gap is the undocumented customerId parameter and any indication of the returned structure.
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 50%: campaignId is documented ('Campaign id from get_campaigns') but customerId has no description in either schema or prose. The description adds no parameter-level meaning at all, so it fails to compensate for the undocumented half of the parameters.
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 states a precise verb+resource: it returns the targeting controls (location, excluded devices, ad schedule, negative keywords) for a campaign. It explicitly distinguishes itself from get_campaigns by contrasting the structural fields that tool covers. An agent can tell exactly what this tool fetches versus the 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?
It names the alternative (get_campaigns) and its scope, then gives a concrete trigger: 'Check this before enabling any campaign meant for specific markets or hours.' It also explains the failure mode of skipping it (missing location targeting defaults to broadest reach). This is explicit when-to-use guidance tied to a real risk.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaign_performanceCampaign performanceARead-onlyInspect
Per-campaign performance over a date range: impressions, clicks, cost, conversions, CTR, and average CPC. Costs are in the account currency (converted from micros). Defaults to the last 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | YYYY-MM-DD. | |
| startDate | No | YYYY-MM-DD. Omit with endDate for LAST_30_DAYS. | |
| customerId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description goes beyond them with genuinely useful behavior: costs are in account currency converted from micros, and the range defaults to the last 30 days. It stops short of describing aggregation granularity or return shape.
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 tight sentences that front-load the returned metrics and append the currency/default-window caveats. No filler, every clause carries 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?
With no output schema, the metric list usefully compensates for the missing return documentation, and the zero-required-parameter design is partly addressed by the default-range note. It still omits customerId resolution, aggregation granularity (per campaign per day vs. aggregate), and any pagination or result-size limits.
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 67%, and the description reinforces the date semantics (last-30-day default) rather than extending them. The undocumented customerId parameter gets no explanation in either place, and no date-format or requiredness detail is added beyond the schema's own notes.
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 names a specific verb+resource and enumerates the exact metrics returned (impressions, clicks, cost, conversions, CTR, avg CPC), which is more than a tautology. It does not, however, differentiate itself from near-siblings like get_ad_performance or get_campaigns, leaving the agent to infer the distinction.
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 only usage signal is the default window (last 30 days). There is no statement of when to choose this over get_ad_performance, get_campaigns, or run_report, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaignsList Ads campaignsARead-onlyInspect
List campaigns for an account: id, name, status, channel type, bidding strategy, and daily budget. Structure only (no performance metrics) - use get_campaign_performance for spend/results.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | No | Ads customer id (10 digits). Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| includeRemoved | No | Include REMOVED campaigns (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral scope beyond the annotations: it returns structural fields only and intentionally excludes performance metrics. It doesn't discuss pagination or result volume, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the scope constraint plus the alternative tool are front-loaded so the routing decision is made immediately.
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?
There is no output schema, so the enumeration of returned fields carries real weight and compensates well. It is nearly complete for a two-parameter read tool, lacking only minor details such as whether results are paginated or how removed campaigns appear.
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 both customerId and includeRemoved are already documented in the schema, including the important multi-account error behavior. The description mentions returned fields rather than parameters and adds no parameter syntax beyond the schema — 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?
States a specific verb+resource ('List campaigns for an account') and enumerates the returned structure (id, name, status, channel type, bidding strategy, daily budget). It also explicitly differentiates itself from the sibling get_campaign_performance, so an agent can route without opening either schema.
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?
Names the alternative tool (get_campaign_performance) and the exact condition that selects it ('for spend/results'), and clarifies the scope boundary of this tool ('Structure only (no performance metrics)'). This is explicit when-to-use/when-to-use-something-else guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_custom_dimensions_and_metricsList custom dimensions & metricsBRead-onlyInspect
List the custom dimensions and custom metrics defined on a GA4 property.
| Name | Required | Description | Default |
|---|---|---|---|
| property | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds only the scoping detail that results are the definitions on a GA4 property; it says nothing about return shape, pagination, or authorization needs.
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 efficient sentence with no filler, front-loaded with the verb and resource. It is appropriately sized, though its brevity is partly under-specification rather than tightness.
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 listing tool with no output schema, the description is minimally adequate, but it leaves the one required parameter's semantics undocumented and gives no hint about the structure or volume of returned definitions.
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 single 'property' parameter is undocumented everywhere. The description mentions a GA4 property but gives no expected identifier format (e.g. properties/1234), so it fails to compensate for the schema gap.
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?
States a specific verb (List) and specific resources (custom dimensions and custom metrics) scoped to a GA4 property. It is unambiguous and no sibling overlaps with this resource, though it does not explicitly differentiate itself from sibling list 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?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as run_gaql_report or get_property_details for related metadata. The agent must infer usage entirely from the purpose statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_property_detailsGet GA4 property detailsARead-onlyInspect
Return details about a specific GA4 property (name, timezone, currency, type, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| property | No | GA property id, e.g. 'properties/123'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful return-content context by listing name, timezone, currency, and type, but it does not disclose behavioral details such as auth requirements, error behavior, or pagination.
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 efficient sentence with the action and resource front-loaded. It contains no redundant or filler text.
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 lookup with one well-documented parameter and no output schema, the description is mostly complete because it names the resource and gives examples of returned fields. It could be slightly stronger by clarifying the expected property ID format or explicitly noting that the property is required despite required-parameter count being zero.
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%, and the single 'property' parameter is already documented in the schema as a GA property ID like 'properties/123'. The description only says 'specific GA4 property' and adds no syntax, format, or optionality information 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 uses a specific verb ('Return details') and resource ('a specific GA4 property'), and lists example fields returned. It distinguishes this tool from sibling property-detail tools such as get_search_console_property_details by explicitly naming GA4.
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?
There is no explicit when-to-use guidance, no prerequisites, and no alternatives named. The purpose implies that this is used when property details are needed, but the description does not help an agent choose between this and related lookup tools like get_resource_metadata or get_account_summaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resource_metadataDescribe an Ads resourceARead-onlyInspect
Describe a Google Ads API resource type (e.g. 'campaign', 'ad_group', 'search_term_view'): its category, the metrics and segments selectable with it, and related resources. Helps construct GAQL for run_gaql_report.
| Name | Required | Description | Default |
|---|---|---|---|
| resource | Yes | Resource/field name, e.g. 'campaign' or 'campaign.status'. | |
| customerId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=true, openWorldHint=true, destructiveHint=false), and the description goes further by naming the returned payload fields (category, metrics, segments, related resources). With no output schema, that content disclosure is genuinely additive, though it omits anything about lookup failure behavior for unknown resources.
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 tightly packed sentences: the first defines the operation and payload, the second states the downstream purpose. No filler, and the core purpose is 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?
For a read-only metadata lookup with no output schema, the description adequately covers what the tool returns and why it exists. The only shortfall is silence on the optional `customerId` and on behavior for invalid resource names.
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 50%: `resource` is documented in the schema with its own examples, and the description merely repeats example values ('campaign', 'ad_group'), adding no new format or nesting guidance. The undocumented `customerId` is not explained in the description either, so the coverage gap is not compensated.
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?
States a specific verb ('Describe') and resource ('a Google Ads API resource type') with concrete examples, and enumerates exactly what the response contains: category, selectable metrics/segments, related resources. This sharply distinguishes it from run_gaql_report, which consumes its output rather than producing metadata.
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?
Explicitly ties the tool to a downstream purpose ('Helps construct GAQL for run_gaql_report'), which tells the agent when to reach for it. It does not state when NOT to use it (e.g. skip it if you already know the resource schema), but the context is clear enough to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_search_console_property_detailsGet Search Console property detailsBRead-onlyInspect
Return your permission level for a single Search Console property.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | No | Property id, e.g. 'sc-domain:example.com' or 'https://example.com/'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds the useful behavioral detail that the return is a permission level rather than full property metadata, but says nothing about failure behavior when the property is inaccessible.
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?
One short sentence with the core verb and result front-loaded; every word earns its place and there is no 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?
With no output schema, the description must carry return-value semantics; it states the return is a permission level, which is the essential point, but omits the possible permission values (e.g. siteOwner/siteFullUser) and any error conditions. Adequate but with clear gaps for a tool whose whole output is the described value.
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% and the single siteUrl parameter is fully documented with format examples in the schema. The description only alludes to 'a single Search Console property' without adding syntax or format detail beyond what the schema already provides, so the baseline of 3 applies.
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?
States a specific verb ('Return') and resource ('your permission level for a single Search Console property'), which an agent can distinguish from siblings like get_property_details or list_sites. It does not explicitly name those siblings, but the resource is specific enough to be actionable.
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?
There is no guidance on when to use this tool versus alternatives such as get_property_details or list_sites, nor any stated prerequisites (e.g. that the property must be one the user has access to). The agent must infer usage entirely from the name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_search_termsSearch terms reportARead-onlyInspect
The actual search queries that triggered your ads, with impressions/clicks/cost/conversions. Useful for spotting wasted spend and negative-keyword candidates. Defaults to the last 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| endDate | No | ||
| startDate | No | ||
| customerId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful return-field context (impressions/clicks/cost/conversions) and a default 30-day window, but omits auth needs, rate limits, and pagination behavior.
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 tight sentences front-load what the tool returns, then add a use case and a default behavior. Every sentence earns its place with no wasted wording.
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, use case, returned metrics, and a default date range, which is helpful because annotations cover safety. But for a 4-parameter tool with zero schema descriptions and no output schema, it is thin on parameter guidance and does not fully compensate for the missing structured documentation.
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 4 parameters and 0% schema description coverage, the description must carry the burden of explaining parameters. It only hints at the date default ('last 30 days') and says nothing about limit, customerId, or date formats, leaving most parameter meaning undocumented.
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?
States the specific resource (actual search queries that triggered ads) and the metrics returned, so the agent knows what the tool produces. However, it does not differentiate this report from sibling report tools such as run_report or get_ad_performance, which limits it to a 4.
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?
Gives a clear use context—spotting wasted spend and finding negative-keyword candidates—which tells the agent when the tool is valuable. It does not name alternative tools or specify when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sitemapGet sitemap statusARead-onlyInspect
Status of one specific sitemap: last downloaded, errors/warnings, and URLs submitted vs. indexed.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | No | ||
| feedpath | Yes | The sitemap's own URL, e.g. 'https://example.com/sitemap.xml'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description goes beyond that by naming the concrete data returned (download status, errors/warnings, submission vs. index counts), which is valuable given there is no output schema.
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 front-loaded sentence that delivers purpose and return content with zero filler. Nothing to trim.
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?
With no output schema, the description usefully summarizes the return payload, but it leaves the siteUrl parameter's role unexplained and gives no pagination or error-handling context. Adequate but with a clear parameter gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%: feedpath is documented in the schema, but siteUrl has no description anywhere. The description mentions no parameters at all, so it does not compensate for the undocumented optional siteUrl (e.g., when it is required vs. defaulted).
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?
States a specific verb (get) and resource (sitemap) plus the scope 'one specific sitemap,' which distinguishes it from the sibling list_sitemaps. It also enumerates exactly what status is returned: last downloaded, errors/warnings, URLs submitted vs. indexed.
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 phrase 'one specific sitemap' implies this is the single-sitemap counterpart to list_sitemaps, but no explicit when-to-use guidance or named alternative is given. Usage is only inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_audit_containerAudit a Tag Manager containerARead-onlyInspect
Check the LIVE version of a GTM container for common tracking problems, worst first: paused tags, duplicate GA4 event tags (double counting), duplicate Google tags, retired Universal Analytics tags, tags that never fire, missing consent settings, unused triggers, Custom HTML sprawl and unpublished workspace changes - each with a one-line fix. Pair with GA4 (run_report by eventName) or Google Ads conversions to confirm the impact.
| Name | Required | Description | Default |
|---|---|---|---|
| container | No | Container public id like 'GTM-ABC123' (or its name), from gtm_list_containers. Only needed when there's more than one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, destructiveHint=false), and the description adds real context beyond them: the audit targets the LIVE version rather than the workspace, findings are ordered worst-first, and each comes with a one-line fix. It doesn't cover limits (e.g., container size, rate/timeouts), so not a 5.
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, zero filler: the check list is front-loaded as the core purpose, and the follow-up pairing advice is the only secondary content. Dense but every phrase carries 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?
There's no output schema, and the description compensates by describing the shape of results (prioritized findings each with a one-line fix). The optional-parameter behavior is handled by the schema. Minor gap: nothing about what happens if no container is resolvable or how large/multi-container accounts behave.
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 one parameter at 100% schema coverage, the schema already documents the 'GTM-ABC123' format and the 'only needed when there's more than one' rule. The description adds nothing about the container argument, so baseline 3 applies.
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?
States a specific verb ('Check') and resource ('the LIVE version of a GTM container') and enumerates the concrete problems it detects, which clearly separates it from gtm_container_overview, gtm_list_tags, and gtm_list_triggers_and_variables (those list; this diagnoses). An agent can pick it without opening any schema.
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?
Gives clear operating context: it audits the LIVE (published) version, and recommends pairing with run_report by eventName or Google Ads conversions to confirm impact. It does not explicitly exclude the sibling tools (e.g., say to use gtm_container_overview first for inventory), so it falls just short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_container_overviewTag Manager container overviewARead-onlyInspect
What's live in a GTM container: the published version (number, name, roughly when it was saved), how many tags, triggers and variables it has, how many tags are paused, and which workspaces have unpublished changes.
| Name | Required | Description | Default |
|---|---|---|---|
| container | No | Container public id like 'GTM-ABC123' (or its name), from gtm_list_containers. Only needed when there's more than one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only safety, so the description's value is in disclosing the payload: version number/name/approximate save time, object counts, paused-tag count, and unpublished workspaces. That is concrete, non-obvious return context. It stops short of saying whether unpublished-change detection is per-user or account-wide, or how 'roughly when' is derived.
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?
One front-loaded sentence listing the reported items, with zero filler. The colon-and-list construction makes the payload scannable, though a single sentence of that length is slightly dense.
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?
With no output schema, the description does the work of describing the return shape and does it thoroughly for a read-only summary tool. Remaining gaps are about aggregation semantics and error cases, which are minor for this tool type.
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 description never mentions the single optional `container` parameter; the schema carries it at 100% coverage, including the 'GTM-ABC123' format and the single-container default. With full schema coverage the baseline of 3 applies.
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?
Opens with a specific scope statement ("What's live in a GTM container") and enumerates exactly what is reported: published version identity, tag/trigger/variable counts, paused tags, and workspaces with unpublished changes. It implicitly separates itself from gtm_list_tags / gtm_list_triggers_and_variables by returning counts rather than lists, but never names those 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?
No when-to-use or when-not-to-use guidance is given. The agent must infer that this is the summary entry point rather than gtm_audit_container or gtm_version_history, and nothing states prerequisites such as needing a container chosen from gtm_list_containers first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_list_containersList Tag Manager containersARead-onlyInspect
List the Google Tag Manager containers this account can see: public id (GTM-XXXX), name, web or server, and domains. Pass one as container to the other gtm_ tools - only needed when there's more than one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description adds real context beyond that: the visibility scope is limited to what the account can see, and the output is a container identifier meant to be fed to sibling gtm_ tools. It stops short of mentioning result limits or pagination, so it is not fully complete.
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 compact sentences with no filler. The enumeration of returned fields comes first, followed by the actionable instruction, so the most decision-relevant content is 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?
With no output schema, the description does the work of describing the return shape and the follow-up usage, which is enough for an agent to call this correctly. Minor gap: nothing about whether the list can be truncated or how many containers are typically returned.
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 takes zero parameters, so the baseline is 4. The description instead documents the returned fields (public id like GTM-XXXX, name, web or server, domains), which is useful since there is no output schema, though it is technically return-value rather than parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the Google Tag Manager containers') and narrows scope with 'this account can see', which separates it from gtm_container_overview and gtm_audit_container. It also names the returned fields, so an agent knows exactly what it gets.
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?
Gives an explicit conditional: 'only needed when there's more than one', plus the downstream routing rule 'Pass one as `container` to the other gtm_ tools'. That tells the agent both when to call it and what to do with the result, which is exactly the guidance a zero-param discovery tool needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_list_tagsList Tag Manager tagsARead-onlyInspect
Every tag in the LIVE version of a container, in plain words: type (e.g. 'GA4 event', 'Google Ads conversion', 'Custom HTML'), the event name / measurement id / conversion id it sends to, which triggers fire or block it, whether it's paused, and its consent settings. Filter by type or a search on the name. To check whether a GA4 event is actually arriving, compare with GA4 run_report (eventName).
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Narrow the list. Default all. | |
| search | No | Case-insensitive text to match in tag names, e.g. 'purchase'. | |
| container | No | Container public id like 'GTM-ABC123' (or its name), from gtm_list_containers. Only needed when there's more than one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered; the description adds the meaningful scope constraint that only LIVE-version tags are returned, which implies draft/workspace edits are invisible. No pagination, result-size, or rate-limit disclosure, which keeps it below a 5.
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 tight sentences: the return shape is front-loaded, filtering and the cross-tool comparison follow. Every clause carries information and nothing is repeated from the title.
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?
With no output schema, the description compensates by enumerating the returned fields and their plain-language form, plus the LIVE-only scope and a verification path via run_report. An agent has enough to call this correctly and interpret the response.
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%, including the enum for `type` and an example for `search`, so the schema carries the parameter burden. The description only restates that filtering is possible by `type` or `search` and never mentions the `container` parameter or its multi-container prerequisite, adding little 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?
States a specific verb (list) and resource (GTM tags), scoped to the LIVE container version, and enumerates exactly what each entry contains (type, event/measurement/conversion id, firing triggers, paused state, consent settings). This lets an agent distinguish it from gtm_list_triggers_and_variables and gtm_container_overview without opening a schema.
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?
Gives concrete narrowing options and an explicit cross-tool workflow: compare results with run_report (eventName) to verify a GA4 event actually fires. It stops short of stating when NOT to use it (e.g. instead of gtm_audit_container for a health check, or that only published tags appear), so it's clear but not exhaustively routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_list_triggers_and_variablesList Tag Manager triggers and variablesARead-onlyInspect
Triggers in the LIVE version with their conditions in plain words (e.g. 'Page Path starts with /checkout/thank-you') and which tags use each one, plus user-defined variables (type and source) and the enabled built-in variables.
| Name | Required | Description | Default |
|---|---|---|---|
| container | No | Container public id like 'GTM-ABC123' (or its name), from gtm_list_containers. Only needed when there's more than one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so safety is covered. The description adds genuine context beyond that: results come from the LIVE version (not draft/workspace), conditions are rendered in plain language, and it enumerates the three content categories returned. It doesn't discuss pagination or result size, keeping it from 5.
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?
One dense sentence that front-loads the resource and immediately gives a concrete example of the plain-word condition format. Efficient, though the parenthetical example costs space relative to its informational 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?
No output schema exists, and the description compensates by enumerating exactly what the response contains (triggers, conditions, tag usage, user-defined variables, built-in variables). Combined with read-only annotations and a single optional param, that is nearly complete; only result volume/pagination behavior is unstated.
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% and the single optional 'container' param is fully documented with format example and the multi-container caveat. The description adds no parameter-level information, so the baseline 3 applies.
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?
States a specific verb (list) and resource (triggers and variables) and enumerates the returned content: trigger conditions in plain words, tags using each trigger, user-defined variables with type/source, and enabled built-in variables. It doesn't explicitly contrast with the sibling gtm_list_tags, which partly overlaps via 'which tags use each one', so it stops short of 5.
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 statement of when to reach for this versus gtm_list_tags, gtm_container_overview, or gtm_audit_container, and no prerequisites or exclusions. The only conditional guidance ('Only needed when there's more than one') lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_pause_tagPause or unpause a Tag Manager tagAIdempotentInspect
Pause (or unpause) one tag, as a draft in the container's Caybl workspace - nothing goes live until the user publishes in Tag Manager. Dry run by default (validateOnly=true).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | Tag id or exact name, from gtm_list_tags. | |
| paused | No | true (default) to pause, false to unpause. | |
| container | No | Container public id like 'GTM-ABC123', from gtm_list_containers. | |
| workspace | No | Name of an existing workspace to draft into instead of "Caybl changes" (created automatically). | |
| validateOnly | No | Default TRUE: a dry run that shows exactly what would change and changes nothing. Show the user the result, and only call again with validateOnly=false once they've agreed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (idempotent, non-destructive, open-world), but the description adds the two facts an agent most needs and annotations cannot express: writes are draft-only ('nothing goes live until the user publishes') and validateOnly defaults to TRUE. That dry-run default is the critical behavioral disclosure for a mutation tool.
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 sentence that front-loads the action, then the draft semantics, then the dry-run default. No filler and nothing buried.
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?
With no output schema and full param coverage, the description supplies enough to call correctly: draft behavior, publish dependency, and the safe default. It could say what pausing actually does to a tag's firing behavior or whether the draft workspace persists, but for this tool the gaps are minor.
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% and every parameter has a description, so the schema already carries the semantics. The description only echoes the validateOnly=true default and gestures at the workspace with 'Caybl workspace'; it adds little beyond what the schema states. Baseline 3 applies when the schema does the heavy lifting.
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?
States a specific verb pair (pause/unpause) and resource (one tag), plus the scope constraint that it operates on a single tag as a draft. An agent can separate this from gtm_upsert_tag (edit/create) and gtm_publish (make live) without opening any schema.
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?
Makes the workflow clear: the change lands as a draft and only takes effect after publishing in Tag Manager, which implicitly routes promotion to gtm_publish. It stops short of naming alternatives like gtm_upsert_tag for configuration edits or stating when-not-to-use, so it is clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_publishPublish a Tag Manager workspace, or roll back to an earlier versionADestructiveInspect
Publish to the LIVE site. Two ways: (1) publish a workspace's drafts as a new named version - by default the "Caybl changes" workspace Caybl's edit tools draft into; or (2) pass version to re-publish an earlier version, which is how to undo a bad publish. Dry run by default: Google compiles the workspace and reports errors or merge conflicts, and the result lists exactly what would change on the live site. Only call with validateOnly=false after the user has seen that list and said yes.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Version notes: what changed and why. | |
| version | No | Re-publish this existing version number instead (roll back). From gtm_version_history. | |
| container | No | Container public id like 'GTM-ABC123', from gtm_list_containers. | |
| workspace | No | Workspace to publish. Default "Caybl changes". Publishing another workspace also publishes everything else drafted in it. | |
| versionName | No | Name for the new version, e.g. 'Unpause Ads purchase tag'. Required to publish a workspace. | |
| validateOnly | No | Default TRUE: a dry run that shows exactly what would change and changes nothing. Show the user the result, and only call again with validateOnly=false once they've agreed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and openWorldHint=true, but the description adds material context the annotations cannot: dry-run is the default, Google compiles the workspace and surfaces errors or merge conflicts, and the response enumerates the live-site diff. It also discloses that the default workspace is "Caybl changes" and that publishing it also ships anything else drafted there. Minor gap: it doesn't say what happens to the prior live version or whether publishing is reversible beyond the rollback path.
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?
Four sentences, front-loaded with the destination (LIVE site) and the two modes, then the dry-run behavior, then the confirmation gate. No filler, and each sentence carries a distinct operational fact.
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-required-parameter destructive publish tool with no output schema, the description covers mode selection, defaults, side effects, error surfacing, and the human-confirmation workflow. An agent has everything needed to call this safely without opening the schema.
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%, so the baseline would be 3, but the description earns above that by explaining the semantics that matter: `version` means re-publish for rollback, `validateOnly` defaults to true and must be flipped deliberately, and `workspace` defaults to "Caybl changes". It doesn't add anything for `notes`, `versionName`, or `container`, but those are self-evident and already well documented in 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?
Opens with a specific verb and destination ("Publish to the LIVE site") and then enumerates the two distinct modes: publishing a workspace's drafts as a new named version, or re-publishing an earlier version. This makes it immediately distinguishable from gtm_upsert_tag, gtm_pause_tag, and gtm_version_history, which are the adjacent tools an agent might confuse it with.
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?
Gives explicit routing: use the `version` parameter when undoing a bad publish, otherwise publish a workspace. It also states a hard procedural gate — only call with validateOnly=false after the user has seen the dry-run list and agreed — which is exactly the when/when-not guidance an agent needs for a destructive tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_upsert_tagCreate or edit a GA4 event or Google Ads conversion tagAInspect
Create a GA4 event tag or Google Ads conversion tag, or edit an existing one of those types, as a draft in the container's Caybl workspace (never published - the user publishes in Tag Manager). Dry run by default: returns the tag exactly as it would be saved, a diff when editing, and warnings for missing triggers or variables. Can't create Custom HTML or template tags.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | To EDIT: the existing tag's id or exact name. Omit to create a new tag. | |
| kind | Yes | ||
| name | Yes | Tag name, e.g. 'GA4 - generate_lead'. | |
| container | No | Container public id like 'GTM-ABC123', from gtm_list_containers. | |
| eventName | No | GA4: the event name, e.g. 'generate_lead'. | |
| workspace | No | Name of an existing workspace to draft into instead of "Caybl changes" (created automatically). | |
| conversionId | No | Google Ads: conversion ID (digits, or AW-digits). | |
| currencyCode | No | Google Ads: e.g. 'EUR'. | |
| validateOnly | No | Default TRUE: a dry run that shows exactly what would change and changes nothing. Show the user the result, and only call again with validateOnly=false once they've agreed. | |
| measurementId | No | GA4: G-XXXXXXX. Defaults to the container's Google tag ID when there's exactly one. | |
| firingTriggers | Yes | Trigger names or ids (from gtm_list_triggers_and_variables), or 'All Pages'. | |
| conversionLabel | No | Google Ads: conversion label. | |
| conversionValue | No | Google Ads: value, a number or a {{variable}}. | |
| eventParameters | No | GA4: event parameters, e.g. {"value": "{{DLV - ecommerce.value}}", "currency": "EUR"}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: results are always drafts (never published), validateOnly defaults true, the dry run returns the would-be tag, a diff when editing, and warnings for missing triggers or variables. This tells the agent exactly what will and will not change before it commits anything.
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?
Three sentences, each earning its place: purpose and allowed types first, then draft/publish behavior, then dry-run return values, then the exclusions. No filler and no repetition of the title or schema.
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?
With no output schema, the description carries the return-value burden itself by naming the dry-run payload, diff, and warnings. With 14 parameters, the draft-workspace and publish constraints are covered, and the remaining detail is in a 93%-covered schema.
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 93%, so the schema already documents the tag, kind, eventName, measurementId, conversion*, and validateOnly semantics. The description adds no syntax or format guidance beyond that 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?
States a precise verb and resource: create or edit a GA4 event tag or Google Ads conversion tag, as a draft in the Caybl workspace. It also names the tag types it cannot create (Custom HTML, template tags), so an agent knows the boundary of the tool without opening the schema.
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?
Explains the create-vs-edit decision (omit tag to create, pass tag to edit) and the dry-run-first workflow, plus that publishing happens in Tag Manager, not here. It does not explicitly route to siblings such as gtm_upsert_trigger or gtm_publish, so an agent must infer those alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_upsert_triggerCreate or edit a Tag Manager triggerAInspect
Create or edit a page view, link click, all-clicks, form submission or custom event trigger, as a draft in the container's Caybl workspace (never published). Dry run by default: returns the trigger in plain words and as saved, and warns when a condition uses a variable that isn't enabled (e.g. Click URL).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| name | Yes | Trigger name, e.g. 'Form - contact'. | |
| trigger | No | To EDIT: the existing trigger's id or exact name. Omit to create. | |
| container | No | Container public id like 'GTM-ABC123', from gtm_list_containers. | |
| eventName | No | custom_event only: the dataLayer event name, e.g. 'generate_lead'. | |
| workspace | No | Name of an existing workspace to draft into instead of "Caybl changes" (created automatically). | |
| conditions | No | All must match (AND). Omit to fire on every matching event. | |
| validateOnly | No | Default TRUE: a dry run that shows exactly what would change and changes nothing. Show the user the result, and only call again with validateOnly=false once they've agreed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true, but the description adds substantial behavioral context: draft-only edits, never published, dry-run by default, return format, and a warning when a condition references an unenabled variable. These details go well beyond the annotations and do not contradict 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 uses two efficient sentences: the first front-loads the create/edit action, trigger kinds, and draft-only scope; the second covers dry-run behavior, return format, and warnings. There is no filler, and the critical safety constraint is surfaced immediately.
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 an 8-parameter mutation tool with no output schema, the description compensates well by explaining the draft-only behavior, dry-run default, return format, and warning behavior. It omits some explicit prerequisite detail around container/workspace sourcing, but the schema already documents those parameters with high coverage.
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 already 88%, so the input schema does most of the work documenting parameters such as kind, trigger, container, workspace, and conditions. The description adds useful high-level context about trigger kinds and dry-run behavior, but does not add per-parameter meaning beyond what the schema already provides, 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?
States a specific verb (create or edit) and resource (Tag Manager trigger), enumerates five supported trigger kinds, and scopes the result to a draft in the Caybl workspace that is never published. This distinguishes it from siblings like gtm_upsert_tag and gtm_publish without needing to open either schema.
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 signals use for creating or editing a trigger and explains that it drafts rather than publishes, while the schema's validateOnly field enforces a dry-run-first workflow. It does not explicitly name gtm_list_triggers_and_variables as the lookup alternative or state when not to use this tool, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_version_historyTag Manager version history and diffARead-onlyInspect
Recent published versions of a container, and exactly what changed between two of them: tags, triggers and variables added, removed or changed (paused, different triggers, different event or conversion id). Default compares the live version with the one before it. Use it for 'conversions dropped on the 14th - what changed?': match the version's date with the drop in GA4 or Google Ads.
| Name | Required | Description | Default |
|---|---|---|---|
| container | No | Container public id like 'GTM-ABC123' (or its name), from gtm_list_containers. Only needed when there's more than one. | |
| toVersion | No | Newer version number. Default: the live version. | |
| fromVersion | No | Older version number. Default: the version before `toVersion`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, non-destructive, open-world operation. The description adds useful behavior beyond annotations: only recent published versions are considered, the diff covers tags/triggers/variables, and the default compares live vs. prior version.
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 front-loaded with the core capability and follows with a concrete diagnostic use case. It is appropriately sized with no filler sentences.
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 low parameter complexity, full schema coverage, and annotations, the description is largely complete for selection and invocation. It could be slightly richer about what 'recent' means or the shape of the diff output, but it covers the essential behavior.
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%, so the parameters are already well documented in the input schema. The description reinforces the default fromVersion/toVersion comparison but adds little parameter-specific meaning beyond what the schema already says.
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 states a specific resource and operation: recent published container versions and a diff of exactly what changed between two of them. It distinguishes the tool from sibling GTM tools by emphasizing version-diff behavior, not tag/trigger listing or container audits.
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 usage scenario ('conversions dropped on the 14th - what changed?') and explains the default comparison behavior. It does not explicitly state when not to use it or name alternative tools for adjacent GTM investigation needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_urlInspect a URL's index statusARead-onlyInspect
Live index status for one URL: whether it's indexed, its Google-selected canonical, mobile usability, and any rich results detected. The tool for answering 'why isn't this page performing' before deciding what to change on it.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The exact page URL to inspect, e.g. 'https://example.com/blog/post'. | |
| siteUrl | No | ||
| languageCode | No | BCP-47 code, e.g. 'en-US'. Defaults to the property's own. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds that the data is 'live' and names the reported categories, which is useful context, but says nothing about rate limits, auth requirements, or whether inspecting a non-indexed URL errors.
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 tight sentences with zero waste. The concrete capability list is front-loaded and the use-case framing follows immediately.
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?
With no output schema, the description usefully enumerates the returned fields, which is the main thing an agent needs. The only gap is the undocumented siteUrl parameter and no indication of what happens for a non-indexed or invalid URL.
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 67%: url and languageCode are documented in the schema, siteUrl is not. The description adds no parameter detail beyond reinforcing the single-URL scope, so it neither compensates for the gap nor adds meaning over 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?
States a specific verb and resource ('Live index status for one URL') and enumerates exactly what it reports: indexed status, Google-selected canonical, mobile usability, rich results. The framing sentence ('why isn't this page performing') further distinguishes it from the create/update/report 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?
Gives a clear situational trigger: use it diagnostically before deciding what to change on a page. However, it names no alternative — notably find_zero_visibility_pages, the closest sibling, is not mentioned, so the agent must infer the boundary itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accessible_customersList accessible Ads accountsARead-onlyInspect
List the Google Ads accounts (customer ids) this connection can access. Pass one as customerId for the other tools - only required when more than one account is reachable; the other tools auto-pick a single reachable account on their own.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuinely non-obvious cross-tool behavior — that downstream tools self-select when only one account is reachable — which is not derivable from annotations or schema.
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-loaded with the action and result, followed by the exact downstream usage. No filler or restatement of the title.
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?
With no output schema, the description usefully signals that the return value is a set of customer ids, and it explains when the tool must actually be called. Minor gap: it does not state what happens on zero reachable accounts, but that is a small omission for a zero-param list 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?
This tool takes zero parameters, so the baseline is 4. The mention of customerId adds useful framing about how the output feeds other tools, though it is not a parameter of this 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?
States a specific verb and resource — 'List the Google Ads accounts (customer ids) this connection can access' — and clarifies the return type as customer ids. It is trivially distinguishable from siblings like get_account_summaries or create_google_ads_link.
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?
Explicitly tells the agent what to do with the result ('Pass one as customerId for the other tools') and the condition under which it matters ('only required when more than one account is reachable'). It also pre-empts a needless call by explaining that other tools auto-pick a single account.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_google_ads_linksList Google Ads linksBRead-onlyInspect
List the Google Ads account links configured on a GA4 property.
| Name | Required | Description | Default |
|---|---|---|---|
| property | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, covering the safety profile. The description adds only the scoping fact that links are per-GA4-property; it says nothing about pagination, result volume, or auth requirements beyond what annotations imply.
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 front-loaded sentence with no filler; the scope qualifier follows the verb+resource immediately.
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 list tool with no output schema and one undocumented parameter, the description is adequate but thin: it neither explains the return shape (no output schema exists to cover it) nor the property identifier format.
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 single 'property' parameter has 0% schema description coverage, so the description must compensate. Mentioning 'configured on a GA4 property' ties the parameter to its meaning, but gives no format (e.g. properties/12345) and, notably, the schema marks it non-required while the description implies it is needed.
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?
States a specific verb ('List') and resource ('Google Ads account links') scoped to a GA4 property. This clearly separates it from the create_google_ads_link and delete_google_ads_link siblings, though it doesn't name them explicitly.
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 explicit when-to-use guidance, prerequisites, or alternatives. Usage is only implied by the verb 'List' and the mention of a GA4 property; the agent must infer it's the read-side counterpart to create/delete_google_ads_link.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sitemapsList sitemapsBRead-onlyInspect
List the sitemaps Search Console knows about for a property, with their last-read status.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds useful context that last-read status is returned, but says nothing about pagination, empty results, or auth requirements beyond what annotations imply.
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 front-loaded sentence with zero filler words; the resource and its returned status are both stated efficiently.
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 single-parameter read tool this covers the core intent, and no output schema exists so return values need only minimal mention (it names last-read status). It falls short on documenting the sole parameter and any result-shape or pagination behavior.
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% for the single siteUrl parameter, so the schema provides no help. The description compensates only partially by implying a property/property-scoped lookup, but never names the parameter or states its expected format (e.g. a URL).
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 states a specific verb (List), resource (sitemaps), and scope (for a property), plus the returned attribute (last-read status). It does not, however, distinguish itself from the sibling get_sitemap (singular), so an agent must infer the list-vs-single difference.
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?
There is no explicit when-to-use guidance, no mention of prerequisites (a verified property), and no reference to alternatives such as get_sitemap or submit_sitemap. Usage is only implied by the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sitesList Search Console propertiesARead-onlyInspect
List the Search Console properties (domain or URL-prefix) this connection can access, with your permission level on each. Pass one as siteUrl for the other tools - only required when more than one property is reachable; the other tools auto-pick a single reachable property on their own.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, destructiveHint=false, so safety is covered. The description adds genuine context beyond them: the response includes the caller's permission level per property, and the auto-pick behavior of sibling tools that determines whether siteUrl is needed. No return envelope or pagination details, but meaningful added value.
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?
Three compact sentences: what is listed, what it returns, and how to use the result. Front-loaded with the core purpose and no wasted 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?
For a zero-parameter discovery tool with no output schema, the description covers what is returned (properties plus permission level) and the cross-tool contract for siteUrl. Nothing an agent needs to invoke it correctly is missing.
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?
Zero parameters, so the baseline is 4. The description also adds semantic context about the `siteUrl` value produced here and consumed by other tools, tying the output to a parameter elsewhere in the toolset.
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?
States a specific verb (List) and resource (Search Console properties), names the two property forms (domain or URL-prefix), and specifies the returned detail (permission level). This clearly separates it from siblings like get_search_console_property_details and get_property_details, which return details for a single known property.
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?
Explicitly explains the downstream purpose of the result: 'Pass one as `siteUrl` for the other tools', and clarifies the conditional requirement ('only required when more than one property is reachable; the other tools auto-pick a single reachable property'). It tells the agent how this tool fits the workflow, though it does not state when *not* to call it or name a direct alternative lister.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_key_eventMark a GA4 event as a key eventAInspect
Mark a GA4 custom event (e.g. connect_success or first_tool_call_success, already flowing in via src/analytics/measurementProtocol.ts and GTM) as a key event - together with create_google_ads_link, the prerequisite for Google to automatically sync it into a Google Ads conversion action (there's no API call to trigger that sync; it happens once both exist). Once synced, see update_ga4_conversion_action (Google Ads connector) to set it as a primary MAXIMIZE_CONVERSIONS goal. Needs the analytics scope; a connection made before that scope was requested will refuse this until reconnected (see needsReconsent).
| Name | Required | Description | Default |
|---|---|---|---|
| property | No | ||
| eventName | Yes | The GA4 event name to mark, exactly as it appears in GA4 (case-sensitive). | |
| countingMethod | No | Default ONCE_PER_EVENT - counts every occurrence, not just the first per session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: it requires the analytics scope, can hard-fail on stale connections pending reconsent, and clarifies there is no API call to trigger the sync (it happens implicitly once both resources exist). Annotations only cover read/write and open-world hints.
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 purpose is front-loaded in the first clause, and the remaining sentences carry prerequisites and downstream steps rather than filler. It is dense with nested parentheticals, which slightly taxes readability but each part earns its place.
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 mutation tool with no output schema, it covers the key operational context: required scope, reconsent failure mode, implicit sync behavior, and downstream tooling. It stops short of describing what the call returns or how to confirm success.
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 67%: eventName and countingMethod are already documented in the schema, and the description only adds illustrative example values for eventName. The 'property' parameter remains undocumented in both schema and description, so the description does not fully compensate.
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?
States a specific verb and resource: marking a GA4 custom event as a key event, with concrete event-name examples. It also situates itself relative to siblings (create_google_ads_link, update_ga4_conversion_action) so an agent can identify it without opening a schema.
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?
Spells out when to use it: together with create_google_ads_link as the prerequisite for Google Ads conversion sync, plus the follow-on step via update_ga4_conversion_action. It also names the exclusion condition — a connection made before the analytics scope was requested will refuse until reconnected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_add_ad_extensionsCreate Microsoft Advertising sitelinks and calloutsAIdempotentInspect
Create sitelinks and/or callouts in the account's extension library. They are created UNATTACHED, so they do not serve until attached to a campaign or ad group with msads_set_ad_extension_attachment. Limits are checked first: sitelink text up to 25 characters (35 without descriptions), descriptions up to 35 and given together or not at all, callout text up to 25. Callouts only serve once there are at least 2 on a campaign or ad group. Use dryRun to review.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| callouts | No | Short callout phrases, up to 25 characters each. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| sitelinks | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only say non-read-only, idempotent, non-destructive, open-world). It discloses that new extensions are unattached and won't serve, that character limits are validated first, that descriptions must be supplied together or not at all, that callouts need at least 2 to serve, and that dryRun previews without sending anything.
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?
Purpose is front-loaded, followed by attachment behavior, validation limits, serving rule, and dryRun hint. Every sentence carries distinct information with no redundancy.
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?
With no output schema, the description covers what is created, its unattached state, the follow-up tool, constraints, and preview mode. The one gap is the return value – an agent isn't told whether extension IDs come back, which matters for the subsequent attach call.
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?
At 75% schema coverage the schema documents most params, but the description adds rules not present in it: sitelink text 25 characters (35 without descriptions), descriptions up to 35 and paired, callout text 25. It doesn't add anything about accountId, which the schema already explains.
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?
Opens with a specific verb and resource: 'Create sitelinks and/or callouts in the account's extension library.' It also distinguishes itself from the attach tool by stating the extensions are created UNATTACHED and naming msads_set_ad_extension_attachment as the step that makes them serve, so an agent can separate this from sibling extension tools without reading schemas.
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?
Gives clear operating context: create here, attach later with msads_set_ad_extension_attachment, and 'Use dryRun to review.' It doesn't explicitly rule out the sibling add_callouts/add_sitelinks tools or state prerequisites like account selection, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_add_keywordsAdd Microsoft Advertising keywordsAIdempotentInspect
Add keywords to an ad group. They are created PAUSED unless status is 'Active', so nothing starts spending until someone turns it on. Keywords already in the ad group with the same text and match type are skipped. Each keyword can have its own bid (otherwise it uses the ad group's) and final URL. Up to 50 per call. Use dryRun to see what would be added.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| status | No | Paused (default) or Active. | Paused |
| keywords | Yes | ||
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| adGroupId | Yes | Ad group id, from msads_get_ad_groups. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, destructive=false, idempotent=true), and the description adds real substance on top: keywords are created PAUSED by default so nothing starts spending, duplicates by text+match type are skipped (explaining the idempotent hint), and each keyword can carry its own bid or inherit the ad group's. This is exactly the behavioral context annotations cannot convey.
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?
Five tight sentences, front-loaded with the action and the most important behavioral fact (created PAUSED). Every sentence carries distinct information — no restating of the name or schema.
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?
No output schema exists, and the description adequately covers return-relevant behavior (what gets created, what gets skipped, dryRun preview). It is slightly incomplete on what happens with invalid/partial keyword batches and on the conditional accountId parameter, but nothing critical to calling it correctly is missing.
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 80%, so baseline is 3; the description goes beyond it by explaining the bid fallback ('otherwise it uses the ad group's'), per-keyword final URL, the 'Active' override of the default status, and the 50-per-call limit. Only accountId and error/partial-failure semantics go unmentioned.
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?
Opens with a specific verb+resource: 'Add keywords to an ad group.' The 'msads_' prefix and title identify the platform, so an agent can separate it from the generic 'add_keywords' sibling. It does not explicitly name the alternative tools (add_keywords, msads_add_negative_keywords), so it stops short of full sibling 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?
Provides useful invocation context — dedupe skipping, the 50-item cap, and a recommendation to use dryRun to preview. But it never states when to prefer this over add_keywords or msads_add_negative_keywords, nor any prerequisites (e.g. ad group must exist and be enabled). Usage is implied rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_add_negative_keywordsAdd Microsoft Advertising negative keywordsAIdempotentInspect
Add negative keywords to a campaign or an ad group, so ads stop showing for those searches (the usual fix for wasted spend found with msads_get_search_terms). Exact blocks only that search, Phrase blocks searches containing the words in order, Broad blocks searches containing all the words in any order - Exact is the safe default. Up to 50 per call; ones already present are skipped. Adding negatives can reduce traffic, so check the list with dryRun when unsure. Needs campaignId for an ad group as well as the ad group id.
| Name | Required | Description | Default |
|---|---|---|---|
| level | Yes | Where the negatives apply. | |
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| entityId | Yes | The campaign id (level campaign) or ad group id (level adGroup). | |
| keywords | Yes | The words or phrases to block, one per item. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| matchType | No | Exact (default), Phrase or Broad. | Exact |
| campaignId | No | Required when level is adGroup: the ad group's campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and a non-destructive write, and the description confirms the duplicate-skip behavior while adding the real caveat that negatives reduce traffic. It also explains the 50-per-call limit and that dryRun is a read-then-diff since Microsoft has no validate mode. Return shape is not described, but no output schema exists.
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?
One dense but well-ordered passage: what it does, then match-type semantics, then limits and dedupe, then the dryRun safety note, then the campaignId gotcha. Every sentence carries operational value, though the match-type clause runs long.
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 7 params, one open-world write and no output schema, the description covers the risky parts an agent needs: dedupe, per-call cap, traffic impact, preview path, and the ad-group campaignId dependency. Only the post-call result is left implicit.
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%, so the schema already documents level, entityId, matchType, dryRun and the 50-item cap. The description's main addition is the behavioral meaning of each match type and the recommendation that Exact is the safe default, which is useful but largely mirrors the enum description.
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?
States a specific verb (add) and resource (negative keywords) with the target scope (campaign or ad group), and ties itself to the upstream sibling msads_get_search_terms. It does not explicitly distinguish itself from the sibling add_ad_group_negative_keywords, which appears to cover a narrower slice of the same job.
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?
Gives a concrete trigger (wasted spend surfaced by msads_get_search_terms) and a safety route (use dryRun when unsure). It also flags the campaignId-for-adGroup requirement. It stops short of saying when to prefer the narrower add_ad_group_negative_keywords sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_create_ad_groupCreate a Microsoft Advertising ad groupAIdempotentInspect
Create an ad group in a campaign. It is ALWAYS created paused. Give it a default max CPC bid (keywords without a bid of their own use it). Names must be unique within the campaign. Language is only needed if the campaign has none set. Use dryRun to review.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Ad group name, up to 256 characters, unique in the campaign. | |
| cpcBid | Yes | Default max CPC bid, in the account currency. | |
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| network | No | Where it can show. Default: Microsoft and partner sites. | OwnedAndOperatedAndSyndicatedSearch |
| language | No | Only if the campaign has no language set, e.g. English. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| campaignId | Yes | Campaign id, from msads_get_campaigns. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, open-world, idempotent, non-destructive operation, and the description adds important behavior beyond that: creation is always paused, names must be unique in the campaign, the CPC bid acts as a keyword default, and dryRun previews changes. These details materially help an agent understand side effects and constraints.
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 short, front-loaded with the core action, and every sentence carries actionable information about creation state, bidding, naming, language, or dryRun.
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 mutation tool with full schema coverage and safety annotations, the description covers the key behavioral constraints needed to invoke it correctly. The main minor gap is that it does not describe what the tool returns, such as the new ad group id, and there is no output schema.
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 description still adds meaning beyond the schema by explaining that cpcBid is inherited by keywords without their own bid and that language is only required when the campaign has no language set.
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 states a specific verb and resource: create an ad group in a campaign. It is clear what the tool does, but it does not distinguish itself from sibling tools such as create_ad_group or update_ad_group.
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 useful operational context: the ad group is always created paused, language is only needed if the campaign has none set, and dryRun can be used to review. However, it does not explicitly say when to choose this tool over the similarly named create_ad_group sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_create_campaignCreate a Microsoft Advertising search campaignAIdempotentInspect
Create a search campaign. It is ALWAYS created paused: it cannot spend until someone adds an ad group, keywords and an ad and turns it on with msads_set_status. Give it either its own dailyBudget or a sharedBudgetId (from msads_get_budgets). The time zone defaults to the account's. Bid strategy: EnhancedCpc (default), MaxClicks, or MaxConversions (needs a UET tag and conversion goal, and works best with 30+ conversions a month). Names must be unique in the account. A new budget above 50 per day needs allowLargeChange. Use dryRun to review.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Campaign name, up to 128 characters, unique in the account. | |
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| maxCpc | No | Optional ceiling on a click for MaxClicks. | |
| timeZone | No | Microsoft's time zone name. Default: the account's own. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| languages | No | Languages as Microsoft spells them, e.g. ['English']. Default English. | |
| bidStrategy | No | EnhancedCpc (default), MaxClicks or MaxConversions. | EnhancedCpc |
| dailyBudget | No | The campaign's own daily budget, in the account currency. | |
| sharedBudgetId | No | Use an existing shared budget instead of dailyBudget. | |
| allowLargeChange | No | A change that more than doubles the current value is refused unless this is true. Set it only when the increase is deliberate and the user has confirmed it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that the campaign is ALWAYS created paused and cannot spend until later steps, that names must be unique in the account, and that budgets above 50/day require allowLargeChange. The MaxConversions prerequisite (UET tag, conversion goal, volume) is operational context no annotation carries.
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?
Five front-loaded sentences, each carrying a distinct constraint or routing hint, with the paused-by-default fact placed early where it matters most. A little of the wording duplicates schema content (uniqueness, bid strategy list), which is the only waste.
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 10-parameter mutation tool with no output schema, the description covers the full creation workflow, budget sourcing, spend implications, and dryRun verification, which is what an agent needs to call it correctly. It stops short of saying what identifier is returned on success, the one remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds genuine meaning by framing dailyBudget vs sharedBudgetId as a mutually exclusive choice, explaining the time zone fallback, and giving trade-off guidance on the three bid strategies rather than just repeating the enum. Minor repetition of the name-uniqueness rule already in the schema keeps it from a 5.
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?
States a specific verb and resource ('Create a search campaign') and immediately identifies the Microsoft Advertising platform via the title and the msads_* siblings referenced. It is cleanly distinguishable from msads_create_ad_group, msads_create_shared_budget, and generic create_campaign.
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?
Explicitly routes the agent: budget comes either from dailyBudget or a sharedBudgetId obtained via msads_get_budgets, and activation happens later through msads_set_status after ad group, keywords and ad exist. It also names when a shared budget is preferable and when MaxConversions is appropriate (needs UET tag + conversion goal, 30+ conversions/month).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_create_conversion_goalCreate a Microsoft Advertising page-visit conversion goalAIdempotentInspect
Create a conversion goal that counts a visit to a page (for example a thank-you page) as a conversion, tied to a UET tag (see msads_get_conversion_tracking for tag ids). It is created PAUSED, so it records nothing until turned on with msads_set_conversion_goal_status. The goal's scope is the account and cannot be changed later. Microsoft turns on automatic click tagging (an msclkid parameter on your landing page URLs) for the account when a conversion goal is added. Because that changes a setting beyond the goal, you must pass acknowledgeAutoTagging: true. Other goal types (events, duration, pages per visit) are not offered here. Use dryRun to review.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Goal name, up to 100 characters, unique for the customer. | |
| tagId | Yes | The UET tag id that will record it, from msads_get_conversion_tracking. | |
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| category | Yes | What kind of conversion this is, e.g. Purchase or SubmitLeadForm. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| countType | No | All counts every conversion; Unique counts one per click. | All |
| fixedValue | No | Optional fixed value per conversion, in the account currency. | |
| urlOperator | No | How to match: Equals (default), BeginsWith, Contains or RegularExpression. | Equals |
| urlExpression | Yes | The page address to match, e.g. /thank-you. | |
| acknowledgeAutoTagging | No | Must be true: confirms you know adding a goal turns on automatic click tagging. | |
| conversionWindowMinutes | No | How long after a click a visit still counts, in minutes. Default 43200 (30 days). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses that creation is paused/non-recording, that goal scope is account-level and immutable after creation, and that adding a goal has an account-wide side effect (automatic click tagging adding msclkid to landing page URLs) which forces the acknowledgment flag. Nothing here contradicts destructiveHint=false, idempotentHint=true or openWorldHint=true.
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?
Five tight sentences, front-loaded with what the tool creates, followed by lifecycle, side effect and the required flag. Every sentence carries information an agent needs before calling; the one-word pointer to dryRun is not wasted space.
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 an 11-parameter mutation with no output schema, the description covers lifecycle, side effects, prerequisites and immutability well. The remaining gap is the return: it never says whether the call returns a goal id or how to reference the new goal when calling msads_set_conversion_goal_status, which an agent needs to complete the intended workflow.
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 every parameter is already self-documented, including tagId's source and dryRun's read-only preview behavior. The description adds rationale only for acknowledgeAutoTagging and does not clarify urlOperator/urlExpression interaction, countType, fixedValue currency, or the conversion window. Baseline 3 is appropriate when the schema does the heavy lifting.
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?
States a specific verb and resource (create a page-visit conversion goal) and immediately bounds the scope: page visits only, other goal types (events, duration, pages per visit) are explicitly not offered. It also ties itself to the correct sibling data source (msads_get_conversion_tracking for tag ids), so an agent can separate it from msads_create_uet_tag and the other create_* 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?
Gives explicit when-to-use context and the follow-up step: the goal is created PAUSED and records nothing until msads_set_conversion_goal_status turns it on. It names the prerequisite (acknowledgeAutoTagging: true, with the reason), recommends dryRun for review, and rules out the goal types this tool does not serve.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_create_responsive_search_adCreate a Microsoft Advertising responsive search adAIdempotentInspect
Create a responsive search ad in an ad group from headlines and descriptions that Microsoft mixes and matches. It is created PAUSED unless status is 'Active', so it does not serve until someone turns it on. Text limits are checked before anything is sent. Use dryRun to review the ad first. Write ads for the business honestly: do not invent offers, prices or claims the user did not give you.
| Name | Required | Description | Default |
|---|---|---|---|
| path1 | No | Optional display path, up to 15 characters, no '/'. | |
| path2 | No | Optional second display path (needs path1). | |
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| status | No | Paused (default) or Active. | Paused |
| finalUrl | Yes | Landing page, a full URL (https://...). | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| adGroupId | Yes | Ad group id, from msads_get_ad_groups. | |
| headlines | Yes | 3 to 15 headlines, each up to 30 characters and all different. | |
| descriptions | Yes | 2 to 4 descriptions, each up to 90 characters and all different. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful non-schema behavior: default PAUSED state, that text limits are validated before any call is sent, and that dryRun is free and cannot affect spend. It stops short of describing what the call returns, but there is no output schema to explain either.
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?
Four sentences, front-loaded with the creation mechanic, then default state, then dryRun guidance. The closing editorial instruction about honest ad copy is arguably extra but is short and actionable rather than 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?
For a 9-parameter creation tool with no output schema, the description covers the essential behavioral facts an agent needs: default paused status, pre-send validation, and a dryRun escape hatch. Only the return value and the pointer to the update sibling are missing, which is a minor gap given the rich schema.
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 per-parameter descriptions covering ranges, character limits, enums, and dependencies (path2 needs path1). The description adds little parameter-level detail beyond the headline/description mixing concept, so the schema carries the load and a 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?
States a specific verb and resource ('Create a responsive search ad in an ad group') and explains the core mechanic of headlines/descriptions being mixed and matched. This clearly distinguishes it from msads_update_responsive_search_ad and the Google-flavored create_responsive_search_ad 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?
Gives clear operational context: use dryRun to review the ad first, and note that ads are created PAUSED so they won't serve until activated. It doesn't explicitly enumerate when to prefer this over update_responsive_search_ad, but the create-vs-update split is implied by the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_create_uet_tagCreate a Microsoft Advertising UET tagAIdempotentInspect
Create a UET tag, the tracking snippet Microsoft Advertising needs on your website to record conversions. This only creates the tag and returns its id and the snippet; it does NOT install it on the site, which is a change to the website someone must make. One tag can serve all goals. Names must be unique for the customer. Use dryRun to review.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Tag name, up to 100 characters. | |
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| description | No | Optional note, e.g. which site it is for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover non-destructive/idempotent/openWorld safety, and the description adds genuinely new context: the tag is not installed on the site, the caller must do that separately, and the return value is the id plus snippet. It doesn't discuss required permissions or rate limits, so not a 5.
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?
Front-loads the definition and the scope limitation, then tacks on constraints compactly. A few clauses are compressed into a slightly run-on list, but no sentence is 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?
With no output schema, the description compensates by saying exactly what comes back (id and snippet). For a four-parameter, single-required-field tool with full schema coverage, nothing an agent needs to call it correctly is missing.
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% and the description still contributes meaning: the uniqueness constraint on 'name' and the review-only intent of dryRun. Account scoping is left entirely to the schema, which is acceptable at full coverage.
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?
Names a specific verb and resource (create a UET tag) and defines what a UET tag is in one clause, which separates it from siblings like msads_create_conversion_goal. It also states the scope boundary explicitly: it creates the tag but does not install it.
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?
'Use dryRun to review' and 'Names must be unique for the customer' give concrete preconditions and a review path. It does not name an alternative sibling (e.g. msads_get_conversion_tracking for reading existing tags), so it falls short of explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_account_statusMicrosoft Advertising account statusARead-onlyInspect
The account's standing: lifecycle status (Active, Pause, ...), any pause reason code, financial status, account mode, payment method type, and when and by whom it was last modified, plus a short needsAttention list. Use it when asked whether the account is in good standing or why ads aren't serving. It cannot read advertiser identity verification, change history, the diagnostics widget or invoices: those are only in the Microsoft Advertising UI, and the result lists them under cannotRead so you can say so. For why a campaign is paused, see msads_get_campaigns (statusMeaning) and msads_get_import_jobs.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, openWorld), so the description's added value is the disclosure of blind spots — advertiser identity verification, change history, diagnostics widget, invoices — and the cannotRead mechanism in the result, which lets the agent explain the gap instead of guessing. It stops short of noting auth/scope requirements or latency, so not a 5.
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?
Front-loaded with the returned fields, then the usage trigger, then exclusions and sibling routing — a sensible order. The field enumeration is somewhat dense but each item maps to a real answer the agent would need to quote, so little 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?
With no output schema, the description carries the return-value burden and does so: it names the fields returned and the cannotRead list, and it explains which adjacent questions belong to sibling tools. An agent has enough to call it and to interpret the response without opening anything else.
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 single accountId parameter is fully documented in the schema (100% coverage), including the format example and the 'only needed when the sign-in can reach more than one account' condition. The description adds nothing about it, which is acceptable at this coverage level but earns only 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?
States a specific resource and enumerates exactly what is returned: lifecycle status, pause reason code, financial status, account mode, payment method type, last-modified metadata, and a needsAttention list. This is clearly distinguishable from msads_list_accounts (enumeration) and msads_get_campaigns (campaign-level pause reasons).
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?
Gives an explicit trigger ('Use it when asked whether the account is in good standing or why ads aren't serving') and explicitly routes the adjacent question to alternatives: msads_get_campaigns (statusMeaning) and msads_get_import_jobs for campaign-level pause reasons. It also carves out what this tool cannot answer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_ad_extensionsList Microsoft Advertising ad extensionsARead-onlyInspect
List ad extensions (sitelinks, callouts, structured snippets, calls, prices, promotions). With no campaignId or adGroupId this is the account's whole extension library; with one, only the extensions attached to it (ad group attachments override campaign ones). Each extension is shown in one flat shape: id, type, status and its text. An extension in the library that is attached to nothing does not serve.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most rows to return (default 100, max 500). | |
| types | No | Only these extension types. Default: all six. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| adGroupId | No | Only extensions attached to this ad group (wins over campaignId). | |
| campaignId | No | Only extensions attached to this campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe read-only operation, and the description adds useful behavioral context about library versus attachment scope, flat return shape, and the fact that unattached extensions do not serve. It does not discuss rate limits or ordering, but it goes meaningfully 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 four tight sentences, front-loaded with the core action and then adding scope and return-shape context. Every sentence earns its place without repetition 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?
For a read-only list tool with full schema coverage and no output schema, the description provides enough context: what is listed, how scoping works, what fields are returned, and that unattached extensions do not serve. Only minor operational details such as result ordering or pagination behavior are left implicit.
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%, so each parameter is already documented in the schema, including the adGroupId-over-campaignId precedence. The description reinforces the no-ID versus ID-based scoping model, but most parameter meaning is already carried by the schema, making the baseline 3 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 uses a specific verb and resource ('List ad extensions') and enumerates the extension types, so the tool's purpose is immediately clear. It does not explicitly name sibling tools such as msads_add_ad_extensions or msads_set_ad_extension_attachment, but the list/read nature 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?
It clearly explains the key usage branches: no campaignId/adGroupId returns the account-wide extension library, while supplying either filters to attached extensions. It also notes that ad group attachments override campaign ones, which helps an agent choose parameters, though it stops short of naming alternative tools or explicit when-not scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_ad_group_performanceMicrosoft Advertising ad group performanceARead-onlyInspect
Ad group performance for a date range (optionally one campaign): impressions, clicks, CTR, average CPC, cost, conversions and cost per conversion, highest spend first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most rows to return, highest spend first (default 50, max 500). | |
| endDate | No | YYYY-MM-DD. Omit for yesterday. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| startDate | No | YYYY-MM-DD. Omit for the last 30 days. | |
| campaignId | No | Only this campaign (id from msads_get_campaigns). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds the output metric set and 'highest spend first' ordering, but says nothing about return volume, truncation when limit is hit, or multi-account behavior (accountId required only when the sign-in reaches multiple accounts is buried in the schema, not the description).
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 dense sentence, front-loaded with the resource and scope before the metric list. It is efficient, though the metric enumeration is slightly long and pushes the ordering note to the end rather than leading with it.
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?
With no output schema, the description usefully enumerates the returned metrics, which is the key thing an agent needs to know. Defaults and formats live in the fully-described schema, and annotations cover safety. Only missing pieces are truncation/limit-hit behavior and multi-account scoping, which are minor for a read-only 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 all five parameters (limit, startDate, endDate, accountId, campaignId) are fully documented with defaults and formats in the schema. The description only reconfirms the date-range and optional-campaign dimensions without adding format, default, or edge-case meaning beyond the schema. Baseline 3 applies.
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?
States a specific resource (ad group performance) and enumerates the exact metrics returned (impressions, clicks, CTR, average CPC, cost, conversions, cost per conversion), plus implicit scope (date range, optional campaign) and ordering. An agent can distinguish it from msads_get_campaign_performance or msads_get_keyword_performance only by inference from the resource noun; no sibling is named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the scope phrase 'optionally one campaign' and the date-range mention. There is no explicit when-to-use-this-vs-alternatives guidance, and no mention of when the campaignId filter should be applied versus aggregating across the account.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_ad_groupsList Microsoft Advertising ad groupsARead-onlyInspect
List a campaign's ad groups: id, name, status, default CPC bid, network and language. Structure only - use msads_get_ad_group_performance for results.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| campaignId | Yes | Campaign id, from msads_get_campaigns. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful scoping context by declaring the result is 'structure only' and excludes metrics, but says nothing about pagination, result caps, or ordering—relevant for a listing call against an openWorld API.
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, zero filler, with the returned-field list first and the disambiguation rule second. Every clause carries information an agent needs to select and scope the call.
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?
There is no output schema, so the description correctly compensates by enumerating the returned fields and flagging the absence of performance data. Combined with 100% schema coverage and read-only annotations, an agent has what it needs; only pagination/ordering behavior is left unstated.
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 both accountId and campaignId documented in the schema including provenance (from msads_list_accounts / msads_get_campaigns). The description's phrase 'a campaign's ad groups' reinforces that campaignId scopes the call but adds no format or edge-case detail beyond the schema. Baseline 3 applies.
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?
States a specific verb and resource ('List a campaign's ad groups') and enumerates the returned fields (id, name, status, default CPC bid, network, language), so the agent knows exactly what this returns. It is clearly separable from msads_get_ad_group_performance, which it explicitly names.
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 second sentence gives an explicit routing rule: this tool is structure only, and msads_get_ad_group_performance should be used for results. That is a clear context signal with a named alternative, though it does not spell out the reverse case (when performance alone is insufficient and both calls are needed).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_adsList Microsoft Advertising adsARead-onlyInspect
List an ad group's ads: id, type, status, final URLs and the ad text (headlines and descriptions for responsive search ads; title parts and text for expanded and text ads).
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| adGroupId | Yes | Ad group id, from msads_get_ad_groups. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds real value beyond that by spelling out what the response contains (id, type, status, final URLs, and ad-text fields per ad type), which matters because there is no output schema. Pagination/result-limit behavior is still undisclosed.
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 front-loaded sentence with the resource and scope first, followed by the field list. The parenthetical is dense but every item in it earns its place given the absence of an output schema.
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?
With no output schema, the description carries the return-value burden and does so credibly by naming the returned fields and differentiating responsive search ads from expanded and text ads. Missing are result-count limits, pagination, and whether all ads in the group are returned, which keeps it from a 5.
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% and both parameters are documented there, including the optional accountId's conditional requirement and the source of adGroupId. The description adds only the implied ad-group scoping and no syntax or format detail, so the baseline of 3 applies.
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?
States a specific verb and resource ('List an ad group's ads') and enumerates exactly which fields come back, which lets an agent distinguish it from msads_get_ad_groups, msads_get_keywords and the create_* tools. It stops short of explicitly naming a sibling it is not, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the phrase 'an ad group's ads' signals that this is a scoped read requiring an ad group context, and the schema notes adGroupId comes from msads_get_ad_groups. There is no explicit when-to-use vs. when-not guidance and no mention of when to prefer performance-oriented siblings such as msads_get_ad_group_performance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_budgetsList Microsoft Advertising shared budgetsARead-onlyInspect
List the account's SHARED budgets: id, name, daily amount, and how many campaigns draw on each. A campaign on a shared budget shows a budgetId in msads_get_campaigns and its own daily budget cannot be changed separately. Campaigns with their own budget are not listed here.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real domain semantics beyond that: a shared-budget campaign's own daily budget cannot be changed separately, which explains downstream behavior of the data being returned. No mention of result limits or pagination, so not a 5.
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?
Three sentences, front-loaded with the verb and the returned field set, then the disambiguation and the exclusion. No repetition of the title and no 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?
There is no output schema, and the description compensates by naming the returned fields (id, name, daily amount, campaign count) and how they relate to campaign records. It stops short of describing ordering, pagination, or behavior for very large accounts, which leaves a small gap for a listing tool with openWorldHint.
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% and the single accountId parameter is already fully documented in the schema, including its optionality and format. The description adds no parameter-level meaning, so the baseline 3 applies.
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?
States a specific verb and resource ('List the account's SHARED budgets') and immediately enumerates the returned fields. It explicitly differentiates itself from the campaign-level budget picture by saying campaigns with their own budget are not listed here and pointing to msads_get_campaigns for the budgetId.
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?
Clear on what this covers and what it excludes ('Campaigns with their own budget are not listed here'), which tells the agent when not to reach for it. It does not name the sibling to use for editing shared budget amounts (msads_set_shared_budget_amount) or for creating one, so the routing is only half-explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_campaign_performanceMicrosoft Advertising campaign performanceARead-onlyInspect
Campaign performance for a date range: impressions, clicks, CTR, average CPC, cost (in the account's currency), conversions, conversion value and cost per conversion, highest spend first. byDay: true returns one row per campaign per day instead of one per campaign. Microsoft generates this as an async report, which usually takes a few seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| byDay | No | One row per campaign per day (default: one row per campaign for the whole range). | |
| limit | No | Most rows to return, highest spend first (default 50, max 500). | |
| endDate | No | YYYY-MM-DD. Omit for yesterday. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| startDate | No | YYYY-MM-DD. Omit for the last 30 days. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=true), so the bar is lower, and the description still adds real operational context: the report is generated asynchronously and 'usually takes a few seconds', cost is returned in the account's currency, and rows are sorted highest spend first. It does not state whether the report is paginated beyond the limit or whether an async poll timeout is possible.
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 tight paragraph, front-loaded with the resource and its metric list, followed by the byDay variant and the async-cost warning. The long metric enumeration earns its place because there is no output schema to describe the return shape.
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?
With no output schema, the description correctly compensates by listing the returned metrics, and it also flags the async latency. Date defaults and row caps are covered by the schema, so little is missing; only the choice against the non-msads 'get_campaign_performance' sibling is unaddressed.
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 all five parameters (byDay, limit, endDate, accountId, startDate) are already fully documented with defaults, formats and ranges; that sets the baseline at 3. The description restates byDay behavior ('one row per campaign per day instead of one per campaign') and the spend ordering but adds no syntax or constraint detail beyond the schema itself.
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 states a specific verb and resource ('Campaign performance for a date range') and enumerates the exact metrics returned (impressions, clicks, CTR, CPC, cost, conversions, conversion value, cost per conversion), so an agent knows precisely what it gets. The gap is sibling differentiation: it never distinguishes itself from the other campaign-level tools in the list, notably 'get_campaign_performance' and 'msads_get_campaigns', which an agent could easily confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied through the metric list and the note that results are ordered by highest spend; there is no explicit when-to-use statement or exclusion against 'msads_get_campaigns' (entity listing) or the generic 'get_campaign_performance'. The 'byDay' sentence clarifies one variant behavior but not when to choose it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_campaignsList Microsoft Advertising campaignsARead-onlyInspect
List campaigns for an account: id, name, status, type, daily budget and bidding scheme. Structure only (no performance metrics) - use msads_get_campaign_performance for spend and results.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint and non-destructive, so safety is covered. The description's real contribution is the field inventory and the 'no performance metrics' constraint, but it says nothing about pagination, result ordering, or whether archived/paused campaigns are included.
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 tight sentences with zero padding: the payload description comes first, then the exclusion and the alternative. Every clause carries information an agent would otherwise have to guess.
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?
With no output schema, the field list is what makes the return shape predictable — that gap is closed well. Small residual gap: nothing states result volume, filtering, or ordering, which matters for a list tool on a single account.
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?
Only one parameter and schema coverage is 100% — the schema already explains the account id format, the msads_list_accounts reference, and the conditional-requirement rule. The description adds nothing parameter-specific, so the baseline 3 applies.
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?
States a specific verb and resource ('List campaigns for an account') and enumerates exactly which fields come back (id, name, status, type, daily budget, bidding scheme). It also pre-empts confusion with the similarly named performance sibling, so an agent can route without opening a schema.
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?
Explicitly scopes the tool to structural data and names the alternative (msads_get_campaign_performance) for spend and results, which is a genuine when-to-use rule. It stops short of covering other routing cases, such as how it relates to the generic get_campaigns sibling or when the optional accountId can be omitted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_conversion_trackingList Microsoft Advertising conversion goals and UET tagsARead-onlyInspect
List the conversion goals (what counts as a conversion: a page visit, an event, time on site, and so on, with its status, count type and value) and the UET tags that feed them, including each tag's tracking status. Use this to find out why conversions are missing: a goal that is paused, or a tag that is not recording, shows here. Conversion numbers themselves are in msads_get_campaign_performance.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=true), so the bar is lower. The description nonetheless adds real behavioral value: it enumerates the fields returned and frames the tool as a diagnostic for missing conversions. It does not mention pagination or result-size behavior, which keeps it short of a 5.
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 core action and scope are front-loaded in the first sentence, with the diagnostic purpose and the alternative tool after it. The parenthetical examples ('a page visit, an event, time on site') earn their place by defining what a conversion goal can be. No 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?
There is no output schema, but the description compensates by enumerating the returned data (goal status, count type, value, tag tracking status). Combined with the full schema coverage on the only parameter and clear annotations, an agent has everything needed to call 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?
Schema description coverage is 100% and the single accountId parameter is fully documented in the schema (including the conditional 'only needed when the sign-in can reach more than one account'). The description adds nothing about the parameter, so the baseline of 3 applies.
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?
States a specific verb (List) and two named resources (conversion goals, UET tags), plus what each record contains (status, count type, value, tag tracking status). It is clearly separable from the write-side siblings (msads_create_conversion_goal, msads_set_conversion_goal_status) and from the reporting sibling it points at.
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?
Gives an explicit diagnostic use case ('use this to find out why conversions are missing') with the concrete signals to look for (paused goal, tag not recording), and routes numeric conversion reporting to msads_get_campaign_performance by name. Both when-to-use and where-to-go-instead are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_import_jobsList Microsoft Advertising Google Ads importsARead-onlyInspect
List the Google Ads import jobs set up on the account: name, status, schedule, last run, who created it, which Google account it reads, and which settings it syncs (campaign status, budgets, bids, locations, deletions), with a plain-English effects list. Use it when a campaign changed or was paused and nobody did it: a scheduled import that syncs status copies a Google Ads pause across at its next run. Only Google Ads imports are listed, not file imports.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=true), and the description adds genuine behavioral context beyond them: it explains that a scheduled import can copy a Google Ads pause onto Microsoft Advertising at its next run, which is a side effect the agent could not infer from annotations. It omits auth requirements and how to interpret job status values, so it is not exhaustive.
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?
Front-loaded with the verb and resource, then the return fields, then the usage trigger — a sensible information order with no filler. The second sentence is long and carries two ideas (the diagnosis scenario and the scheduled-import side effect), but both earn their place.
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?
With no output schema, the description compensates by listing the returned fields (name, status, schedule, last run, creator, source Google account, synced settings) plus the plain-English effects list. What is missing is minor: pagination behavior and what status values are possible, but neither blocks correct invocation of a zero-required-parameter list 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%, and the single accountId parameter is fully documented in the schema including the example format and the 'only needed when the sign-in can reach more than one account' condition. The description adds nothing about the parameter, so the baseline 3 for high-coverage schemas applies.
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?
States a specific verb and resource ('List the Google Ads import jobs set up on the account') and immediately enumerates the returned fields, so the agent knows exactly what comes back. It also draws an explicit boundary against a near-miss interpretation ('Only Google Ads imports are listed, not file imports'), which separates it from any file-import 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?
Provides a concrete triggering scenario: 'Use it when a campaign changed or was paused and nobody did it,' which is a real diagnostic path an agent can act on. It does not name a specific alternative tool (e.g. msads_get_campaigns or list_google_ads_links) for the case where the agent wants the link config rather than the job list, so it stops short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_keyword_ideasMicrosoft Advertising keyword ideasARead-onlyInspect
Keyword ideas for up to 20 seed words or phrases, each with average monthly searches (and the 12 monthly counts), Microsoft's suggested bid, competition and relevance, highest volume first. Needs Microsoft's numeric locationIds (from its Geographical Location Codes list), because volumes are per location. Microsoft's docs list keyword ideas as available for the United States, United Kingdom, Canada, Australia, France and Germany. Volumes are estimates and lag by up to about three days.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most rows to return (default 100, max 500). | |
| queries | Yes | Seed words or phrases, e.g. ['coffee subscription']. | |
| language | No | Language name as Microsoft spells it, e.g. English, French, German. | English |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| locationIds | No | Microsoft location ids to size volume for. Required on a connected account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotations, it discloses output ordering (highest volume first), the returned fields (avg monthly searches, 12 monthly counts, suggested bid, competition, relevance), and a data-freshness caveat that volumes are estimates lagging about three days. That freshness/estimation behavior is exactly the kind of thing an agent cannot infer from 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?
Four compact sentences, front-loaded with capability then constraints then caveats, with essentially no filler. The market-availability sentence is dense but each clause carries information the agent needs.
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?
With no output schema, the description fully compensates by enumerating returned fields, sort order, and freshness semantics, and it flags the location requirement and market limits. Nothing an agent needs to call this correctly — aside from sibling routing — is missing.
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%, so baseline is 3; the description earns more by explaining where locationIds come from (Microsoft's Geographical Location Codes list) and why multiple locations change results, which the schema only hints at with 'Required on a connected account.' It does not add anything on limit or language 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?
Opens with a specific verb+resource ('keyword ideas') and names the exact inputs (up to 20 seed words) and returned metrics, so an agent can tell this is a research/discovery tool rather than a keyword-listing tool like msads_get_keywords. It never names a sibling alternative, which keeps it just short of a 5.
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 concrete usage precondition — locationIds must be Microsoft's numeric ids because volumes are per location — and states the supported markets (US, UK, CA, AU, FR, DE), which tells the agent when this call is viable. There is no explicit 'use X instead' routing against generate_keyword_ideas or bing_keyword_research.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_keyword_performanceMicrosoft Advertising keyword performance and quality scoreARead-onlyInspect
Keyword performance for a date range (optionally one campaign): match type, quality score (1-10) with its expected CTR, ad relevance and landing page experience ratings, current max CPC bid, and impressions, clicks, CTR, average CPC, cost and conversions, highest spend first. Quality score is null for keywords with too little traffic to score.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most rows to return, highest spend first (default 50, max 500). | |
| endDate | No | YYYY-MM-DD. Omit for yesterday. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| startDate | No | YYYY-MM-DD. Omit for the last 30 days. | |
| campaignId | No | Only this campaign (id from msads_get_campaigns). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/openWorld/destructive=false, so the safety profile is covered. The description adds a genuinely useful behavioral fact the annotations don't carry: quality score is null for keywords with too little traffic, which prevents the agent from misreading nulls as errors. It does not mention pagination or how many rows are returned before the limit applies.
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 dense sentence, front-loaded with scope before metrics, with the null caveat trailing as a separate sentence. The metric enumeration is long but each item is a real return field the agent would otherwise have to guess at, given there is no output schema.
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?
With no output schema, the description must describe return shape, and it does so field by field including the quality-score sub-ratings and the null case. Defaults and account resolution live in the schema, so nothing essential is missing; only pagination/row-count behavior is left implicit.
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%, so all five parameters — including date defaults, accountId sourcing, and the campaignId provenance — are already documented in the schema. The description only echoes "optionally one campaign" and the highest-spend ordering. Baseline 3 is correct where the schema carries the load.
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 names a specific resource (keyword performance) and enumerates exactly what comes back — match type, quality score with component ratings, bid, and the standard metric set. That is well past tautology and clearly distinct from a plain keyword-list tool. It stops short of naming the sibling it differs from (msads_get_keywords, msads_get_ad_group_performance), leaving the agent to infer the level of granularity.
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?
"For a date range (optionally one campaign)" implies the scoping context, and the "highest spend first" framing hints at the analysis use case. There is no explicit when-to-use versus msads_get_keywords or msads_get_ad_group_performance, and no stated preconditions. Usage is inferable but not guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_keywordsList Microsoft Advertising keywordsARead-onlyInspect
List an ad group's keywords: id, text, match type, status and the keyword's own bid (null = inherits the ad group's). Quality score is NOT part of the keyword record in Microsoft's API - use msads_get_keyword_performance, which reports quality score and its three components.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| adGroupId | Yes | Ad group id, from msads_get_ad_groups. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered; the description adds valuable non-obvious semantics — that a null bid means inheritance from the ad group, and that quality score is absent from the record. It does not mention pagination, result caps, or ordering, which a list tool would ideally disclose.
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, zero filler, with the field list front-loaded and the sibling redirect placed last as a pointer. Every clause carries information an agent cannot get from the schema.
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?
With no output schema, the description correctly compensates by naming the returned fields and the null-bid semantics. The only gap is result volume behavior (pagination/truncation) for what may be a long keyword list, which is not addressed anywhere.
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% and both parameters (accountId, adGroupId) already document their source tools and when accountId is needed. The description adds nothing about parameters, so the baseline 3 applies — the schema does the heavy lifting.
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?
States a specific verb and resource ('List an ad group's keywords') and enumerates the exact fields returned (id, text, match type, status, bid). It also pre-emptively separates itself from msads_get_keyword_performance, so an agent can distinguish the two without opening either schema.
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?
Explicitly names the sibling tool that should be used instead when quality score is needed, which is a real and non-obvious routing decision in this API (quality score is not on the keyword record). This is the when-not/alternative pattern done correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_location_performanceMicrosoft Advertising location performanceARead-onlyInspect
Performance by the geographic location of the searcher (country and city) for a date range, optionally one campaign: impressions, clicks, CTR, average CPC, cost and conversions, highest spend first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most rows to return, highest spend first (default 50, max 500). | |
| endDate | No | YYYY-MM-DD. Omit for yesterday. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| startDate | No | YYYY-MM-DD. Omit for the last 30 days. | |
| campaignId | No | Only this campaign (id from msads_get_campaigns). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the sort order (highest spend first), which matters for interpreting truncated results, but says nothing about truncation behavior, row limits, or empty-result handling beyond the schema.
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?
One dense, front-loaded sentence: geography scope first, then time scope, then optional filter, then metrics and sort. No filler, though packing the whole metric list into the sentence makes it slightly run-on.
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?
There is no output schema, so the description usefully enumerates the returned metrics (impressions, clicks, CTR, average CPC, cost, conversions) and declares sort order. Combined with full schema coverage of the five optional parameters, an agent has enough to call it; only result-shape details such as grouping granularity are left implicit.
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 date formats, defaults, account id format and the campaign id source are all already documented. The description only restates the date range and optional campaign scoping, adding no semantics beyond the schema; baseline 3 applies.
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?
States a specific verb+resource+dimension: performance broken down by searcher geography (country and city) for a date range, optionally scoped to one campaign. That is distinguishable from msads_get_campaign_performance or msads_get_keyword_performance, though siblings are never named explicitly.
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 phrase 'optionally one campaign' and 'for a date range' imply the filtering use case, and the metric list implies a reporting/analysis use case. But there is no explicit when-to-use guidance and no routing away from sibling performance tools such as msads_get_campaign_performance or msads_get_ad_group_performance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_negative_keywordsList Microsoft Advertising negative keywordsARead-onlyInspect
List the negative keywords on a campaign, or on one of its ad groups when adGroupId is given: id, text and match type. Negatives block searches; check these before adding more with msads_add_negative_keywords or when wondering why a search term gets no traffic. Shared negative keyword lists are not included.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| adGroupId | No | Ad group id. Omit for the campaign's own negatives. | |
| campaignId | Yes | Campaign id, from msads_get_campaigns. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds real value beyond that: it discloses the exact returned fields and the important limitation that shared negative keyword lists are out of scope. It does not mention pagination or result limits, which keeps it short of a 5.
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?
Three tight sentences: scope first, returned fields second, usage trigger and exclusion last. Every clause carries information an agent would otherwise have to infer, and nothing is redundant.
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, three-parameter listing tool with no output schema, the description compensates well by naming the returned fields and the out-of-scope shared lists. Combined with annotations covering the safety profile, an agent has everything needed to call 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?
Schema description coverage is 100%, so campaignId, adGroupId and accountId are already fully documented, including the 'omit for the campaign's own negatives' rule. The description's note that ad groups are listed 'when adGroupId is given' largely restates the schema rather than adding new semantics, so the baseline of 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?
States a specific verb and resource (list negative keywords), the two scopes (campaign vs. ad group via adGroupId), and the exact fields returned (id, text, match type). It also explicitly bounds scope by excluding shared negative keyword lists, so an agent can tell it apart from msads_get_keywords and msads_add_negative_keywords without opening the schema.
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?
Gives concrete triggers for calling it — before adding more negatives, and when diagnosing a search term with no traffic — and names the sibling it pairs with (msads_add_negative_keywords). The exclusion of shared negative keyword lists prevents an agent from assuming coverage it does not have.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_search_termsMicrosoft Advertising search termsARead-onlyInspect
The search queries that triggered ads, for a date range (optionally one campaign): the query, the keyword and match type that matched it, and impressions, clicks, CTR, cost and conversions, highest spend first. Use it to find wasted spend (cost with no conversions) and new keyword ideas.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most rows to return, highest spend first (default 50, max 500). | |
| endDate | No | YYYY-MM-DD. Omit for yesterday. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| startDate | No | YYYY-MM-DD. Omit for the last 30 days. | |
| campaignId | No | Only this campaign (id from msads_get_campaigns). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral context by listing returned metrics and stating results are ordered highest spend first, though it does not discuss pagination or limits beyond the schema.
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 tight sentences, front-loaded with what the tool returns and followed by a concrete usage suggestion. No filler or redundancy.
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 reporting tool with no output schema, the description adequately lists the returned fields and purpose, while the schema covers all parameters. It could be more complete by differentiating from the sibling get_search_terms and noting pagination behavior, but nothing essential for correct invocation is missing.
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%, and the schema documents all five parameters including defaults, date formats, and account/campaign sourcing. The description only echoes the date range, optional campaign scope, and spend ordering, adding little 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 states a specific resource—search queries that triggered ads—and enumerates the returned fields and scope (date range, optional campaign). It is clear what the tool does, but it does not explicitly distinguish itself from the sibling get_search_terms or name Microsoft Advertising in the body.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear actionable use cases: finding wasted spend (cost with no conversions) and new keyword ideas. However, it does not state when not to use it or name alternatives such as msads_get_keyword_performance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_get_targetingList Microsoft Advertising targeting and bid adjustmentsARead-onlyInspect
List a campaign's targeting (locations, radius, device, day and time, age, gender), or an ad group's when adGroupId is given, with each criterion's bid adjustment in percent (+20 = bid 20% more, -100 on a device = excluded) and whether it is an exclusion. A type with nothing set has no restriction. Ad group targeting of a type overrides the campaign's.
| Name | Required | Description | Default |
|---|---|---|---|
| types | No | Only these criterion types. Default: all. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| adGroupId | No | Ad group id: read the ad group's own targeting instead. | |
| campaignId | Yes | Campaign id, from msads_get_campaigns. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only/non-destructive/open-world; the description adds real behavioral content beyond that: bid adjustment semantics ('+20 = bid 20% more, -100 on a device = excluded'), an exclusion flag, 'a type with nothing set has no restriction', and the campaign-vs-ad-group override rule. It stops short of describing result shape or volume, but the interpretation guidance is substantive.
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?
Three sentences, the primary purpose and scope front-loaded, followed by result interpretation and one inheritance rule. No filler, no restating of the title.
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 4-parameter list tool with an output-schema-free response, the description covers what is returned (criteria + bid adjustment + exclusion flag) and the campaign/ad-group precedence. Only pagination or result-size expectations are missing.
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%, so the schema already documents types, accountId, adGroupId and campaignId, establishing a baseline of 3. The description reinforces the key semantic that adGroupId redirects the read to ad group-level targeting and adds the override relationship between the two levels, giving it a slight edge over 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?
States a specific verb ('List') and resource ('targeting and bid adjustments') and enumerates the criterion types covered (locations, radius, device, day/time, age, gender). It also clarifies the two resource modes — campaign by default, ad group when adGroupId is given — which cleanly separates it from siblings like set_campaign_targeting, msads_set_bid_adjustment, and msads_get_campaign_criteria.
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?
'...or an ad group's when adGroupId is given' tells the agent the exact condition that switches the read target. However, it never names the alternative tool for changing targeting (set_campaign_targeting) or for filtering criteria, leaving write-vs-read routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_list_accountsList Microsoft Advertising accountsARead-onlyInspect
List the Microsoft Advertising accounts this connection can read: account id, name, account number, currency, time zone and status. Use the accountId with the other msads_ tools when there is more than one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so safety is covered. The description adds genuinely new behavioral context by scoping results to accounts 'this connection can read', signaling that the list is permission-filtered rather than a global directory, and it enumerates the returned fields in lieu of an output schema.
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, both front-loaded with the useful information: what is listed and what fields come back, then the downstream usage rule. No filler, no repetition of the title.
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 tool with no output schema, the description carries the return-value burden and does so by naming the fields. Minor gaps remain: ordering of results, behavior on an empty or single-account connection, and whether paging applies.
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 takes zero parameters, so there is nothing to disambiguate and the baseline is 4. The only identifier mentioned (accountId) is explicitly framed as an input to other tools, not to this one, so no confusion is introduced.
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?
Specific verb + resource ('List the Microsoft Advertising accounts') plus the exact fields returned (id, name, account number, currency, time zone, status). It also positions itself against the sibling msads_ tools by explaining that the returned accountId feeds them, so an agent can tell what this tool is for without opening anything else.
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 second sentence gives a clear trigger: use the accountId with the other msads_ tools when more than one account exists, which implies calling this first to resolve the account. It stops short of an explicit 'call this before any other msads_ tool' instruction or stating what to do with the result when only one account is returned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_remove_negative_keywordsRemove Microsoft Advertising negative keywordsADestructiveIdempotentInspect
Remove negative keywords from a campaign (or an ad group when adGroupId is given), so ads can show for those searches again. Match them by text; add matchType to remove only that match type. Removing negatives can increase traffic and spend. Returns exactly what was removed so it can be put back with msads_add_negative_keywords. Use dryRun first when unsure.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| keywords | Yes | The negative keyword texts to remove. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| adGroupId | No | Ad group id: remove the ad group's own negatives instead. | |
| matchType | No | Only remove negatives with this match type. | |
| campaignId | Yes | Campaign id, from msads_get_campaigns. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is known; the description adds real value on top by warning that removals 'can increase traffic and spend' and by promising the response echoes exactly what was removed so it can be re-added. It does not spell out behavior for text matches that hit more than one negative, a small remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each doing distinct work: effect, scoping/matching, consequence, and reversibility. The scope rule and the dryRun advice are front-loaded where an agent will hit them first.
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?
There is no output schema, and the description compensates by stating that the response returns exactly what was removed. Combined with spend-warning, dryRun guidance, and undo path, an agent has everything needed to call this destructive tool safely.
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 dryRun, matchType, accountId, and the rest; baseline 3 applies. The description restates matchType and adGroupId semantics but adds no syntax or format detail beyond what the schema 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?
States a specific verb and resource ('Remove negative keywords') plus the scope variant: campaign-level by default, ad-group-level when adGroupId is given. That also cleanly distinguishes it from its sibling msads_add_negative_keywords, which is named later as the inverse.
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?
Gives concrete routing conditions: use adGroupId to target an ad group's own negatives, add matchType to narrow to one match type, and 'Use dryRun first when unsure' with an explicit prerequisite. It also names the recovery path (msads_add_negative_keywords), so the agent knows both when to invoke and how to undo.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_set_ad_extension_attachmentAttach or detach Microsoft Advertising extensionsADestructiveIdempotentInspect
Attach library extensions to a campaign or an ad group (they start serving there), or detach them (they stop serving there and stay in the library). Use ids from msads_get_ad_extensions. Attaching to an ad group overrides what the campaign has. Use dryRun first when unsure.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | attach = start serving, detach = stop serving. | |
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| adGroupId | No | The ad group to attach to or detach from (wins over campaignId). | |
| campaignId | No | The campaign to attach to or detach from. | |
| extensionIds | Yes | Extension ids, from msads_get_ad_extensions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety bar is lower, but the description adds genuinely non-obvious semantics: detaching leaves the extension in the library rather than deleting it, and ad group attachment overrides campaign-level attachment. It does not discuss spend impact beyond the dryRun note or what a batch of 100 ids returns.
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?
Four short sentences, zero waste, with the core attach/detach semantics and the resulting serving effect front-loaded before the operational hints.
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?
A destructive, batch-capable mutation tool with no output schema is adequately covered: action meaning, id sourcing, dryRun escape hatch, and override rule are all present. Only the absence of any statement about return/error behavior for partial batch failures keeps it below 5.
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% and every parameter already carries a description, including the dryRun preview semantics and the adGroupId-wins-over-campaignId precedence. The description's only additive parameter note is the sourcing of extensionIds, which the schema also states, so baseline 3 applies.
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?
Specific verb pair (attach/detach) plus precise resource (library extensions) and target (campaign or ad group), with an explicit statement of the resulting behavior ('they start serving there'). Clearly separable from msads_add_ad_extensions (creation) and msads_get_ad_extensions (lookup).
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?
Routes the agent to msads_get_ad_extensions for ids and advises 'Use dryRun first when unsure', plus the precedence rule that ad group attachment overrides campaign. Strong contextual guidance, though it never states when this tool is the wrong choice versus sibling tools like msads_add_ad_extensions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_set_ad_group_bidChange a Microsoft Advertising ad group bidADestructiveIdempotentInspect
Set an ad group's default max CPC bid, used by every keyword in it that has no bid of its own. A change that more than doubles the current bid is refused unless allowLargeChange is true. Returns the previous bid so it can be undone. Use dryRun first when unsure. Keyword and ad group bids steer delivery under Manual or Enhanced CPC bidding; under an automated bid strategy Microsoft may ignore them.
| Name | Required | Description | Default |
|---|---|---|---|
| cpcBid | Yes | New default max CPC bid, in the account's currency (see msads_list_accounts for the currency). | |
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| adGroupId | Yes | Ad group id, from msads_get_ad_groups. | |
| campaignId | Yes | Campaign id, from msads_get_campaigns. | |
| allowLargeChange | No | A change that more than doubles the current value is refused unless this is true. Set it only when the increase is deliberate and the user has confirmed it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructive/idempotent annotations: it discloses the more-than-doubling refusal guard, that the previous bid is returned so the change can be undone, that dryRun is free and cannot affect spend, and that automated bid strategies may make the setting moot. These are exactly the traits an agent needs before mutating live spend.
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?
Four sentences, no filler, and front-loaded: what it sets, then the guardrail, then the return value, then the bidding-strategy caveat. Every sentence carries distinct operational 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?
There is no output schema, and the description compensates by stating the return value (previous bid, for undo). Combined with the dryRun behavior, the large-change guard, and the bid-strategy caveat, an agent has everything needed to call this correctly on a destructive spend-mutating 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 coverage is 100%, so the baseline is 3, and the description earns a bump by explaining what cpcBid actually means functionally (the inherited default for keywords without their own bid) rather than just repeating the schema. The allowLargeChange and dryRun semantics it mentions are already fully spelled out in the schema, so it adds less there.
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?
States a specific verb, resource and scope: it sets the ad group's *default* max CPC, and immediately explains that this applies to keywords with no bid of their own, which cleanly separates it from msads_set_keyword_bid. An agent can pick between the two without opening either schema.
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?
Gives concrete operating guidance: use dryRun when unsure, and set allowLargeChange only when the increase is deliberate and user-confirmed. It also warns that automated bid strategies may ignore the bid. It does not name msads_set_keyword_bid or msads_set_campaign_budget as alternatives, so sibling routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_set_bid_adjustmentChange a Microsoft Advertising bid adjustmentADestructiveIdempotentInspect
Set a campaign's bid adjustment, in percent (20 = bid 20% more, -20 = 20% less, 0 = none), for a device, a location or a day/time slot. For devices this creates the adjustment if there is none. For a location or a day/time slot only an EXISTING one can be changed (see msads_get_targeting): adding one would also change where or when ads show, which this tool does not do. An adjustment above +100, or -100 on a device (which stops ads on it), needs allowLargeChange. Returns the previous adjustment so it can be restored. Use dryRun first when unsure.
| Name | Required | Description | Default |
|---|---|---|---|
| day | No | For DayTime: the day. | |
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| toHour | No | For DayTime: end hour, 1-24. | |
| fromHour | No | For DayTime: start hour, 0-23. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| criterion | Yes | What the adjustment applies to. | |
| campaignId | Yes | Campaign id, from msads_get_campaigns. | |
| deviceName | No | For Device: Computers, Smartphones or Tablets. | |
| locationId | No | For Location: the Microsoft location id (shown by msads_get_targeting). | |
| allowLargeChange | No | A change that more than doubles the current value is refused unless this is true. Set it only when the increase is deliberate and the user has confirmed it. | |
| adjustmentPercent | Yes | Percent change to bids: 20 = +20%, -20 = -20%, 0 = none. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/openWorld/idempotent, and the description adds real context beyond them: create-vs-update asymmetry per criterion, the +100/-100 thresholds, the stop-ads consequence of -100 on a device, and that the previous value is returned for restoration.
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?
Front-loads the core action and units, then layers the criterion-specific constraints in decreasing priority order. No sentence is redundant; the dryRun advisory closes the note usefully.
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 an 11-parameter mutation tool with no output schema, the description covers units, mode-dependent requirements, safety thresholds, response value, and preview advice — everything needed to call it safely.
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%, so baseline is 3, but the description adds percent semantics (20 = +20%, -20 = -20%, 0 = none) and criterion-conditional requirements that clarify which of the 11 parameters matter in each mode.
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?
States a specific verb and resource (set a campaign's bid adjustment) with the unit and the three criterion types it applies to. An agent can distinguish it from msads_set_keyword_bid or set_campaign_targeting without opening the schema.
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?
Explicitly scopes behavior: devices can be created, location/day-time must already exist (pointing at msads_get_targeting), and adding those would change delivery which this tool does not do. It also advises dryRun when unsure and allowLargeChange only for confirmed deliberate large increases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_set_campaign_budgetChange a Microsoft Advertising campaign's daily budgetADestructiveIdempotentInspect
Set a campaign's daily budget. This directly changes how much the campaign can spend per day. Only campaigns with their own standard daily budget can be changed here: a campaign on a shared budget, or a lifetime or accelerated budget, is refused with an explanation. A change that more than doubles the budget is refused unless allowLargeChange is true. Returns the previous budget so it can be undone. Use dryRun first when unsure. Microsoft treats a daily budget as a target: actual daily spend can run up to about 20% over it.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| campaignId | Yes | Campaign id, from msads_get_campaigns. | |
| dailyBudget | Yes | New daily budget, in the account's currency (see msads_list_accounts for the currency). | |
| allowLargeChange | No | A change that more than doubles the current value is refused unless this is true. Set it only when the increase is deliberate and the user has confirmed it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructive/idempotent/openWorld) by disclosing refusal rules, the doubling guard and allowLargeChange, that the previous budget is returned for undo, and that actual spend can run ~20% over target. These are non-obvious behaviors an agent must know before calling a spend-affecting mutation.
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?
Front-loads the action and effect, then the refusal conditions, the safety valve, the undo affordance, and the spend caveat in that order. Every sentence carries distinct information with no 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?
For a 5-param spend-affecting mutation with no output schema, it covers what happens on refusal, how to preview safely, what is returned, and the real-world spend variance. 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.
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 prose adds real meaning: it explains the allowLargeChange escape hatch and the dryRun preview workflow in context rather than leaving them as bare field docs.
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?
States a specific verb and resource ('set a campaign's daily budget') plus the immediate effect. It is clearly distinguishable from the sibling mutation tools like create_campaign_budget and update_campaign_budget, which would create or rename/adjust rather than set a specific daily value.
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?
Gives concrete preconditions (standard daily budget only; shared/lifetime/accelerated budgets are refused) and explicitly recommends 'Use dryRun first when unsure.' It does not name a sibling as the alternative for the refused cases, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_set_campaign_budget_linkLink or unlink a Microsoft Advertising campaign and a shared budgetADestructiveIdempotentInspect
Move a campaign onto a shared budget (attach), or give it its own daily budget again (detach). Attaching makes the campaign spend from the shared amount, so if that is more than double its current budget it needs allowLargeChange. Detaching needs the campaign's new own dailyBudget. Returns the previous setup so it can be restored. Use dryRun first.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| campaignId | Yes | Campaign id, from msads_get_campaigns. | |
| dailyBudget | No | For detach: the campaign's own daily budget from now on. | |
| sharedBudgetId | No | For attach: the shared budget, from msads_get_budgets. | |
| allowLargeChange | No | A change that more than doubles the current value is refused unless this is true. Set it only when the increase is deliberate and the user has confirmed it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructive/idempotent/openWorld annotations: attaching makes the campaign draw from a shared amount, the >2x guard exists and can be overridden deliberately, detaching requires a replacement budget, and the call returns the prior setup so it can be restored. That is exactly the consequence-and-reversibility information an agent needs before a destructive mutation.
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?
Three tight sentences: the action pair, then each action's prerequisite in the same order, then the return value and the dryRun recommendation. Every sentence carries distinct information with no repetition of schema text.
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?
With no output schema, the description steps in to say the prior configuration is returned, and it covers both branches plus the override condition. Minor gaps remain: what happens to the campaign's own budget on attach, and whether detaching requires the campaign to have been on a shared budget first.
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 already 86%, so 3 would be the baseline. The description earns above that by tying parameters to branches — allowLargeChange to the attach case with the >2x trigger, dailyBudget to detach — and by endorsing dryRun before mutating. It doesn't restate accountId or the budget id sources, which the schema already covers.
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?
States a specific verb and resource — moving a campaign onto or off a shared budget — and separates the two directions (attach/detach) with their effects. It does not name the closest siblings (msads_set_campaign_budget, msads_set_shared_budget_amount), so an agent must infer the boundary from the title rather than from explicit contrast.
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?
Gives clear operational conditions: allowLargeChange is required when the shared amount exceeds double the current budget, and detach needs the campaign's new dailyBudget. It also recommends 'Use dryRun first.' It stops short of saying when to pick this tool over msads_set_campaign_budget or msads_create_shared_budget.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_set_conversion_goal_statusPause or resume a Microsoft Advertising conversion goalADestructiveIdempotentInspect
Turn a conversion goal on (Active) or off (Paused). A paused goal records no conversions, which changes what msads_get_campaign_performance reports and what automated bidding learns from. Returns the previous status. Use dryRun first.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| goalId | Yes | Goal id, from msads_get_conversion_tracking. | |
| status | Yes | ||
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, which already declare the mutation as destructive and idempotent, the description explains that a paused goal records no conversions and affects campaign performance reporting and automated bidding. It also mentions the return value (previous status) and recommends dryRun. This adds useful behavioral context, though it could say more about reversibility or permission requirements.
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 four short, front-loaded sentences. The action is stated first, followed by consequences, return value, and a safety recommendation. Every sentence earns its place with no wasted text.
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 mutation tool with no output schema, the description covers the key behavioral impacts: conversion loss, reporting changes, bidding effects, return value, and dryRun guidance. It does not explicitly address account-scoping (handled by the schema) or permission requirements, leaving a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so the schema already documents most parameters. The description mentions Active/Paused and dryRun, but these are already well covered by the enum and schema descriptions. It adds little parameter-specific meaning beyond what the structured fields provide, so the baseline of 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 states a specific verb and resource: 'Turn a conversion goal on (Active) or off (Paused).' It clearly identifies the object being changed. However, it does not explicitly distinguish this from sibling status-changing tools such as msads_set_status or msads_create_conversion_goal, so it falls short of the perfect sibling differentiation required for a 5.
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 operational recommendation: 'Use dryRun first.' It also explains the consequence of pausing, which helps an agent understand when the tool is appropriate. It does not state when-not to use it or name alternative tools, keeping it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_set_keyword_bidChange a Microsoft Advertising keyword bidADestructiveIdempotentInspect
Set one keyword's own max CPC bid. This changes what the keyword can spend per click. A change that more than doubles the current bid is refused unless allowLargeChange is true. Returns the previous bid so it can be undone. Use dryRun first when unsure. Keyword and ad group bids steer delivery under Manual or Enhanced CPC bidding; under an automated bid strategy Microsoft may ignore them.
| Name | Required | Description | Default |
|---|---|---|---|
| bid | Yes | New max CPC bid, in the account's currency (see msads_list_accounts for the currency). | |
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| adGroupId | Yes | Ad group id, from msads_get_ad_groups. | |
| keywordId | Yes | Keyword id, from msads_get_keywords. | |
| allowLargeChange | No | A change that more than doubles the current value is refused unless this is true. Set it only when the increase is deliberate and the user has confirmed it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the annotations: the >2x guard rail and how to override it, the fact that the previous bid is returned so the change can be undone, the dryRun preview semantics, and the caveat that automated strategies may nullify the bid. These are things an agent could not infer from destructiveHint/idempotentHint alone.
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?
Five short sentences, front-loaded with the core action and effect, then guard rails, then return/undo behavior, then usage advice and the bid-strategy caveat. Nothing is padded or repeated.
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 six-parameter mutation with no output schema, the description covers the action, the guard rail and its override, reversal via returned previous bid, and a safe preview path. An agent has everything needed to call it correctly and safely.
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%, so every parameter including allowLargeChange, dryRun, and currency handling is already fully documented in the schema. The description restates the doubling rule and dryRun but adds no syntax, formatting, or constraint detail beyond what the schema provides, so the baseline 3 applies.
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?
States a specific verb and resource and narrows scope precisely: "Set one keyword's own max CPC bid." The phrase "one keyword's own" distinguishes it from the sibling tools that set ad group (msads_set_ad_group_bid) or campaign-level (msads_set_campaign_budget) values, and "This changes what the keyword can spend per click" nails the effect.
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?
Gives a clear operational instruction ("Use dryRun first when unsure") and a meaningful exclusion condition (bids steer delivery under Manual/Enhanced CPC, but ";under an automated bid strategy Microsoft may ignore them"). It does not explicitly name the sibling alternative for ad-group or campaign-level bid changes, so the routing guidance is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_set_statusPause or resume a Microsoft Advertising campaign, ad group, keyword or adADestructiveIdempotentInspect
Pause or resume one campaign, ad group, keyword or ad. Pausing stops it serving and spending; resuming lets it serve again, which can start spending. Only Active and Paused can be set, and an item whose status is something else (for example paused by the budget) is refused rather than overridden. Returns the previous status so the change can be undone. Use dryRun first when unsure. Needs campaignId for an ad group, and adGroupId for a keyword or ad.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| status | Yes | Active = serving, Paused = stopped. | |
| entityId | Yes | Id of the campaign, ad group, keyword or ad (from the msads_get_* tools). | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| adGroupId | No | Required when entityType is keyword or ad. | |
| campaignId | No | Required when entityType is adGroup. | |
| entityType | Yes | What to change. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by explaining the spend consequences of each direction, the refusal rule for externally-set statuses (e.g. paused by budget), and that the previous status is returned so the change is reversible. This is exactly the mutation-risk context the destructiveHint alone cannot convey.
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?
Five tight sentences, front-loaded with the core action and effect, then constraints, then rollback and dry-run guidance. 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?
With no output schema, the description compensates by stating the return value (previous status) and the refusal semantics. Combined with full schema coverage, an agent has everything needed to call this safely.
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%, so every parameter is already documented, including the same conditional campaignId/adGroupId requirements the description restates. The description adds no format or constraint detail the schema lacks, so baseline 3 applies.
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?
States a specific verb pair (pause/resume) and the exact set of resources it applies to (campaign, ad group, keyword, ad). An agent can immediately distinguish it from bid/budget setters and from generic status updaters in the sibling list.
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?
Gives concrete preconditions: only Active and Paused are accepted, other states are refused rather than overridden, and dryRun should be used when unsure. It does not name a sibling alternative (e.g. the campaign-level update tools), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msads_update_responsive_search_adEdit a Microsoft Advertising responsive search adADestructiveIdempotentInspect
Change a responsive search ad's headlines, descriptions, final URL or display paths. Only what you pass is changed, but a list of headlines or descriptions REPLACES the whole existing list, so send the complete new set. Editing a live ad sends it back for Microsoft's review. Returns the previous text so it can be restored. Use dryRun first.
| Name | Required | Description | Default |
|---|---|---|---|
| adId | Yes | Ad id, from msads_get_ads (must be a responsive search ad). | |
| path1 | No | New first display path. | |
| path2 | No | New second display path. | |
| dryRun | No | Preview only. Microsoft has no validate-only mode, so Caybl reads the current value and shows exactly what would change (before and after) without sending anything. Free, and cannot affect spend. | |
| finalUrl | No | New landing page URL. | |
| accountId | No | Microsoft Advertising account id or account number (e.g. 'F123ABCD'), as listed by msads_list_accounts. Only needed when the sign-in can reach more than one account. | |
| adGroupId | Yes | Ad group id, from msads_get_ad_groups. | |
| headlines | No | 3 to 15 headlines, each up to 30 characters and all different. | |
| descriptions | No | 2 to 4 descriptions, each up to 90 characters and all different. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the destructive list-replacement semantics (partial lists wipe existing values), warns that editing a live ad triggers Microsoft review, states the return value (previous text, so it can be restored), and explains dryRun is free and cannot affect spend. This is exactly the mutation-risk context annotations alone (destructiveHint/idempotentHint) cannot convey.
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?
Four short sentences, front-loaded with what changes, then the replacement caveat, then the review consequence, then the dryRun recommendation. Every sentence carries distinct operational information with no 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?
For a 9-parameter mutation tool with no output schema, the description covers the mutation risk, the review side-effect, the return payload, and the safe-preview path. An agent has everything needed to invoke it responsibly.
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%, so the baseline is 3, and the description earns a bump by clarifying the non-obvious semantics of 'headlines'/'descriptions' as whole-list replacement rather than merge, plus steering to dryRun. It adds no character limits or counts, but those are already in 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?
States a specific verb (Change) and resource (responsive search ad) and enumerates the editable fields: headlines, descriptions, final URL, display paths. This cleanly separates it from msads_create_responsive_search_ad and from status-only siblings like update_ad_status, without the agent needing to open another schema.
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?
Gives explicit operating guidance: use dryRun first, and send the complete new set when passing lists. It does not spell out when to prefer a sibling tool (e.g. update_ad_status for pausing), but the field list implicitly excludes those cases and the dryRun-first instruction is a concrete usage rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pagespeed_auditPageSpeed audit (Lighthouse)ARead-onlyInspect
Run Google PageSpeed Insights (Lighthouse) on one public page right now: performance, SEO, accessibility and best-practices scores (0-100), lab LCP / TBT / CLS, and the top fixes ranked by estimated time saved (e.g. 'Properly size images - save ~1.4 s'), plus the failed SEO and accessibility checks. Also includes the page's real-user field data when Google has it. Takes 10-30 seconds. Use it to explain WHY a page is slow; for whether it's slow for real users, or for many pages at once, use pagespeed_core_web_vitals.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Full public page URL, e.g. 'https://example.com/pricing'. | |
| strategy | No | mobile (default, throttled like a mid-range phone) or desktop. | |
| categories | No | Which Lighthouse categories to run. Default: performance and seo. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint and destructiveHint=false, so the safety profile is covered; the description adds real value on top with a 10-30 second latency estimate, the single-public-page constraint, and the conditional availability of real-user field data. It stops short of noting API quota/rate-limit behavior or what a failure looks like for a non-public or unreachable URL, which keeps it from a 5.
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?
Front-loaded with the action and tightly written for how much it covers; the enumeration of outputs is long but each item distinguishes a real capability. The first sentence runs on through several clauses and a parenthetical example, which costs a bit of scannability.
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?
With no output schema, the description carries the full burden of explaining returns and does so concretely (score ranges, metric names, ranked fixes with sample formatting, conditional field data). Combined with the latency note and the sibling routing, an agent has everything it needs to call this 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 coverage is 100% and both optional parameters carry their own descriptions with defaults and enum semantics, so the schema does the heavy lifting. The description never mentions the strategy or categories parameters and adds no format or default guidance beyond them, making the baseline 3 the right call.
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?
Names a specific verb (Run) and resource (Google PageSpeed Insights / Lighthouse on one public page), then enumerates exactly what comes back: category scores 0-100, lab LCP/TBT/CLS, ranked fixes with time savings, failed checks, and field data. It explicitly separates itself from the sibling that answers a different question, so an agent can pick it without opening any schema.
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?
Gives an explicit use case ("explain WHY a page is slow") and an explicit exclusion with the alternative named ("for whether it's slow for real users, or for many pages at once, use pagespeed_core_web_vitals"). It also scopes the tool to a single public page, which rules out bulk use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pagespeed_core_web_vitalsCore Web Vitals (real-user data)ARead-onlyInspect
Real-user Core Web Vitals from the Chrome UX Report: the 75th-percentile LCP, INP and CLS (plus FCP and TTFB) that Chrome users actually experienced over the last 28 days, each rated good / needs improvement / poor, and whether the page passes Google's Core Web Vitals assessment. This is the data Google uses in ranking. Fast (about a second) and works for ANY public site, including competitors. Pass up to 10 URLs to compare pages - for 'which of my busiest pages are slow?', first get top landing pages from Google Analytics (run_report with landingPage) or Search Console, then pass their full URLs here. A URL with too little traffic falls back to its whole site (origin) and says so. Use pagespeed_audit for the reasons a page is slow.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | Full page URLs, e.g. ['https://example.com/', 'https://example.com/pricing']. Or a bare domain for the whole site. | |
| formFactor | No | PHONE (default - what Google uses for mobile-first ranking), DESKTOP, or ALL devices combined. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, yet the description adds real value: ~1s latency, works for any public site including competitors, and the origin fallback when a URL has too little traffic (with the caveat that it says so). It doesn't discuss rate limits or whether the fallback is silent vs flagged in the response beyond a passing note.
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?
Front-loads the data source and metrics before routing guidance, and every sentence contributes something actionable (workflow, fallback behavior, tool alternative). No filler or restatement of the title.
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?
With no output schema, the description carries the burden of describing returns and does so: percentile metrics, good/needs-improvement/poor ratings, and the pass/fail assessment verdict. Combined with the fallback note and URL limits, an agent has everything needed to call it and interpret results.
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 both parameters are already documented, including the PHONE default and enum values. The description reinforces the 10-URL comparison use case and full-URL vs bare-domain semantics, but never mentions formFactor, so it adds only marginal meaning beyond the schema. Baseline 3 applies.
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?
States a specific verb and resource: real-user Core Web Vitals from the Chrome UX Report, with named metrics (LCP, INP, CLS, FCP, TTFB) and a 28-day window. It explicitly separates itself from pagespeed_audit ('for the reasons a page is slow') and from its history sibling by framing itself as current-data only.
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?
Gives a concrete trigger scenario ('which of my busiest pages are slow?') and a full upstream workflow: pull top landing pages from run_report with landingPage or Search Console, then pass full URLs here. It also names the alternative tool and the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pagespeed_core_web_vitals_historyCore Web Vitals trendARead-onlyInspect
Weekly trend of real-user LCP, INP and CLS (75th percentile, each point a rolling 28-day window) for a page or a whole site, for up to about 9 months. Answers 'did our site get slower, and when?' - flags the week a metric crossed into a worse rating. Compare the date with GA4 conversions or a deploy to find the cause.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | A full page URL, or a bare domain (e.g. 'example.com') for the whole site. | |
| weeks | No | How many weekly points. Default 25 (about six months). | |
| formFactor | No | PHONE (default - what Google uses for mobile-first ranking), DESKTOP, or ALL devices combined. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, non-destructive, open-world), and the description adds genuinely non-obvious behavior: real-user data at the 75th percentile, each point being a rolling 28-day window, a ~9-month horizon cap, and that it flags the week a metric crossed into a worse rating. It does not mention that low-traffic pages may return no data or that recent weeks lag — the one real caveat left out.
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?
Three tight sentences: scope first, the diagnostic question second, the causal follow-up third. Every clause carries information (percentile, window type, horizon, rating-crossing flag) with no 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?
With no output schema, the description correctly takes on the burden of describing what comes back — weekly points, rolling windows, and rating-change flags. Combined with full schema coverage and safety annotations, the only gap is expected behavior when data is sparse or delayed.
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%, so all three parameters (url, weeks, formFactor) are already documented in the schema, including the default of 25 weeks and the PHONE default. The description only echoes the page-vs-site choice and 'up to about 9 months', which loosely restates the weeks maximum — useful reinforcement but no new syntax or format guidance.
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?
States a specific resource and form (weekly trend of real-user LCP, INP and CLS at the 75th percentile over rolling 28-day windows) plus the scope options (a single page or a whole site, up to ~9 months). This is clearly the historical/trend counterpart to the snapshot-style pagespeed_core_web_vitals and pagespeed_audit siblings, so an agent can pick it without ambiguity.
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?
Gives the diagnostic question it answers ('did our site get slower, and when?') and explicitly points to correlating the returned date with GA4 conversions or a deploy to find a cause, which routes the agent into follow-up tools. It stops short of naming when to use the sibling snapshot tool instead, so there is no explicit alternative rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_campaign_criterionRemove a campaign-level targeting criterionADestructiveInspect
Undo one location, device exclusion, ad schedule block, or negative keyword set by set_campaign_targeting or add_negative_keywords - e.g. 'actually don't exclude mobile after all'. Criteria don't have a paused state like campaigns/ads do; this removes it outright.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | ||
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| criterionId | Yes | Criterion id - from the resourceNames returned by the tool that created it, or a GAQL query on campaign_criterion. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is partly covered. The description adds a genuine behavioral trait beyond that: criteria have no paused state, so this removes them outright rather than disabling them. It stops short of describing permission requirements or what happens if the criterion no longer exists.
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-loaded with the action, then a clarifying constraint. The example and the no-paused-state note both earn their place by preventing a mistaken pause-then-remove attempt; there is no 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?
For a destructive mutation with no output schema, the description covers what it removes, the source tools, and the permanence nuance, while the schema richly documents parameters including the validateOnly dry run. Missing only edge-case behavior (criterion already gone, permission needs), which is minor given annotation and schema coverage.
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 description says nothing about any of the 5 parameters. Schema description coverage is 80% (criterionId, customerId, extraFields, validateOnly are all documented in-schema), so the schema carries the load and the baseline of 3 applies. No extra syntax or format guidance is added beyond what the schema 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?
States a specific verb+resource (undo/remove a campaign-level criterion) and enumerates exactly which criterion kinds it covers (location, device exclusion, ad schedule block, negative keyword). Naming set_campaign_targeting and add_negative_keywords as the creators lets an agent distinguish this from the sibling add/get tools without opening a schema.
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?
Explicitly states when to reach for it — undoing a criterion created by set_campaign_targeting or add_negative_keywords — and gives a concrete trigger example ('actually don't exclude mobile after all'). It also explains that criteria lack a paused state, so removal is the only disable path, which resolves the obvious alternative (why not just pause it?).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_funnel_reportRun GA4 funnel reportARead-onlyInspect
Run a GA4 funnel report (Data API v1alpha). Provide ordered funnelSteps (simple form: {name, dimension, matchValue}) or a raw funnel object for advanced funnels. NOTE: funnels use the Exploration schema, which supports fewer dimensions than run_report - pagePath is NOT valid here and is mapped to unifiedPagePathScreen. Use eventName to match events.
| Name | Required | Description | Default |
|---|---|---|---|
| funnel | No | Raw GA4 funnel spec; overrides funnelSteps. | |
| endDate | No | today | |
| property | No | ||
| startDate | No | 28daysAgo | |
| funnelSteps | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only profile, so the description is free to add value — and it does: it discloses the Exploration schema constraint, that pagePath is mapped to unifiedPagePathScreen, and that eventName should be used to match events. These are non-obvious behavioral caveats not captured in 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?
Front-loaded with the core action and keeps the caveats in a compact NOTE clause; every sentence carries usable information. Slightly dense but not padded.
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?
No output schema exists, so the description needn't cover return values, and annotations handle safety. For a moderate 5-param read tool it covers the distinctive funnel semantics well, though date-range and property parameters remain unaddressed.
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 only 20%, so the description must compensate. It does well for funnelSteps (spelling out the simple {name, dimension, matchValue} shape) and for funnel overriding funnelSteps, but startDate, endDate, and property are left unexplained in both schema and description.
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?
States a specific verb+resource ('Run a GA4 funnel report') and pins the API version (Data API v1alpha). It distinguishes itself from the sibling run_report by noting the funnel-specific Exploration schema, so an agent can tell the two apart without opening a schema.
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?
Explains the two ways to supply funnel structure (ordered funnelSteps vs raw funnel object) and warns that pagePath is invalid here, but never states the condition under which an agent should choose this tool over run_report or run_gaql_report. Usage context is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_gaql_reportRun a GAQL queryARead-onlyInspect
Run an arbitrary read-only Google Ads Query Language (GAQL) SELECT against an account and return the raw rows. The power tool for anything the structured tools don't cover. Only SELECT is allowed.
| Name | Required | Description | Default |
|---|---|---|---|
| gaql | Yes | A GAQL SELECT statement, e.g. "SELECT campaign.name, metrics.clicks FROM campaign WHERE segments.date DURING LAST_7_DAYS". Enum-typed fields only accept their exact string name in WHERE (e.g. `campaign.status = 'ENABLED'`), never the field's underlying numeric/ordinal value (e.g. NOT `= '2'` or `= 2`) and never LIKE/wildcards. Use IN (...) with the exact enum name(s), e.g. WHERE campaign.status IN ('ENABLED','PAUSED'), or omit the filter and inspect the returned enum values in a first pass. Any metrics/segments field requires a `segments.date` filter that bounds a finite range - bound `segments.date` with either `segments.date DURING LAST_30_DAYS` (or another named range: TODAY, YESTERDAY, LAST_7_DAYS, THIS_MONTH, LAST_MONTH, ...) or `segments.date BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'`. A single-sided comparison (`segments.date >= '...'`) does not count as a finite range. Otherwise Google errors with "Expects filters on the following field to limit a finite date range: 'segments.date'". For keyword-level metrics (impressions, clicks, cost, conversions, ...), query `FROM keyword_view`, not `FROM ad_group_criterion` - ad_group_criterion only exposes the criterion's own config (status, keyword.text, keyword.match_type, quality_info, ...) and has no metrics. On keyword_view, name the keyword with the `ad_group_criterion.keyword.text` / `ad_group_criterion.keyword.match_type` fields, not `segments.keyword.info.text` / `segments.keyword.info.match_type` - that segment labels a different resource's rows by the keyword involved (e.g. search_term_view), and keyword_view rows are already one per keyword. Otherwise Google errors with "metric/segment is incompatible with the resource in the FROM clause". `change_event` and `change_status` don't support `segments.date` at all - use their own date/time field instead: `change_event.change_date_time` on change_event, `change_status.last_change_date_time` on change_status. Conversion-related segments (segments.conversion_action_name, segments.conversion_action_category, segments.conversion_lag_bucket, ...) only combine with conversion-specific metrics (metrics.conversions, metrics.all_conversions, metrics.conversions_value, ...) - ordinary metrics like clicks, impressions, and cost_micros aren't computed per conversion action, and Google names the ones actually blocking the query as "unsupported metrics" above. Drop those metrics from this query, or run them separately without the conversion segment. GAQL requires that any field used in WHERE or ORDER BY also appear in the SELECT list - add the named field there too. `DURING` only accepts a fixed set of named ranges: TODAY, YESTERDAY, LAST_7_DAYS, LAST_14_DAYS, LAST_30_DAYS, LAST_BUSINESS_WEEK, THIS_WEEK_SUN_TODAY, THIS_WEEK_MON_TODAY, LAST_WEEK_SUN_SAT, LAST_WEEK_MON_SUN, THIS_MONTH, LAST_MONTH - there's no LAST_90_DAYS or other custom-length range. For anything else, use `segments.date BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'` with explicit dates instead. `change_event` and `change_status` cap how far back `segments.date`/the relevant date field can start - 30 days for change_event, 90 for change_status - Google simply doesn't retain older history. Narrow the `BETWEEN`/`DURING` range to stay within that limit. `change_event` and `change_status` queries must end with an explicit `LIMIT n` where n <= 10000, e.g. `LIMIT 1000` - Google rejects them outright with no LIMIT clause at all. `change_event` has no `resource_type` field - that name belongs to `change_status`. On `change_event` the equivalent is `change_event.change_resource_type` (an enum, e.g. AD, CAMPAIGN, AD_GROUP, ...). GAQL's WHERE clause doesn't support parentheses or boolean grouping - conditions can only be ANDed together as a flat list, and there's no OR at all. Remove the parentheses; if you need an OR over the same field's values, use `IN (...)` instead, and if you need an OR across different fields, run separate queries and merge the results. | |
| customerId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, covering the safety profile. The description reinforces read-only behavior and adds 'only SELECT is allowed' and 'return the raw rows,' but does not disclose other operational traits like rate limits, pagination, or error handling. With annotations carrying the main behavioral load, this is a modest addition.
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?
Three short sentences with no filler, and the core purpose and fallback guidance are front-loaded. It is appropriately sized for a tool description, with detailed parameter constraints correctly delegated to the schema.
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 an arbitrary-query tool, the description covers the basic contract: read-only, SELECT-only, raw rows, and fallback role. However, it does not explain the customerId parameter, and without an output schema or annotations describing return shape beyond 'raw rows,' more context would help an agent invoke it confidently.
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 description adds no parameter meaning; schema description coverage is only 50% because the required gaql parameter is richly documented in the schema while customerId has no description anywhere. The description does not compensate for the undocumented customerId or explain parameter formats, leaving a clear gap.
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 states a specific verb, resource, and scope: 'Run an arbitrary read-only GAQL SELECT against an account and return the raw rows.' It explicitly positions itself against siblings as 'the power tool for anything the structured tools don't cover,' so an agent can distinguish it from structured report tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: use this when structured tools do not cover the need, and it notes the SELECT-only restriction. However, it does not explicitly name alternatives or say when not to use it, so it falls short of the full when/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_realtime_reportRun GA4 realtime reportARead-onlyInspect
Run a GA4 realtime report (active users right now, by dimension). The Realtime API only supports a small fixed schema - dimensions: appVersion, audienceId, audienceName, audienceResourceName, city, cityId, country, countryId, deviceCategory, eventName, minutesAgo, platform, streamId, streamName, unifiedScreenName, plus customUser:<parameter_name>; metrics: activeUsers, eventCount, keyEvents, screenPageViews. Most of run_report's ~150 dimensions/metrics (e.g. pagePath, sessionSource) aren't valid here - use run_report instead for anything outside this list.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| metrics | No | ||
| property | No | ||
| dimensions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds genuine behavioral context beyond that: the Realtime API enforces a small fixed schema and many run_report fields (e.g. pagePath, sessionSource) are invalid here, which tells the agent what will error. It doesn't mention rate limits or quotas, so it falls short of a 5.
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?
Front-loads the purpose before the field lists, and the long enumeration is necessary given zero schema coverage. It is dense but every clause earns its place; the only minor cost is the parenthetical that interrupts the opening sentence.
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 report tool with no output schema, nothing an agent needs to invoke it correctly is missing, including the routing rule to run_report. The annotation and output-schema picture means no further return-value explanation is required.
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 dimension/metric arrays are bare strings with no enums, so the description carries the full burden. It compensates well by enumerating the complete valid set of dimensions (including the `customUser:<parameter_name>` pattern) and metrics, which is exactly what the schema lacks. It says nothing about `limit` or `property`, leaving those two params unexplained.
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?
States a specific verb and resource ('Run a GA4 realtime report') and immediately defines the scope ('active users right now, by dimension'). It explicitly distinguishes itself from the similar-sounding sibling run_report, so an agent can pick the right tool without opening either schema.
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?
Gives an explicit when and when-not: use this for realtime/active-user reporting, and 'use run_report instead for anything outside this list.' The condition selecting the alternative is spelled out rather than inferred, which is exactly the routing guidance the sibling set needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_reportRun GA4 reportARead-onlyInspect
Run a GA4 report via the Data API. Dimensions × metrics over a date range, with optional dimensionFilter/metricFilter (GA4 FilterExpression objects), orderBys, offset pagination, and multiple dateRanges. Example: device usage by page = dimensions [pagePath, deviceCategory], metric [screenPageViews]. GA4 allows at most 4 dateRanges per run_report call - split more into separate calls and combine the results. GA4 counts dimensions referenced in dimensionFilter toward the 9-dimension nested-request limit, on top of the dimensions array - reduce the dimensions requested or simplify the filter. A numericFilter needs its comparison value wrapped as { int64Value: '10' } (string) or { doubleValue: 10.5 }, not a bare number - e.g. { fieldName: 'sessions', numericFilter: { operation: 'GREATER_THAN', value: { int64Value: '10' } } }. A bare value: 10 passes schema validation here but GA4 rejects it at request time with "value is missing from NumericFilter" since it never finds anything under int64Value/doubleValue.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | Row offset for pagination. | |
| endDate | No | today | |
| metrics | Yes | e.g. ['screenPageViews','activeUsers'] | |
| orderBys | No | ||
| property | No | GA property id, e.g. 'properties/123'. Defaults to the connection's. | |
| startDate | No | 28daysAgo | |
| dateRanges | No | Overrides startDate/endDate; supports multiple ranges. | |
| dimensions | Yes | e.g. ['pagePath','deviceCategory'] | |
| metricFilter | No | GA4 FilterExpression on metrics (pass-through). | |
| keepEmptyRows | No | ||
| dimensionFilter | No | GA4 FilterExpression on dimensions (pass-through). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly/openWorld/destructive), leaving behavioral disclosure to the text, which delivers strongly: GA4's 4-dateRange ceiling with instructions to split calls, the 9-dimension nested-request accounting for filter dimensions, and the specific trap that a bare numericFilter value validates locally but is rejected at request time. These are exactly the runtime constraints an agent cannot get from 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?
Front-loaded with the purpose and a concrete example before the constraint list, and nearly every sentence carries actionable content. The numericFilter explanation runs long with a restated GA4 error string, which is slightly redundant but justified by the severity of the pitfall.
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 12-parameter read-only report tool with no output schema, the description covers the tricky behavioral edges (date-range limits, dimension accounting, filter value typing) that would otherwise cause failed calls. Return-shape details are unnecessary absent an output schema, and the remaining minor gap is response/pagination shape.
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 only 58%, so the description must compensate, and it does for the complex parameters: it identifies dimensionFilter/metricFilter as GA4 FilterExpression objects, explains dateRanges override startDate/endDate and support multiple ranges, and gives a full worked numericFilter shape. It leaves the simpler fields (limit, keepEmptyRows, property) untouched, but the gap is minor.
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 names a specific verb and resource ('Run a GA4 report via the Data API') and describes the core shape (dimensions × metrics over a date range) with a concrete example. It does not, however, explicitly differentiate itself from adjacent report siblings like run_realtime_report, run_funnel_report, or run_gaql_report, so an agent must infer the routing.
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?
There is substantial 'how-to-use' guidance (4-dateRange cap, 9-dimension limit, filter pass-through types, pagination via offset), and the worked example implies usage context. But there is no explicit when-to-use vs when-not or any statement naming an alternative report tool, so usage guidance remains implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_search_analytics_reportSearch analytics reportARead-onlyInspect
Organic search performance for a property: clicks, impressions, CTR, and average position, broken down by the dimensions you choose (query, page, country, device, date, searchAppearance). Filter to a search type (web/image/video/news/discover/googleNews) - discover and googleNews cover Google's Discover feed and Google News; searchAppearance as a dimension is the closest proxy the API currently offers for isolating AI Overview / rich-result rows, since there is no dedicated AI Overview search type yet. Defaults to the last 28 days (Search Console's own default). Use pageFilters to narrow to (or exclude) a URL pattern server-side - e.g. notContains on /dashboard/ and /authenticate/ to drop internal traffic that would otherwise crowd out marketing pages - rather than requesting the maximum rowLimit and filtering client-side. For an exact-URL allowlist ("only these known-good pages"), use the in operator instead of a hand-written regex - it avoids the notContains-as-denylist mismatch and chunks itself automatically to stay under Google's undocumented filter-size ceiling (may take more than one upstream call for a large list). Large requests are paged internally in batches of up to 5000 rows and will stop early with nextStartRow set if they run long, rather than risk a request timeout - pass that back as startRow to continue. collapseVariants merges query-string/scheme duplicates of the same page; brandKeywords adds a derived branded/non-branded field per query row.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | web | |
| endDate | No | YYYY-MM-DD. | |
| siteUrl | No | ||
| rowLimit | No | ||
| startRow | No | Offset for paging beyond rowLimit. | |
| startDate | No | YYYY-MM-DD. Omit with endDate for the last 28 days. | |
| dimensions | No | ||
| pageFilters | No | Filters applied to the `page` dimension server-side, before rowLimit truncates the result. Multiple filters are ANDed together, e.g. [{operator: 'notContains', expression: '/dashboard/'}, {operator: 'notContains', expression: '/authenticate/'}] excludes both paths in one request. At most one filter may use operator `in` (a values array) - matches if the page is any one of them, expanded internally into chunked regex-alternation queries (Google's filter API has no native set-membership or OR operator). | |
| brandKeywords | No | Caller-supplied brand-name substrings/variants (e.g. ['legitfit', 'legit fit', 'legitfit login']) - plain substrings, not regex. When set and `query` is among `dimensions`, adds a derived `brandedVsNonbranded` field per row via case-insensitive substring match. Caybl does not store or infer these keywords - you decide what counts as this tenant's brand and supply the list each call. | |
| collapseVariants | No | Merge rows that are the same logical page but differ only by tracking query-string or http/https/www scheme - sums clicks/impressions and recomputes ctr/position across the merged rows. Only applies when `page` is among `dimensions`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the read-only/non-destructive profile, but the description adds substantial behavior: internal 5000-row batching, early stop with nextStartRow for continuation, filter chunking under Google's undocumented filter-size ceiling possibly requiring multiple upstream calls, and collapseVariants recomputing ctr/position across merged rows.
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?
Purpose is front-loaded before the option-by-option detail, and the dense sentences each carry distinct guidance about filtering, paging, or derived fields. It is long and near the upper bound of what is useful, but almost nothing is redundant.
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?
No output schema exists, so the description must carry the return-value burden; it names the metric fields, the nextStartRow continuation mechanism, and the brandedVsNonbranded derived field. It never details a full row shape or how dimensions map to row keys, leaving a small gap for a 10-parameter 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?
With 60% schema coverage, the description supplies meaning beyond the schema for the hardest parameters: `discover`/`googleNews` semantics, searchAppearance as the AI-Overview proxy, the `in` versus regex tradeoff, and the derived brandedVsNonbranded field. A few parameters (siteUrl, rowLimit, endDate) remain unelaborated, but the complex ones are well covered.
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?
States a specific verb and resource — organic search performance for a property — and enumerates the exact metrics (clicks, impressions, CTR, average position) and dimensions. An agent can distinguish this from GA4-oriented siblings like run_report or get_search_terms without opening the schema.
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?
Gives clear operational context: default 28-day window, server-side filtering via pageFilters instead of client-side filtering on a maxed rowLimit, and `in` for allowlists vs regex. It does not explicitly compare against sibling tools (e.g. get_search_terms), so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_campaign_targetingSet campaign locations, excluded devices, and ad scheduleADestructiveInspect
Add location targeting, device exclusions, and/or an ad schedule (day-parting) to a Google Ads campaign. A campaign with no locations serves everywhere Google allows, so set locations before enabling a campaign meant for specific markets. Locations and schedule blocks are added alongside existing ones. Excluding a device sets that device's bid adjustment to -100%, which overwrites any adjustment already set for it. Undo any of these with remove_campaign_criterion.
| Name | Required | Description | Default |
|---|---|---|---|
| adSchedule | No | Day-parting: one entry per day+hour-range block to serve in, e.g. Mon-Fri 9-18 is 5 entries. A campaign with no ad schedule at all serves every hour of every day. | |
| campaignId | Yes | ||
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| geoTargetIds | No | Geo target constant ids to target, e.g. ['2840','2372'] for US and Ireland. Additive - existing location criteria are left alone. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. | |
| excludeDevices | No | Device types to stop serving on, e.g. ['MOBILE']. Sets the device's bid adjustment to -100%. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive and non-idempotent, but the description adds the concrete mechanics: locations and schedule blocks are additive ('added alongside existing ones'), and excluding a device silently sets that device's bid adjustment to -100%, overwriting any prior adjustment. That overwrite disclosure is exactly the kind of behavioral detail annotations cannot convey.
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?
Four tight sentences: purpose first, then the prerequisite for locations, then the additive/overwrite behavior, then the undo path. No filler, and the most decision-relevant information is 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?
For a 7-parameter mutation tool with nested adSchedule objects and no output schema, the description covers the branching behaviors an agent needs (additivity, device-exclusion overwrite, undo route), while the schema handles the 86% of parameter detail and validateOnly dry-run guidance.
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 86% schema coverage the baseline is 3, but the description reinforces the additive semantics of location/schedule additions and the -100% overwrite consequence of excludeDevices, and explains the no-locations/no-schedule defaults. It does not add much on extraFields or validateOnly beyond the already-rich schema text.
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?
Opens with a specific verb and resource: 'Add location targeting, device exclusions, and/or an ad schedule (day-parting) to a Google Ads campaign.' This clearly distinguishes it from siblings like update_campaign and remove_campaign_criterion, which handle different operations on the same object.
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?
Gives an explicit when-to-use rule ('set locations before enabling a campaign meant for specific markets' since a campaign with no locations serves everywhere) and names the exact alternative for the inverse operation ('Undo any of these with remove_campaign_criterion'). Both direction and undo path are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_sitemapSubmit (resubmit) a sitemapAIdempotentInspect
Tell Google to (re)fetch a sitemap - the natural next step after editing pages based on performance data, so the change is picked up rather than waiting for the next crawl. Requires write access on this property (auth/scopes.ts) - refuses cleanly if the connection or this specific property has changes switched off.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | No | ||
| feedpath | Yes | The sitemap's own URL, e.g. 'https://example.com/sitemap.xml'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false, openWorld=true. The description adds non-structured context the annotations don't cover: write-access requirement, a pointer to auth/scopes.ts, and the graceful-failure behavior when the property has changes disabled. Return/confirmation behavior is still unspecified, keeping it at 4.
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-loaded with the core action before the usage rationale and the auth caveat. Density is high and every clause carries information, though the em-dash parentheticals make it slightly harder to scan than a 5 would warrant.
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 2-parameter, no-output-schema tool with annotations already covering the safety profile, the description supplies the missing pieces: when to use it, the write-scope requirement, and failure behavior. The only real gap is parameter-level detail (the undocumented siteUrl) and any success response semantics.
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 only 50% — feedpath is documented but siteUrl is not. The description says nothing about either parameter, so it fails to compensate for the undocumented siteUrl and does not clarify how the two relate (e.g., whether siteUrl defaults). It adds no meaning 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?
States a specific verb and resource — 'Tell Google to (re)fetch a sitemap' — and the parenthetical '(re)fetch' clarifies that this both submits and resubmits. This distinguishes it implicitly from read-only siblings like get_sitemap and list_sitemaps, which the agent can separate without opening a schema.
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?
Gives clear when-to-use context: it's 'the natural next step after editing pages based on performance data, so the change is picked up rather than waiting for the next crawl.' It also names a when-not condition (refuses when the connection/property has changes switched off). No explicit alternative tool is named, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ad_groupChange an ad group's status or bidBDestructiveInspect
Change an ad group's status and/or its default max CPC. Raising the bid raises what each click can cost. REMOVED is permanent.
| Name | Required | Description | Default |
|---|---|---|---|
| cpcBid | No | New default max CPC in account currency. | |
| status | No | ||
| adGroupId | Yes | Ad group id from get_ad_groups. | |
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description usefully adds that REMOVED is permanent and that raising the bid raises cost-per-click, which is real behavioral context beyond the annotations, but it omits idempotency, permissions, and rate-limit 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?
Three short, front-loaded sentences with the core action first. The middle sentence about bid cost is mildly self-evident but serves as a spend caution, so it earns its place; no true waste.
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 6-parameter mutation with a rich parameter-level schema and annotations covering safety, the description covers the purpose and the key permanence/spend warnings. No output schema exists, so return values need not be explained. It is essentially complete, though validateOnly/extraFields usage is left entirely to the schema.
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 83%, so the schema already documents cpcBid, status, customerId, extraFields, and validateOnly in depth. The description only names 'status' and 'default max CPC' at a high level, adding little beyond what the schema provides; baseline 3 applies.
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?
States a specific verb+resource: changing an ad group's status and/or default max CPC. An agent can distinguish it from siblings like update_campaign or update_keyword by the ad-group resource. It stops short of explicitly naming which sibling to use for related tasks, so it is not a 5.
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 no when-to-use vs alternatives guidance, no prerequisites, and no sibling routing (e.g., vs update_ad_status or update_campaign_status). The 'REMOVED is permanent' note is a caution, not usage guidance. Nothing tells the agent the conditions under which to pick this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ad_statusEnable, pause or remove an adBDestructiveInspect
Change a single ad's status within its ad group. REMOVED is permanent.
| Name | Required | Description | Default |
|---|---|---|---|
| adId | Yes | ||
| status | Yes | ||
| adGroupId | Yes | ||
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is largely covered. The description adds one useful fact beyond them — 'REMOVED is permanent' — but says nothing about spend implications of pausing, whether re-enabling restores prior state, or the interaction with validateOnly.
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 tightly written sentences with the scope stated first and the key permanence warning second; nothing is padded. It is arguably too terse for the complexity, but every sentence earns its place and it is 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?
For a destructive, open-world mutation taking 6 parameters, the description is thin: it omits the dry-run workflow, the customerId account-selection rule, and the extraFields escape hatch, all of which live only in the schema. Minimal but not fully adequate 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 coverage is only 50%: customerId, extraFields, and validateOnly are well documented in the schema, while adId, status, and adGroupId have none. The description adds no parameter meaning at all, so it fails to compensate for the undocumented half.
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?
States a specific verb (change status) and resource (a single ad within its ad group), which cleanly separates it from update_ad_group and update_campaign_status siblings. The title further enumerates the three operations (enable, pause, remove). It stops short of explicitly naming a sibling, but the scope 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 implies when to use it (changing one ad's status) and the title enumerates the enum values, but there is no explicit guidance on when to prefer this over update_ad_group or update_campaign_status, nor any prerequisite framing. Usage must be inferred from scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_campaignRename a campaign, or change its budget or bidding strategyADestructiveInspect
Change a campaign's name, reassign it to a different budget, or switch its bidding strategy - everything about a campaign except status (use update_campaign_status for that). Useful for the common pattern of starting on MANUAL_CPC to see real auction behaviour, then moving to an automated strategy once there's data to bid on, without recreating the campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New campaign name. | |
| budgetId | No | Reassign to a different campaign budget id. | |
| campaignId | Yes | Campaign id from get_campaigns. | |
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. | |
| biddingStrategy | No | MAXIMIZE_CONVERSIONS needs conversion tracking already working, or delivery will suffer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the mutation profile (readOnlyHint=false, destructiveHint=true, idempotentHint=false), so the description is not obligated to restate safety. It nevertheless adds real behavioral context: the PAUSED-by-default safety state, the fact that extraFields can only add fields and can never override status or bypass validation, and the free dry-run path. It does not discuss live spend impact or reversibility, leaving a small gap against the destructiveHint.
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-loaded with the scope statement and the sibling exclusion before the workflow aside. The second sentence is long and slightly digressive (the MANUAL_CPC story), but it earns its place by motivating the tool. No 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?
For a 7-parameter mutation tool with nested objects and no output schema, the description covers routing, the escape hatch semantics, the validateOnly dry-run, and the status exclusion. Nothing an agent needs to invoke it correctly is missing.
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 description exceeds it by giving the biddingStrategy parameter operational meaning (MAXIMIZE_CONVERSIONS requires working conversion tracking) and framing the MANUAL_CPC-to-automated transition as the reason to change it. It still does not add format or constraint detail for name/budgetId 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?
States a precise verb and resource ('Change a campaign's name, reassign it to a different budget, or switch its bidding strategy') and explicitly carves out the boundary: 'everything about a campaign except status (use update_campaign_status for that).' An agent can distinguish this from update_campaign_status and update_campaign_budget without opening any schema.
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?
Names the excluded case and its alternative tool directly, and supplies a concrete usage pattern (start on MANUAL_CPC, then move to an automated strategy once data exists) that tells the agent when this tool is the right choice. Both when-to-use and when-not-to-use are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_campaign_budgetChange a campaign budget amountADestructiveInspect
Change the daily amount on an existing campaign budget. This directly changes how much the campaigns on that budget can spend per day - dry-run it first if you are unsure.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | New daily budget in account currency. | |
| budgetId | Yes | Campaign budget id (from get_campaigns or a GAQL query on campaign_budget). | |
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds value beyond that by stating the real-world consequence (which campaigns can spend how much per day) and pointing at the dry-run path, though it says nothing about permissions or propagation timing.
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 short sentences, the effect front-loaded before the safety advice, with zero filler. Every clause earns its place.
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 destructive five-parameter mutation with full schema coverage, no output schema, and annotations covering the safety hints, the description supplies the impact and validation guidance an agent needs. It leaves open only secondary details such as permission requirements and whether extraFields carries hidden risk.
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%, including detailed docs for amount, customerId, extraFields and validateOnly, so the schema already carries the parameter burden. The description only echoes the 'daily amount' and dry-run concepts, adding no syntax or format detail beyond the schema's 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?
States a specific verb and resource: changing the daily amount on an existing campaign budget. This implicitly separates it from create_campaign_budget and from update_campaign, but it never names a sibling or the boundary explicitly, so it falls just short of 5.
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?
"Dry-run it first if you are unsure" gives a concrete precondition tied to validateOnly, which is real guidance. However, there is no routing advice against alternatives such as update_campaign or create_campaign_budget, so usage is only partially covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_campaign_statusEnable, pause or remove a campaignADestructiveInspect
Change a campaign's status. ENABLED starts it serving and spending; PAUSED stops delivery and is reversible; REMOVED is permanent and cannot be undone through the API or the Ads UI.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | REMOVED is irreversible. | |
| campaignId | Yes | Campaign id from get_campaigns. | |
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds concrete consequences the annotations cannot convey: ENABLED begins spending, PAUSED stops delivery and is reversible, REMOVED is permanent and not undoable via API or the Ads UI. That spend and reversibility detail is genuinely additive.
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, zero filler, and the operation is front-loaded with the destructive case (REMOVED) clearly distinguished. Every clause earns its place.
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 destructive mutation with no output schema, the description covers the key risks (irreversibility, spend impact) and the schema covers parameters thoroughly. It slightly under-delivers on permission/auth requirements and what the response returns, but nothing critical to a correct call is missing.
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%, so the baseline is 3, but the description meaningfully expands the most important enum beyond the schema's terse "REMOVED is irreversible" by spelling out spend behavior for ENABLED and reversibility for PAUSED. The other params (campaignId, customerId, extraFields, validateOnly) are left entirely to the schema, which documents them well.
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?
"Change a campaign's status" is a specific verb+resource, and the title plus enum values make the three operations explicit. It is distinguishable from update_campaign (broader edits) and update_ad_status (different resource) by scope, though it never names those siblings directly.
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 explains what each status means but gives no explicit guidance on when to prefer this over update_campaign or update_ad_status, nor any prerequisites. Usage is implied by the enum semantics rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ga4_conversion_actionTune a GA4-sourced conversion actionADestructiveInspect
Update settings on a Google Ads conversion action that Google has already synced from a linked GA4 property's key event (see create_google_ads_link and mark_key_event in the Google Analytics connector - Google imports it automatically once both exist; there is no Ads API call to create or trigger that import). Use this to set primaryForGoal true, which is what actually makes it usable as a MAXIMIZE_CONVERSIONS bidding goal. Find the conversion action id first with run_gaql_report, e.g. "SELECT conversion_action.id, conversion_action.name, conversion_action.google_analytics_4_settings.event_name FROM conversion_action WHERE conversion_action.type IN ('GOOGLE_ANALYTICS_4_CUSTOM','GOOGLE_ANALYTICS_4_PURCHASE','GOOGLE_ANALYTICS_4_GENERATE_LEAD','GOOGLE_ANALYTICS_4_QUALIFY_LEAD','GOOGLE_ANALYTICS_4_CLOSE_CONVERT_LEAD')" (enum fields reject LIKE/wildcards - see run_gaql_report). Note: includeInConversionsMetric is immutable on a GA4-synced action once Google has set it - expect an IMMUTABLE_FIELD error if you try to change it; primaryForGoal and status remain changeable.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Conversion actions have no PAUSED state, unlike campaigns/ad groups/ads. | |
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. | |
| primaryForGoal | No | Whether campaigns scoped to primary goals only will optimize for this conversion. | |
| conversionActionId | Yes | Conversion action id, from a conversion_action GAQL query. | |
| includeInConversionsMetric | No | Whether this counts toward the account's main "Conversions" column and bidding. Often immutable on a GA4-synced action (Google sets it at import time) - expect an IMMUTABLE_FIELD error if so. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructive/openWorld/non-idempotent), the description discloses that there is no Ads API call to create or trigger the GA4 import, that includeInConversionsMetric is immutable on a synced action with an expected IMMUTABLE_FIELD error, and that primaryForGoal and status remain changeable. That is exactly the mutation-safety context an agent needs before calling a destructive tool.
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?
Purpose and the primary use case are front-loaded, and every sentence carries operational content. The long embedded GAQL example is useful but heavy for a description field, slightly diluting scannability.
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 7-parameter destructive mutation with no output schema, the description covers provenance of the id, the import path, immutability traps, and the purpose of the key flag. Nothing an agent needs to call it correctly is missing.
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%, so the baseline is 3, but the description adds real meaning: it explains why primaryForGoal matters (bidding goal eligibility) and warns that includeInConversionsMetric will fail with IMMUTABLE_FIELD. The GAQL-based provenance of conversionActionId is also clarified.
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 states a specific verb+resource (update settings on a GA4-synced Google Ads conversion action) and explicitly scopes what it is not (it cannot create or trigger the import, unlike create_google_ads_link / mark_key_event). An agent can distinguish it from every sibling without opening a schema.
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 explicit when-to-use ('set primaryForGoal true, which is what actually makes it usable as a MAXIMIZE_CONVERSIONS bidding goal'), names the prerequisite sibling workflow, and even supplies the run_gaql_report query to find the id. It also flags the enum/LIKE caveat that routes the agent to the right query style.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_keywordChange a keyword's status or bid, or remove itADestructiveInspect
Change an existing keyword's status (PAUSED/ENABLED, or REMOVED to delete it permanently) and/or its max CPC bid. add_keywords can only add new keywords - this is how to act on one that's already there, e.g. pausing an underperformer found via get_search_terms.
| Name | Required | Description | Default |
|---|---|---|---|
| cpcBid | No | New max CPC in account currency. | |
| status | No | REMOVED is permanent. | |
| adGroupId | Yes | Ad group id the keyword belongs to. | |
| keywordId | Yes | Keyword's criterion id, e.g. from add_keywords' resourceNames or a GAQL query on ad_group_criterion. | |
| customerId | No | 10-digit Google Ads customer id. Omit only if this connection has exactly one reachable account - with more than one, omitting it errors and lists the available ids to pick from. | |
| extraFields | No | Escape hatch for a field Google requires that this tool doesn't set yet - use it when a prior call to this same tool failed naming a required field and its valid values (e.g. after adding `contains_eu_political_advertising`, retry with { contains_eu_political_advertising: "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING" }). Keys are the Ads API's own snake_case field names; nest an object to add a field under one this tool already sets (e.g. a new network_settings sub-field). Only ADDS fields not already set by this tool's own arguments - it can never override `status` or any other field already set here, so it cannot be used to bypass validation or a safety default like a campaign's PAUSED-by-default status. | |
| validateOnly | No | Dry run. When true the Google Ads API validates the change and reports any errors but applies nothing. Use this first whenever you are unsure - it is free and cannot affect spend. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description reinforces that REMOVED is a permanent delete, adding useful context beyond the enum, but says little about irreversibility of bids or idempotency beyond what annotations and schema 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?
Two tight sentences, front-loaded with the core action and followed by the sibling routing. No 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?
For a destructive mutation tool, the safety semantics are carried by annotations, all seven parameters are documented at 100% coverage, and the description supplies the routing and permanence caveat. No output schema is needed and nothing an agent requires to call correctly is missing.
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 every parameter (including validateOnly, extraFields, customerId) is already fully documented in the schema. The description only echoes the status/bid fields, adding no syntax or constraint detail beyond it.
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?
Specific verb+resource ('Change an existing keyword's status...and/or its max CPC bid') with the exact mutation fields named. It explicitly distinguishes itself from the sibling add_keywords by stating add_keywords only adds while this acts on existing keywords.
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?
Routes the agent precisely: it names add_keywords as the alternative for creation and supplies a concrete when-to-use scenario ('pausing an underperformer found via get_search_terms'). Nothing about selecting this tool vs. siblings 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
- Removed
bing_add_site - Removed
bing_backlinks - Removed
bing_crawl_health - Removed
bing_inspect_url - Removed
bing_keyword_research - Removed
bing_list_sitemaps - Removed
bing_list_sites - Removed
bing_search_performance - Removed
bing_submit_sitemap - Removed
bing_submit_urls - Removed
bing_top_pages - Removed
bing_top_queries - Removed
bing_verify_site
2 tool updates
- Added
msads_get_account_status - Added
msads_get_import_jobs
10 tool updates
- Added
gtm_audit_container - Added
gtm_container_overview - Added
gtm_list_containers - Added
gtm_list_tags - Added
gtm_list_triggers_and_variables - Added
gtm_pause_tag - Added
gtm_publish - Added
gtm_upsert_tag - Added
gtm_upsert_trigger - Added
gtm_version_history
21 tool updates
- Added
msads_add_ad_extensions - Added
msads_add_keywords - Added
msads_create_ad_group - Added
msads_create_campaign - Added
msads_create_conversion_goal - Added
msads_create_responsive_search_ad - Added
msads_create_shared_budget - Added
msads_create_uet_tag - Added
msads_get_ad_extensions - Added
msads_get_budgets - Added
msads_get_conversion_tracking - Added
msads_get_keyword_ideas - Added
msads_get_negative_keywords - Added
msads_get_targeting - Added
msads_remove_negative_keywords - Added
msads_set_ad_extension_attachment - Added
msads_set_bid_adjustment - Added
msads_set_campaign_budget_link - Added
msads_set_conversion_goal_status - Added
msads_set_shared_budget_amount - Added
msads_update_responsive_search_ad
5 tool updates
- Added
msads_add_negative_keywords - Added
msads_set_ad_group_bid - Added
msads_set_campaign_budget - Added
msads_set_keyword_bid - Added
msads_set_status
11 tool updates
- Added
msads_get_ad_group_performance - Added
msads_get_ad_groups - Added
msads_get_ads - Added
msads_get_campaign_performance - Added
msads_get_campaigns - Added
msads_get_impression_share - Added
msads_get_keyword_performance - Added
msads_get_keywords - Added
msads_get_location_performance - Added
msads_get_search_terms - Added
msads_list_accounts
3 tool updates
- Added
pagespeed_audit - Added
pagespeed_core_web_vitals - Added
pagespeed_core_web_vitals_history
1 tool update
- Changed
set_campaign_targeting1 field changed- changed
Input schema / properties / excludeDevices / descriptionPrevious value: -"Device types to exclude from serving, e.g. ['MOBILE']. Implemented as a 0 bid modifier - Google Ads has no true device exclusion - which in practice stops that device from serving."New value: +"Device types to stop serving on, e.g. ['MOBILE']. Sets the device's bid adjustment to -100%."
2 tool updates
- Added
bing_add_site - Added
bing_verify_site
11 tool updates
- Added
bing_backlinks - Added
bing_crawl_health - Added
bing_inspect_url - Added
bing_keyword_research - Added
bing_list_sitemaps - Added
bing_list_sites - Added
bing_search_performance - Added
bing_submit_sitemap - Added
bing_submit_urls - Added
bing_top_pages - Added
bing_top_queries
47 tool updates
- First observed
add_ad_group_negative_keywords - First observed
add_callouts - First observed
add_keywords - First observed
add_negative_keywords - First observed
add_sitelinks - First observed
create_ad_group - First observed
create_campaign - First observed
create_campaign_budget - First observed
create_google_ads_link - First observed
create_responsive_search_ad - First observed
delete_google_ads_link - First observed
find_zero_visibility_pages - First observed
generate_keyword_ideas - First observed
get_account_summaries - First observed
get_ad_groups - First observed
get_ad_performance - First observed
get_campaign_criteria - First observed
get_campaign_performance - First observed
get_campaigns - First observed
get_custom_dimensions_and_metrics - First observed
get_impression_share - First observed
get_property_details - First observed
get_resource_metadata - First observed
get_search_console_property_details - First observed
get_search_terms - First observed
get_sitemap - First observed
inspect_url - First observed
list_accessible_customers - First observed
list_google_ads_links - First observed
list_sitemaps - First observed
list_sites - First observed
mark_key_event - First observed
remove_campaign_criterion - First observed
run_funnel_report - First observed
run_gaql_report - First observed
run_realtime_report - First observed
run_report - First observed
run_search_analytics_report - First observed
set_campaign_targeting - First observed
submit_sitemap - First observed
update_ad_group - First observed
update_ad_status - First observed
update_campaign - First observed
update_campaign_budget - First observed
update_campaign_status - First observed
update_ga4_conversion_action - First observed
update_keyword
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceRemote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.MIT
- AlicenseCqualityCmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs112 npm58 PyPIMIT
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1623 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.