microsoft-ads-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@microsoft-ads-mcpshow me my campaigns"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
microsoft-ads-mcp
An MCP server for the Microsoft Advertising (Bing Ads) REST API, built for agent-led campaign management and reporting. It exposes a focused set of useful-work tools — walk the campaign tree, create and edit in place (rename, repoint Final URLs, tracking templates, status, bids), manage negative keywords, ad extensions, conversion goals/UET tags, and ZIP location targeting, run the Bulk API, and pull performance reports that are actually downloaded and parsed for you — rather than a 1:1 mirror of the API surface.
Built with FastMCP and the official Microsoft
msads REST SDK (which ships OpenAPI-generated Pydantic
v2 models). Managed with uv, linted/formatted with ruff, type-checked with ty.
Why REST / msads (not the legacy SOAP bingads SDK)
Microsoft is retiring the SOAP API: new features are REST-only from Oct 1, 2026, and SOAP
is fully deprecated on Jan 31, 2027 (migration guide).
The REST SDK msads gives typed Pydantic models, structured HTTP exceptions, and the same
OAuth/ServiceClient entry points — so this server is built on it directly.
SDK quirks worth knowing
msadsis synchronous (requests/urllib3). Tools here are therefore plain sync functions; FastMCP runs them in a worker thread, so the event loop is never blocked. We do not wrap the SDK in async.msadsdoes not declare itspython-dateutildependency, even thoughopenapi_clientimports it. We pinpython-dateutilexplicitly inpyproject.toml.The package installs as the
bingads.*(auth +ServiceClient) andopenapi_client.*(models + exceptions) import namespaces — there is no top-levelmsadsmodule.
Related MCP server: Bing Ads MCP Server
REST API reference & endpoints
Pydantic models shipped inside msads are
code-generated from Microsoft's internal spec; the public surface is the per-operation
Campaign Management reference
on Microsoft Learn (the Python SOAP→REST migration guide
is the most useful map of REST request/response shapes).
The REST service base URLs ServiceClient targets — set automatically from
MICROSOFT_ADS_ENVIRONMENT — are:
Service | Production | Sandbox |
Campaign Management |
|
|
Reporting |
|
|
Bulk |
|
|
Ad Insight |
|
|
Customer Mgmt / Billing |
|
|
Install
The published package runs from anywhere with uvx — no clone, no project files. Put your
credentials in ~/.config/microsoft-ads/.env (the same directory the server already persists
OAuth tokens to), then point your MCP client at uvx microsoft-ads-mcp:
mkdir -p ~/.config/microsoft-ads
cat > ~/.config/microsoft-ads/.env <<'EOF'
MICROSOFT_ADS_DEVELOPER_TOKEN=...
MICROSOFT_ADS_CLIENT_ID=...
# Optional once you've signed in; otherwise mint one via the auth tools (see Authentication):
# MICROSOFT_ADS_REFRESH_TOKEN=...
EOF
chmod 600 ~/.config/microsoft-ads/.envThis .env is read independently of the working directory, so the server works from any repo
and no secrets live in any project file — the MCP client config carries only the non-secret
operational flags (see MCP client configuration). Do the one-time
sign-in once (see Authentication); the refresh token is then persisted next
to this file and auto-refreshed.
From source (development)
uv sync # create .venv and install
cp .env.example .env # then set the credentials below
uv run python -m microsoft_ads_mcp # run over stdio (default)Configuration
Credentials and flags load from (highest priority first) real environment variables, a
project-local .env, then the cwd-independent ~/.config/microsoft-ads/.env. See
.env.example for the full list:
Variable | Required | Notes |
| yes | From the developer portal |
| yes | OAuth app (client) id — an Azure app, or a Google Cloud OAuth client when |
| no |
|
| recommended | Run non-interactively; else mint one via the auth tools |
| no | Microsoft web/confidential apps, or the Google OAuth client secret |
| no | Discovered via |
| no |
|
| no |
|
| no |
|
Refresh tokens are persisted to ~/.config/microsoft-ads/tokens.json, created with 0600
permissions (owner read/write only).
Authentication
If you have no refresh token yet, mint one once (interactive):
Call
get_auth_url()→ open the URL, sign in.Copy the redirect URL and call
complete_auth(redirect_url).The refresh token is saved to
~/.config/microsoft-ads/tokens.json(mode0600) and reused/auto-refreshed thereafter — so you never need to add it to.envby hand.
MCP client configuration
Recommended — run the published package with uvx, credentials in
~/.config/microsoft-ads/.env (see Install). The config carries only the non-secret
flags:
{
"mcpServers": {
"microsoft-ads": {
"command": "uvx",
"args": ["microsoft-ads-mcp"],
"env": {
"READ_ONLY": "false",
"TOOL_SEARCH": "true"
}
}
}
}Alternatively, run from a source checkout (development) and/or pass credentials inline instead of
via .env:
{
"mcpServers": {
"microsoft-ads": {
"type": "stdio",
"command": "uv",
"args": ["run", "--directory", "${CLAUDE_PROJECT_DIR:-.}", "python", "-m", "microsoft_ads_mcp"],
"env": {
"MICROSOFT_ADS_DEVELOPER_TOKEN": "...",
"MICROSOFT_ADS_CLIENT_ID": "...",
"MICROSOFT_ADS_REFRESH_TOKEN": "...",
"READ_ONLY": "false"
}
}
}
}Tools
Call account_health first to validate credentials and learn whether writes are enabled. It
returns a discriminated auth_state (ok / no_token / token_expired / token_rejected /
dev_token_missing / account_inactive) and needs_interactive_auth, so a client can branch
deterministically instead of pattern-matching an error string.
Auth — get_auth_url, complete_auth (one-time interactive sign-in; see below).
Read — account_health, search_accounts, set_active_account (switch which account
calls hit), get_campaigns, get_ad_groups, get_keywords, get_ads (includes the RSA copy:
headlines / descriptions / paths), get_budgets, get_negative_keywords, get_ad_extensions,
get_conversion_goals, get_uet_tags, get_location_targets, get_location_intent
(presence vs. search-interest targeting), get_ad_schedules (dayparting windows plus the
campaign time zone they run in), get_device_bid_adjustments (per-device modifiers —
Computers / Smartphones / Tablets), resolve_postal_codes
(ZIP → Microsoft LocationId), bulk_download, get_account_url_options. get_campaigns also
surfaces each campaign's time_zone, start_date, languages, bid_strategy_type (plus its
stored max_cpc / target_cpa / target_roas when the scheme carries them), and
ad_schedule_use_searcher_time_zone. get_ad_groups surfaces each ad group's network (ad
distribution: the entire Microsoft Advertising Network vs. Microsoft sites and select traffic only).
The hierarchy reads
(get_campaigns, get_ad_groups, get_ads, get_keywords) also surface each entity's URL
tracking — tracking_url_template, final_url_suffix, and url_custom_parameters. A null
template at a level usually means it inherits the account-level default, which
get_account_url_options returns (tracking template, Final URL suffix, and
msclkid_auto_tagging_enabled — the Microsoft Click ID that drives attribution). Confirm these
before activating paused campaigns rather than assuming the per-campaign blanks mean "untracked".
get_ads and get_keywords also surface editorial_status — the ad-review state (Active /
Inactive / ActiveLimited / Disapproved), separate from the Active/Paused status — so you can
tell whether an Active ad or keyword is actually approved to serve (the first thing to check on
zero impressions).
get_conversion_goals reports each goal's exclude_from_bidding — the inverse of the UI's
"Include in conversions" checkbox, i.e. whether the goal feeds automated bidding (ECPC / tCPA) —
plus count_type, conversion_window_in_minutes, goal_category, and the revenue model; confirm
a goal is included before relying on it to steer spend.
Reporting — run_performance_report (submit → poll → download → parse, returns rows),
covering campaign / keyword / search-query / geographic reports. Supports a predefined
date_range or a custom start_date/end_date, and scoping to a single campaign_id /
ad_group_id / account_id.
Keyword research (Ad Insight / Keyword Planner; read-only, registered even in READ_ONLY
mode) — estimate_keyword_bids returns the estimated first-page (or mainline) bid per keyword
(estimated_min_bid) with the modeled CPC/CTR/clicks/impressions/cost it buys;
get_keyword_ideas discovers keywords from seed phrases and/or a landing-page URL with monthly
search volume, a suggested bid, and a competition bucket (defaults to English / United States);
and get_keyword_traffic_estimates projects weekly clicks / impressions / cost / position for
keywords at a given max CPC. check_first_page_bids(ad_group_id, campaign_id) joins an ad group's
live keyword bids to these estimates and flags the keywords bidding below their first-page bid (the
"Below first page bid" delivery state), each with its current_bid, estimated_first_page_bid,
and shortfall. Every value is a modeled estimate and may be null where Microsoft has no data.
Write (only when READ_ONLY=false) — new campaigns / ad groups / ads are created PAUSED.
Campaigns, ad groups, ads, keywords —
create_campaign,update_campaign,update_campaign_status,create_ad_group,update_ad_group,create_responsive_search_ad,update_responsive_search_ad,add_keywords,update_keyword,delete_campaign,delete_ad_group,delete_ad,delete_keyword. Create/update at every level (campaign, ad group, ad, keyword) accepttracking_url_template,final_url_suffix, andurl_custom_parameters(a{key: value}map, referenced in templates as{_key}).create_ad_group/update_ad_groupalso acceptnetwork(ad distribution).create_campaign/update_campaignalso acceptbid_strategy_typeto set the campaign's inline bid strategy (EnhancedCpc,ManualCpc,MaxClicks,MaxConversions,TargetCpa,MaxConversionValue,TargetRoas) with optionalmax_cpc/target_cpa/target_roas— e.g.MaxClicks+max_cpcis Maximize Clicks with a Maximum CPC limit (distinct frombid_strategy_id, which applies a portfolio strategy; set one or the other).Account-level URL options —
set_account_url_optionssets the tracking template, Final URL suffix, andmsclkidauto-tagging once for the whole account (every campaign inherits them) — the cleanest single-point lever for an account-wide tracking/rebrand change.Negative keywords —
add_negative_keywords,remove_negative_keywords(campaign or ad-group scope).Ad extensions —
add_call_extension,update_call_extension,add_callout_extension,add_sitelink_extension,update_sitelink_extension,add_structured_snippet_extension,update_structured_snippet_extension,delete_ad_extension. Call extensions acceptis_call_tracking_enabled(US/UK) to turn on Microsoft call tracking so call-from-ad conversions are measured — pass it onadd_call_extension, or flip it on an existing asset withupdate_call_extension. New forwarding numbers are local (toll-free is no longer provisioned). They also acceptis_call_only(the "Show just my phone number" call-only mobile format). Sitelinks carry the twodescription1/description2lines (set both or neither); structured snippets carry aheaderfrom Microsoft's predefined list (e.g. "Brands", "Services", "Types") plus 3-10 shortvalues. Theupdate_sitelink_extension/update_structured_snippet_extensiontools edit those in place (e.g. add descriptions to an existing sitelink), re-sending the replace-required fields for you so a partial edit is safe.delete_ad_extensionremoves any extension type by id — it deletes the account-level object itself, not just a single campaign/ad-group association.get_ad_extensionssurfaces the currentis_call_tracking_enabled/is_call_onlyflags, sitelink descriptions, and snippet header/values.Conversion goals / UET tags —
create_conversion_goaladds a goal: anOfflineConversiongoal (keyed by MSCLKID, no UET tag) or a UET-backed web goal (Url/Event/Duration/PagesViewedPerVisit, which need atag_id). Goals are created active (a goal doesn't spend; a paused one silently fails to record).update_conversion_goaledits a goal in place: rename, setstatus, and (most launch-relevant) toggleexclude_from_bidding— the inverse of the UI's "Include in conversions" checkbox, the single switch for whether a goal feeds automated bidding (ECPC / tCPA). Also setscount_type,conversion_window_in_minutes, and the revenue model (revenue_type/revenue_value/revenue_currency_code). For phone calls there is no native "calls from ads" goal:apply_offline_conversionsis the bid-eligible path — filter the call-center log yourself (e.g. calls ≥60s), then upload qualifying calls by MSCLKID against anOfflineConversiongoal whose name matchesconversion_name.update_uet_tagrenames/redescribes a tag.Location (ZIP/geo) targeting —
add_location_targets,remove_location_targets,set_location_intent(presence —PeopleIn— vs. search-interest targeting; one criterion per campaign, updated in place).Ad scheduling (dayparting) —
add_ad_schedules,remove_ad_schedules,replace_ad_schedule(day + time windows at 15-minute granularity; times run in the campaign time zone unlessuse_searcher_time_zoneis set). Windows are additive, but a same-day window may not overlap an existing one (the API rejects it), so to change or extend a window usereplace_ad_schedule(which removes the old criterion then adds the new one — the only safe order) rather than adding over it.update_campaignacceptstime_zoneto set the zone those schedules run in.Device bid adjustments —
set_device_bid_adjustment(campaign_id, device, bid_adjustment)sets a per-device modifier (-100 to 900 percent; -100 excludes the device). Microsoft calls mobile Smartphones (there is no "Mobile"); "Computers" is desktop/laptop. Device criterions are created as a set, so the first call also creates the other two at a neutral 0.Bulk API —
bulk_upload.
The update_* tools patch in place: only the fields you pass change. Prefer them over
recreate-and-pause when an entity already exists.
Tool discovery (TOOL_SEARCH)
With TOOL_SEARCH=true, the server lists only a few pinned orientation tools
(account_health, search_accounts, get_campaigns, run_performance_report, plus the auth
tools) alongside two synthetic tools: search_tools(query) (BM25 over names, descriptions, and
parameters) and call_tool(name, arguments). The rest of the catalog is discovered on demand
instead of loaded upfront — useful as the tool count grows. Hidden tools keep their full typed
schemas, and because search runs through the normal pipeline, the READ_ONLY gate still applies:
write tools aren't registered in read-only mode, so they're neither listed nor discoverable. This
is FastMCP's stable BM25SearchTransform — no code execution, no sandbox.
Architecture
src/microsoft_ads_mcp/
config.py # pydantic-settings; all env config
server.py # builds FastMCP, lifespan-manages the client, registers tools
api/
auth.py # OAuth flow + hardened token store
client.py # wraps msads ServiceClient(s); the single dispatch point
errors.py # translate openapi_client exceptions -> MsAdsApiError
domain/
entities.py # lean Pydantic summary/report models for tool outputs
services/
accounts.py # user/account reads (CustomerManagementService)
account_properties.py # account-level URL options (CampaignManagementService AccountProperties)
campaigns.py # hierarchy + list reads
mutations.py # create/update/delete for campaigns, ad groups, ads, keywords
negatives.py # negative-keyword add/list/remove
extensions.py # ad extensions (call/callout/sitelink/structured snippet)
conversions.py # conversion goals + UET tags
criteria.py # location (ZIP/geo) targeting via campaign criterions
geo.py # ZIP -> LocationId resolution (cached geo-locations file)
bulk.py # Bulk API upload/download (submit/poll)
reporting.py # submit/poll/download/parse
insights.py # Ad Insight keyword research (bid/idea/traffic estimates)
tools/
health.py read_tools.py write_tools.py reporting_tools.py insight_tools.py auth_tools.py # READ_ONLY-gatedDevelopment
uv run ruff check . && uv run ruff format --check .
uv run ty check
uv run pytest -q
# or all at once:
bash scripts/ci.shMCP Inspector
The MCP Inspector is a browser UI for calling the server's tools by hand — the fastest way to exercise a tool while iterating locally. FastMCP ships an integration that launches it (with auto-reload on file changes):
# Run the package as a module (-m) so its relative imports resolve; --with-editable .
# installs this package into the Inspector's ephemeral env.
uv run fastmcp dev inspector microsoft_ads_mcp -m --with-editable .This prints a http://localhost:6274/?MCP_PROXY_AUTH_TOKEN=... URL — open it, connect, and
call account_health first. To test the exact python -m entrypoint an MCP client uses,
run the standalone Inspector against the real command instead:
npx @modelcontextprotocol/inspector uv run python -m microsoft_ads_mcpEither way, credentials load from .env. Write tools only appear when READ_ONLY=false —
set it in .env, or (for the standalone Inspector) in its env panel before connecting.
License
MIT — see LICENSE.
Available Tools
66 toolsaccount_healthARead-only
Validate credentials and report the environment and write mode.
Call this first. read_only tells you whether write tools are available this
session; environment is production or sandbox. auth_state discriminates why
auth failed (e.g. no_token vs token_rejected); branch on needs_interactive_auth
rather than the message string.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| message | Yes | |
| read_only | Yes | |
| user_name | No | |
| account_id | No | |
| auth_state | No | |
| customer_id | No | |
| environment | Yes | |
| needs_interactive_auth | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description details returned fields (read_only, environment, auth_state, needs_interactive_auth) and their meanings, including advice to branch on needs_interactive_auth rather than message strings. This adds significant 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?
The description is concise and front-loaded with the main purpose. It uses a structured format with field names in backticks, making it easy to parse. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, the presence of an output schema, and annotations, the description fully explains the output fields, their interpretation, and provides actionable guidance for error handling. It is complete for the tool's simplicity.
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?
No input parameters exist. Schema coverage is 100%, so baseline is 4. The description does not need to add parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Validate credentials and report the environment and write mode.' It distinguishes itself from siblings by being the tool to call first for auth checks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs 'Call this first,' indicating when to use it. It also explains how to interpret results, but does not explicitly mention when not to use it or provide exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_ad_schedulesA
Add ad-schedule (dayparting) windows to a campaign.
Each window restricts serving to one day and time range and is additive (a campaign with no schedule serves all hours). Hours are 0-24; minutes are 15-minute granularity, so only 0/15/30/45 are valid (e.g. 09:15-16:45 -> from_hour 9, from_minute 15, to_hour 16, to_minute 45). Times run in the campaign time zone (see get_campaigns / get_ad_schedules) unless you pass use_searcher_time_zone=true. Read existing windows with get_ad_schedules first to avoid duplicates.
A new window for a day may NOT overlap an existing window on that same day -- the API rejects the add (returned as ok=false with a partial error, not a crash). To change or extend a window, remove_ad_schedules the old criterion first and then add the new one, in that order (adding the overlapping window first fails); or use replace_ad_schedule, which does the remove-then-add for a single window in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| schedules | Yes | Windows to add, each {day, from_hour, from_minute, to_hour, to_minute, bid_adjustment}. day is "Monday".."Sunday"; bid_adjustment is a percent modifier (0 = no change). | |
| campaign_id | Yes | The campaign id. | |
| use_searcher_time_zone | No | If set, also updates the campaign flag controlling whether the hours are interpreted in each searcher's time zone (true) or the campaign's (false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation (false), the description details additive behavior, granularity of minutes (0/15/30/45), time zone handling, the no-overlap rejection with ok=false partial error, and the need for ordered operations. This fully informs the agent of all behavioral traits.
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 organized into two logical paragraphs: first about schedule semantics and time, second about constraints and workaround. Each sentence adds value without redundancy. Slightly verbose but acceptable for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (additive windows, constraints, error behavior, and interaction with three sibling tools), the description covers all necessary aspects: granularity, time zone, duplicate prevention, overlap handling, error response format, and alternative workflows. Output schema is not provided but the description mentions the return format (ok=false). This is complete for an AI agent to use 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?
Input schema has 100% description coverage, so baseline is 3. The description adds meaning by explaining the additive nature of schedules, the 15-minute granularity, and the time zone fallback logic. It also provides practical context like reading existing windows and overlapping rules, which the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Add ad-schedule (dayparting) windows' with a specific verb and resource. It distinguishes from siblings like remove_ad_schedules and replace_ad_schedule by naming them in the context of handling duplicates and changes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises reading existing windows first with get_ad_schedules to avoid duplicates, explains the no-overlap rule, and provides step-by-step instructions for modifications: remove first then add, or use replace_ad_schedule. This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_call_extensionA
Create a call extension and optionally attach it to a campaign or ad group.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | No | Campaign or ad group id to associate it with (omit to create unattached). | |
| country_code | No | Two-letter country code for the number (default "US"). | US |
| is_call_only | No | Whether the extension shows only the phone number (no website click). | |
| phone_number | Yes | The phone number to show (e.g. "2065550100"). | |
| association_type | No | "Campaign" or "AdGroup" (default "Campaign"). | Campaign |
| is_call_tracking_enabled | No | Turn on Microsoft call tracking (US/UK only) so call-from-ad conversions are measured. Microsoft displays a forwarding number instead of the raw number; new forwarding numbers are local (toll-free is no longer provisioned). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description merely states 'Create' which aligns with annotations (readOnlyHint: false), but adds no further behavioral context (e.g., permissions, limits, side effects). Key behavioral details are relegated to parameter descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no wasted words. Front-loaded with the core action.
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 creation tool with an output schema (not shown), the description adequately covers the core action and optional attachment. It implicitly covers context given the sibling list and parameter count.
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?
Since schema description coverage is 100%, the baseline is 3. The description adds no extra meaning beyond the schema's already detailed parameter documentation.
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?
Description clearly states 'Create a call extension' with a specific verb and resource, and distinguishes from sibling tools like 'update_call_extension' and 'add_callout_extension'.
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 guidance on when to use this tool versus alternatives such as 'update_call_extension'. The description implies usage for creation but lacks exclusions or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_callout_extensionA
Create a callout extension and optionally attach it to a campaign or ad group.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Callout text (max 25 chars). | |
| entity_id | No | Campaign or ad group id to associate it with (omit to create unattached). | |
| association_type | No | "Campaign" or "AdGroup" (default "Campaign"). | Campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate mutation (readOnlyHint=false). The description adds behavioral detail about optional attachment to a campaign or ad group, but does not disclose potential side effects, idempotency, or limits beyond what the annotations 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?
A single, concise sentence that covers the core functionality with no extraneous words. Front-loaded with the primary action.
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 tool is simple with 3 parameters and an output schema exists, so the description is largely adequate. However, it could mention that callout extensions are a type of ad extension and that there might be limits, but these are not critical gaps.
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 parameter descriptions already present. The description adds no new parameter-level information beyond what the schema provides, so it meets the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Create') and the resource ('callout extension'), and it distinguishes the tool from sibling tools that create other extension types like sitelinks or structured snippets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide explicit guidance on when to use this tool versus alternatives (e.g., other extension types), nor does it mention prerequisites or when not to use it. The usage context is implied but not clarified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_keywordsB
Add keywords (Active) to an ad group.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | Keyword texts to add. | |
| match_type | No | "Broad", "Phrase", or "Exact" (default "Broad"). | Broad |
| ad_group_id | Yes | The ad group id. | |
| default_bid | No | Default CPC bid in account currency (default 1.0). | |
| final_url_suffix | No | Optional Final URL suffix (applies to every keyword in this batch). | |
| tracking_url_template | No | Optional keyword-level tracking template (applies to every keyword in this batch; overrides ad-group/campaign templates). | |
| url_custom_parameters | No | Optional {key: value} URL custom parameters, referenced in templates/suffixes as {_key} (applies to every keyword in this batch). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the action (add) but provides no additional behavioral traits beyond the annotation's readOnlyHint=false. It does not mention whether duplicates are handled, the impact on existing keywords, or any rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no unnecessary words. It efficiently conveys the core action and scope.
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?
Despite having an output schema, the description is too brief. Given the tool's complexity (7 parameters), it lacks guidance on when to use it, prerequisites, and limitations, leaving an agent underinformed.
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 each parameter is already described in the schema. The tool description adds no extra meaning beyond what the schema provides, earning the baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Add keywords' and the resource 'ad group', along with the status '(Active)'. This distinguishes it from sibling tools like 'update_keyword' or 'add_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?
No explicit guidance on when to use this tool vs alternatives. It does not mention prerequisites like the ad group must exist or be active, nor does it compare with 'update_keyword' or 'add_negative_keywords'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_location_targetsA
Target (or exclude) Microsoft LocationIds on a campaign.
Resolve ZIPs to LocationIds first with resolve_postal_codes.
| Name | Required | Description | Default |
|---|---|---|---|
| exclude | No | When true, exclude these locations instead of targeting them. | |
| campaign_id | Yes | The campaign id. | |
| location_ids | Yes | Microsoft LocationIds to target/exclude. | |
| bid_adjustment | No | Percent bid modifier for targeted locations (ignored when exclude). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description indicates a mutation operation (target or exclude), consistent with the readOnlyHint=false annotation. However, it lacks details on how existing targets are affected (e.g., overwrite or append) and any potential side effects.
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 extremely concise: two sentences with no wasted words. It is front-loaded with the core action and provides a useful prerequisite in the second 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?
Given the existence of an output schema, the description does not need to explain return values. It could provide more context on how bid_adjustment interacts with targeting vs. exclusion, but overall it is reasonably complete for a well-documented 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 100% schema description coverage, the schema already documents all parameters. The description adds minimal semantic value beyond the schema, only hinting that location_ids should come from resolve_postal_codes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool targets or excludes Microsoft LocationIds on a campaign, using a specific verb and resource. However, it does not explicitly differentiate from sibling tools like remove_location_targets, which is a minor gap.
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 provides a clear prerequisite (resolve ZIPs to LocationIds first with resolve_postal_codes), helping the agent understand the required sequence. It does not explicitly state when not to use this tool, but the context is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_negative_keywordsB
Attach negative keywords to a campaign or ad group.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | Negative keyword texts to add. | |
| entity_id | Yes | The campaign id (or ad group id) to attach negatives to. | |
| match_type | No | "Broad", "Phrase", or "Exact" (default "Exact"). | Exact |
| entity_type | No | "Campaign" or "AdGroup" (default "Campaign"). | Campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description only restates that the tool adds keywords, without disclosing behavioral details such as whether it appends or overwrites existing negatives, or any rate limits. The readOnlyHint=false annotation already indicates mutation, so the description adds little beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that immediately conveys the tool's purpose. It is appropriately sized but could be slightly more structured to include brief usage 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?
Given the presence of an output schema, the description does not need to detail return values. However, it lacks context about error conditions, idempotency, or limits. For a mutation tool, this is adequate but not comprehensive.
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?
Since schema description coverage is 100%, the baseline is 3. The description does not add any additional meaning beyond what the schema already provides for 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 clearly states the action ('attach negative keywords') and the target resource ('campaign or ad group'), distinguishing it from sibling tools like 'add_keywords' or 'remove_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?
The description does not provide guidance on when to use this tool versus alternatives like 'remove_negative_keywords' or 'add_keywords'. It also lacks context about prerequisites (e.g., the entity must exist) or when to choose campaign vs. ad group.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_sitelink_extensionA
Create a sitelink extension and optionally attach it to a campaign or ad group.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | No | Campaign or ad group id to associate it with (omit to create unattached). | |
| final_url | Yes | Landing page URL for the sitelink. | |
| description1 | No | First description line shown under the link (max 35 chars). Microsoft requires both description lines together, so pass description1 and description2 as a pair or omit both. | |
| description2 | No | Second description line (max 35 chars); see description1. | |
| display_text | Yes | Sitelink link text (max 25 chars). | |
| association_type | No | "Campaign" or "AdGroup" (default "Campaign"). | Campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint: false (write operation), which the description confirms. However, the description adds minimal behavioral context beyond creation and optional attachment. It does not disclose prerequisites (e.g., needing a campaign/ad group), side effects of attachment, or limits on the number of extensions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence (13 words) that front-loads the essential information. Every word is meaningful, 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?
Given that an output schema exists (reducing the need to explain return values), the description is fairly complete for a creation tool. It covers the core action and optional attachment. However, it could briefly mention the pairing constraint for descriptions, though the schema already handles that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description does not add any extra meaning beyond what the schema already provides for parameters like entity_id, final_url, etc.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Create'), the resource ('sitelink extension'), and the optional association ('optionally attach to a campaign or ad group'). It effectively distinguishes from sibling tools like update_sitelink_extension (modify) and other extension tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for creation, but lacks explicit guidance on when to use this tool versus alternatives (e.g., when to attach vs. create unattached, or comparisons with other extension creation tools). No when-not or exclusion criteria are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_structured_snippet_extensionA
Create a structured snippet extension and optionally attach it to a campaign/ad group.
A structured snippet is a header followed by a short list of values (e.g. header "Brands" with values ["Acme", "Globex", "Initech"]).
| Name | Required | Description | Default |
|---|---|---|---|
| header | Yes | The snippet header. Must be one of Microsoft's predefined headers (e.g. "Amenities", "Brands", "Courses", "Degree programs", "Destinations", "Featured hotels", "Insurance coverage", "Languages", "Models", "Neighborhoods", "Service catalog", "Shows", "Styles", "Types"); an unrecognized header is rejected. | |
| values | Yes | 3 to 10 snippet values, each shown after the header (max 25 chars each). | |
| entity_id | No | Campaign or ad group id to associate it with (omit to create unattached). | |
| association_type | No | "Campaign" or "AdGroup" (default "Campaign"). | Campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, consistent with 'Create'. The description adds optional attachment context but no further behavioral traits like required permissions or side effects. Adequate but minimal given no annotation contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences front-loaded with main action. The example is helpful but not strictly necessary; still compact with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given output schema exists and schema descriptions are thorough, the description is complete for a create operation. It lacks mention of authentication context, but that is likely shared across sibling tools.
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 detailed parameter descriptions. The description adds an example but does not provide additional semantic meaning beyond the schema, so baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Create' and the resource 'structured snippet extension', and optionally attaching to campaign/ad group. It distinguishes from siblings like update_structured_snippet_extension and other add_* extensions by specific naming.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for creating new extensions but does not explicitly state when to use this vs. alternatives (e.g., update). No exclusions or prerequisites mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_website_exclusionsA
Block websites / mobile-app ids on a campaign so ads won't serve there.
Additive: new sites are merged with the campaign's existing exclusions (read-modify-write), so this never clobbers what's already blocked. Pass bare domains or paths (e.g. "example.com", "example.com/section") or mobile-app ids; a leading http(s):// is stripped for you. Microsoft sites (e.g. MSN.com) can't be excluded and there's a ~2500-site cap per campaign -- such rejections come back in partial_errors. View with get_website_exclusions.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | Websites / app ids to block (referrer domains). | |
| campaign_id | Yes | The campaign id to block sites on. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint: false annotation, the description provides rich behavioral details: read-modify-write semantics, URL stripping, exclusion of Microsoft sites, cap of ~2500 sites, and partial error returns. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each adding distinct information. Front-loaded with purpose, then additive behavior, then formatting details, then constraints/error handling. No fluff.
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 2 simple parameters and an output schema (present but not shown), the description covers behavior, constraints, error handling, and sibling tool for reading. It is self-contained and leaves no major gaps for a typical use case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with basic descriptions, but the description adds significant value by specifying formats (bare domains, paths, mobile-app ids) and that leading http(s):// is stripped. This helps the agent format inputs correctly.
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?
Clearly states the verb 'block' and the resource 'websites/mobile-app ids on a campaign'. Distinguishes from sibling tools by mentioning additive nature and referencing get_website_exclusions for viewing.
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 the additive behavior (never clobbers), constraints (Microsoft sites cannot be excluded, 2500-site cap), and error handling (partial_errors). Mentions viewing with get_website_exclusions but does not explicitly compare to remove_website_exclusions or state when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_offline_conversionsA
Import offline conversions against an OfflineConversion goal, keyed by MSCLKID.
This is the bid-eligible path for phone calls: create an OfflineConversion goal with create_conversion_goal, apply your own qualifying filter to the call-center log (e.g. keep calls >=60s), then upload one record per qualifying call. Each record is attributed to the click that drove it and counted under the goal whose name matches conversion_name. Returns per-record errors in partial_errors (the API returns no ids).
Note: wait ~2 hours after creating an OfflineConversion goal before uploading — earlier uploads are rejected with "OfflineConversionNotAcceptedForGoal" (expected, not a bug).
| Name | Required | Description | Default |
|---|---|---|---|
| conversions_to_apply | Yes | One or more conversions. Each has: click_id — the MSCLKID from the ad click (Microsoft auto-tags it onto landing-page URLs; see get_account_url_options); conversion_name — must match an existing OfflineConversion goal's name; conversion_time — ISO-8601 timestamp (treated as UTC if no offset given), after the click and within the goal's conversion window; value — optional conversion value (requires currency_code); currency_code — ISO 4217 code for value, e.g. "USD". |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate mutation (readOnlyHint=false), and the description expands on behavioral aspects: returns partial_errors, no ids, requires post-creation wait, and details the record attribution logic. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise paragraphs with no fluff; first sentence captures purpose, then details usage and constraints. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 1 parameter (array), 100% schema coverage, output schema (partial_errors), and thorough description covering purpose, usage, timing, error handling, and parameter details, the tool is fully specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. The description adds significant meaning beyond schema: explains click_id as MSCLKID, conversion_name must match goal, conversion_time as ISO-8601, and value/currency_code relationship.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool imports offline conversions against an OfflineConversion goal keyed by MSCLKID, and distinguishes it from siblings by specifying its use for bid-eligible phone call conversions, referencing create_conversion_goal.
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 explicit guidance on when to use (after creating a goal, for qualifying calls) and when not to (wait ~2 hours before uploading to avoid rejection), and notes the alternative of creating a goal first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_downloadARead-only
Export the account to a Bulk file; returns the result file URL when ready.
Submits a Bulk download and polls to completion (the file can be large, so the URL is returned rather than the contents).
| Name | Required | Description | Default |
|---|---|---|---|
| entities | No | Entity types to include, e.g. ["Campaigns", "AdGroups", "Ads", "Keywords"] (the default set). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the readOnlyHint annotation by explaining the polling behavior and file size reasoning. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with purpose and outcome, no redundant 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?
Given low complexity (one optional param), existing output schema, and clear behavioral description (polling, file size), the description is complete for an agent.
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 parameter 'entities' is fully described in the input schema (100% coverage). The tool description does not add further semantic meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Export the account to a Bulk file') and the outcome ('returns the result file URL when ready'). It distinguishes from siblings like bulk_upload but does not explicitly differentiate from other read tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that it polls and returns a URL due to file size, but does not provide explicit guidance on when to use this tool versus alternatives (e.g., individual get_* tools). No when-not or alternative references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_uploadB
Apply ready-made Bulk CSV rows to the account; polls to completion.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_records | Yes | Bulk-file CSV rows (including the Format Version / Type header rows Microsoft expects). Returns the request status and result file URL. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, so the description adds minimal extra behavioral context. It mentions polling but does not disclose details like whether it's synchronous, how long polling takes, what gets destroyed, 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?
The description is a single sentence that efficiently states the action and polling behavior without wasted words. It could be slightly improved by front-loading the purpose more prominently.
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?
Despite having an output schema, the description does not explain the polling mechanism, return format, or error states. For a bulk upload tool, this lacks completeness for an agent to fully understand the 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 100%, and the parameter description already explains the CSV rows and expected output. The tool description adds context about applying to the account but does not add 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?
The description clearly states it applies ready-made Bulk CSV rows to the account and polls to completion, specifying the verb and resource. However, it does not differentiate from the sibling 'bulk_download' tool, which is for downloading.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when CSV rows are ready and the tool will poll to completion, but it does not explicitly state when to use this tool versus alternatives or provide exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_first_page_bidsARead-only
Flag keywords whose bid is below the estimated first-page bid ("Below first page bid").
This is the API-driven version of the delivery state the UI shows as "Below first page
bid". For each keyword in the ad group it looks up the Keyword Planner first-page bid
estimate (at the keyword's own match type) and compares it against the keyword's effective
bid -- the keyword's own bid, or the ad group's default bid when the keyword has none. The
result lists the under-bid keywords first (largest shortfall first) with each one's
current_bid, estimated_first_page_bid, and bid_source, plus counts. Use it when
diagnosing low impressions, or before activating a campaign, to find keywords that won't
reach the first page at their current bid.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Language name for the estimate, e.g. "English" (optional). | |
| ad_group_id | Yes | The ad group whose keywords to check. | |
| campaign_id | Yes | The parent campaign id -- required to read the ad group's default bid, which keywords without their own bid inherit. | |
| location_ids | No | Microsoft location ids to scope demand to; the estimate defaults to the United States ("190") when omitted. | |
| target_position | No | "FirstPage" (default), "MainLine", or "MainLine1" (top ad slot). | FirstPage |
Output Schema
| Name | Required | Description |
|---|---|---|
| keywords | No | |
| ad_group_id | Yes | |
| currency_code | No | |
| target_position | Yes | |
| keywords_checked | Yes | |
| undetermined_count | Yes | |
| ad_group_default_bid | No | |
| below_first_page_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the internal logic: looks up Keyword Planner first-page bid estimate, compares it to effective bid, and lists under-bid keywords with details. This adds significant value beyond the readOnlyHint annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, starting with the core purpose, then explaining the algorithm and output. Every sentence adds value without unnecessary verbosity.
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 presence of an output schema, the description adequately covers the purpose, usage, and behavioral details. It mentions the result structure (under-bid keywords with fields and counts), making it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. However, the description adds context on how parameters like campaign_id are used (to read the ad group's default bid), which goes beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Flag keywords whose bid is below the estimated first-page bid.' It is specific and distinguishes from sibling tools by focusing on a unique diagnostic action.
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?
Explicit usage guidance is provided: 'Use it when diagnosing low impressions, or before activating a campaign, to find keywords that won't reach the first page at their current bid.' This clearly indicates when to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_authA
Finish sign-in: exchange the browser's redirect URL for a saved refresh token.
Call this with the URL the user pasted back after completing get_auth_url.
| Name | Required | Description | Default |
|---|---|---|---|
| redirect_url | Yes | The full URL the browser landed on after sign-in (contains ``code=``). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide openWorldHint (true). The description adds that the tool saves a refresh token, indicating state change. This adds value beyond annotations but does not detail other behaviors like side effects or persistence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, perfectly front-loaded with the core action. No superfluous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists (not shown but indicated in context signals), the description does not need to explain return values. It fully covers the required context for an auth completion 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 covers 100% of the parameter, but the description adds crucial context: the URL comes from the browser after completing get_auth_url. This goes beyond the schema's description of 'the full URL the browser landed on.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: finish sign-in by exchanging a redirect URL for a refresh token. It uses a specific verb+resource and distinctly differs from all sibling tools (e.g., get_auth_url).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to call this after get_auth_url and with the URL the user pastes back, providing clear context and sequencing. No explicit when-not-to-use, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ad_groupA
Create an ad group (PAUSED) in a campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Ad group name. | |
| cpc_bid | No | Default CPC bid in account currency (default 1.0). | |
| network | No | Ad distribution (where the ad group serves). Omit to inherit Microsoft's default. "OwnedAndOperatedAndSyndicatedSearch" = the entire Microsoft Advertising Network (Microsoft sites + all syndicated partners); "OwnedAndOperatedOnly" = Microsoft sites and select traffic (a quality-screened partner subset). | |
| language | No | Ad group language (required by Microsoft; default "English"). | English |
| campaign_id | Yes | The parent campaign id. | |
| final_url_suffix | No | Optional Final URL suffix appended to landing-page URLs. | |
| tracking_url_template | No | Optional tracking template for URLs in the ad group. | |
| url_custom_parameters | No | Optional {key: value} URL custom parameters, referenced in templates/suffixes as {_key}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the initial paused state, which adds value beyond the annotation (readOnlyHint=false). However, it does not mention other behaviors like validation requirements, side effects, or auth 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?
The description is a single sentence that conveys the core purpose without any unnecessary words. It is well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is an output schema and the tool is relatively simple (create with 2 required parameters), the description is complete enough. It could mention activation after creation but is adequate.
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 adds no extra parameter details beyond what the schema already provides; it only mentions the initial state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Create an ad group (PAUSED)' with the resource and an important initial state. It distinguishes from sibling tools like update_ad_group or delete_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?
The description implies usage for creating a new ad group but does not provide explicit when-to-use or when-not-to-use guidance, nor does it mention alternatives or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_campaignA
Create a Search campaign (PAUSED by default for safety).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Campaign name. | |
| max_cpc | No | Optional Maximum CPC limit (account currency) for MaxClicks / MaxConversions / TargetCpa / MaxConversionValue / TargetRoas. Not valid for EnhancedCpc / ManualCpc. | |
| target_cpa | No | Target CPA (account currency) for TargetCpa / MaxConversions. | |
| description | No | Optional description. | |
| target_roas | No | Target ROAS for TargetRoas / MaxConversionValue. | |
| daily_budget | Yes | Daily budget in account currency. | |
| final_url_suffix | No | Optional Final URL suffix appended to landing-page URLs. | |
| bid_strategy_type | No | The campaign's inline bid strategy. Omit to inherit Microsoft's default (EnhancedCpc). One of "EnhancedCpc", "ManualCpc", "MaxClicks", "MaxConversions", "TargetCpa", "MaxConversionValue", "TargetRoas". | |
| tracking_url_template | No | Optional tracking template applied to all URLs in the campaign (e.g. "{lpurl}?utm_source=bing"). | |
| url_custom_parameters | No | Optional {key: value} URL custom parameters, referenced in templates/suffixes as {_key} (e.g. {"src": "bing"}). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate readOnlyHint=false. The description adds value by disclosing that the campaign is created in a PAUSED state for safety, a behavioral trait important for the agent to know.
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 sentence, front-loaded with the core action, and contains no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (10 parameters, output schema exists), the description is minimal but covers the essential action and the paused default. The output schema likely provides return details, so the description is adequate but not rich.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with all parameters described. The description does not add any additional meaning beyond the schema, meeting the baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a Search campaign' with a specific verb and resource, and adds the notable default state 'PAUSED by default for safety', which distinguishes it from sibling update/delete tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when creating a new Search campaign, but provides no explicit guidance on when to use this tool versus alternatives like creating ad groups or updating campaigns, nor prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_conversion_goalA
Create a conversion goal. Goals are created Active (a goal does not spend; a paused goal silently fails to record conversions) — pass status="Paused" to override.
Conversion goals CANNOT be deleted (Microsoft has no delete API) — they can only be paused or renamed, so name them deliberately.
Microsoft has no native "calls from ads" goal. The bid-eligible path for phone calls is an "OfflineConversion" goal fed by apply_offline_conversions (keyed by MSCLKID) — create that goal here, then upload qualifying calls with apply_offline_conversions.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Goal name. For an OfflineConversion goal, this is the name you pass as conversion_name to apply_offline_conversions. | |
| value | No | ||
| status | No | "Active" (default) or "Paused". | |
| tag_id | No | UET tag id (from get_uet_tags) — REQUIRED for the web goals, must be omitted for OfflineConversion (it is keyed by MSCLKID, not a UET tag). | |
| goal_type | Yes | One of "OfflineConversion", "Url", "Event", "Duration", "PagesViewedPerVisit". The four web goals require tag_id; OfflineConversion does not (it keys on MSCLKID). | |
| count_type | No | "All" (every conversion per click) or "Unique" (one per click). | |
| revenue_type | No | Value model — "FixedValue" (requires revenue_value), "VariableValue", or "NoValue". | |
| url_operator | No | Url goal — match operator: "Equals" (default), "BeginsWith", "RegularExpression", "Contains". | Equals |
| goal_category | No | Reporting category, e.g. "Purchase", "SubmitLeadForm", "Contact". Required for "Event" and "OfflineConversion" goals (Microsoft rejects them with InvalidGoalCategory if omitted); recommended for the others too. | |
| revenue_value | No | Revenue amount (required for "FixedValue"). | |
| label_operator | No | ||
| url_expression | No | Url goal — the URL to match (required for "Url"). | |
| value_operator | No | ||
| action_operator | No | ||
| label_expression | No | ||
| action_expression | No | ||
| category_operator | No | ||
| category_expression | No | ||
| exclude_from_bidding | No | Omit to inherit Microsoft's default (false = included in bidding); true excludes the goal from the Conversions column and ECPC/tCPA bid math. | |
| minimum_pages_viewed | No | PagesViewedPerVisit goal — minimum pages per visit (required for "PagesViewedPerVisit"). | |
| revenue_currency_code | No | ISO currency code for revenue_value, e.g. "USD". | |
| minimum_duration_in_seconds | No | Duration goal — minimum time-on-site in seconds (required for "Duration"). Note: this measures UET dwell time, NOT phone-call length. | |
| conversion_window_in_minutes | No | Click-to-conversion lookback in minutes (e.g. 43200 = 30 days). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes key behaviors beyond annotations: goals created active, paused goal silently fails, cannot be deleted, and the relationship between offline conversion goals and apply_offline_conversions. Annotations only indicate not read-only, so description adds significant 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 paragraphs, front-loaded with key behavior. Efficient but slightly longer than absolutely necessary; still clear and well-structured.
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 high complexity (23 parameters, output schema exists), the description covers creation behavior, deletion constraint, status override, and relationship to offline conversions. Complete enough for correct agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 65%, which is moderate-high. The description does not elaborate on parameter semantics beyond what the schema provides. It adds context for some parameters indirectly (e.g., name for offline conversion), but overall parameter meaning is adequately covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a conversion goal, with specific verb 'Create'. It distinguishes itself from sibling tools like update_conversion_goal and apply_offline_conversions by explaining the offline conversion workflow and deletion constraints.
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?
Explicit guidance on when to use: create conversion goals, with notes on status override, deletion impossibility, and the specific path for offline conversion goals using apply_offline_conversions. Clearly differentiates from alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_responsive_search_adB
Create a Responsive Search Ad (PAUSED).
| Name | Required | Description | Default |
|---|---|---|---|
| path1 | No | Optional display URL path 1 (max 15 chars). | |
| path2 | No | Optional display URL path 2 (max 15 chars). | |
| final_url | Yes | Landing page URL. | |
| headlines | Yes | 3-15 headlines (truncated to 30 chars each). | |
| ad_group_id | Yes | The ad group id. | |
| descriptions | Yes | 2-4 descriptions (truncated to 90 chars each). | |
| final_url_suffix | No | Optional Final URL suffix appended to landing-page URLs. | |
| tracking_url_template | No | Optional tracking template for this ad's URLs. | |
| url_custom_parameters | No | Optional {key: value} URL custom parameters, referenced in templates/suffixes as {_key}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, so the description's 'Create' is consistent. The paused state is a helpful behavioral detail. However, no other behavioral traits are disclosed (e.g., auth requirements, rate limits, overwrite behavior). The description adds minimal value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise (one sentence) and front-loaded with key info. However, it is arguably too terse for a complex tool with 9 parameters, lacking contextual detail that would aid understanding without extra scanning.
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 existence of an output schema and full schema parameter coverage, the description doesn't need to explain return values. However, it fails to provide high-level context such as validation rules, required permissions, or relationship to other tools (e.g., ad groups). It meets the minimum but is not comprehensive.
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 all parameters and their descriptions. The tool description adds no additional meaning beyond what the schema 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?
The description clearly states the action ('Create'), the resource ('Responsive Search Ad'), and the initial state ('PAUSED'), which distinguishes it from the sibling tool 'update_responsive_search_ad'. 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 guidance is provided on when to use this tool versus alternatives (e.g., when to create an active ad instead of paused, or prerequisites like ad group existence). The description lacks any contextual usage tips.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_adB
Delete one or more ads by id.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_ids | Yes | The ad ids to delete. | |
| ad_group_id | Yes | The parent ad group id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description straightforwardly states the delete operation, which aligns with the annotation readOnlyHint=false. However, it adds no behavioral details such as whether deletion is irreversible, cascading effects, permissions required, or confirmation steps. The annotation already covers the write nature, so the description adds minimal 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?
The description is a single, concise sentence with no superfluous information. Every word is necessary and efficiently communicates the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete tool with two well-described parameters and an output schema, the description is largely sufficient. It lacks only minor context about return format or confirmation, but the output schema likely covers that. The sibling tools provide contrast, but the description does not address when alternatives are appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes both parameters (ad_ids and ad_group_id) with clear descriptions, and coverage is 100%. The tool description does not add any additional meaning beyond what the schema provides, meeting the baseline expectation.
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 'Delete one or more ads by id' precisely states the action (delete), the resource (ads), and the scope (by id). It clearly distinguishes from sibling tools like delete_keyword or delete_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?
No guidance is provided on when to use this tool versus alternatives (e.g., deleting campaigns or ad groups) or under what conditions deletion should be performed. There is no mention of prerequisites or consequences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_ad_extensionA
Delete account-level ad extensions by id.
Removes the extension objects entirely (not just their campaign/ad-group associations).
| Name | Required | Description | Default |
|---|---|---|---|
| ad_extension_ids | Yes | The ad extension ids to delete (from get_ad_extensions). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds context beyond the annotation (readOnlyHint=false) by specifying the scope (account-level) and effect (removes objects entirely), but does not detail destructive consequences or prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no extraneous information, effectively front-loading the core purpose and behavioral nuance.
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 tool with one parameter and an output schema, the description covers purpose and key behavior, leaving no significant gaps.
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 adds no additional meaning beyond the schema's parameter description, meeting the baseline for high schema 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?
The description clearly states the tool deletes account-level ad extensions by ID and emphasizes that it removes the extension objects entirely, distinguishing it from other operations that might only remove associations.
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 this tool (to remove entire extension objects vs. just associations) but does not provide explicit guidance or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_ad_groupB
Delete one or more ad groups by id.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | The parent campaign id. | |
| ad_group_ids | Yes | The ad group ids to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, implying destruction, and the description says 'delete', which is consistent but adds no additional behavioral context like irreversibility, permissions, or cascading effects.
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?
Extremely concise (6 words), efficient, and front-loaded. However, it could include slightly more context without becoming verbose.
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 delete operation, the description lacks important details such as whether the delete is soft or permanent, idempotency, and what the output schema contains. Minimal completeness given 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?
Scema coverage is 100% with clear descriptions for both parameters. The description adds no extra meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool deletes one or more ad groups by ID, which is specific and distinguishes it from sibling tools like delete_keyword or delete_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?
No guidance on when to use this tool versus alternatives, such as update_ad_group or other operations. No exclusions or context provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_campaignB
Delete one or more campaigns by id.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_ids | Yes | The campaign ids to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotation indicating mutation (readOnlyHint: false), the description only states deletion. It does not disclose side effects on related entities, reversibility, or error behavior, which would be valuable for a destructive operation.
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 sentence with no wasted words, front-loaded with the action. Slightly too brief for optimal clarity but concise.
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 deletion tool with one parameter and existing annotations/output schema, the description is adequate but lacks details on permissions, side effects, or error handling. Sufficient for minimal understanding.
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 the parameter. The description adds no additional meaning beyond 'by id', but is consistent and minimally sufficient.
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?
Description clearly states the verb (delete), resource (campaigns), and method (by id), distinguishing it from other campaign-related tools like create_campaign, update_campaign, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives, such as prerequisites, idempotency, or limitations on the number of campaign IDs. Does not mention when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_keywordB
Delete one or more keywords by id.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_group_id | Yes | The parent ad group id. | |
| keyword_ids | Yes | The keyword ids to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false. The description adds no additional behavioral context beyond 'delete', such as irreversibility, permissions needed, or effect on related data.
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, clear sentence with no unnecessary information. Every word 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 simple delete operation with two parameters and an output schema, the description is adequate but lacks mention of batch behavior, error handling, or permission requirements.
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 parameters described. The description does not add extra 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?
The description clearly states the action (delete), resource (keywords), and method (by id). It effectively distinguishes from siblings like add_keywords and update_keyword.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives (e.g., delete_campaign). No context about prerequisites or exclusions is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_keyword_bidsARead-only
Estimate the bid to reach the first page (or mainline) for keywords -- the "estimated first page bid" from Keyword Planner.
For each keyword, returns one estimate per match type: estimated_min_bid (the headline
first-page/mainline bid) plus modeled average CPC, CTR, and weekly clicks/impressions/cost
ranges. Estimates are account-scoped and may be null where Microsoft has no data.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | Keyword texts to price, e.g. ["running shoes", "trail running shoes"]. | |
| language | No | Language name for the estimate, e.g. "English" (optional). | |
| match_types | No | Subset of ["Broad", "Phrase", "Exact"]; defaults to ["Exact"]. | |
| location_ids | No | Microsoft location ids to scope demand to (optional). | |
| currency_code | No | ISO currency for the bids (e.g. "USD"); defaults to the account currency. | |
| target_position | No | "FirstPage" (default), "MainLine", or "MainLine1" (top ad slot). | FirstPage |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the readOnlyHint annotation by detailing that estimates are per-match-type with modeled metrics, account-scoped, and may be null. It does not contradict annotations. Could mention more about data sourcing or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with four sentences, front-loading the purpose and efficiently covering output, scoping, and nulls. Every sentence adds value 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?
Given the tool has 6 parameters, output schema, and annotations, the description covers the main behavioral aspects (return structure, scoping, nulls). It is slightly incomplete regarding how to interpret estimates or handle edge cases, but overall adequate.
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 parameters are already well documented. The description adds an example for keywords but does not provide additional semantics beyond what the schema offers, meeting the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool estimates the bid to reach first page or mainline for keywords, using a specific verb and resource. It is distinct from siblings like 'get_keyword_traffic_estimates' which estimate traffic, and 'check_first_page_bids' which checks current bids, though it does not explicitly differentiate.
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 (to estimate bids for first page/mainline) but does not provide explicit guidance on when not to use it or how it compares to similar siblings like 'check_first_page_bids'. The context is clear but lacks exclusions or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_url_optionsARead-only
Read the account-level URL tracking / tracking template that every campaign inherits.
This is the account-level URL options: the tracking template (tracking URL template),
Final URL suffix, msclkid auto-tagging, and parallel tracking that per-campaign, ad-group,
ad, and keyword values inherit. Those per-entity values are typically blank and inherit
from here, so this answers "where is the tracking template set?" and how UTM / msclkid
click tracking is configured -- check this (not just the entity hierarchy) to confirm how
clicks are tracked. msclkid_auto_tagging_enabled is what appends the Microsoft Click ID
(msclkid) for conversion attribution. Confirm these before activating paused campaigns. To
see the resolved (effective) value for a specific campaign or ad group and which level
set it, see get_effective_url_settings; to change these, see set_account_url_options.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| final_url_suffix | No | |
| tracking_url_template | No | |
| ad_click_parallel_tracking | No | |
| msclkid_auto_tagging_enabled | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with readOnlyHint=true by starting with 'Read.' It adds behavioral context beyond annotations, explaining that per-entity values typically inherit from account level and that msclkid_auto_tagging_enabled appends the Microsoft Click ID. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet comprehensive, front-loading the main purpose and then detailing components and usage guidance. Every sentence adds value without 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?
Given zero parameters, an output schema exists, and annotations are clear, the description fully explains what the tool returns (tracking template, final URL suffix, msclkid auto-tagging, parallel tracking) and why it matters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so the description cannot add parameter-level meaning. Baseline for 0 parameters is 4, and the description provides no parameter info, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads account-level URL tracking settings, listing specific components (tracking template, final URL suffix, msclkid auto-tagging, parallel tracking). It distinguishes from sibling tools like get_effective_url_settings and set_account_url_options by name and purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: to answer 'where is the tracking template set?' and to confirm tracking configuration before activating paused campaigns. It also provides exclusions and alternatives: for resolved values, use get_effective_url_settings; to change, use set_account_url_options.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_extensionsARead-only
List ad extensions in the account (call, callout, sitelink, etc.).
By default this enumerates all association scopes (Account, Campaign, AdGroup) and merges them, so extensions attached at the campaign or ad-group level are included — most extensions are associated to a campaign, not the account, so scoping to Account alone often looks empty. Pass an explicit association_type to narrow to one scope.
| Name | Required | Description | Default |
|---|---|---|---|
| extension_types | No | Optional filter, e.g. ["Call", "Sitelink"]; defaults to all types. | |
| association_type | No | Scope to enumerate ids from: "Account", "Campaign", or "AdGroup". Omit (default) to search all three scopes and de-dupe. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, consistent with a listing operation. The description adds transparency about merging scopes, deduplication, and default behavior, which is beyond what annotations provide. It does not contradict 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 concise with two well-structured paragraphs. The first paragraph states the core purpose, and the second provides necessary behavioral details. Every sentence adds value without 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?
Given the output schema exists, annotations are present, and parameters are fully described, the description covers all needed context: default behavior, filtering options, and a practical tip about scoping. It is complete for a listing 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%, but the description adds valuable context beyond the schema: it explains why the default association_type merges all scopes and why Account alone may look empty. This enriches understanding beyond parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists ad extensions with examples of types (call, callout, sitelink) and explains the default merging behavior, making the purpose specific and distinguishable from sibling tools like get_campaigns.
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 when to use the default (all scopes merged) and when to narrow with association_type, and warns that scoping to Account alone often looks empty. It does not explicitly mention alternative tools but provides clear context for effective usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_groupsBRead-only
List ad groups in a campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | The campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is clear. The description adds no extra behavioral context beyond the basic listing action.
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 sentence, concise and front-loaded. It conveys the essential purpose without unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and annotations, the description is adequate for a simple list tool. However, it lacks information about pagination or filtering, which might be valuable.
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 only parameter, campaign_id, has a description in the input schema ('The campaign id.'). The tool description adds no further meaning, so it does not exceed the baseline for 100% schema 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?
The description 'List ad groups in a campaign' clearly states the verb (list) and resource (ad groups), and implies the scope (within a campaign). It distinguishes from sibling tools that list other entities like keywords or ads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives such as search_accounts or get_campaigns. The description does not mention any constraints or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_adsARead-only
List text/responsive-search ads in an ad group.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_group_id | Yes | The ad group id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, indicating a safe read operation. The description adds no additional behavioral context beyond the annotation, missing potential details like pagination, rate limits, or result limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that conveys the tool's purpose without extra words, earning 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?
Given the output schema exists and the tool has low complexity, the description is sufficiently complete. No critical missing information is apparent, though pagination details could be beneficial.
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 a single parameter described. The description does not add meaning beyond the schema, so a baseline score 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 clearly states the tool lists text and responsive-search ads in an ad group, specifying the verb 'List' and resource 'ads' with a scope that distinguishes it from sibling tools like get_campaigns and get_ad_groups.
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 the tool (to list ads in an ad group) but does not provide explicit guidance on when not to use it or mention alternatives among siblings, such as create or update ad tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_schedulesARead-only
Read a campaign's ad-schedule (dayparting) windows and their time-zone context.
Returns each window (day, from_hour/from_minute, to_hour/to_minute,
bid_adjustment) plus the campaign's time_zone and use_searcher_time_zone flag. When
use_searcher_time_zone is false, the hours run in the campaign time_zone; remove a
window with remove_ad_schedules using its criterion_id.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | The campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| schedules | No | |
| time_zone | No | |
| campaign_id | Yes | |
| use_searcher_time_zone | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint annotation, description details return fields (windows with days/times, bid adjustments, time_zone, use_searcher_time_zone) and explains behavior based on use_searcher_time_zone flag. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with verb and resource, no wasted words. Essential information efficiently presented.
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?
Despite having an output schema, the description still lists return fields, which adds context. Includes sibling reference for removal. Adequately covers all necessary information for a simple read 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?
Only one parameter (campaign_id) with schema coverage 100%; description does not add additional semantic meaning beyond what the schema provides. Baseline score 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?
Clearly states 'Read a campaign's ad-schedule windows' with specific verb 'Read' and resource. Distinguishes from siblings (add/remove/replace) by implying read-only nature and explicitly mentioning removal tool.
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 'remove_ad_schedules' as the tool for removal, providing direct guidance on when to use sibling tool. Context implies use for viewing dayparting settings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_auth_urlARead-only
Begin one-time sign-in: returns an OAuth sign-in URL to give the user.
The URL targets the account's identity provider (Microsoft by default, or Google for
Google-federated accounts). Present it to the user as a clickable sign-in link, and ask
them to sign in with the account that manages the ad account. After they sign in,
the browser lands on a near-blank page whose address-bar URL contains a code=
value; have them paste that full URL back, then call complete_auth with it.
Only needed once, when no refresh token is configured. The minted token is persisted and auto-refreshed thereafter, so the user never has to repeat this.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and openWorldHint=true. The description adds valuable context: the URL targets an identity provider, the flow includes a code= parameter, and the token is persisted and auto-refreshed.
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 5 sentences, well-structured: summary, details of the OAuth flow, and usage context. Every sentence adds value without 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?
Given zero parameters, existing annotations, and an output schema, the description fully covers purpose, step-by-step workflow, and when it is needed. It is complete for its context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters (100% coverage). The description does not need to add parameter details, and it appropriately focuses on the tool's purpose and usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool returns an OAuth sign-in URL and distinguishes it from the sibling tool 'complete_auth', which is called afterward.
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 says 'Only needed once, when no refresh token is configured' and advises to call 'complete_auth' after. It does not explicitly state when not to use, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_budgetsARead-only
Per-campaign budget view (daily budget and any shared-budget id).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description does not need to restate read-only nature. It adds value by specifying exactly what data is returned (daily budget and shared-budget id), providing useful behavioral context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the core purpose ('Per-campaign budget view') followed by parenthetical specifics. No extra words, perfectly sized for the tool's simplicity.
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 tool has an output schema (not shown but signaled) and zero parameters. The description succinctly covers what the tool returns, which is sufficient for a read-only view. No gaps are apparent given the tool's simplicity.
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?
No parameters exist in the input schema, so schema coverage is 100%. With zero parameters, the baseline is 4; the description does not need to add parameter info, and it does not detract.
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?
Description clearly states the tool provides a per-campaign budget view, detailing the specific data returned: daily budget and shared-budget id. This verb+resource is specific and distinguishes it from sibling tools, which are mostly about campaigns, ads, or other entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. With many sibling tools, including get_campaigns and others, the description does not specify context or exclusions, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaignsARead-only
List Search campaigns in the configured account.
| Name | Required | Description | Default |
|---|---|---|---|
| include_deleted | No | Include campaigns with status Deleted (default False). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the tool is safe. The description adds no additional behavioral traits such as pagination, rate limits, or data freshness. Without annotations, this would be a gap, but with annotations, it meets the baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the key information. Every word earns its place 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?
Given the presence of an output schema, the description does not need to explain return values. However, it lacks nuances like filtering by account or campaign type. For a simple listing tool with good annotations, this is adequate but not comprehensive.
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 the include_deleted parameter having a clear description. The tool description does not add any parameter-level details 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?
The description 'List Search campaigns in the configured account' clearly states the action (list), the resource (Search campaigns), and the scope (configured account). This distinguishes it from sibling tools like get_ad_groups or get_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?
The description provides context for use (listing campaigns in the current account) but does not explicitly state when not to use or mention alternative tools. However, the purpose is clear enough that an agent can infer the appropriate scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conversion_goalsARead-only
List conversion goals (all types). Pass goal_ids to fetch specific goals.
Each goal reports exclude_from_bidding — the inverse of the UI's "Include in
conversions" checkbox and the single switch for whether the goal steers automated
bidding: false means it counts in the Conversions column and ECPC/tCPA bid math, true
means it only shows under All conversions. Also surfaces count_type (All/Unique),
conversion_window_in_minutes, goal_category, and the revenue model (revenue_type /
revenue_value / revenue_currency_code). Confirm exclude_from_bidding is false before
relying on a goal to drive spend; flip it with update_conversion_goal.
| Name | Required | Description | Default |
|---|---|---|---|
| goal_ids | No | Optional conversion goal ids; omit to list all goals in the account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds rich behavioral context: it explains the meaning of exclude_from_bidding and its relationship to bidding, lists other fields, and confirms the read-only nature. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but efficient, front-loading the main purpose. Each sentence adds value: first states purpose, then explains key field, lists other fields, and gives usage advice. It is well-structured and not overly verbose.
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 that an output schema exists, the description doesn't need to detail return values. It provides key field explanations and a usage warning, making it complete for a simple, read-only tool with one optional parameter. The context signals indicate low complexity, and the description covers all necessary aspects.
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% for the single parameter (goal_ids), with a clear description. The tool's description adds 'Pass goal_ids to fetch specific goals,' which is similar to the schema description. It does not add significant extra meaning beyond what the schema already provides, so the score is at baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists conversion goals, with the verb 'List' and resource 'conversion goals'. It specifies all types and the option to fetch specific ones via goal_ids. This distinguishes it from sibling tools like create_conversion_goal and update_conversion_goal.
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 tells the agent when to use the tool (list goals) and provides a specific guideline: confirm exclude_from_bidding is false before relying on a goal to drive spend, and points to update_conversion_goal as the sibling to flip it. It could be more explicit about when not to use it, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_device_bid_adjustmentsARead-only
Read a campaign's device bid adjustments (Computers / Smartphones / Tablets).
Each row's bid_adjustment is a percent modifier (-100 to 900; -100 excludes the device).
An empty list means no device modifier is set, so every device serves at the base bid.
Note Microsoft calls mobile "Smartphones". Set one with set_device_bid_adjustment.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | The campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Explains bid_adjustment range (-100 to 900) and meaning of empty list, plus clarifies Microsoft's terminology for mobile. These details add value beyond the readOnlyHint annotation.
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 concise sentences, front-loaded with the core action, no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple read operation, existing output schema, and annotations, the description fully covers expected behavior, output interpretation, and cross-references the write counterpart.
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 description 'The campaign id.' The tool description does not add extra semantic meaning beyond the schema, which is adequate.
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?
Clearly states it reads device bid adjustments for a campaign, lists specific devices (Computers, Smartphones, Tablets), and distinguishes from the sibling set_device_bid_adjustment.
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 mentions the sibling tool for setting adjustments, guiding when to use this read tool. However, no explicit when-not scenarios, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_effective_url_settingsARead-only
Resolve the effective URL tracking (tracking template, Final URL suffix, URL custom parameters) for a campaign or ad group, and which level set each.
URL tracking follows Microsoft's inherited / override order (keyword > ad > ad group >
campaign > account): a value set at a deeper level wins, otherwise it inherits from its
parent, ultimately the account-level URL options. So a campaign or ad group can show a null
tracking template while the account template is what actually applies. This walks that
inheritance chain and returns the effective tracking_url_template / final_url_suffix /
url_custom_parameters plus a *_source ("ad_group", "campaign", or "account") for each, so
you do not have to manually cross-reference get_account_url_options with the per-entity
reads. Also surfaces msclkid_auto_tagging_enabled. Use it to answer "what tracking
template actually applies here, and where is it set?" before activating a campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_group_id | No | Optional ad group id (within that campaign) to resolve at the ad-group level; omit to resolve at the campaign level. | |
| campaign_id | Yes | The campaign id to resolve settings for. |
Output Schema
| Name | Required | Description |
|---|---|---|
| level | Yes | |
| ad_group_id | No | |
| campaign_id | Yes | |
| final_url_suffix_source | No | |
| effective_final_url_suffix | No | |
| msclkid_auto_tagging_enabled | No | |
| tracking_url_template_source | No | |
| url_custom_parameters_source | No | |
| effective_tracking_url_template | No | |
| effective_url_custom_parameters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true. Description adds significant behavioral detail: walks inheritance chain (keyword > ad > ad group > campaign > account), returns null for inherited values, includes source fields and msclkid_auto_tagging_enabled. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is efficiently structured, front-loaded with purpose and inheritance explanation. Slightly long but every sentence adds value. Could be more concise but not overly verbose.
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 annotations, schema, and output schema, the description fully covers tool behavior: inheritance logic, source tracking, and additional field. No missing context for an agent to correctly invoke 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 coverage is 100% with detailed descriptions for both parameters. Description does not add further parameter-level meaning beyond what schema already provides, meeting the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool resolves effective URL tracking settings (tracking template, suffix, custom parameters) and identifies which level set each. It explicitly distinguishes from sibling tools like get_account_url_options by explaining it returns effective values with source, avoiding manual cross-referencing.
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 use case: 'answer what tracking template actually applies here, and where is it set?' before activating a campaign. Also explains it avoids manual cross-referencing across per-entity reads. Does not explicitly state when not to use, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_keyword_ideasARead-only
Discover keyword ideas from seed phrases and/or a landing-page URL (Keyword Planner).
Each idea reports avg_monthly_searches (+ the monthly history), a rough suggested_bid,
and a competition bucket (Low/Medium/High). Provide at least one of keywords or url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | A landing page to mine for related keywords, e.g. "contoso.com/shoes". | |
| network | No | "OwnedAndOperatedAndSyndicatedSearch" (default), "OwnedAndOperatedOnly", or "SyndicatedSearchOnly". | OwnedAndOperatedAndSyndicatedSearch |
| keywords | No | Seed phrases to expand, e.g. ["running shoes"]. | |
| language | No | Exactly one language name (default "English"). | English |
| max_results | No | Cap on returned ideas (default 100). | |
| expand_ideas | No | Expand beyond the seeds to related keywords (default True). When False, `keywords` is required and only those seeds are scored. | |
| location_ids | No | Microsoft location ids; defaults to the United States ("190"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds behavioral context beyond that: it details what each idea reports ('avg_monthly_searches', 'suggested_bid', 'competition bucket') and explains the expand_ideas behavior ('Expand beyond the seeds to related keywords'). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three sentences covering purpose, output details, and a key constraint. It is front-loaded with the purpose. Minor improvement could be more structured formatting, but it earns its 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 tool has 7 parameters, full schema coverage, annotations, and an output schema (not shown but indicated), the description provides sufficient context: purpose, return fields, input requirements, and behavioral notes (expand_ideas). No gaps for the intended use case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value by stating the constraint 'Provide at least one of `keywords` or `url`' and clarifies that when 'expand_ideas' is False, 'keywords' is required. This aids correct parameter selection beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Discover keyword ideas from seed phrases and/or a landing-page URL (Keyword Planner).' It specifies the verb (discover) and resource (keyword ideas via Keyword Planner), and distinguishes it from sibling tools like 'get_keywords' which retrieve 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?
The description explicitly states a key usage constraint: 'Provide at least one of `keywords` or `url`.' While it does not explicitly list when to use or avoid this tool versus siblings, the context from sibling names (e.g., 'get_keywords', 'estimate_keyword_bids') implies this is for discovery, not retrieval or estimation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_keywordsARead-only
List keywords in an ad group.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_group_id | Yes | The ad group id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds no further behavioral details (e.g., pagination, error states). With annotations, the bar is lower; a score of 3 is appropriate.
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 no extraneous words. It is front-loaded and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has one parameter, an output schema, and readOnlyHint annotation, the description is minimally adequate. However, it lacks context like expected results or typical use case, which could improve usability among many siblings.
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 parameter 'ad_group_id' is already well-described in the schema ('The ad group id.'). Schema description coverage is 100%, so the description adds no extra meaning beyond the schema. Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'List keywords in an ad group' uses a specific verb ('List') and identifies the resource ('keywords in an ad group'). It clearly distinguishes from sibling tools like get_negative_keywords or get_keyword_ideas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. Among many sibling tools related to keywords (e.g., get_keyword_ideas, estimate_keyword_bids), there is no mention of prerequisites or typical use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_keyword_traffic_estimatesARead-only
Estimate weekly traffic (clicks/impressions/cost/position) for keywords at a given bid.
Each keyword's estimate is a min..max bracket at the supplied max_cpc and match type --
useful to gauge search volume and likely spend before launching. (estimate_keyword_bids
also returns weekly clicks/impressions/cost, so reach for this when you specifically want
the traffic at a bid you choose rather than at the first-page suggested bid.)
| Name | Required | Description | Default |
|---|---|---|---|
| max_cpc | Yes | The max CPC bid to model, in account currency (e.g. 2.50). | |
| network | No | "OwnedAndOperatedAndSyndicatedSearch" (default), "OwnedAndOperatedOnly", or "SyndicatedSearchOnly". | OwnedAndOperatedAndSyndicatedSearch |
| keywords | Yes | Keyword texts to estimate, e.g. ["running shoes", "trail running shoes"]. | |
| language | No | Exactly one language name (default "English"). | English |
| match_type | No | "Exact" (default), "Phrase", or "Broad". | Exact |
| location_ids | No | Microsoft location ids; defaults to the United States ("190"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so no contradiction. The description adds behavioral details: it provides a min..max bracket at the supplied max_cpc and match type, and mentions the output fields (clicks, impressions, cost, position). This adds value beyond the readonly hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two paragraphs. The first sentence front-loads the core purpose, and the second paragraph provides usage guidance. Every sentence adds value without 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?
Given the complexity (6 parameters, 2 required), the presence of an output schema, and the annotations, the description provides sufficient context. It covers purpose, usage, and behavioral details, making it complete for an AI agent to select and invoke 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%, so all parameters are described in the schema. The description adds context about the bracket nature and the bid input, which helps understanding. However, it does not add detailed semantics beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'estimate' and the resource 'keyword traffic', listing the specific metrics (clicks/impressions/cost/position). It also distinguishes itself from the sibling tool 'estimate_keyword_bids', providing differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool (to gauge search volume and likely spend before launching) and when not (when you want traffic at a bid you choose rather than first-page suggested bid). It names the alternative tool 'estimate_keyword_bids' and explains the difference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_location_intentARead-only
Read a campaign's location-intent setting (presence vs. broader reach).
Returns the single LocationIntent criterion's intent_option: PeopleIn (only people
physically in the targeted locations) or PeopleInOrSearchingForOrViewingPages (people
in, searching for, or viewing pages about them; Microsoft's default). Legacy campaigns
may still report the deprecated PeopleSearchingForOrViewingPages.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | The campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses return values including possible enum options and mentions legacy behavior (deprecated value). This adds significant context beyond the readOnlyHint annotation. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences front-loaded with the core purpose, followed by essential return detail and note on legacy. Every word 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?
Given the tool's simplicity (1 param, read-only), with an output schema presumably detailing the return, the description fully explains what the tool does and what it returns. No gaps.
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 campaign_id described. The description does not add extra parameter-level details beyond what the schema 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?
The description clearly states the tool reads a campaign's location-intent setting, specifies the returned values (intent_option with possible options), and distinguishes it from the sibling tool set_location_intent which writes the same setting.
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 implicitly informs when to use the tool (to check location-intent setting) but does not explicitly contrast with alternatives like get_location_targets, which returns broader location targeting details. However, the context shows siblings include that tool, and the description's clarity on what this tool returns helps differentiate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_location_targetsBRead-only
List the location targets/exclusions on a campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | The campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description 'List' is consistent but adds no additional behavioral context (e.g., data freshness, pagination, permissions). There is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the verb and resource. No extraneous words. Extremely concise and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with one required parameter and an existing output schema, the description is adequate. It could briefly mention what the response contains, but the output schema likely covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with one parameter (campaign_id) already described in the schema. The description does not elaborate beyond 'The campaign id.' Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the verb 'List' and clearly identifies the resource as 'location targets/exclusions on a campaign'. This is specific and distinct from sibling tools like 'add_location_targets' or 'remove_location_targets'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives (e.g., set_location_intent, add_location_targets). The description is a bare statement without context or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_negative_keywordsARead-only
List negative keywords attached to campaigns or ad groups.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_ids | Yes | Campaign ids (or ad group ids) to read negatives from. | |
| entity_type | No | "Campaign" or "AdGroup" (default "Campaign"). | Campaign |
| parent_entity_id | No | For entity_type "AdGroup", the parent campaign id (required). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with annotations (readOnlyHint=true), confirming a read-only operation. However, it does not disclose additional behavioral traits such as pagination, performance characteristics, or scope limitations beyond what annotations already provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no wasted words. It front-loads the action and resource, making it immediately clear.
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 existence of an output schema (context: true) and comprehensive parameter documentation, the description sufficiently covers the tool's purpose. It might benefit from mentioning that entity_ids can be campaign or ad group IDs, but the schema already handles that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with all three parameters documented. The description adds no extra meaning beyond the schema; it merely restates the resource type. 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 'List negative keywords attached to campaigns or ad groups' uses a specific verb ('list') and resource ('negative keywords'), with clear context. It distinguishes from sibling tools like get_keywords (positive keywords) and add_negative_keywords (write 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?
Usage context is implied (reading negatives), but there is no explicit statement on when to use this tool versus alternatives like add_negative_keywords or remove_negative_keywords, nor any when-not conditions. The description provides minimal guidance beyond the basic purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_uet_tagsARead-only
List UET tags. Pass tag_ids to fetch specific tags.
| Name | Required | Description | Default |
|---|---|---|---|
| tag_ids | No | Optional UET tag ids; omit to list all tags in the account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares the tool as read-only. The description adds that it lists or fetches tags, but does not disclose additional behaviors like error handling or performance. This is adequate given the annotation coverage.
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 purpose. Every word is necessary and 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?
For a simple list/fetch tool with full schema coverage, annotations, and an output schema, the description covers the essential behavior. No additional details are necessary.
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 a well-described parameter. The description ('Pass tag_ids to fetch specific tags') largely mirrors the schema description and adds minimal new 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?
The description clearly states 'List UET tags' with a specific verb and resource, and distinguishes between listing all tags and fetching specific ones via tag_ids. This is distinct from sibling tools like update_uet_tag or other get_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for listing all or specific UET tags. While it does not explicitly mention when not to use it or provide alternatives, the context is clear and no other sibling tool serves the same purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_website_exclusionsARead-only
List the website / mobile-app-id exclusions (negative sites) blocked on a campaign.
These prevent ads from serving on the listed sites/apps. Add or remove them with add_website_exclusions / remove_website_exclusions.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | The campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| urls | No | |
| count | No | |
| campaign_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. Description adds context about the nature of exclusions (negative sites) and their effect, enhancing transparency without contradicting 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: first defines purpose, second adds context and sibling tools. No wasted words, front-loaded with key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple tool with one parameter and output schema exist. Description fully covers purpose, usage context, and relationship to siblings, leaving no gaps.
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 has 100% coverage for the single parameter campaign_id, so baseline is 3. Description does not add additional parameter 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?
Description clearly states the verb 'List' and resource 'website / mobile-app-id exclusions (negative sites) blocked on a campaign', distinguishing it from sibling tools add/remove_website_exclusions.
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 that exclusions prevent ads from serving and directs users to add_website_exclusions/remove_website_exclusions for modifications, providing clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_ad_schedulesA
Remove ad-schedule (dayparting) windows from a campaign by criterion id.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | The campaign id. | |
| criterion_ids | Yes | Campaign criterion ids (from get_ad_schedules). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states a write operation ('Remove'), which aligns with the annotation 'readOnlyHint: false'. However, it does not disclose additional behavioral traits such as whether the removal is permanent, if it affects active campaigns, or any required permissions. The description is adequate but minimal.
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 sentence with no unnecessary words. It is front-loaded with the core action and specific detail, making it highly concise and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the availability of an output schema, the description does not need to explain return values. The description covers the essential action and parameters. It could mention relationships with sibling tools (e.g., 'replace_ad_schedule') but remains reasonably complete for a straightforward deletion 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?
The schema has 100% description coverage for both parameters. The description adds no extra meaning beyond what the schema already provides (e.g., 'criterion_ids' described as 'Campaign criterion ids (from get_ad_schedules)'). Thus, baseline score 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 clearly states the verb 'Remove' and the resource 'ad-schedule (dayparting) windows', and specifies the method 'by criterion id'. This distinguishes it from sibling tools like 'add_ad_schedules' and 'replace_ad_schedule'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'replace_ad_schedule'. The description lacks context such as prerequisites or scenarios where removal is preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_location_targetsA
Remove location targets/exclusions from a campaign by criterion id.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | The campaign id. | |
| criterion_ids | Yes | Campaign criterion ids (from get_location_targets). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint: false indicates a mutation, which the description confirms. However, the description adds no new behavioral traits beyond the schema, such as side effects, permission requirements, or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no unnecessary words. It efficiently conveys the action and key input.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the presence of an output schema, the description is complete enough. It identifies the essential input (criterion IDs) and action, though it could briefly note that IDs come from get_location_targets, which is already 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 coverage is 100%, with both parameters clearly documented. The description adds no additional meaning beyond referencing the criterion IDs, so it meets the baseline but does not enhance understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Remove' and the resource 'location targets/exclusions from a campaign', specifying the method 'by criterion id'. This distinguishes it from sibling tools like add_location_targets.
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 the tool is used when removing location targets by criterion IDs, but it does not provide explicit guidance on when to use vs. alternatives, nor does it mention prerequisites or scenarios to avoid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_negative_keywordsA
Remove negative keywords from a campaign or ad group, identified by id.
Resolve ids first with get_negative_keywords (deletion is by id, not text).
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | The campaign id (or ad group id) the negatives are attached to. | |
| entity_type | No | "Campaign" or "AdGroup" (default "Campaign"). | Campaign |
| keyword_ids | Yes | The negative keyword ids to remove. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a write operation (readOnlyHint=false). The description adds that deletion is by id, not text, which is a key behavioral detail. However, it does not disclose whether the operation is reversible, what permissions are needed, or any side effects. Given the minimal annotations, the description carries more burden and adds moderate 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?
The description consists of two concise sentences with no wasteful words. It front-loads the verb and resource, immediately conveying the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential flow (resolve ids then remove) and the scope. Given that an output schema exists (context signal true) and annotations are minimal, the description is sufficient for an AI agent to understand the tool's operation. It could mention permanence or permissions, but it is adequate.
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 mentions that deletion is by id for keyword_ids and that entity_id corresponds to campaign/ad group id, but the schema already describes these parameters. No additional semantic meaning beyond the schema is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Remove', the resource 'negative keywords', and the scope 'from a campaign or ad group, identified by id'. It distinguishes itself from sibling tools like 'add_negative_keywords' and 'get_negative_keywords' by specifying that deletion is by id, not text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'Resolve ids first with get_negative_keywords (deletion is by id, not text).' This tells the agent when to use this tool and what prerequisite steps are needed. It could be more explicit about when not to use it (e.g., if you have text instead of ids), but the guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_website_exclusionsA
Unblock previously excluded websites / app ids on a campaign (matched by URL).
Read-modify-write: the named sites are filtered out and the rest are re-set, so other exclusions are retained. Removal is by URL (case-insensitive), not by id. List the current exclusions first with get_website_exclusions.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | The websites / app ids to unblock. | |
| campaign_id | Yes | The campaign id the sites are blocked on. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=false), the description details the read-modify-write mechanism, ensuring other exclusions are retained, and clarifies removal by URL (case-insensitive) rather than ID. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, no redundant words. Each sentence adds value: purpose, behavior, and usage hint. Front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given simple parameters and existence of output schema, the description fully covers usage, behavior, and prerequisites. Complete for this 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 already covers both parameters with descriptions. The description adds minor context (URL matching, case-insensitivity) but does not significantly improve understanding 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?
Description clearly states the verb 'unblock' and resource 'previously excluded websites/app ids on a campaign'. Differences from sibling tools like get_website_exclusions and add_website_exclusions are implied by naming and explicit mention of removal by URL.
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?
Description advises to 'List the current exclusions first with get_website_exclusions' and explains the read-modify-write behavior. It implicitly provides context but does not explicitly state when not to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_ad_scheduleA
Replace one ad-schedule (dayparting) window: remove the old criterion, add a new one.
The API rejects adding a window that overlaps an existing same-day window, so an in-place edit is impossible; this does the only safe sequence -- remove the old criterion, then add new_window -- in one call. Get the criterion_id from get_ad_schedules. If the remove fails, nothing changes; if the add fails after the remove, the result says so (the old window is gone, so that slot is briefly uncovered until you re-add it).
| Name | Required | Description | Default |
|---|---|---|---|
| new_window | Yes | The replacement window {day, from_hour, from_minute, to_hour, to_minute, bid_adjustment}. day is "Monday".."Sunday"; minutes are 0/15/30/45. | |
| campaign_id | Yes | The campaign id. | |
| criterion_id | Yes | The existing window's criterion id (from get_ad_schedules) to replace. | |
| use_searcher_time_zone | No | If set, also updates the campaign flag controlling whether the hours are interpreted in each searcher's time zone (true) or the campaign's (false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses destructive nature and partial failure scenarios (removal succeeds but addition fails), beyond the minimal readOnlyHint annotation.
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 succinct sentences front-loading purpose, followed by well-structured explanation of necessity and behavior.
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?
Covers rationale, prerequisites, parameter origin, failure modes, and safe behavior; adequate given output schema exists.
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 covers parameters fully; description adds only procedural context (e.g., 'criterion_id from get_ad_schedules') but not new parameter details.
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?
Clearly states it replaces an ad-schedule window by removing old and adding new, distinguishing from add/remove sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when to use (no in-place edit possible), how to get criterion_id, and the safe sequence with failure outcomes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_postal_codesARead-only
Resolve ZIP / postal codes to Microsoft LocationIds (for location targeting).
Downloads and caches Microsoft's geo-locations file on first use.
| Name | Required | Description | Default |
|---|---|---|---|
| postal_codes | Yes | ZIP / postal codes to resolve, e.g. ["98101", "98052"]. | |
| language_locale | No | Geo file locale (default "en"). | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as readOnlyHint=true, so the tool is safe and non-destructive. The description adds that it 'downloads and caches Microsoft's geo-locations file on first use', which is a valuable behavioral detail beyond annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences that front-load the primary purpose and provide essential behavioral context. No redundant words; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a known output schema (not shown but present), the description doesn't need to explain return values. It covers the tool's main action and caching behavior. Could mention that it processes multiple codes at once, but this is implied by the array input.
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 clear parameter descriptions (including example for postal_codes). The description adds context ('Resolve ... to LocationIds') but does not significantly enhance parameter understanding 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?
The description clearly states the action ('resolve'), the resource ('ZIP/postal codes'), and the output ('Microsoft LocationIds'). It also specifies the use case ('for location targeting'), which distinguishes it from sibling tools like get_location_targets or add_location_targets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (when needing to convert postal codes for targeting) but does not explicitly state when to use this tool over alternatives like get_location_targets or add_location_targets. No exclusions or context about when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_performance_reportARead-only
Run a performance report end-to-end and return the parsed rows.
Unlike a raw submit, this submits the report, polls until it is ready, downloads the CSV, and parses it — so the rows come back inline.
| Name | Required | Description | Default |
|---|---|---|---|
| columns | No | Optional explicit column list; a sensible default is used per report type. | |
| end_date | No | Custom range end "YYYY-MM-DD" (pair with start_date). | |
| account_id | No | Report on this account instead of the configured one. | |
| date_range | No | A predefined range, e.g. "LastWeek", "LastMonth", "LastThreeMonths", "ThisYear", "LastYear". Ignored when start_date/end_date are given. | LastMonth |
| start_date | No | Custom range start "YYYY-MM-DD" (pair with end_date). | |
| ad_group_id | No | Narrow the report to a single ad group (keyword/search_query/geographic reports only). Requires campaign_id as well — the report scope needs the parent campaign to identify the ad group. | |
| campaign_id | No | Narrow the report to a single campaign. | |
| report_type | No | One of "campaign", "keyword", "search_query", "geographic". | campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| columns | Yes | |
| row_count | Yes | |
| date_range | Yes | |
| report_type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already include readOnlyHint=true, and the description adds useful behavioral context by detailing the submission, polling, downloading, and parsing steps. It does not contradict annotations and provides insight into the end-to-end process.
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 extremely concise: two sentences front-load the purpose and then explain the difference from a raw submit. Every sentence adds value without 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?
Given the tool's complexity (8 optional parameters, output schema exists), the description covers the core workflow but omits potential edge cases like timeouts or error handling. However, the output schema provides return type information, making the description reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the baseline is 3. The description does not mention any parameters or add meaning beyond the schema, so it neither improves nor degrades the semantic understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs a performance report end-to-end and returns parsed rows. It uses a specific verb (run) and resource (performance report), and distinguishes itself from a raw submit by explaining the workflow. This uniqueness is maintained among 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?
The description provides a clear contrast with a 'raw submit' (indicating when to use this tool for convenience), but does not explicitly list alternatives or when not to use it. However, the context is sufficient for the agent to understand its primary use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_accountsARead-only
List every Microsoft Advertising account reachable by the authenticated user.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with the readOnlyHint annotation, confirming it is a read-only operation. It adds the detail that it lists 'every' account, implying completeness. No contradictions, though additional context like pagination or error handling is absent but acceptable given the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence of 10 words, front-loading the key action and resource. Every word 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 simple tool with no parameters and an output schema available, the description sufficiently conveys the list operation and scope. No additional context is necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so per guidelines the baseline is 4. The description does not need to add parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List', the resource 'Microsoft Advertising accounts', and specifies the scope 'reachable by the authenticated user'. It distinguishes itself from sibling tools like set_active_account which deals with account selection.
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?
While the purpose is clear, there is no explicit guidance on when to use this tool versus alternatives (e.g., get_campaigns for campaign-level data). The description implies use for discovering accounts, but doesn't provide when-not-to-use or alternative scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_account_url_optionsA
Set account-level URL options / tracking template (applies account-wide; every campaign inherits them).
The cleanest way to apply a tracking template (tracking URL template), Final URL suffix, msclkid auto-tagging, or parallel tracking across the whole account at once -- the inherited URL settings -- instead of editing each campaign/ad/keyword. Only the fields you pass change. Read the current values first with get_account_url_options, and use get_effective_url_settings to confirm what a given campaign/ad group resolves to afterward.
| Name | Required | Description | Default |
|---|---|---|---|
| final_url_suffix | No | Account Final URL suffix appended to landing-page URLs ("" clears). | |
| tracking_url_template | No | Account tracking template, e.g. "{lpurl}?utm_source=bing&utm_medium=cpc&utm_campaign={campaign}". Pass "" to clear. | |
| ad_click_parallel_tracking | No | Whether to enable parallel tracking. | |
| msclkid_auto_tagging_enabled | No | Whether to auto-append the Microsoft Click ID (msclkid) used for conversion attribution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false (mutation). The description adds that changes are account-wide and inherited, only touched fields are modified, and suggests a workflow to read before writing. This goes beyond basic mutation disclosure.
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: first defines purpose and scope, second explains use case with alternatives, third clarifies partial update, fourth advises workflow. No wasted words; each sentence 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?
Given 4 optional parameters, 100% schema coverage, and an output schema (not shown but present), the description covers purpose, usage, behavior, and workflow. It is complete for an agent to understand and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 4 parameters with 100% description, including defaults and clearing behavior. The description groups parameters (tracking template, Final URL suffix, msclkid, parallel tracking) and adds context that only passed fields change, complementing the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'sets account-level URL options/tracking template' and specifies it applies 'account-wide; every campaign inherits them.' It contrasts with editing individual campaigns/ad groups, distinguishing it from sibling tools like get_account_url_options and get_effective_url_settings.
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 advises reading current values first with get_account_url_options and using get_effective_url_settings to confirm. States 'the cleanest way' to apply settings across the whole account instead of per-campaign/ad/keyword, and clarifies that only passed fields change.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_active_accountA
Switch which account subsequent tool calls read from and write to (this session only).
Use search_accounts to find ids. The OAuth credential is unchanged; this only rescopes calls. Confirm the target with account_health afterwards before any write.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | The advertising account id to make active. | |
| customer_id | No | Optional manager (customer) id that owns the account. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, and description adds that OAuth credential remains unchanged and only scopes are rescoped. Clearly explains a mutation behavior without contradicting 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 with front-loaded main action. No wasted words; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With output schema present and low complexity (2 params, no nesting), description covers the core purpose, pre- and post-steps. Minor gap: no mention of error states.
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 parameters documented. Description adds the context of switching accounts, but does not provide additional nuance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Switch' and the resource 'account', specifying it affects subsequent tool calls and is session-only. This distinguishes it from siblings like search_accounts and account_health.
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 instructs to use search_accounts to find IDs and to confirm with account_health before writes. Provides clear workflow context, though no explicit alternatives are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_device_bid_adjustmentA
Set a campaign's bid adjustment for one device (e.g. a mobile modifier).
Microsoft calls mobile "Smartphones" (there is no "Mobile"); "Computers" is desktop/laptop. Device criterions are created as a set, so the first time you set any device this also creates the other two at a neutral 0. Read the current values first with get_device_bid_adjustments.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes | The device to adjust. Canonical values are "Computers", "Smartphones", and "Tablets"; the friendly aliases "mobile" (-> Smartphones), "desktop"/"pc" (-> Computers), and "tablet" are also accepted (case-insensitive). | |
| campaign_id | Yes | The campaign id. | |
| bid_adjustment | Yes | Percent modifier from -100 to 900 (e.g. 40 = +40%); -100 excludes the device from serving entirely. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotation (readOnlyHint: false), the description reveals key behaviors: device criterion set creation on first use, Microsoft terminology mapping, and the effect of bid_adjustment values (e.g., -100 excludes the device). This adds significant context for safe usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (3 short sentences plus a recommendation) and front-loaded. Every sentence adds essential information without redundancy. It is well-structured, starting with the primary action, then terminology, then behavioral nuance, and finally a usage tip.
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 that an output schema exists (not shown), the description adequately covers core behavioral aspects and parameter details. It lacks mention of error conditions or prerequisites (e.g., campaign existence), but these are minor omissions. Overall, it provides sufficient context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers 100% of parameters, so baseline is 3. The description adds value by explaining device aliases (mobile -> Smartphones, etc.) and the set creation behavior, which is not in the schema. This enhances understanding beyond the schema's field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence clearly states the tool's purpose: 'Set a campaign's bid adjustment for one device.' It differentiates from the sibling tool get_device_bid_adjustments by specifying it is a write operation. The description also clarifies Microsoft-specific terminology, leaving no 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?
The description explicitly advises to read current values first with get_device_bid_adjustments and explains the set creation behavior (first use creates other devices at neutral 0). This provides clear guidance on when and how to use the tool, including a critical prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_location_intentA
Set who sees a campaign's ads relative to its targeted locations (location intent).
Updates the campaign's single LocationIntent criterion in place (created by Microsoft with a default of "PeopleInOrSearchingForOrViewingPages"). Read the current value first with get_location_intent.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | The campaign id. | |
| intent_option | Yes | "PeopleIn" (presence — only people physically in/regularly in the targeted locations) or "PeopleInOrSearchingForOrViewingPages" (people in, searching for, or viewing pages about them; Microsoft's default). The legacy "search-interest-only" option was deprecated by Microsoft in April 2024. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description notes that the criterion is 'updated in place' and mentions the default, but with annotations lacking destructive hint, it could more explicitly state it's a write operation that modifies campaign settings. It is adequate but not thorough.
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 highly concise: one sentence for purpose and one for behavioral context/usage hint. No redundant 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?
The description covers the main action, parameter options, default condition, and a usage hint. With output schema present, it is sufficiently complete for a simple update tool, though it could mention error conditions.
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 100% schema coverage, the schema already describes both parameters well. The description adds context about the default value and the deprecated option, but does not fundamentally enhance parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Set') and the resource ('location intent' for a campaign). It distinguishes from siblings by referencing the read counterpart get_location_intent and explaining the default 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?
The description explicitly advises to read the current value first with get_location_intent, providing a clear usage flow. However, it does not mention circumstances where this tool should not be used or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ad_groupA
Update an existing ad group in place. Only the fields you pass change.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New ad group name (rename). | |
| status | No | "Active" or "Paused". | |
| cpc_bid | No | New default CPC bid in account currency. | |
| network | No | Ad distribution (where the ad group serves). "OwnedAndOperatedAndSyndicatedSearch" = the entire Microsoft Advertising Network; "OwnedAndOperatedOnly" = Microsoft sites and select traffic (a quality-screened partner subset). Read the current value from get_ad_groups. | |
| ad_group_id | Yes | The ad group id. | |
| campaign_id | Yes | The parent campaign id (required by Microsoft to update an ad group). | |
| final_url_suffix | No | Final URL suffix appended to landing-page URLs. | |
| tracking_url_template | No | Tracking template for URLs in the ad group. | |
| url_custom_parameters | No | {key: value} URL custom parameters, referenced in templates/suffixes as {_key}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, consistent with a mutation tool. The description adds that it is a partial update ('Only the fields you pass change'), which is useful. However, it lacks details on side effects, permissions, idempotency, or whether unchanged fields remain untouched (implied but not explicit). The transparency is adequate but not exceptional.
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, information-dense sentence. It front-loads the key action and behavior, with no extraneous words. Every part adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 100% schema coverage and existence of an output schema, the description is reasonably complete for a straightforward partial update tool. It covers the primary behavior, though it could briefly mention required parameters (campaign_id, ad_group_id) or preconditions (ad group must exist). Still, it provides sufficient context for an agent.
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 each parameter described in the schema. The description reinforces partial update semantics but does not add meaning beyond what's already in the schema. The baseline 3 applies as the description does not compensate for missing schema information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Update'), the resource ('existing ad group'), and the key behavior ('in place', 'Only the fields you pass change'). This distinguishes it from siblings like create_ad_group (creation) and delete_ad_group (deletion). The verb+resource+scope is specific and 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 does not explicitly state when to use this tool vs alternatives (e.g., creating, deleting, or other update tools). However, the name and partial update hint imply its purpose. No concrete usage boundaries or when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_call_extensionA
Update an existing call extension in place (e.g. the brand's phone number or tracking).
Microsoft replaces the whole call extension on update, so phone number and country code are always required; when you omit them (e.g. to flip only is_call_tracking_enabled) this tool fetches the current extension and re-sends them, so a single-field toggle is safe.
| Name | Required | Description | Default |
|---|---|---|---|
| country_code | No | Two-letter country code for the number, e.g. "US" (omit to keep current). | |
| is_call_only | No | Whether the extension shows only the phone number (no website click). | |
| phone_number | No | New phone number (omit to keep the current one). | |
| ad_extension_id | Yes | The call extension id (from get_ad_extensions). | |
| is_call_tracking_enabled | No | Turn Microsoft call tracking on/off (US/UK only). When on, Microsoft displays a forwarding number so call conversions are measured (new forwarding numbers are local, not toll-free). Pass true to enable tracking on an existing plain call asset. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint=false annotation, the description details the replacement behavior and the fetch mechanism for omitted fields, giving full transparency on the tool's actions.
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 that cover purpose, behavioral implications, and safe usage with no redundant 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 100% schema coverage, annotations, and an output schema, the description completes the picture by focusing on the key nuance (whole replacement) that is not obvious from structured data.
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?
Adds critical context beyond the schema, clarifying that country_code and phone_number are required in the API even though the schema allows null defaults, and explains the behavior when omitted.
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?
Clearly states 'Update an existing call extension' with specific examples (brand's phone number or tracking), differentiating from sibling tools like add_call_extension and delete_ad_extension.
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 that Microsoft replaces the whole extension and that phone number and country code are always required, while also providing the safe toggle behavior for partial updates via fetching current values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_campaignA
Update an existing campaign in place. Only the fields you pass change.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New campaign name (rename). | |
| status | No | "Active" or "Paused". | |
| max_cpc | No | Optional Maximum CPC limit (account currency) for MaxClicks / MaxConversions / TargetCpa / MaxConversionValue / TargetRoas. Not valid for EnhancedCpc / ManualCpc. get_campaigns reports the current value; re-pass it when changing bid_strategy_type or the existing cap may be cleared (the scheme is rewritten as a whole). | |
| time_zone | No | Campaign time zone (Microsoft code, e.g. "CentralTimeUSCanada"); ad schedules run in this zone. Read the current value from get_campaigns. | |
| target_cpa | No | Target CPA (account currency) for TargetCpa / MaxConversions. get_campaigns reports the current value; re-pass it to preserve it (see max_cpc). | |
| campaign_id | Yes | The campaign id. | |
| target_roas | No | Target ROAS for TargetRoas / MaxConversionValue. get_campaigns reports the current value; re-pass it to preserve it (see max_cpc). | |
| daily_budget | No | New daily budget in account currency. | |
| bid_strategy_id | No | Id of a portfolio (shared) bid strategy to apply. Mutually exclusive with bid_strategy_type. | |
| final_url_suffix | No | Final URL suffix appended to landing-page URLs. | |
| bid_strategy_type | No | Set the campaign's own inline bid strategy (BiddingScheme): one of "EnhancedCpc", "ManualCpc", "MaxClicks", "MaxConversions", "TargetCpa", "MaxConversionValue", "TargetRoas". e.g. "MaxClicks" (+ optional max_cpc) is Maximize Clicks with a Maximum CPC limit. The long-form value get_campaigns returns for TargetRoas / MaxConversionValue ("TargetRoasBiddingScheme" / "MaxConversionValueBiddingScheme") is also accepted, so a read value round-trips. Mutually exclusive with bid_strategy_id. | |
| tracking_url_template | No | Tracking template for all URLs in the campaign. | |
| url_custom_parameters | No | {key: value} URL custom parameters, referenced in templates/suffixes as {_key}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses partial-update behavior ('Only the fields you pass change'), which adds value beyond the annotations (readOnlyHint=false). However, it does not detail other behavioral traits such as idempotency, error handling, or the effect on unpassed fields. Annotations already indicate it's a write operation, so the burden is partially met.
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 extremely concise, two sentences, and front-loaded with the key behavior. Every word earns its place without 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 tool with 13 parameters and an output schema, the description is minimal but sufficient. It conveys the essential behavior (partial update) and the output schema handles return value documentation. The description does not cover authentication or prerequisites, but those are often implicit. Overall, it is adequately complete for this complexity level.
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 adds no additional meaning beyond what the schema already provides for each parameter. The schema itself is detailed, so no extra description is necessary.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates an existing campaign in place, specifying that only passed fields change. This distinguishes it from sibling tools like create_campaign and delete_campaign, and aligns with the tool name.
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 the tool is used when updating campaign fields, but provides no explicit guidance on when to use it versus alternatives like update_campaign_status or when not to use it. The usage is implied but not clearly contrasted with siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_campaign_statusB
Set a campaign Active or Paused.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | "Active" or "Paused". | |
| campaign_id | Yes | The campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already show it's not read-only; description adds no extra behavioral insights like side effects, idempotency, or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single, clear sentence with no wasted words, front-loading the action and resource.
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?
Simple tool with two parameters and output schema present; minimal description is adequate but lacks context on behavior when status is unchanged or error states.
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%; description does not add beyond schema. Mentions status values which are already in schema, so baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Set a campaign Active or Paused' clearly specifies the verb and resource, and distinguishes from siblings like update_campaign by focusing solely on status change.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like update_campaign, or when not to use it. Sibling tools exist but no differentiation is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_conversion_goalA
Update a conversion goal in place. Only the fields you pass change.
The key bidding lever is exclude_from_bidding — the inverse of the web UI's "Include in
conversions" checkbox. exclude_from_bidding=false keeps the goal in the Conversions
column and in automated-bidding math (ECPC / tCPA); true drops it from both (it still
reports under All conversions). Confirm this is false before relying on a goal to steer
spend. Read the current values first with get_conversion_goals.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New goal name (rename). | |
| status | No | "Active" or "Paused" (a paused goal stops recording conversions). | |
| goal_id | Yes | The conversion goal id (from get_conversion_goals). | |
| count_type | No | How conversions are counted per click — "All" (every conversion) or "Unique" (one per click). | |
| revenue_type | No | Conversion value model — "FixedValue" (same value each time, requires revenue_value), "VariableValue" (value sent with the event), or "NoValue". Revenue fields are merged onto the goal's current revenue, so you can change one without re-stating the others. | |
| revenue_value | No | Revenue amount (required for "FixedValue"; the default for "VariableValue"). | |
| exclude_from_bidding | No | false = include the goal in the Conversions column and automated bidding; true = exclude it from both (still tracked under All conversions). | |
| revenue_currency_code | No | ISO currency code for the revenue value, e.g. "USD". | |
| conversion_window_in_minutes | No | Click-to-conversion lookback window in minutes (e.g. 43200 = 30 days). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotation indicating a write operation, the description details the selective update behavior ('Only the fields you pass change'), explains the critical exclude_from_bidding parameter's effect on bidding and reporting, and notes that revenue fields are merged. This adds significant value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with no extraneous information. It front-loads the core purpose, then provides focused details on the most important parameter. Every sentence contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 9 parameters and an output schema (not shown but noted), the description covers essential behavioral aspects and usage context. It could be slightly more complete by mentioning the output format, but the output schema likely handles that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 9 parameters have schema descriptions (100% coverage), so baseline is 3. The description adds extra meaning by highlighting exclude_from_bidding as the 'key bidding lever' and clarifying the merge behavior for revenue fields, raising the score to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update a conversion goal in place' which specifies the verb (update) and resource (conversion goal). It distinguishes itself from create_conversion_goal and get_conversion_goals, as noted in sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises to 'Read the current values first with get_conversion_goals' before updating, providing clear context on when to use this tool. It also warns about the exclude_from_bidding parameter being the inverse of the UI checkbox, though it doesn't explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_keywordA
Update an existing keyword in place. Only the fields you pass change.
| Name | Required | Description | Default |
|---|---|---|---|
| bid | No | New CPC bid in account currency. | |
| status | No | "Active" or "Paused". | |
| final_url | No | New keyword-level Final URL. | |
| keyword_id | Yes | The keyword id. | |
| match_type | No | "Broad", "Phrase", or "Exact". | |
| ad_group_id | Yes | The parent ad group id. | |
| final_url_suffix | No | Keyword-level Final URL suffix. | |
| tracking_url_template | No | Keyword-level tracking template (overrides ad-group/campaign). | |
| url_custom_parameters | No | {key: value} URL custom parameters, referenced in templates/suffixes as {_key}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation (false), the description adds that updates are partial ('Only the fields you pass change') and happen in place. This provides useful behavioral context without contradicting 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 extremely concise at two sentences, front-loads the action clearly, and contains no redundant information. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity with 9 parameters and an output schema, the description effectively conveys the core behavior (partial update). It omits some specifics like required parameters, but these are covered in the schema, making it sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already describes all parameters and their defaults. The description does not add additional meaning beyond what the schema provides, meeting the baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it updates an existing keyword in place, using a specific verb and resource. It distinguishes itself from siblings like add_keywords or delete_keyword by specifying modification rather than creation or deletion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you want to modify a keyword, but does not explicitly state when to use this tool over alternatives or provide context about prerequisites such as requiring the keyword to exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_responsive_search_adA
Update an existing Responsive Search Ad in place. Only the fields you pass change.
Use this to repoint a Final URL or refresh copy without recreating the ad.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | The ad id (from get_ads). | |
| path1 | No | New display URL path 1 (max 15 chars). | |
| path2 | No | New display URL path 2 (max 15 chars). | |
| status | No | "Active" or "Paused". | |
| final_url | No | New landing page URL. | |
| headlines | No | Replacement headlines (3-15; truncated to 30 chars each). | |
| ad_group_id | Yes | The parent ad group id. | |
| descriptions | No | Replacement descriptions (2-4; truncated to 90 chars each). | |
| final_url_suffix | No | Final URL suffix appended to landing-page URLs. | |
| tracking_url_template | No | Tracking template for this ad's URLs. | |
| url_custom_parameters | No | {key: value} URL custom parameters, referenced in templates/suffixes as {_key}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, and the description adds that 'Only the fields you pass change,' which clarifies partial update behavior beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, no unnecessary words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the full schema coverage and output schema presence, the description is adequate. It covers the main intent and use cases, though it could mention return values or error handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description does not add meaning beyond the schema, meeting the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it updates an existing Responsive Search Ad, with specific verb 'update' and resource 'Responsive Search Ad'. It distinguishes from siblings like create_responsive_search_ad and delete_ad by implying modification in place.
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?
Explicit use cases are given: 'repoint a Final URL or refresh copy without recreating the ad.' While it doesn't explicitly list when not to use, the context and sibling tools imply alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_sitelink_extensionA
Update an existing sitelink extension in place (e.g. add or edit its descriptions).
Microsoft replaces the whole sitelink on update, so display text and the final URL are always required; when you omit any field (e.g. to add only descriptions to an existing sitelink) this tool fetches the current extension and re-sends it, so a partial update is safe. Microsoft requires the two description lines together — a sitelink with description1 must also have description2.
| Name | Required | Description | Default |
|---|---|---|---|
| final_url | No | New landing page URL (omit to keep the current one). | |
| description1 | No | First description line, max 35 chars (omit to keep current). | |
| description2 | No | Second description line, max 35 chars (omit to keep current). | |
| display_text | No | New link text, max 25 chars (omit to keep the current one). | |
| ad_extension_id | Yes | The sitelink extension id (from get_ad_extensions). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description discloses critical behaviors: Microsoft replaces the whole sitelink, the tool fetches current extension for partial updates, and the requirement that description1 and description2 must be provided together. This adds context beyond the readOnlyHint=false annotation.
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?
Description is concise with two paragraphs. First sentence states purpose, second provides behavioral details. No wasted words, front-loaded key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool complexity (mutation, 5 params, output schema exists), the description covers the safe partial update mechanism and important Microsoft constraints. Could mention error handling or prerequisites, but overall complete enough for agent selection.
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?
Input schema has 100% coverage with clear 'omit to keep current' descriptions. The description adds important constraints: display text and final URL are always required (though optional in schema due to fetch) and description pair requirement. This enriches understanding beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update an existing sitelink extension in place', specifying the verb (update), resource (sitelink extension), and scope. It distinguishes from siblings like add_sitelink_extension by implying this is for modifying existing ones.
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 the safe partial update behavior due to fetching, but does not explicitly contrast with add_sitelink_extension. It gives context for using this tool vs alternatives, though a clearer when-to-use statement would improve it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_structured_snippet_extensionA
Update an existing structured snippet extension in place (edit its header or values).
Microsoft replaces the whole snippet on update, so the header and values are always required; when you omit either (e.g. to change only the values) this tool fetches the current extension and re-sends the other, so a partial update is safe.
| Name | Required | Description | Default |
|---|---|---|---|
| header | No | New header from Microsoft's predefined list (omit to keep the current one). | |
| values | No | New list of 3 to 10 values, max 25 chars each (omit to keep the current ones). | |
| ad_extension_id | Yes | The structured snippet extension id (from get_ad_extensions). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the tool fetches the current extension when a parameter is omitted, enabling safe partial updates. This adds behavioral insight beyond the readOnlyHint annotation (false), which only indicates write operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with purpose and followed by necessary behavioral context. No redundant 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?
Given the tool's complexity (update with partial support), the description covers all essential aspects: purpose, behavior, parameter handling, and safety. Output schema exists, so return details are not needed.
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 100% schema coverage, parameters are well-documented. The description adds value by clarifying that 'header' and 'values' are always required conceptually but omitting them is safe due to automatic fetching.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates an existing structured snippet extension with verb 'update' and specific resources 'header or values'. It is distinguished from sibling tools like 'add_structured_snippet_extension' and 'delete_ad_extension'.
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 the update behavior (Microsoft replaces whole snippet) and how the tool safely handles partial updates by fetching current values. This guides correct invocation but does not explicitly contrast with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_uet_tagB
Update a UET tag's name and/or description in place.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New tag name. | |
| tag_id | Yes | The UET tag id (from get_uet_tags). | |
| description | No | New tag description. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| ids | No | |
| message | Yes | |
| partial_errors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only set readOnlyHint=false, so description carries the burden. It says 'update in place' but does not disclose potential side effects, permission requirements, or error behavior (e.g., what happens if tag_id is invalid).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence of 12 words, front-loaded with verb and resource. No extraneous 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 simple update tool with 3 params and an output schema, the description is adequate but could mention that the tag must exist and that the tag_id comes from get_uet_tags (schema notes this implicitly). No mention of return value, though output schema likely covers it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for each parameter. The description reaffirms that name and/or description can be updated but adds little new 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?
The description states the verb 'Update' and the resource 'UET tag', specifying the fields 'name and/or description'. It clearly distinguishes from sibling tools that update other resources like campaigns or ad groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives, no prerequisites or exclusions mentioned. For example, it does not indicate that one should first retrieve a tag ID via get_uet_tags.
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.
66 tool updates
v0.4.0- First observed
account_health - First observed
add_ad_schedules - First observed
add_call_extension - First observed
add_callout_extension - First observed
add_keywords - First observed
add_location_targets - First observed
add_negative_keywords - First observed
add_sitelink_extension - First observed
add_structured_snippet_extension - First observed
add_website_exclusions - First observed
apply_offline_conversions - First observed
bulk_download - First observed
bulk_upload - First observed
check_first_page_bids - First observed
complete_auth - First observed
create_ad_group - First observed
create_campaign - First observed
create_conversion_goal - First observed
create_responsive_search_ad - First observed
delete_ad - First observed
delete_ad_extension - First observed
delete_ad_group - First observed
delete_campaign - First observed
delete_keyword - First observed
estimate_keyword_bids - First observed
get_account_url_options - First observed
get_ad_extensions - First observed
get_ad_groups - First observed
get_ad_schedules - First observed
get_ads - First observed
get_auth_url - First observed
get_budgets - First observed
get_campaigns - First observed
get_conversion_goals - First observed
get_device_bid_adjustments - First observed
get_effective_url_settings - First observed
get_keyword_ideas - First observed
get_keyword_traffic_estimates - First observed
get_keywords - First observed
get_location_intent - First observed
get_location_targets - First observed
get_negative_keywords - First observed
get_uet_tags - First observed
get_website_exclusions - First observed
remove_ad_schedules - First observed
remove_location_targets - First observed
remove_negative_keywords - First observed
remove_website_exclusions - First observed
replace_ad_schedule - First observed
resolve_postal_codes - First observed
run_performance_report - First observed
search_accounts - First observed
set_account_url_options - First observed
set_active_account - First observed
set_device_bid_adjustment - First observed
set_location_intent - First observed
update_ad_group - First observed
update_call_extension - First observed
update_campaign - First observed
update_campaign_status - First observed
update_conversion_goal - First observed
update_keyword - First observed
update_responsive_search_ad - First observed
update_sitelink_extension - First observed
update_structured_snippet_extension - First observed
update_uet_tag
TDQS
Scored across 66 tools
Most tools have distinct purposes, with clear CRUD patterns for each entity. A few tools like get_effective_url_settings and get_account_url_options are closely related but well-differentiated in descriptions. Overall, an agent can reliably distinguish tools.
All tool names follow a consistent verb_noun pattern using snake_case. Examples include search_accounts, get_campaigns, create_campaign, delete_campaign, add_negative_keywords. No mixing of conventions.
66 tools is on the higher end, but given the comprehensive coverage of Microsoft Advertising (campaigns, ad groups, keywords, ads, extensions, conversion goals, reports, etc.), the count is borderline. It may be slightly heavy but not excessive.
The tool set covers a wide range of operations: account management, CRUD for campaigns, ad groups, keywords, ads, extensions, conversion goals, location targeting, ad schedules, device adjustments, reports, and bulk operations. Minor gaps exist (e.g., no single entity getters), but core workflows are well-supported.
Maintenance
Related MCP Connectors
Google Ads MCP server — manage campaigns, keywords, and metrics.
Google Ads, Meta Ads & GA4 MCP server - 250+ tools for campaigns, creatives, audiences & reports.
MCP server for querying and analyzing data from ad platforms, analytics tools, and spreadsheets
Hosted MCP server for Google Ads and LinkedIn Ads analysis.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for Google Ads API — 22 tools for campaigns, keywords, RSAs, assets, audiences, geo/device performance, impression share, auction insights, and budget pacing. Community edition with B2B/agency-focused tooling beyond the official Google MCP.22331MIT
- AlicenseNot gradedqualityAmaintenanceProduction-grade MCP server for Microsoft Advertising (Bing Ads) API. Enables Claude to manage Bing/Microsoft Ads accounts with full campaign, ad group, keyword, and performance analysis capabilities.1044MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server for Microsoft Advertising (Bing Ads / DuckDuckGo Ads). This server enables AI assistants to create, manage, and report on Microsoft Advertising campaigns programmatically.2MIT
- AlicenseAqualityDmaintenanceAn MCP server for the Microsoft Advertising (Bing Ads) API. Gives an MCP client live read and management access to your Microsoft Advertising accounts — reporting, campaign structure, and full write operations.26MIT