google-ecommerce-mcp
This MCP server gives an AI assistant read access to a shop's Google and ad-platform data — and, only if explicitly enabled, prepares changes you approve.
GA4: reports (channels, landing pages, purchases, revenue, key events), realtime checks, property listing, custom definitions.
Search Console: clicks/impressions/CTR/position by query, page, country, device or date; URL index inspection; sitemaps; sites.
Merchant Center: product disapprovals/issues and the attribute to fix, feed data sources, account issues, MCQL report queries.
Tag Manager: tags, triggers, variables, live version and workspace status — e.g. spot a tag loaded twice.
Indexing API & PageSpeed: index notification history for a URL; Lighthouse performance/SEO scores and Core Web Vitals.
Google Ads: readable accounts, performance by account/campaign/ad group, validated read-only GAQL
SELECTqueries.Meta Ads + ecosystem: ad accounts, insights with breakdowns and attribution windows; pixel health, dataset quality, catalog, Instagram and Page insights.
ChatGPT Ads: ad account, performance insights, conversion insights.
Cross-platform:
ads_overviewputs Google Ads, Meta and ChatGPT Ads side by side for one period, with attribution caveats.Multi-client: register several clients, keep ids and secrets isolated per client, pin a server process to one client.
Controlled writing (off by default): plan → terminal approval for anything costly/irreversible → apply, limited to paused creations, pauses, budgets, negatives, sitemap submission, GTM workspace edits, catalog item updates; with journal and rollback.
Client reporting: turn tool JSON into a branded static HTML/PDF report.
Safety: read-only by default with endpoint allow-lists, secrets in the OS keyring, no third-party server in the path.
Provides read-only access to GA4 reports and realtime data, enabling queries for channels, landing pages, purchases, revenue, and recent activity by period.
Provides read-only access to Search Console performance data, URL inspection, and sitemap information, enabling analysis of clicks, impressions, CTR, position, indexing status, canonical selection, last crawl, and sitemap errors.
Provides Lighthouse performance and SEO scores plus Core Web Vitals for URLs via PageSpeed Insights.
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., "@google-ecommerce-mcpwhich products are disapproved in Merchant Center?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
google-ecommerce-mcp
One MCP server for the data an online shop decides from, for one shop or for many clients: GA4, Search Console, Merchant Center, Tag Manager, Indexing API, PageSpeed, the ad platforms Google Ads, Meta Ads and ChatGPT Ads, and the Meta pixel, catalog, Instagram and Page. It reads by default, and can also prepare controlled changes that you approve (pause a campaign, change a budget, submit a sitemap, add a tag in a workspace).
Ask your AI assistant "how much organic traffic did we get this month?", "which products are disapproved in Merchant Center?", "is GA4 loaded twice on my site?" or "what did each ad platform claim last month, and what does GA4 say?" and it answers from your own accounts. Out of the box it reads and reports and changes nothing. If you turn writing on for a client, the assistant can propose a change as a plan; nothing is sent until you approve it, and anything that costs money needs your approval in a terminal, outside the chat.
Built by MoonEyes, a small French shop selling 3D-printed tabletop terrain, because no existing MCP server covered GA4, Search Console and Merchant Center together.
Writing is off by default and has never been tested on a real account. The write tools exist in this version, but they were checked offline only, against fake answers written from each platform's documentation. Turning them on is opt-in per client and per platform, creations are always paused, and some risks cannot be removed (for example a Google Ads token or a ChatGPT Ads key cannot be limited to reading). Read docs/SECURITY.md and docs/WRITE.md before you turn it on, and try it first on a test account. New here? docs/QUICKSTART.md: your first client in 10 minutes.
The paid media connectors are new and tested offline only. The Google Ads, Meta Ads and ChatGPT Ads tools were checked against fake responses written from each platform's documentation. They have not been run against real ad accounts yet: compare the first figures with each platform's own interface. Details: docs/ADS.md.

Documentation
Page | What is in it |
Your first client in 10 minutes: four commands | |
The client registry | |
A pilot with one client and writing left off: access checklist, steps, how to check writing is off, how to revoke | |
Turn writing on in 5 steps, three full examples, every lock, every refusal and its fix | |
Components, the write path, a tool call step by step, design choices, sequence diagrams | |
Every tool (82): parameters, output, example questions | |
Which services you need, access checklist and e-mail template for a client, install order with | |
Monthly report plan, KPI formulas, the | |
A prompt to paste into Claude to be guided step by step (French) | |
Code ported from OpenGSC (MIT); ideas credited to other open-source projects (no code copied) | |
Google Ads, Meta Ads, ChatGPT Ads: client e-mail, numbered steps, ids, checks, revocation | |
Google Ads, Meta Ads, ChatGPT Ads: prerequisites step by step, GAQL rules, errors, what is untested | |
OAuth client, APIs to enable, where to find each id | |
What writing changes, the real guardrails, the known limits, scopes, token storage, how to revoke | |
Every error we have met and its fix | |
Questions that work well, by use case | |
Claude Desktop (one or two shops), Claude Code |
Related MCP server: Google Search Console MCP Server
Why this one
One server for the whole picture. Traffic and sales (GA4), organic search (Search Console), the product feed (Merchant Center), the tracking setup (Tag Manager), site speed, and what the ad platforms say they delivered. Other MCP servers cover one or two of these.
Several clients, kept apart. An agency registers each client once (ids in a file, secrets in the OS keyring). Every call names its client, a foreign account id is refused, and one server process can be pinned to one client.
Read by default, controlled writing on request. Reading uses a per-platform allow-list with no write endpoint. Writing is off until you enable it per client and per platform, and then goes through one path only: plan (diff, dry run, signed token), your approval (in a terminal for anything that costs money, is irreversible or touches personal data), apply, and a journal. Creations are paused; there is no activation, deletion or publishing in this version.
Secrets kept out of the way. The Google token goes to your OS keyring (Windows Credential Manager, macOS Keychain or Secret Service). The Google Ads token is a separate keyring entry because its scope can write. Meta and ChatGPT Ads secrets go to the OS keyring from a hidden prompt (an environment variable also works), never on the command line or in a URL.
Answers a model can read correctly. Reports return the top rows plus totals over everything, the unit and definition of each metric, dates resolved in the account's timezone with a flag when the last days can still change, and the attribution windows each ad platform used.
Honest about what it does not know. Ad platforms count conversions their own way. The tools say so in every answer instead of adding up numbers that should not be added.
No third party. Requests go straight from your machine to Google, Meta and OpenAI. Nothing goes through a MoonEyes server.
How it compares
Checked on 2026-10-18 from each project's public page; they change fast, so check before you decide.
Project | License | Scope | Writing |
googleanalytics/google-analytics-mcp (official) | Apache-2.0 | GA4 | reads only |
googleads/google-ads-mcp (official) | Apache-2.0 | Google Ads | reads only |
Meta Ads MCP (official, hosted by Meta, beta) | closed | Meta Ads | yes, hosted by Meta |
BUSL | Meta Ads | yes | |
Apache-2.0 | Tag Manager | read and write | |
MIT | 12+ ad and analytics platforms | see its docs | |
This project | MIT | GA4, Search Console, Merchant Center, Tag Manager, PageSpeed, Google Ads, Meta Ads, ChatGPT Ads | off by default, plan, approval, journal, rollback; never tested on a real account |
Where this one fits: you run several shops or clients from one self-hosted server and want every change shown as a diff and approved before it is sent. If you need one Google product only, or a hosted service with nothing to install, the official servers above are the better choice.
What you can ask
Each case gives the question, the tools the assistant usually calls, what you learn, and the decision it supports. The decision stays yours: by default the server shows data and changes nothing, and any change it prepares needs your approval. Ready-to-paste prompts are in examples/PROMPTS.md.
Traffic, search, feed, tracking
Where do visits and sales come from? "Sessions, purchases and revenue by channel, this month vs. last month." Tools:
ga4_report. You learn which channels bring revenue and which only bring visits. Decision: where to put the next hour or euro.Which searches are one push away from page one? "Queries ranking 5 to 15 with more than 100 impressions, and their landing page." Tools:
gsc_performance. You learn which pages already earn impressions but few clicks. Decision: which titles, descriptions and internal links to rewrite first.Which disapproved products still get visits? "Products disapproved in Merchant Center that still receive organic clicks." Tools:
merchant_product_issues,gsc_performance. You learn which feed errors hit pages people still visit. Decision: fix those products before the rest.Is the tracking trustworthy? "Is GA4 loaded twice? Does the purchase tag fire once? Is the workspace the same as the live version?" Tools:
gtm_inventory,ga4_realtime. You learn whether purchases or page views may be double counted and whether unpublished changes exist. Decision: publish, remove a duplicate tag, or leave it.Preparing a redesign. "Which landing pages earn money and organic clicks, which will need a 301, and what is today's speed baseline?" Tools:
ga4_report(dimensionlandingPage),gsc_performance,gsc_moves,gsc_opportunities,gsc_inspect_url,pagespeed. You learn which URLs to preserve, which redirects to plan, and the before-numbers to compare with after. Decision: the redirect map and what must not change.
Paid media (needs the connectors below)
Do the platforms agree with GA4? "Compare the conversions of Google Ads, Meta and ChatGPT Ads with GA4 for last month." Tools:
ads_overview,ga4_report. You learn how far each platform's claim is from what GA4 recorded. Decision: which figure to trust less, and which attribution settings to review in that platform's interface.What does each platform's ROAS look like next to real revenue? "Reported ROAS per platform vs. GA4 revenue for the same days." Tools:
ads_overview,ga4_report. You learn the value each platform claims and the revenue GA4 saw. The server does not compute an overall return on ad spend (MER): you compare the two yourself. Decision: whether the claimed values are plausible together.Which campaigns spend without a recorded purchase? "Campaigns with spend and no purchase attributed, and what GA4 shows for the same campaign names." Tools:
gads_performanceormeta_insights,ga4_report(dimensionsessionCampaignName). You learn which campaigns spend while neither the platform nor GA4 shows a sale. Decision: pause, fix the tracking or wait, done by you in the ad platform.
Why platform numbers differ. Meta defaults to a 7-day click plus 1-day view window, ChatGPT Ads, as this server requests it by default, to 30-day click plus 1-day view, and Google Ads to the setting of each conversion action. Platforms attach a conversion to different dates, count the same order independently, and may report modelled conversions when visitors decline cookies (Consent Mode). GA4 adds its own thresholds. What the tools cannot tell you: whether an ad caused a sale (incrementality), your real number of orders (your shop's back office is not read), or your consent rate.
Real findings
Findings from MoonEyes' own accounts and from one anonymised small-business account. They show the kind of problem the data revealed, not a promised result. Each states its period and how it was measured. They are single cases, not a benchmark, and a fix that coincides with a better number is a correlation, not a guarantee. The repository holds no raw export behind these figures, so they cannot be re-checked from here.
Finding | Period | Measured by |
Merchant Center: 2,544 listings, 112 disapproved. 224 "weight too high" refusals came from a grams-to-kilograms unit error in the feed (packs sent as about 2 tonnes), since corrected. One false "alcoholic drink" refusal was caused by a product name and went away after renaming 3 products. A duplicate feed source created by the Google for WooCommerce plugin was removed. | Audit of 1-2 June 2026 (MoonEyes) | Merchant Center product statuses and feed sources (the same kind of data |
A purchase counted twice: the same Google Ads conversion id was sent both by a WordPress snippet and by Google Tag Manager. The snippet was disabled and GTM stays the single source. The number of gtag occurrences in the served HTML went from 18 to 12 on one page and from 6 to 3 on another. | 2 June 2026 (MoonEyes) | Counting gtag occurrences in the served HTML |
GA4 over-counted conversions: 265 conversions for 201 sessions, because phone, e-mail and contact clicks were marked as key events. | The 28 days before the 1-2 June 2026 audit (MoonEyes) | GA4 conversions and sessions (the check |
Search Console: 0 clicks and 708 submitted URLs for 0 indexed, the starting point of an indexing work item. | 1 June 2026 (MoonEyes) | Search Console |
A Google Ads account showed 96 conversions at EUR 2.16 each for 10 real bookings. Real cost: EUR 207.57 / 10 = about EUR 20.76 per booking, 9.6 times the displayed figure. Cause: | 26 August to 22 September 2026 | Google Ads console (read in the Ads interface, not with these tools) |
Tools
82 tools in total. Full parameters and outputs: docs/TOOLS.md. Most only read. The *_plan_* tools prepare a change and write nothing. Only four tools write, and only for a client where writing is on: gads_apply, meta_apply, openai_ads_apply, google_apply.
Platform | Reads | Prepares a change (plan) | What the plans can do (all behind the locks of WRITE.md) |
All |
|
| Undo a plan with a new plan |
GA4 |
|
| Create a key event or a custom dimension |
Search Console |
|
| Submit a sitemap |
Merchant Center |
|
| Change title, description, link, availability or price of a product |
Tag Manager |
|
| Edit a non-default workspace. Nothing goes live: no version, no publish |
Indexing, PageSpeed |
| none | none |
Google Ads |
|
| Pause, daily budget, negative keywords, one new Search campaign (paused) |
Meta ads |
|
| Pause, daily budget, new campaign, ad set and ad (paused) |
Meta pixel, catalog, Instagram, Page |
|
| Price, sale price, availability, stock of one catalog item |
ChatGPT Ads |
|
| Pause, daily budget, new campaign (paused) |
What the main read tools answer:
Tool | Service | What it answers |
| GA4 | Any report: channels, landing pages, purchases, revenue, by period |
| GA4 | Which events are key events, and whether they inflate conversions (more key events than sessions, page_view or contact clicks marked as key) |
| Search Console | Clicks, impressions, CTR, position by query, page, country, device, date |
| Search Console | Queries or pages ranking 5 to 15 with real impressions, and those with impressions but no clicks |
| Search Console | Is this URL indexed, which canonical did Google pick, last crawl |
| Merchant Center | Products with disapprovals or warnings, all pages |
| Tag Manager | Tags, triggers, variables, live version |
| PageSpeed Insights | Lighthouse performance and SEO scores, Core Web Vitals |
| Google Ads | Spend, clicks, conversions, value, ROAS by account, campaign or ad group |
| Google Ads | One read-only GAQL |
| Meta Ads | Spend, reach, purchases, value, ROAS by level, with breakdowns |
| ChatGPT Ads | Impressions, clicks, spend, conversions, attributed sales |
| Google Ads, Meta, ChatGPT Ads | The three platforms side by side for one period |
Paid media connectors
Optional. Configure one, two or all three; the others answer not_configured. The table lists the original reading tools; the full list, with the plan tools, is above.
Platform | Tools | You need |
Google Ads |
| A customer id ( |
Meta Ads |
| A system user token with only |
ChatGPT Ads |
| An advertiser API key from Ads Manager ( |
All |
| At least one of the above |
Step by step, with the GAQL rules, every error and the known limits: docs/ADS.md.
Attribution warning. Each platform attributes conversions independently, with its own windows, dates and model, so the same order can be counted by several of them. The sum of the platforms' conversions is not deduplicated and overstates real orders. ads_overview repeats this in every answer. Read the figures as "what each platform claims", and compare them with GA4 and, outside this server, with your orders.
Reads by default, with one caveat. The Google Ads permission (adwords) can write and Google offers no read-only version. Without writing turned on, the server only sends read requests, but the token itself could write, so it is stored apart from your other Google token. ChatGPT Ads documents no read-only key either, and the same key serves reading and writing. See Security notes.
Tested offline only, reading and writing. All behaviour was checked against fake responses; real-account trials are still to do, and no write has ever been sent to a real account. Not yet confirmed: the timezone ChatGPT Ads returns with time_granularity=none, Meta's longer view windows (7d_view, 28d_view; the tool does not offer them), and whether a ChatGPT Ads key can be limited to reading.
Client reporting
google-ecommerce-mcp report turns the tools' JSON results into one static HTML file in your client's brand (name, logo, accent colour), printable to PDF. It needs no network and no configured service, shows comparisons with the previous month and last year, and never invents a cause: a cause appears only if you supply it.
# the assistant runs the tools for each period and saves their raw JSON; you assemble report.json from them
google-ecommerce-mcp report --input report.json --output report.html --brand-name "Client name" --accent "#1F6F5B" --logo logo.png
# open report.html in a browser, then Ctrl+P > Save as PDFThe plan, the input contract, the colour rules, the KPI formulas and common mistakes are in docs/REPORTING.md; a ready prompt is in examples/PROMPTS.md. Tested on sample data only, not yet on real client accounts. Margin, targets and annotations come from you, and some figures (impression share, Shopping product reports, MER) need extra GAQL or a calculation by the assistant.
Who is it for
Shop owner. You want straight answers (what sold, what is broken, which ads spend for nothing) without opening six dashboards. Install, ask in plain language, decide yourself.
Agency. You work for several clients. One install, one registry (docs/MULTI-CLIENT.md), the same checks each time, attribution caveats written into the answers you hand to a client, and writing turned on only for the clients and platforms you choose.
Developer. You want a small, readable, tested server: plain HTTP calls, per-platform allow-lists, one write path, structured errors. Pull requests welcome (see Contributing).
What it will not do
No change without a plan you can read. By default it writes nothing. With writing on for a client, it still cannot activate a paused campaign, delete or archive anything, publish a Tag Manager container, set a bid amount or choose a bidding strategy (a new Google Ads campaign gets a fixed manual CPC with no bid amount), or upload conversions and customer lists in this version. Everything it creates is paused. To do those, use the platform's own interface.
No change that costs money without you at a terminal. Budgets, new campaigns and price changes are applied only after you run
google-ecommerce-mcp approveyourself. This does not protect you from an assistant that has a shell on your machine (see docs/SECURITY.md).No causal attribution. It reports what each platform and GA4 recorded. It cannot say whether an ad caused a sale (incrementality).
No real order count. Your shop's back office (WooCommerce, Shopify...) is not read, so it cannot tell you actual orders, margins or returns. It does not know your consent rate either.
No deduplicated conversions, no currency conversion. It will not merge the platforms' conversions into one "true" number, and it adds spends only when they share one currency.
Quick install
Create your Google OAuth client first (step 1 below), then run the installer. It installs uv if needed, asks your ids, opens the Google consent screen and adds the server to Claude Desktop (your previous config is backed up). It installs the exact package version it was released with (google-ecommerce-mcp==0.6.0).
Recommended: download, read, run. The URLs name an exact commit, not a branch, so the script cannot change under you.
Windows (PowerShell):
Invoke-WebRequest https://raw.githubusercontent.com/MoonEyes/google-ecommerce-mcp/54705d4dd1a4b34b387a682c13de164210892352/install.ps1 -OutFile install.ps1
Get-Content .\install.ps1 # read it
(Get-FileHash .\install.ps1 -Algorithm SHA256).Hash # compare with the SHA-256 below
.\install.ps1macOS / Linux:
curl -LsSf -o install.sh https://raw.githubusercontent.com/MoonEyes/google-ecommerce-mcp/54705d4dd1a4b34b387a682c13de164210892352/install.sh
cat install.sh # read it
shasum -a 256 install.sh # compare with the SHA-256 below
sh install.shSHA-256 of the pinned scripts:
install.ps1:aa697734ffcd71fd063ebb5ac6e6996a29572582ac7f18d53566082723265db0install.sh:3849a64501ed954ec5a79ecaaa29c8c79621bfe0c8bd20c758179feb3fc85aba
One line, if you accept to run it without reading (same pinned commit; this way the SHA-256 is not checked):
irm https://raw.githubusercontent.com/MoonEyes/google-ecommerce-mcp/54705d4dd1a4b34b387a682c13de164210892352/install.ps1 | iexcurl -LsSf https://raw.githubusercontent.com/MoonEyes/google-ecommerce-mcp/54705d4dd1a4b34b387a682c13de164210892352/install.sh | shThe installer has an optional Paid media step (Google Ads, Meta Ads, ChatGPT Ads); skip it with --skip-ads. It never takes a secret as an argument: Google Ads uses the browser consent (the same OAuth client file, a separate token), and the Meta token and ChatGPT Ads key are typed at a hidden prompt into the OS keyring. The Claude Desktop config only receives non-secret ids. Non-secret options: --gads-customer-id (exactly 10 digits, dashes allowed), --gads-login-customer-id, --meta-account-id (3 to 20 digits), and --corporate-proxy (sets ADS_TRUST_ENV=1; it is enough on its own to add it to an existing entry). All checks run before any consent or secret prompt; a conflicting value stops with exit code 3 and changes nothing, and --force replaces a value but never deletes a variable. With --yes, ChatGPT Ads is skipped (no id to give): add it interactively (install --skip-auth) or with set-secret openai-ads-key. The PageSpeed key is read from --pagespeed-key (not recommended: it stays in your shell history), else PAGESPEED_API_KEY, else a hidden prompt.
Guided install. To be walked through it one step at a time, paste examples/INSTALL-PROMPT.md (English) or INSTALL-PROMPT.fr.md (French) into Claude. Install one service at a time and the access checklist for your client are in docs/SETUP.md.
Then quit Claude Desktop completely and reopen it. To pass options, save the script first, for example .\install.ps1 --ga4 123456789 --gsc sc-domain:example.com --client-secret client_secret.json. Run google-ecommerce-mcp install --help for every option. Maintainers: each release bumps the version in both scripts, then refreshes the commit in these URLs and the checksums (tests/test_installer_scripts.py fails until they match).
Setup, step by step
If you used the quick install, you only need step 1. The steps below are the manual path.
1. Google Cloud (once, about 10 minutes)
Full walkthrough with every click explained: docs/SETUP-GOOGLE-CLOUD.md. Short version:
In Google Cloud Console, create or pick a project.
Enable the APIs you need: Google Analytics Data API, Google Analytics Admin API, Google Search Console API, Merchant API, Tag Manager API, Web Search Indexing API, PageSpeed Insights API.
Configure the OAuth consent screen (External, add yourself as a test user).
Create an OAuth client of type Desktop app and download its JSON file.
Merchant API only: register your Cloud project with your Merchant Center account.
Optional: create an API key restricted to PageSpeed Insights (the anonymous quota is shared and often exhausted).
2. Install and authorize
# with uv (recommended): nothing to install, uvx fetches the package from PyPI
uvx google-ecommerce-mcp setup --client-secret path/to/client_secret.json --with-merchant
# read scopes only by default; --with-merchant / --with-indexing add the write-capable ones you need
# or with pip
pip install google-ecommerce-mcp
google-ecommerce-mcp setup --client-secret path/to/client_secret.jsonLatest development version: uvx --from git+https://github.com/MoonEyes/google-ecommerce-mcp google-ecommerce-mcp.
Your browser opens the Google consent screen. The token is then stored in your OS keyring. Check everything with google-ecommerce-mcp check.
Check each service with doctor:
google-ecommerce-mcp doctor # offline; without a registry: Service, Set up, Secret, Token, Status, Account; with one: Client, Platform, Ids, Read, Write, On, Status, Account, Next (plus Live with --live)
google-ecommerce-mcp doctor --only gads --live # one service, plus one minimal read call
google-ecommerce-mcp doctor --live --json # no secret in the output; ids masked (123***890)--client <name> limits it to one client of the registry. --only takes ga4,gsc,merchant,gtm,pagespeed,gads,meta,openai (comma-separated). doctor reads this shell's environment and the server entry of your Claude Desktop config (--config and --name point it elsewhere). The table is followed by "To fix" (the exact command for each problem), "Not set up", a Result: line and a Next command:. Exit code 0 means all configured services work, 1 that a configured service fails, 2 that nothing is configured. --live does not test PageSpeed (it is shown as skipped: it needs a page address and about 30 seconds); ask the assistant to run pagespeed instead.
Paid media (optional)
Set up Google Ads with google-ecommerce-mcp setup-ads --client-secret client_secret.json (or install with --gads-customer-id), Meta with google-ecommerce-mcp set-secret meta-access-token plus the ad account id (install --yes --skip-auth --meta-account-id <id>), ChatGPT Ads with google-ecommerce-mcp set-secret openai-ads-key, then check each with doctor --only <service> --live. Prerequisites: docs/ADS.md. Overall procedure, access checklist and an e-mail template for your client: docs/SETUP.md.
3. Add it to your MCP client
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"google-ecommerce": {
"command": "uvx",
"args": ["google-ecommerce-mcp"],
"env": {
"GA4_PROPERTY_ID": "123456789",
"GSC_SITE_URL": "sc-domain:example.com",
"MERCHANT_ACCOUNT_ID": "1234567890",
"GTM_CONTAINER_ID": "GTM-XXXXXXX",
"PAGESPEED_API_KEY": ""
}
}
}
}Claude Code:
claude mcp add google-ecommerce -e GA4_PROPERTY_ID=123456789 -e GSC_SITE_URL=sc-domain:example.com \
-e MERCHANT_ACCOUNT_ID=1234567890 -e GTM_CONTAINER_ID=GTM-XXXXXXX \
-- uvx google-ecommerce-mcpEvery variable is optional: a tool for a service you did not configure simply answers not_configured. These variables describe one shop (legacy mode). For several clients, create a registry instead and leave the ids out of this config: docs/QUICKSTART.md, docs/MULTI-CLIENT.md. Once a registry exists, the id variables below are ignored. For the ad platforms, put ids in the config (GADS_CUSTOMER_ID, META_AD_ACCOUNT_ID) and secrets in the keyring with the commands below the table.
Variable | Example | Used by |
|
| GA4 tools |
|
| Search Console tools |
|
| Merchant tools |
|
|
|
| API key |
|
|
| store the token in a file instead of the keyring |
|
| Google Ads tools |
|
| manager (MCC) id, only if you reach the account through one |
| not needed since 9 September 2026; sent only when set | |
|
| store the Google Ads token in a file instead of the keyring (must differ from |
|
| Google Ads REST version |
|
| lifts the resource lists of |
| Meta token ( | |
|
|
|
|
| Graph API version |
| ChatGPT Ads key. Prefer | |
|
| use |
|
| pin this server process to one client of the registry |
| a path | use another client registry file than the default |
|
| allow writing at all. Unset means every apply is refused. See docs/WRITE.md |
| a path | where plans, approvals and the journal are kept |
|
| language of the |
| a long random string | signing key for plans and approvals (CI); otherwise keyring entry |
|
| with it, apply works only for a client marked |
|
| a client's secret read from the environment instead of the keyring (CI) |
Command for the client report: google-ecommerce-mcp report --input report.json --output report.html [--lang fr|en] [--brand-name NAME] [--accent #RRGGBB] [--logo FILE] [--force] (see docs/REPORTING.md).
Commands for the paid media connectors (details in docs/ADS.md):
google-ecommerce-mcp setup-ads --client-secret path/to/client_secret.json [--token-file path] # Google Ads only, separate token
google-ecommerce-mcp set-secret meta-access-token # hidden prompt, stored in the OS keyring
google-ecommerce-mcp set-secret openai-ads-key # hidden prompt, stored in the OS keyringHow a call works

Security notes
Details, the full list of guardrails and the known limits: docs/SECURITY.md.
Reading is read-only, enforced. Every read request is checked against an allow-list before it is sent, and CI fails if a tool tries an endpoint outside it.
readOnlyHintis only a hint.Writing is off by default and opt-in. It needs
GEM_WRITE=1,enabledfor the client and platform, an allowed account, budget caps, paused creations, a field allow-list, a signed single-use token bound to the exact plan, a journal that must be writable, and, for money, personal data, irreversible or high-risk plans, your approval in a terminal. It never activates, deletes or publishes.The limits you must know. The terminal approval does not stop an assistant that has a shell or file access on your machine. A Google Ads token and a ChatGPT Ads key cannot be split into read and write. The write policy is a file you (or anything running as you) can edit. No write was ever verified on a real account.
setuprequests read scopes only. Google has no read-only scope for Merchant Center (content) or the Indexing API (indexing); they are requested only with--with-merchant/--with-indexing. Write scopes for GA4, Tag Manager, Search Console and Merchant Center live in a separate token created bysetup --client <name> --write.Paid media. Each ad platform has its own allow-list (host pinned, a few read endpoints). Google Ads queries go through a GAQL validator before being sent. Redirects are never followed, answers are capped at 20 MB, secrets are masked in every error, and the environment's proxy is used only if you set
ADS_TRUST_ENV=1.Google Ads scope caveat.
setup-adsrequests theadwordsscope, which can write and cannot be limited. It is stored in its own keyring entry, apart from the Google read token. ChatGPT Ads documents no read-only key, and a Meta system user token is long-lived: dedicate each credential to this server and revoke it when you stop.Every result carries
fetched_atandfreshness; report tools return thedate_rangequeried, resolved in the data's timezone, withdata_complete.Revoke access at any time from your Google account permissions.
Limitations
The Merchant API is recent and Google keeps changing it; the older Content API for Shopping has been shut down, so only the Merchant API is used. Open an issue if a call breaks.
Without a client registry (legacy mode): one site, Merchant account and container per server instance, and writing is not available. With a registry: any number of clients, each with its own ids and secrets.
GA4 Data API quotas apply to
ga4_report. Each ad platform has its own quotas, returned asrate_limited; nothing is retried automatically.Neither the paid media connectors nor any write is tested on real accounts (offline tests only). Platform conversions are attributed independently and are not deduplicated; spends are never converted between currencies.
Ad platforms keep changing their APIs (defaults: Google Ads
v26, Metav26.0; both are settable). Open an issue if a call breaks.One Google Ads customer, one Meta ad account and one ChatGPT Ads key per client. With a registry, a
property_id,customer_idoraccount_idthat is not the client's own is refused (id_not_owned) for reads and for plans; only in legacy mode (no registry) do these parameters read any account the credential can see.Writing, since 0.5.0: bids are refused (which blocks some creations, for example a Meta ad set whose goal needs a bid cap; a new Google Ads campaign uses a fixed manual CPC with no bid amount), activation, deletion and publishing do not exist, and
max_plan_budget_microsis not usable.
Contributing
See CONTRIBUTING.md. Security reports: SECURITY.md.
Development
pip install -e ".[dev]"
pytestTests run offline with a fake HTTP session; no Google, Meta or OpenAI account needed. Maintainers: see docs/RELEASING.md.
License
MIT, see LICENSE.
Available Tools
82 toolsads_overviewAds overview (all platforms)ARead-onlyIdempotent
Google Ads, Meta and OpenAI Ads totals side by side for one period: spend, impressions, clicks, conversions and conversion value as reported by each platform, the platform's own ROAS, currency, attribution windows and date range. A platform not configured or failing gets its own block without blocking the others (partial). combined adds spends only when every currency is the same (else null with combined_reason; a platform without activity adds zeros and needs no currency) and computes ROAS as total value / total spend. Conversions overlap between platforms: their sum is not deduplicated (warning). Multi-client: one client only (client_id), and only the platforms that client has; never two clients mixed.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | Yes | Last day, YYYY-MM-DD, on or after start_date | |
| client_id | No | Client id from clients_list; empty uses the only client. Only that client's platforms are added up | |
| start_date | Yes | First day, YYYY-MM-DD (each platform counts in its own account timezone) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent safety, but the description goes far beyond them: failing or unconfigured platforms are isolated into their own block (partial), combined spend is null unless all currencies match with a combined_reason, ROAS is defined as total value / total spend, and cross-platform conversions overlap are explicitly not deduplicated. These are real behavioral traits an agent could not infer otherwise.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose before the caveats, and nearly every clause carries distinct information. The long run-on sentences with stacked parentheses (combined_reason, currency rules, overlap warning) make it dense and harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden and does so: it names the returned metrics, explains the partial per-platform block structure, the combined aggregation and null semantics, and the cross-platform overlap caveat. Nothing essential for correct interpretation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents start_date, end_date and client_id (including the empty-uses-only-client and per-platform timezone details). The description largely restates that scoping, adding only the 'never two clients mixed' constraint, which is marginal added value at this coverage level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource – pull Google Ads, Meta and OpenAI Ads totals side by side for one period – and enumerates the exact metrics returned (spend, impressions, clicks, conversions, conversion value, ROAS, currency, attribution windows, date range). This is clearly distinguishable from the single-platform siblings like gads_query, meta_insights and openai_ads_insights.
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 cross-platform scope and the 'one client only (client_id)' rule establish when this tool is the right choice, and the partial-failure note explains what happens when a platform is misconfigured. However, no sibling is named as an alternative and there is no explicit when-not-to-use guidance (e.g. use gads_query for per-campaign breakdowns).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audit_logWrite journalARead-onlyIdempotent
Read the write journal of a client (plans, apply intents and results, rollbacks), secrets masked.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of entries to return | |
| plan_id | No | Only entries of this plan id | |
| client_id | No | Client id from clients_list; empty uses the only client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed world), and the description adds real behavioral context beyond them: the entry types returned and the fact that secrets are masked. It does not say how entries are ordered or whether the journal is complete or windowed, which would have pushed it higher.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the verb and resource and puts the useful scoping detail (secrets masked) at the end. Nothing is redundant and nothing obvious is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter read tool with no output schema, the description does the key work of describing what comes back (plans, apply intents and results, rollbacks) and that secrets are redacted. It leaves out ordering and how much history exists, which an agent arguably needs to interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, plan_id, and client_id are already documented in the schema, including that client_id comes from clients_list and that an empty value uses the only client. The description adds only the vague phrase 'of a client' and no format or default semantics beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Read') and resource ('write journal of a client') and enumerates what the journal contains (plans, apply intents and results, rollbacks), which separates it from plan_list/plan_get/rollback_plan. It stops short of naming a sibling it is often confused with, so differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool for auditing past plan/apply/rollback activity. There is no explicit 'use this when...' guidance, no mention of when to prefer plan_get or rollback_plan, and no note on default ordering or scope of the journal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
client_checkClient checkARead-onlyIdempotent
Health of one client: which services are configured, whether its Google token works and which scopes it holds (like server_status), plus whether each of its secrets is stored ("secrets": {kind: true/false}; the values are never read out).
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list; empty uses the only client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuinely non-obvious behavior: that secrets are reported only as booleans by kind and 'the values are never read out', which tells the agent the output is non-sensitive and shaped predictably.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense but well-structured sentence that front-loads the core purpose ('Health of one client') and then enumerates the returned facets. No filler, though the nested parenthetical and clause stack require a re-read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only one optional parameter, the description carries the return-shape burden and does so: it enumerates services, token/scope status, and the boolean secret map. It stops short of describing the response envelope or error semantics, but an agent has enough to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — the single client_id parameter already documents 'Client id from clients_list; empty uses the only client'. The description adds nothing about the parameter, so the baseline 3 applies; it neither compensates for nor degrades existing 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 names a specific resource and scope: health of ONE client, enumerated as configured services, Google token validity/scopes, and secret-storage booleans. The parenthetical '(like server_status)' positions it against the server-level sibling, giving partial sibling differentiation, though it doesn't explicitly contrast with client_profile or clients_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (check whether a client is healthy/configured) but there is no explicit when-to-use, when-not-to-use, or prerequisite statement. The only comparative cue is '(like server_status)', which hints at the relationship to the server-level tool but doesn't spell out which to pick when.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
client_profileClient profileARead-onlyIdempotent
One client's profile: label, sandbox flag, the account ids of each platform (GA4 property, Search Console site, Merchant account, GTM container, Google Ads customer, Meta ad account...) and its write policy per platform (enabled, allowed accounts, budget caps). Never a secret value.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list; empty uses the only client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds a genuine extra disclosure that annotations do not carry: it returns configuration/account identifiers and 'Never a secret value', which tells the agent this tool is safe to surface in output.
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?
It is a single front-loaded sentence that leads with the resource and then the payload, with no filler. The parenthetical platform list and the security note both earn their place, though the sentence is long enough that it reads as a dense enumeration rather than crisp guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns, and it does so concretely (label, sandbox flag, account ids, write policy). Safety is covered by annotations, so the only remaining gaps are minor: no error/absence behavior and no note on what an empty or unknown client_id yields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single client_id parameter is fully documented in the schema ('Client id from clients_list; empty uses the only client'). The description adds no parameter-level detail beyond this, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely ('One client's profile') and enumerates its contents: label, sandbox flag, per-platform account ids, and per-platform write policy. The singular 'one client' implicitly contrasts with the plural clients_list sibling, so an agent can distinguish them, though the contrast is not stated outright.
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 lists what the profile contains but never states when to call it, when not to, or how it relates to siblings like clients_list or client_check. The only usage pointer ('Client id from clients_list; empty uses the only client') lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clients_listClients listARead-onlyIdempotent
Clients this server can work on, from the client registry (clients.json): client_id, label, sandbox and which platforms are configured. Never a secret. Without a registry there is one implicit client, "default", built from the environment variables. Pass client_id to the other tools when several clients are listed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, lowering the bar. The description still adds value beyond them: it discloses the 'clients.json' registry source, the 'Never a secret' security guarantee, and the implicit 'default' client behavior when no registry exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool lists and its fields, followed by the security note and fallback behavior. Slightly dense and run-on in the middle, but every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining the return shape, which it does (client_id, label, sandbox, platforms). It also covers the edge case of no registry, leaving only the sibling-differentiation gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description adds meaningful context about where the data comes from (registry file vs. implicit env-var-derived default) even though there is no parameter syntax to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (clients this server can work on) and enumerates the returned fields (client_id, label, sandbox, configured platforms), so an agent knows exactly what this yields. It does not differentiate from the sibling client_check or client_profile tools, keeping it just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a downstream usage tip ('Pass client_id to the other tools when several clients are listed') and explains the no-registry fallback, which is genuinely useful. However, it gives no explicit when-to-use guidance versus client_check or client_profile, so selection between these sibling tools is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ga4_compareGA4 compareARead-onlyIdempotent
Compare a GA4 period with an earlier one in ONE call (Data API runReport with two date ranges): this month against last month, the last 7 days against the 7 before, a month against the same month last year. Returns, per row, the current and previous value of each metric with the absolute "change" and "change_pct" (percent; None when the previous value is 0), "totals" over every row, the unit and definition of each metric under "metrics", the currency, both "date_range"s resolved to calendar dates in the property's timezone with "data_complete", and "biggest_moves": the 5 rows whose first metric changed the most in absolute terms. A key present in one range only shows the other as 0 and a "present_in" list. Use ga4_report for a single range.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows returned (1 to 1000); totals and biggest_moves always cover every fetched row | |
| period | No | last_7_days, last_14_days, last_28_days, last_30_days, last_90_days, this_month (month to date, up to yesterday), last_month (whole previous month) or YYYY-MM-DD:YYYY-MM-DD | last_28_days |
| metrics | No | GA4 API metric names, e.g. sessions, purchaseRevenue, ecommercePurchases; the first one ranks biggest_moves | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) | |
| compare_to | No | previous_period: the range of the same length just before (this_month is set against the same number of days of the month before); previous_year: the same dates one year earlier | previous_period |
| dimensions | No | GA4 API dimension names that split the rows, e.g. sessionDefaultChannelGroup, landingPage, itemName; empty list for one row of totals | |
| property_id | No | Numeric GA4 property id, as listed by ga4_properties; empty uses the configured GA4_PROPERTY_ID (or the client's property) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, non-destructive), the description discloses important runtime behavior: per-row current/previous values, change and change_pct with None for zero previous values, totals, metric metadata, resolved date ranges with data_complete, and biggest_moves. It also explains the edge case where a key exists in only one range by showing the other as 0 plus present_in.
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 definition is front-loaded with the core comparison purpose and examples, then moves efficiently into return structure and edge cases. Despite its density, every sentence contributes useful information and there is no redundant restatement of the tool name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of explaining return values—and it does so thoroughly: per-row values, change metrics, totals, metric metadata, currency, resolved date ranges, data completeness, and biggest_moves. Combined with a fully documented parameter schema, an agent has everything needed to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents every parameter with defaults, enums, and examples. The description adds output semantics tied to parameters (e.g., first metric ranks biggest_moves, date ranges resolved in property timezone), but parameter guidance itself is largely carried by the schema, so the 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 opens with a specific verb and resource: 'Compare a GA4 period with an earlier one in ONE call (Data API runReport with two date ranges)', and immediately distinguishes the tool from ga4_report by directing single-range queries elsewhere.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete usage examples ('this month against last month, the last 7 days against the 7 before, a month against the same month last year') and explicitly names the alternative tool for the single-range case: 'Use ga4_report for a single range.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ga4_custom_definitionsGA4 custom definitionsARead-onlyIdempotent
Custom dimensions and custom metrics of a GA4 property (parameter name, display name, scope, unit) and how many slots each scope uses against the standard quotas (50 event, 25 user, 10 item dimensions; 50 metrics). Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| property_id | No | Numeric GA4 property id of the client (empty: the configured one) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description goes beyond them by disclosing quota behavior (50/25/10 dimensions, 50 metrics) that an agent would not otherwise know, though it does not describe pagination or output shape 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?
Front-loads the resource and fields, then adds the quota detail in one compact clause; nothing is redundant. The awkward line break is cosmetic and the 'Read only' clause largely duplicates the annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns and does so by listing the returned fields and quota counts. Adequate for a simple two-parameter read tool; the client/property resolution is left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (client_id, property_id) are fully documented in the schema, including fallback behavior. The description adds no parameter-level meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (custom dimensions/metrics of a GA4 property), enumerates the fields returned, and adds quota context. It is clearly a read/list tool, which distinguishes it from the adjacent ga4_plan_custom_dimension_create sibling, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Read only' signals the mode of use and the quota explanation implies an auditing/inspection scenario, but there is no explicit guidance on when to pick this over ga4_properties or the plan_* creation tools. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ga4_key_event_auditGA4 key event auditARead-onlyIdempotent
Which GA4 events are marked as key events (conversions), and do they inflate conversions: more key events than sessions, page_view or other engagement events marked as key, contact clicks (phone, e-mail, WhatsApp) marked as key. Two Data API runReport calls: events with eventCount and keyEvents, then the property totals of sessions, keyEvents and ecommercePurchases. Returns "key_events" (event_name, event_count, key_events, share_pct, flags), "totals", "key_events_per_session", "findings" ({code, severity, event_name, detail}), the unit and definition of each metric under "metrics" and a "date_range" with "data_complete". Heuristics: check in GA4 Admin > Events > Key events before changing anything. Run it first on a new property, before reading any conversion rate or ROAS.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | YYYY-MM-DD, NdaysAgo, yesterday or today | yesterday |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) | |
| start_date | No | YYYY-MM-DD, NdaysAgo, yesterday or today | 28daysAgo |
| property_id | No | Numeric GA4 property id, as listed by ga4_properties; empty uses the configured GA4_PROPERTY_ID (or the client's property) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent safety, and the description adds real value on top: it discloses the two Data API runReport calls (cost/latency signal), the exact output keys including a findings list with severities, and a data_complete flag implying freshness caveats. It stops short of auth or quota details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then call mechanics, then return shape, then heuristics — a sensible order. The enumerated output keys are dense but justified because no output schema exists; the phrasing is compact with little filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by naming every top-level key plus the findings structure. Combined with the annotations and a fully documented schema, an agent has enough to call it correctly; only rate-limit/auth expectations are absent.
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 date formats, client_id resolution and property_id fallback all documented in the schema. The description adds nothing about parameters — no guidance on date range choice for the audit — so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opening sentence names a specific resource and diagnostic angle: which GA4 events are key events and whether they inflate conversions, with concrete red-flag criteria (more key events than sessions, page_view marked as key, contact clicks marked as key). It is clearly a diagnostic audit rather than a plain listing, which implicitly separates it from ga4_key_events, but it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Run it first on a new property, before reading any conversion rate or ROAS" gives an explicit ordering rule, and the Admin > Events > Key events pointer tells the agent what to do with findings. No explicit exclusions or named alternatives are given, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ga4_key_eventsGA4 key eventsBRead-onlyIdempotent
Key events (formerly conversions) of a GA4 property: event name, counting method, default value, whether it is custom and deletable. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| property_id | No | Numeric GA4 property id of the client (empty: the configured one) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered and the description's 'Read only' adds nothing. The only behavioral value added is that key events carry a deletable flag, hinting at mutation routes elsewhere, but there is no word on pagination, scoping, or auth beyond what the schema states.
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 compact sentence, front-loaded with the resource and followed by the field list, then the read-only qualifier. Efficient, though the parenthetical and trailing list make it slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns, and it does list the returned attributes (event name, counting method, default value, custom/deletable flags). For a simple read-only tool with two optional params this is close to sufficient; only collection-level details like ordering or result shape are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (client_id, property_id) are documented in-schema with defaults and fallback semantics. The description adds no parameter meaning at all, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource (GA4 key events, formerly conversions) and enumerates the fields it surfaces, with 'Read only' distinguishing it from write-oriented siblings such as ga4_plan_key_event_create. It stops short of naming an alternative explicitly, but an agent can tell this is the read counterpart to the create-plan 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?
The description gives no when-to-use guidance, no mention of prerequisites (client_id needed when several clients are registered), and does not route the agent to or away from any sibling. 'Read only' is the only usage signal, and it merely restates the annotation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ga4_plan_custom_dimension_createPlan a GA4 custom dimensionARead-only
PLAN (nothing is written): register a custom dimension on the client's GA4 property. Warning: parameterName and scope are immutable and the slot counts against the quota (50 event / 25 user / 10 item). Apply with google_apply after the user agreed. No automatic rollback (archiving is not offered).
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Scope (can never be changed later) | EVENT |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| description | No | Optional description, 150 characters at most | |
| property_id | No | Numeric GA4 property id of the client (empty: the configured one) | |
| display_name | Yes | Name shown in GA4 reports | |
| parameter_name | Yes | Event or user parameter to register, e.g. payment_type (can never be changed later) | |
| disallow_ads_personalization | No | USER scope only: exclude it from ads personalization |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it warns that parameterName and scope are immutable, quantifies the quota (50 event / 25 user / 10 item), and discloses that no automatic rollback exists because archiving is not offered. That is exactly the kind of irreversible-consequence context an agent cannot get from readOnlyHint/destructiveHint alone, and it is consistent with readOnlyHint=true since nothing is written.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short clauses, front-loaded with the plan-vs-write distinction, then the risk warning, then the apply step. Every sentence carries distinct decision-relevant information with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation-planning tool with no output schema, it covers the workflow handoff, irreversibility, and quota limits, and the schema handles client/property selection. It could note how the resulting plan is retrieved (plan_get) or reviewed, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already labels scope and parameter_name as 'can never be changed later', so the description largely restates parameter facts. Its genuinely additive detail (the 50/25/10 quota) is not per-parameter guidance, so the baseline 3 is right.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (plan/register), resource (custom dimension), and target (client's GA4 property), and the 'PLAN (nothing is written)' prefix instantly separates it from apply-style siblings like google_apply and from the read-only ga4_custom_definitions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the follow-up action and precondition: 'Apply with google_apply after the user agreed.' That is clear workflow routing, though it stops short of stating when *not* to use this tool or what alternative exists if the user declines.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ga4_plan_key_event_createPlan a GA4 key eventARead-only
PLAN (nothing is written): mark an event as a key event of the client's GA4 property. Returns the plan with a confirmation_token; apply it with google_apply after the user agreed. No automatic rollback (deleting a key event is not offered in this version: remove it in GA4 Admin > Key events).
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| event_name | Yes | GA4 event name to mark as a key event, e.g. generate_lead | |
| property_id | No | Numeric GA4 property id of the client (empty: the configured one) | |
| counting_method | No | Count every event, or once per session | ONCE_PER_EVENT |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true/destructiveHint=false, which the description reinforces and enriches: nothing is written, a confirmation_token is returned, user agreement is a prerequisite, and there is no automatic rollback because deletion is not offered in this version. This is behavior beyond what the structured hints 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?
Roughly three dense sentences, front-loaded with the PLAN/nothing-written constraint, then the apply path, then the rollback caveat. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation-adjacent plan tool with no output schema, the description covers the write-free guarantee, the returned token, the apply handoff, and the missing rollback path. Nothing an agent needs to invoke and follow up correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (client_id, event_name, property_id, counting_method) are already documented in the schema with defaults and enum values. The description adds no additional parameter semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('mark an event as a key event of the client's GA4 property') and immediately clarifies the mode with 'PLAN (nothing is written)'. An agent can distinguish it from the sibling apply tools and from ga4_key_events without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit two-step workflow: plan here, then 'apply it with google_apply after the user agreed', plus what to do instead if the user wants removal (GA4 Admin > Key events). Names both the next step and the unavailable alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ga4_propertiesGA4 propertiesARead-onlyIdempotent
GA4 accounts and properties the authorized Google account can read (Admin API accountSummaries), so the assistant can find a property id itself and pass it as property_id to ga4_report or ga4_realtime. Returns {"properties": [{property_id, property_name, property_type, account_id, account_name, configured}], "configured_property_id"}. Needs the Google Analytics Admin API enabled; no extra OAuth scope. With a client registry each property also says whether it belongs to the client ("owned"): only those can be queried.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) | |
| max_pages | No | Pages of 200 accounts to read at most |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly/idempotent/non-destructive), and the description adds real behavioral context on top: the Admin API must be enabled, no extra OAuth scope is needed, pagination is bounded, and under a client registry only 'owned' properties are queryable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and the return shape, then prerequisites and the registry caveat. Information-dense and mostly waste-free, though the run-on sentence packing return schema, auth, and ownership rules is slightly heavy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-value burden and does so explicitly (properties array fields plus configured_property_id). Combined with precondition and ownership guidance, an agent has everything needed to invoke and interpret 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%, so the schema already documents client_id and max_pages, setting a baseline of 3. The description adds meaning by tying client_id behavior to the client-registry concept and the 'owned' queryability rule, going beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: reading GA4 accounts and properties via the Admin API accountSummaries, so the agent can discover a property_id. It explicitly distinguishes its role from siblings by naming ga4_report and ga4_realtime as downstream consumers of the id it returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear routing: use this to find a property id when you need to pass property_id to ga4_report or ga4_realtime. It also names the ga4_report/ga4_realtime alternatives, though it stops short of stating an explicit 'do not use this when' exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ga4_realtimeGA4 realtimeARead-onlyIdempotent
GA4 realtime report for the last 30 minutes. Useful to check a tracking change, for example that one page view is counted once and not twice. Returns {"rows": [...], "row_count": n, "totals": {...}, "metrics": {...}}.
| Name | Required | Description | Default |
|---|---|---|---|
| metrics | No | GA4 realtime metrics, e.g. activeUsers, screenPageViews, eventCount | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) | |
| dimensions | No | GA4 realtime dimensions, e.g. unifiedScreenName, country, deviceCategory | |
| property_id | No | Numeric GA4 property id, as listed by ga4_properties; empty uses the configured GA4_PROPERTY_ID (or the client's property) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower, and the description adds the meaningful 30-minute staleness window plus the return shape. With no output schema, disclosing {"rows", "row_count", "totals", "metrics"} is real added value; it stops short of noting latency or sampling behavior for realtime 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?
Two sentences plus a compact return-shape sketch; purpose and time window come first. Slightly more than strictly necessary given every input is already documented in the schema, but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only 4-param tool with full schema coverage and annotations covering safety, this is nearly complete: window, use case and return shape are all present. The one gap is the relationship to ga4_report, which an agent must infer from the word 'realtime'.
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% – metrics, dimensions, client_id and property_id all carry their own guidance, including the client-registry fallback rules. The description adds nothing parameter-specific, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('GA4 realtime report') and pins the scope to 'the last 30 minutes', which is enough to separate it from the sibling ga4_report without opening either schema. An agent immediately knows this is the live-window variant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete motivating scenario ('check a tracking change, e.g. that one page view is counted once and not twice'), which implies when it is useful. However it never names the alternative (ga4_report for historical ranges) or states when not to use it, so the alternative-selection decision is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ga4_reportGA4 reportARead-onlyIdempotent
Run a Google Analytics 4 report (Data API runReport): traffic, conversions or revenue split by any dimensions over a date range. Returns the top rows ({"rows": [{dimension: value, metric: number}]}), "totals" over every row, "row_count" and "truncated", the unit and definition of each metric under "metrics", the currency, and a "date_range" resolved to calendar dates in the property's timezone with "data_complete". Use ga4_realtime for the last 30 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows returned (1 to 1000); totals always cover every row | |
| metrics | No | GA4 API metric names, e.g. sessions, totalUsers, ecommercePurchases, purchaseRevenue, keyEvents | |
| end_date | No | YYYY-MM-DD, NdaysAgo, yesterday or today | yesterday |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) | |
| dimensions | No | GA4 API dimension names, e.g. sessionDefaultChannelGroup, landingPage, sessionSource, yearMonth, itemName | |
| start_date | No | YYYY-MM-DD, NdaysAgo, yesterday or today | 28daysAgo |
| property_id | No | Numeric GA4 property id, as listed by ga4_properties; empty uses the configured GA4_PROPERTY_ID (or the client's property) | |
| channel_group | No | Optional exact filter on sessionDefaultChannelGroup, e.g. 'Organic Search'; empty for all channels |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly, idempotent, openWorld, non-destructive), so the bar is lower, and the description still adds real behavior: results are 'top rows' subject to a limit, totals cover every row regardless, and dates are resolved to the property's timezone with a data_complete flag. That is meaningful operational context beyond the annotations, though permissions/quota behavior is unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded before the return-value details, and the closing alternative-tool sentence is well placed. The return enumeration is long, but with no output schema it earns most of its 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?
With no output schema, the description correctly compensates by describing the return shape (rows, totals, row_count, truncated, metrics metadata, currency, date_range). All parameters are optional and documented in the schema, so an agent has enough to call it; only error/permission behavior is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all eight parameters are documented there with defaults and accepted formats, so the schema does the heavy lifting. The description only loosely gestures at metrics/dimensions/date range, adding no format or constraint detail 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?
It names a specific verb and resource ('Run a Google Analytics 4 report (Data API runReport)') and states the scope ('traffic, conversions or revenue split by any dimensions over a date range'). It also actively disambiguates from the sibling ga4_realtime, so an agent can tell the two apart without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one explicit routing rule with its selecting condition ('Use ga4_realtime for the last 30 minutes'), which is genuinely useful. It stops short of addressing the other adjacent reporting siblings (ga4_properties, ga4_key_events, gads_query), so there is no full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gads_accountsGoogle Ads accountsARead-onlyIdempotent
Google Ads customer accounts the Google Ads token can read directly (customers:listAccessibleCustomers), with the configured customer (GADS_CUSTOMER_ID, or the client's) and login customer (manager account), to pick a customer_id for gads_performance or gads_query. Returns {"customers": [{"id"}], "configured_customer_id", "login_customer_id", "cached"} (cached: true when the list comes from the 5-minute discovery cache). With a client registry only the client's own customers are listed ("hidden_customers" counts the others).
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list; empty uses the only client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, but the description adds real behavioral context: results may come from a 5-minute discovery cache (cached: true), the configured vs. login customer distinction, and hidden_customers counting suppressed accounts. It stops short of auth/rate-limit caveats but goes well beyond the annotation set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and return shape, then layers the client-registry nuance. The second sentence is dense and parenthetical-heavy, but nearly every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by spelling out the return payload keys (customers[].id, configured_customer_id, login_customer_id, cached). Combined with the client-scoping note, an agent has everything needed to call and interpret 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 coverage is 100% and the schema already explains that client_id comes from clients_list and empty falls back to the only client. The description adds value by explaining the consequence of client scoping (only the client's own customers are listed), which meaningfully extends the parameter's behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: lists Google Ads customer accounts the token can read directly, naming the underlying API call (customers:listAccessibleCustomers). It also positions itself against siblings gads_performance and gads_query as the source of a customer_id for those 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 says to use the result to pick a customer_id for gads_performance or gads_query, and explains the client-registry scoping case. It gives clear context for when this tool is the right one, though it does not state an explicit exclusion or when-not-to-use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gads_applyApply a Google Ads planADestructive
WRITE: apply a signed plan for Google Ads, after the user approved it. Pass plan_id, confirmation_token and confirm exactly as the plan_* tool returned them. Every lock is re-checked; ops run in order and stop at the first error; everything is journaled.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Confirmation string '<client_id>:<plan_id>:<digest8>' returned with the plan | |
| plan_id | Yes | Plan id returned by the plan_* tool | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| confirmation_token | Yes | confirmation_token returned by the plan_* tool, unchanged |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive, openWorld, and non-idempotent, so the bar is lower, yet the description adds real operational semantics: locks are re-checked, ops run in order, execution stops at the first error, and everything is journaled. These are exactly the failure-mode and audit details an agent needs before firing a destructive call.
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 dense sentences, front-loaded with a 'WRITE:' marker that flags the operation class instantly, followed by the required inputs and the execution guarantees. 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 no output schema but rich annotations, the description adequately covers execution behavior and failure semantics for a destructive apply. It could be slightly stronger by noting the journal's recovery/rollback path, but nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully documents plan_id, confirmation_token, and confirm. The description restates the exact-match requirement but adds little beyond the schema and says nothing about the optional client_id, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (apply) plus resource (a signed Google Ads plan) and immediately flags it as a WRITE operation. The phrase 'after the user approved it' and the reference to the 'plan_* tool' cleanly distinguish it from the sibling plan-creation tools and from rollback_plan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition ('after the user approved it') and instructs passing the three values exactly as returned by the plan_* tool. It does not, however, name alternatives such as rollback_plan or plan_list, so an agent must infer the broader workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gads_conversion_actionsGoogle Ads conversion actionsARead-onlyIdempotent
Google Ads conversion actions of one customer and the settings that decide what metrics.conversions counts: name, status, type, category, origin, primary_for_goal, include_in_conversions_metric, counting type (one or every conversion per click), attribution model, click-through and view-through lookback windows (days) and default value / currency. Fixed GAQL template on conversion_action (searchStream), sorted by name; REMOVED actions are left out unless include_removed. Use it to explain why conversions differ from another platform.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum actions returned (1 to 1000), by name | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| customer_id | No | Google Ads customer id (digits, dashes allowed), as listed by gads_accounts; empty uses the client's (or GADS_CUSTOMER_ID) | |
| include_removed | No | Also list REMOVED conversion actions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: a fixed GAQL template on conversion_action via searchStream, name-sorted output, and the REMOVED-filtering rule tied to include_removed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource, then the returned settings, then the query/filter mechanics. The long field enumeration is dense but informative and each clause carries content; only the multiclause middle sentence strains readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with full schema coverage and complete annotations, the description covers what is queried, how it is sorted, and what is filtered out. No output schema exists, but the field list effectively pre-describes the return shape, leaving only minor gaps around response volume.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented. The description restates the include_removed behavior and name-sorting that the schema also conveys, adding little new parameter-level meaning; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (Google Ads conversion actions and their settings) with an explicit enumeration of the fields returned, so an agent knows exactly what it gets back. It never names a sibling such as openai_ads_conversions or ga4_key_events, so differentiation from other conversion-reporting tools relies on the resource name alone rather than explicit contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing sentence gives a concrete use case – 'explain why conversions differ from another platform' – which orients the agent to a real scenario. It offers no exclusions, prerequisites, or named alternatives, so a 5 is not warranted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gads_performanceGoogle Ads performanceARead-onlyIdempotent
Google Ads performance by account, campaign or ad group over a date range: spend, impressions, clicks, conversions, conversion value, CTR, CPC, CPA and ROAS, optionally split by date, device or network. Built from fixed aggregated GAQL templates (searchStream), highest spend first. Returns "rows", "totals" (ROAS = sum of values / sum of spends) with "totals_complete". start_date and end_date are required (empty -> invalid_dates), the "currency" (looked up when no row), a "date_range" in the account timezone with "data_complete", the unit and definition of each metric, and the "attribution" used.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Row level: account, campaign or ad_group | campaign |
| limit | No | Maximum rows returned (1 to 1000), highest spend first; totals cover up to 10,000 rows (see totals_complete) | |
| segment | No | Optional split of each row: none, date, device or network | none |
| end_date | No | Required: last day, YYYY-MM-DD (account timezone) | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| start_date | No | Required: first day, YYYY-MM-DD (account timezone) | |
| customer_id | No | Google Ads customer id (digits, dashes allowed), as listed by gads_accounts; empty uses the client's (or GADS_CUSTOMER_ID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent/openWorld annotations: it discloses the fixed-template query model, highest-spend-first ordering, totals semantics (ROAS = sum of values / sum of spends), the totals_complete caveat that totals cover up to 10,000 rows, the invalid_dates error case, currency lookup when no row is present, and the account-timezone date_range with data_complete. That is unusually rich behavioral 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?
Front-loaded with the core purpose and metric list, then packs return-shape details into a dense second half. Every sentence carries information, though the long comma-spliced tail listing returned fields is harder to scan than the opening.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries full responsibility for explaining returns, and it does: rows, totals, totals_complete, currency, date_range, data_complete, metric units/definitions and attribution. An agent can call this correctly and interpret the output without further documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description earns a bump by surfacing the hidden requirement that start_date/end_date must be non-empty (they are schema-optional with default ''), the invalid_dates failure mode, and the currency/customer_id fallback behavior. It also documents the shape of the returned rows and totals that the parameters drive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Google Ads performance by account, campaign or ad group over a date range' — plus the exact metric set and segmentation options. It also implies differentiation from gads_query by noting results come from 'fixed aggregated GAQL templates (searchStream),' though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the metric/level/date-range framing, and it flags that start_date and end_date are required (empty -> invalid_dates). But it offers no explicit when-to-use vs when-to-use-something-else guidance, and never routes the agent to gads_query for arbitrary GAQL or to gads_accounts for account discovery beyond a parenthetical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gads_plan_add_negativesPlan: add Google Ads negative keywordsARead-only
Plan adding negative keywords (1 to 50 texts given by you, match type EXACT, PHRASE or BROAD) to one campaign (campaign_id) or to one shared negative keyword list (shared_set_id), in one atomic request, dry-run by Google first. Negatives only stop ads from showing (no spend increase). Rollback is manual (remove them in the interface).
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | Negative keyword texts (1 to 50, at most 10 words each) | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| match_type | No | Match type of every negative | EXACT |
| campaign_id | No | Campaign id | |
| customer_id | No | Google Ads customer id (10 digits, dashes allowed); empty uses the client's own customer | |
| shared_set_id | No | Shared negative keyword list id (shared_set.id); or give campaign_id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real operational context beyond annotations: the request is atomic, Google dry-runs it first, negatives can only suppress delivery (no spend risk), and rollback is manual. Annotations already cover read-only/non-destructive status, so the remaining gap (what the plan artifact looks like, how it is later applied) is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the action and targets front-loaded; the parenthetical restating the 1-50 limit and match types duplicates the schema slightly but is compact. No filler or hedging.
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 target selection, limits, atomicity, the dry-run behavior, risk profile, and rollback for a six-parameter mutation-planning tool with no output schema. It does not describe the plan output/next step, which is the only notable omission.
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 keywords, match_type, client_id, customer_id, campaign_id, and shared_set_id. The description echoes the keyword count, match types, and target selector but adds only the campaign-vs-shared-set exclusivity nuance, which the schema also hints at.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (add), resource (negative keywords), and scope (to a campaign or a shared negative keyword list) in one atomic request. It is immediately distinguishable from siblings such as gads_plan_pause_entities or gads_plan_create_campaign without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly explains the two targeting modes (campaign_id or shared_set_id) and signals that this is a Google-side dry-run plan whose rollback is manual removal in the interface. It stops short of naming the execution step (applying the plan, e.g. via gads_apply) or quantifying when to prefer this over other gads_plan_* tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gads_plan_budget_changePlan: change a Google Ads daily budgetARead-only
Plan a new daily amount for one Google Ads campaign budget (amountMicros, in micros of the ACCOUNT currency: 12.50 EUR = 12500000). Give budget_id, or campaign_id to change the budget that campaign uses. The current budget and currency are read first; the policy caps it (max_daily_budget_micros in cap_currency, +20 % per 24 h at most) and a human approval is required before gads_apply (financial). A shared budget changes every campaign using it (shown in the plan).
| Name | Required | Description | Default |
|---|---|---|---|
| budget_id | No | Campaign budget id (campaign_budget.id); or give campaign_id | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| campaign_id | No | Campaign id | |
| customer_id | No | Google Ads customer id (10 digits, dashes allowed); empty uses the client's own customer | |
| daily_budget_micros | Yes | New daily budget in micros of the account currency (12.50 = 12500000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description does not contradict them — it plans rather than mutates. Beyond that it discloses what happens at call time: the current budget and currency are read first, the policy caps the value (max_daily_budget_micros in cap_currency, +20% per 24h), a human approval is required downstream, and a shared budget affects every campaign using it.
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 dense sentences, front-loaded with the amount/semantics and target selection, then policy and approval behavior. Little waste, though the micros conversion example duplicates what the schema already states.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only planning tool with no output schema, it covers target selection, unit semantics, policy caps, approval flow, and shared-budget side effects. It stops short of telling the agent how to inspect the resulting plan (plan_get/plan_list) or whether the plan expires, which would complete the loop.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains the micros unit against the account currency with a worked example, and clarifies the either/or relationship between budget_id and campaign_id that the schema presents only as two loosely described fields. The currency/micros example partially repeats the schema, keeping it out of 5 territory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Plan a new daily amount for one Google Ads campaign budget'. It also explicitly distinguishes itself from the apply step ('a human approval is required before gads_apply'), so an agent can tell this planning tool apart from its sibling execution tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete targeting guidance ('Give budget_id, or campaign_id to change the budget that campaign uses') and names the follow-up alternative gads_apply along with the approval gate that separates planning from execution. The conditions for use are explicit rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gads_plan_create_campaignPlan: create a paused Google Ads Search campaignARead-only
Plan creating one Google Ads Search campaign, PAUSED, with its own daily budget (amountMicros in micros of the account currency; not shared), Google Search network only, in one atomic request dry-run by Google. No ad group, keyword nor ad is created; the bidding strategy is fixed (manual CPC, no bid amount, not configurable). It stays PAUSED: activate it in the Google Ads interface once it is complete. Financial: human approval before gads_apply.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Campaign name (1 to 200 characters) | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| customer_id | No | Google Ads customer id (10 digits, dashes allowed); empty uses the client's own customer | |
| daily_budget_micros | Yes | New daily budget in micros of the account currency (12.50 = 12500000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds real context beyond the annotations: the request is a Google-side dry-run, nothing downstream (ad groups, keywords, ads) is created, the bidding strategy is hard-fixed to manual CPC with no bid amount, and the campaign remains PAUSED until activated in the Google Ads UI. This is consistent with readOnlyHint=true and destructiveHint=false, though it does not address the declared idempotentHint=false (e.g. whether re-planning the same name yields a new plan).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and key constraints are front-loaded, and each sentence carries distinct information (budget ownership, network, atomicity, bid strategy, paused state, approval gate). It is dense and slightly fragmented by line breaks, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description covers everything needed to call this correctly: what gets created, what explicitly does not, the fixed bidding strategy, the budget semantics, the paused lifecycle and the approval/apply follow-up. Nothing material is left ambiguous for a four-parameter planning tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents name, client_id, customer_id and the micros budget. The description still adds meaning by clarifying the budget is the campaign's own and not shared, plus the account-currency micros convention, which is the one parameter most easily mis-scaled by an agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Plan creating one Google Ads Search campaign') and pins down scope precisely: PAUSED, own non-shared daily budget, Search network only, single atomic request. It also states explicitly what is NOT produced (no ad group, keyword or ad), which lets an agent distinguish this from sibling planning tools such as gads_plan_budget_change or gads_plan_add_negatives.
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 places the tool in a workflow by noting the plan stays paused and requires human approval before gads_apply, so the agent understands this is the planning step and gads_apply is the execution step. It does not explicitly say when to choose this over a sibling campaign-planning tool or what preconditions (e.g. an existing client/customer id) are required, so it falls short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gads_plan_pause_entitiesPlan: pause Google Ads entitiesARead-only
Plan pausing Google Ads campaigns, ad groups or ads (status PAUSED, nothing else). Each entity is read first (current status kept for the rollback) and dry-run by Google (validateOnly). Ad ids are "<ad_group_id>~<ad_id>". Returns the plan (diff, risks, confirmation_token, confirm): show it to the user, then gads_apply. A paused entity stops spending; rollback_plan re-enables it only if allow_activate is set.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Ids to pause (1 to 25): campaign ids, ad group ids, or '<ad_group_id>~<ad_id>' for ads | |
| level | Yes | What to pause | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| customer_id | No | Google Ads customer id (10 digits, dashes allowed); empty uses the client's own customer |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite readOnlyHint/destructiveHint annotations already covering the safety profile, the description adds substantial context: each entity is read first (status kept for rollback), it is dry-run via validateOnly, the pause stops spending, and rollback re-enables only under a condition. This is well 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?
Front-loads the purpose and packs the key mechanics (read-first, dry-run, ad-id format, follow-up, rollback caveat) into a tight block. Dense but every clause earns its place; minor crowding from the rollback/spend sentences keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains what the plan returns (diff, risks, confirmation_token, confirm) and the required user-facing flow, plus the ad-id syntax. An agent has everything needed to call it and hand the result back.
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 four parameters including the '<ad_group_id>~<ad_id>' ad-id format. The description restates the same ad-id format rather than adding new semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Plan pausing Google Ads campaigns, ad groups or ads (status PAUSED, nothing else).' The explicit scope 'nothing else' and the entity list distinguish it from siblings like gads_plan_budget_change and gads_plan_add_negatives without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear workflow: show the returned plan to the user, then call gads_apply, and notes that rollback_plan re-enables only if allow_activate is set. It names the follow-up tools but stops short of an explicit when-not-to-use statement or contrast against other plan_* tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gads_queryGoogle Ads GAQL queryARead-onlyIdempotent
Run a free read-only Google Ads Query Language (GAQL) SELECT on one customer (searchStream), for fields the fixed gads_performance templates do not cover. Refused without any network call unless it is a single SELECT with no ';' and no '--' or '/' (refused even inside a string literal). The read is bounded: without LIMIT, LIMIT 10001 is added (before PARAMETERS); a larger LIMIT is lowered to 10001; the answer is capped at 20 MB. One SELECT and one FROM only, no JOIN, no backslash, ASCII only outside string literals. FROM and every dotted name prefix in SELECT, WHERE and ORDER BY (besides metrics and segments) must be a reporting resource: customer, campaign, campaign_budget, ad_group, ad_group_ad, ad_group_criterion, keyword_view, shopping_performance_view, product_group_view, asset_group, asset_group_listing_group_filter, asset_group_asset, asset, ad_group_ad_asset_view, campaign_criterion, geographic_view, gender_view, age_range_view, landing_page_view, expanded_landing_page_view, display_keyword_view, topic_view, bidding_strategy, conversion_action, location_view, distance_view, with customer. limited to id, descriptive_name, currency_code, time_zone, status, manager, test_account and resource_name; anything else is refused with resource_not_allowed. Names exposing personal data (change_event, click_view, call_view, search term views, leads, user_*, payments_*, billing_*, customer_user_access, invoices, account links, placements...) are refused anywhere in the query with sensitive_resource. Setting GADS_ALLOW_SENSITIVE_QUERIES=1 in the server env lifts both lists (personal data possible). Rows are flattened to GAQL field names (campaign.name, metrics.clicks); micros fields are converted to currency units: micros renamed without the suffix (metrics.cost_micros -> metrics.cost), metrics.average_cpc, average_cpm, average_cost and cost_per kept under their name.
| Name | Required | Description | Default |
|---|---|---|---|
| gaql | Yes | One read-only GAQL statement starting with SELECT, e.g. SELECT campaign.name, metrics.clicks FROM campaign WHERE segments.date DURING LAST_7_DAYS; no ';', '--' or '/*' anywhere, even in a string | |
| limit | No | Maximum rows returned (1 to 1000); Google is asked for at most 10,001 rows (LIMIT added or lowered) | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| customer_id | No | Google Ads customer id (digits, dashes allowed), as listed by gads_accounts; empty uses the client's (or GADS_CUSTOMER_ID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the readOnly/idempotent annotations: it discloses that malformed queries are refused with no network call, the exact validation rules (single SELECT, no ';', '--', '/*' even in literals, ASCII only, no backslash/JOIN), the server-side row bounds (LIMIT 10001 injected or lowered, 20 MB cap), the resource allowlist and the sensitive_resource refusal list, the env-var override, and the returned row shape. This is unusually complete behavioral disclosure for a mutation-free query tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded correctly: purpose and the gads_performance differentiator come first, then the validation and bounds. It is long but nearly every clause carries a constraint the agent must satisfy; only the resource allowlist is bloated by enumeration and the no-';' rule duplicates the schema text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a raw-query tool with no output schema this covers the full contract: input grammar, refusal behavior, row/byte caps, allowlisted resources, sensitive-data refusals, and the return shape (flattened GAQL field names, *_micros → currency units). Nothing an agent needs to formulate a valid, non-refused query is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so gaql, limit, client_id and customer_id are already documented; the description mostly restates the gaql constraint that the schema states verbatim. It adds some value by explaining the interaction between a user LIMIT and the internal 10,001 ceiling, but says nothing extra about client_id/customer_id resolution or the output `limit` semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (run a read-only GAQL SELECT), the resource (one Google Ads customer via searchStream), and the scope that distinguishes it from siblings ('fields the fixed gads_performance templates do not cover'). An agent can separate this from gads_performance, gads_accounts and gads_conversion_actions without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for fields the fixed gads_performance templates do not cover' explicitly routes the agent away from the sibling and toward this tool when the templated report is insufficient. It also states the prerequisite (a customer_id from gads_accounts / GADS_CUSTOMER_ID), though it never gives explicit when-not-to-use exclusions for the other gads siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
google_applyApply a GA4, Search Console, Merchant, GTM planADestructive
WRITE: apply a signed plan for GA4, Search Console, Merchant, GTM, after the user approved it. Pass plan_id, confirmation_token and confirm exactly as the plan_* tool returned them. Every lock is re-checked; ops run in order and stop at the first error; everything is journaled.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Confirmation string '<client_id>:<plan_id>:<digest8>' returned with the plan | |
| plan_id | Yes | Plan id returned by the plan_* tool | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| confirmation_token | Yes | confirmation_token returned by the plan_* tool, unchanged |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/openWorld/non-idempotent, yet the description adds execution semantics beyond them: locks are re-checked, ops run in order, execution halts on first error, and everything is journaled. It also imposes a token-integrity constraint (pass values exactly as returned), which is real behavioral guidance not present in the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded 'WRITE:' marker followed by two dense sentences; every clause earns its place by covering scope, precondition, parameter integrity, and execution/failure semantics with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation tool with no output schema, the description covers the critical facts (approval gate, exact token passing, lock re-check, ordered execution, stop-on-error, journaling). It could go further by noting how to verify the result (audit_log) or undo it (rollback_plan), which keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a meaningful constraint beyond the schema: plan_id, confirmation_token and confirm must be passed 'exactly as the plan_* tool returned them,' which conveys a provenance/integrity requirement the field descriptions do not 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?
Opens with a specific verb and object ('WRITE: apply a signed plan') and enumerates the exact platforms it covers (GA4, Search Console, Merchant, GTM), which distinguishes it from the sibling apply tools (gads_apply, meta_apply, openai_ads_apply). An agent can route to it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States a clear precondition ('after the user approved it') and implies the plan_* -> apply workflow by requiring the exact values the plan_* tool returned. It does not name when NOT to use it nor point to rollback_plan/audit_log as follow-ups, so it stops short of explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_inspect_urlSearch Console URL inspectionARead-onlyIdempotent
Google index status of one URL (URL Inspection API): verdict, coverage state, user and Google-selected canonical, robots.txt state, page fetch state and last crawl time. Quota: 2,000 inspections per day.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Full URL to inspect; must belong to the configured Search Console property | |
| site_url | No | Search Console property, e.g. sc-domain:example.com or https://www.example.com/; empty uses the configured GSC_SITE_URL (or the client's site). With a client registry it must be one of the client's sites | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description usefully adds a hard operational constraint the annotations cannot express: a quota of 2,000 inspections per day. It does not, however, explain quota accounting or auth prerequisites beyond what the schema implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both front-loaded: purpose first, then the quota constraint. Nothing is padded and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description compensates by enumerating the returned fields, and it flags the daily quota. Combined with 100% schema coverage of inputs and full annotation coverage of the safety profile, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the two optional parameters (site_url, client_id) and the required url are already fully documented in the schema. The description adds no additional parameter-level semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and resource: 'Google index status of one URL (URL Inspection API)', scoping it to a single URL. It then enumerates exactly what the result contains (verdict, coverage state, canonicals, robots.txt state, page fetch state, last crawl time), which makes it unmistakable against data-oriented siblings like gsc_performance or gsc_sitemaps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no sibling is named as an alternative. Usage is only implied by the scope phrase 'one URL', which a capable agent can infer but which is not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_movesSearch Console movesARead-onlyIdempotent
Search Console week-over-week moves: the queries (or pages) that lost and gained the most clicks, last N days against the N days before, with clicks, impressions, CTR and position for both periods, plus totals and both date ranges. A key absent from one period counts as a full loss or a full gain. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Length of each period in days (1 to 90): the last N days, ending 2 days ago, against the N days before | |
| limit | No | Losers and gainers returned, each (1 to 100) | |
| site_url | No | Search Console property, e.g. sc-domain:example.com or https://www.example.com/; empty uses the configured GSC_SITE_URL (or the client's site). With a client registry it must be one of the client's sites | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) | |
| dimension | No | What to compare: query or page | query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world and non-destructive behavior, so the description's 'Read only' line is redundant. However, it adds a meaningful behavioral rule beyond annotations: a key absent from one period is counted as a full loss or full gain, which materially affects interpretation.
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 definition is front-loaded and efficient: it names the report first, then explains comparison periods and output fields. The only minor waste is 'Read only', which repeats an annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description does a good job explaining returned fields: clicks, impressions, CTR, position for both periods, totals, and both date ranges. It also covers the key behavioral quirk for missing keys, making the definition complete enough to invoke and interpret correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented, including the date windows, limit, site/client context and dimension enum. The description reinforces the N-days-against-N-days comparison but adds little 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?
The description clearly states a specific verb and resource: it returns Search Console week-over-week movers in queries or pages, with loss/gain framing. It does not explicitly differentiate itself from nearby GSC siblings such as gsc_performance or gsc_opportunities, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is strongly implied by 'week-over-week moves' and 'lost and gained the most clicks', but there is no explicit when-to-use guidance and no named alternatives. An agent can infer this is for mover analysis rather than general performance reporting, but must still decide among GSC tools itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_opportunitiesSearch Console opportunitiesARead-onlyIdempotent
Search Console opportunities: the queries (or pages) ranking between min_position and max_position with at least min_impressions ("striking_distance"), and the ones with impressions but zero clicks ("no_clicks"), each sorted by impressions. One request over the last N days ending 2 days ago. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Length of the period in days (7 to 90): the last N days, ending 2 days ago | |
| limit | No | Rows returned in each list (1 to 200) | |
| site_url | No | Search Console property, e.g. sc-domain:example.com or https://www.example.com/; empty uses the configured GSC_SITE_URL (or the client's site). With a client registry it must be one of the client's sites | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) | |
| dimension | No | What to list: query or page | query |
| max_position | No | Worst average position kept in striking_distance (1 to 100) | |
| min_position | No | Best average position kept in striking_distance (1 to 100) | |
| min_impressions | No | Minimum impressions in the period for a row to count (1 to 100000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered; the trailing 'Read only' is largely redundant. The description does add real behavioral context the annotations cannot: a single request, a window of the last N days ending two days ago (a data-freshness lag), and that each list is sorted by impressions. Return-field detail is absent but there is no output schema to lean on, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and its two result lists, followed by two short supporting sentences on time window and read-only nature. The first sentence is dense and run-on, and 'Read only' is wasted given the annotations, but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, no-output-schema tool the description does the necessary work: it defines both result lists, the sort order, and the data window. What is missing is the per-row shape (which metrics accompany each query/page) and whether the no_clicks list is also bounded by limit, though the schema's 'rows returned in each list' largely covers the latter.
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 does add one genuinely non-schema fact — that min_position, max_position and min_impressions scope only the striking_distance list, not no_clicks — but it leaves days/limit/dimension/client_id entirely to the schema, so it does not exceed the baseline by much.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-plus-resource framing and, more importantly, spells out the exact two output lists it produces ('striking_distance' filtered by position and impressions, 'no_clicks' for zero-click rows). That makes it clearly distinguishable from gsc_performance or gsc_inspect_url without opening a schema. It stops short of naming those siblings explicitly, so it is a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the phrase 'opportunities' and the striking-distance/no-clicks definitions suggest an optimization-audit scenario, but the description never states when to pick this over gsc_performance or gsc_inspect_url. There are no exclusions or preconditions beyond the client/site resolution already carried by the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_performanceSearch Console performanceARead-onlyIdempotent
Google Search Console search performance for the configured property: clicks, impressions, CTR and average position, split by query, page, country, device or date. Returns the top rows, "totals" for the whole period (same filter, no split), "truncated", the unit and definition of each metric under "metrics", and a "date_range" in Pacific Time (Search Console's timezone) with "data_complete".
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows returned (1 to 1000); totals always cover the whole property | |
| end_date | No | YYYY-MM-DD; empty means 2 days ago (Search Console data lag) | |
| site_url | No | Search Console property, e.g. sc-domain:example.com or https://www.example.com/; empty uses the configured GSC_SITE_URL (or the client's site). With a client registry it must be one of the client's sites | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) | |
| dimensions | No | How to split the results | |
| start_date | No | YYYY-MM-DD; empty means 30 days ago (Pacific Time) | |
| search_type | No | Search type (sent to Google as `type`): web, image, video, news, discover or googleNews | web |
| page_contains | No | Optional: keep only pages whose URL contains this text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the bar is lower, and the description goes well beyond them: it discloses that results are the top rows only, that a 'truncated' flag exists, that 'totals' cover the whole period with the same filter but no split, and that dates are reported in Pacific Time with a 'data_complete' field. It does not mention auth requirements or rate limits, but the return-shape transparency is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence, front-loaded with what is measured, then the split options, then the return structure. Every clause (totals semantics, truncation, metric definitions, timezone) carries information; only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description has to explain the return payload, and it does so for the key fields (totals, truncated, metrics, date_range/data_complete). Combined with 100% schema coverage on the eight input parameters, an agent has enough to call and interpret this tool, though routing guidance and pagination nuance are thin.
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 eight parameters including defaults, enum values, and the data-lag behavior. The description adds no syntax or constraint detail beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource (Google Search Console search performance for the configured property) and enumerates the metrics and split dimensions returned. An agent can distinguish it from gsc_inspect_url, gsc_sites, or gsc_sitemaps without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the metric-and-dimension framing (pull aggregated GSC performance data), but there is no explicit when-to-use versus alternatives such as ga4_report or gads_performance, and no statement of prerequisites or exclusions. Adequate for an agent that already knows it wants GSC data, but it does not route.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_plan_sitemap_submitPlan a Search Console sitemap submissionARead-only
PLAN (nothing is written): submit a sitemap to the client's Search Console property. The sitemap URL must be inside the property (same domain or a subdomain for sc-domain:, same prefix for a URL-prefix property). Low risk. Apply with google_apply after the user agreed. A sitemap that was not listed before can be removed again with rollback_plan (needs write.gsc.allow_delete and a human approval); one that was already listed has no rollback.
| Name | Required | Description | Default |
|---|---|---|---|
| site_url | No | Search Console property of the client (empty: the configured one), e.g. sc-domain:example.com | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| sitemap_url | Yes | Full URL of the sitemap, inside the client's property, e.g. https://www.example.com/sitemap.xml |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds real context beyond them: nothing is written at plan stage, the 'Low risk' assessment, the domain/prefix scoping constraint, and the precise rollback semantics including the permission and approval requirements. No contradiction with the read-only annotation since planning performs no write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the key fact ('PLAN (nothing is written)'), followed by constraint, risk level, apply path, and rollback conditions. Every sentence carries distinct, actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a plan-only tool with no output schema, the description covers the full lifecycle an agent needs: what planning means, the input constraint, the risk level, how to apply, and the rollback options and their requirements. Nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning for sitemap_url by defining the placement constraint (same domain or subdomain for sc-domain:, same prefix for URL-prefix properties). It does not elaborate on site_url/client_id beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('submit a sitemap to the client's Search Console property') and immediately flags the plan-only nature ('PLAN (nothing is written)'). An agent can tell this apart from the sibling gsc_sitemaps (list) and from apply tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Apply with google_apply after the user agreed,' and explains the rollback path in detail, including prerequisites (write.gsc.allow_delete and human approval) and the case with no rollback. When-to-use and the alternative follow-up tools are all named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_sitemapsSearch Console sitemapsBRead-onlyIdempotent
Sitemaps declared in Search Console, with last submission, last download, errors and warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| site_url | No | Search Console property, e.g. sc-domain:example.com or https://www.example.com/; empty uses the configured GSC_SITE_URL (or the client's site). With a client registry it must be one of the client's sites | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds real value by disclosing the returned fields (submission/download timestamps, errors, warnings), which matters since there is no output schema, but it says nothing about auth requirements beyond the schema, rate limits, or whether sitemap data can be stale.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the most important content (what sitemaps and which fields) comes first. It is efficient, though the noun-phrase form leaves the action verb implicit.
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 two-parameter read tool with full schema coverage, annotations, and no output schema, the definition is adequate: it tells the agent what data comes back. It stops short of explaining scope (single property at a time), result limits, or how it relates to the sibling sitemap-submission tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both site_url and client_id are fully documented in the schema, including the fallback behavior and client-registry constraint. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific resource (sitemaps declared in Search Console) and enumerates the data surfaced: last submission, last download, errors, warnings. The retrieval verb is only implied ('Sitemaps declared in...'), and it doesn't explicitly distinguish itself from siblings like gsc_sites or gsc_plan_sitemap_submit, but an agent can tell this is the sitemap-status read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no alternatives named. It never says to use gsc_plan_sitemap_submit for submitting a sitemap or gsc_sites for property listing, so routing between the GSC read tools is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_sitesSearch Console sitesARead-onlyIdempotent
Search Console properties the client's Google token can see: address (sc-domain:example.com or a URL prefix), permission level (siteOwner, siteFullUser, siteRestrictedUser, siteUnverifiedUser), whether it is the client's configured site and whether that level may submit sitemaps. With several clients, sites that are not this client's are masked. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the description's 'Read only' adds nothing. What it does add is genuinely non-obvious behavior: with several clients registered, other clients' sites are masked, and the returned permission level determines whether sitemaps may be submitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the resource before listing returned attributes. The parenthetical enumerations of address format and permission levels are useful but make it slightly run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates what is returned (address, permission level, whether it is the configured site, whether sitemaps may be submitted) and discloses the multi-client masking caveat. Nothing essential to invoking a single-optional-parameter read tool appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so client_id is already documented in the schema (including 'Required when several clients are registered'). The description nevertheless adds meaning to that parameter by explaining the multi-client masking consequence that makes client scoping matter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and scope: the Search Console properties visible to the client's Google token, with the address format (sc-domain: or URL prefix) spelled out. It is clearly distinct from gsc_performance, gsc_sitemaps and gsc_inspect_url by resource, though it never names those siblings to route the agent explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no alternatives are named. Usage is only implied: a discovery step for properties before calling gsc_performance or gsc_sitemaps. The multi-client masking note hints at the scoping condition but is not framed as usage advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_get_tagGTM tagARead-onlyIdempotent
One tag of a workspace in full (type, parameters, triggers, paused) with its fingerprint, which gtm_plan_tag_upsert needs to update it. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| tag_id | Yes | Numeric tag id | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| workspace_id | Yes | Numeric GTM workspace id (gtm_workspace_status lists them); never the Default Workspace for a change |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description goes beyond them by disclosing the returned contents and, critically, the fingerprint dependency on gtm_plan_tag_upsert, which is behavioral context the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the resource and scope before the downstream dependency. It is efficient with no filler, though the parenthetical field list and wrapped line slightly impede scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by naming the fields returned. The read-only annotations cover safety, and the upsert linkage covers intent; only edge cases (tag not found, error behavior) are unaddressed, which is minor here.
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 tag_id, client_id, and workspace_id are already documented in the schema (including the multi-client requirement and the Default Workspace caveat). The description adds no parameter-level meaning, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (one tag of a workspace), then enumerates the returned surface (type, parameters, triggers, paused, fingerprint). An agent can distinguish it from gtm_get_trigger and gtm_get_variable purely from the text, since the resource noun is explicit and the sibling names share the same suffix pattern.
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 routes the agent: this is the read step whose fingerprint is required by gtm_plan_tag_upsert to perform an update, so it signals when to call it in the workflow. It does not, however, state when not to use it or mention alternative reads such as gtm_versions or gtm_workspace_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_get_triggerGTM triggerARead-onlyIdempotent
One trigger of a workspace in full (type, filters) with its fingerprint (needed to update it). Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| trigger_id | Yes | Numeric trigger id | |
| workspace_id | Yes | Numeric GTM workspace id (gtm_workspace_status lists them); never the Default Workspace for a change |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so 'Read only' restates structured data. The one piece of added value is that the returned fingerprint is required for updates, which explains why an agent would call this before a write.
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 compact sentence with the resource and scope front-loaded and no filler. The stacked parentheticals make it slightly dense but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description does state the shape of the return (type, filters, fingerprint), which is the key missing piece. Combined with 100% schema coverage and annotations carrying the safety profile, it is nearly complete, though error/permission behavior is unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all three parameters (client_id, trigger_id, workspace_id) are documented in the schema, including the multi-client fallback and the Default Workspace caveat. The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (get) and resource (one trigger of a workspace) and even scopes the payload (type, filters, fingerprint). An agent can separate it from gtm_get_tag and gtm_get_variable by resource, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical 'needed to update it' implies the fetch-then-upsert flow (presumably feeding gtm_plan_trigger_upsert), which is useful context, but there is no explicit when-to-use, when-not-to-use, or named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_get_variableGTM variableARead-onlyIdempotent
One variable of a workspace in full (type, parameters) with its fingerprint (needed to update it). Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| variable_id | Yes | Numeric variable id | |
| workspace_id | Yes | Numeric GTM workspace id (gtm_workspace_status lists them); never the Default Workspace for a change |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds real behavioral value by disclosing that the returned fingerprint is the prerequisite for updating the variable, which tells an agent why to call it and what to do with the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence that front-loads the resource and scope, followed by the fingerprint rationale and a read-only qualifier. No filler, though the trailing 'Read only' is slightly redundant against the annotations.
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 3-parameter read tool with no output schema, the description adequately conveys what comes back (full variable with type, parameters, fingerprint) and the schema fully documents the inputs. Nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with client_id, variable_id, and workspace_id all documented in the schema itself (including the 'never the Default Workspace' caveat). The description adds no parameter-level detail beyond what the schema already provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: fetches one GTM variable of a workspace in full, and names the content (type, parameters, fingerprint). The word 'variable' implicitly separates it from the sibling getters gtm_get_tag and gtm_get_trigger, though neither is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical 'needed to update it' implies the intended workflow (read the fingerprint before an update), and 'Read only' clarifies the operation class, but there is no explicit statement of when to choose this over gtm_inventory or gtm_workspace_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_inventoryTag Manager inventoryARead-onlyIdempotent
Tags (type, paused, firing triggers, parameters), triggers and variables of the configured Google Tag Manager container's default workspace, plus the id of the live published version. Built-in trigger ids are translated, e.g. All Pages. Useful to spot a tag configured twice.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the description's job is to add context — and it does: it discloses that only the default workspace is covered, that the live published version id is included, and that built-in trigger ids are humanized. It does not disclose result size or pagination behavior, which keeps this below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the returned contents, then qualifications, then the use case — a sensible ordering. Dense but every clause carries information; only the trailing 'Useful to spot...' sentence is mildly promotional rather than factual.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must describe the return payload, and it does enumerate the fields returned (tags with type/paused/firing triggers/parameters, triggers, variables, live version id) along with the container/workspace scope. It omits how the single client_id parameter affects behaviour and any size/rate caveats, so it is good but not fully 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 description coverage is 100% and there is a single optional client_id fully documented in the schema, so the baseline is 3. The description never references client selection at all, adding no meaning beyond the schema's 'Client id from clients_list' explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource and its scope precisely: tags (with type, paused, firing triggers, parameters), triggers, variables of the default workspace, plus the live version id. It is implicitly distinguished from the single-entity getters (gtm_get_tag, gtm_get_trigger, gtm_get_variable) by being a whole-container inventory, but no sibling is named and there is no explicit verb.
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 final clause ('Useful to spot a tag configured twice') gives one concrete use case, which is better than nothing, but there is no statement of when to prefer this over gtm_get_tag/gtm_get_trigger/gtm_get_variable for a single entity, nor any prerequisite or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_plan_quick_previewPreview a GTM workspaceARead-only
Preview step of a GTM plan: compile a workspace into a throw-away preview version and report compiler errors, merge conflicts and what it holds. It changes nothing (no version is created, nothing goes live), so there is nothing to apply. Uses the write token (scope tagmanager.edit.containerversions) and needs writes enabled for the client.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| workspace_id | Yes | Numeric GTM workspace id (gtm_workspace_status lists them); never the Default Workspace for a change |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: it clarifies why readOnlyHint=true holds despite needing a write token ('no version is created, nothing goes live') and discloses the exact auth prerequisites (scope tagmanager.edit.containerversions, writes enabled for the client). That reconciles an otherwise confusing safety/scope pairing and is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and outcome, then behavior guarantees, then auth requirements. Three dense sentences with little waste; 'so there is nothing to apply' mildly restates 'it changes nothing', which keeps it below 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still specifies what gets reported (compiler errors, merge conflicts, workspace contents), confirms nothing persists, and covers auth scope. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (client_id, workspace_id) are already fully documented in the schema, including the 'never the Default Workspace' constraint. The description only refers to 'a workspace' and 'the client' generically and adds no syntax or format detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('compile a workspace into a throw-away preview version') and names the outputs ('compiler errors, merge conflicts and what it holds'). An agent can distinguish this from siblings like gtm_plan_workspace_create or gtm_workspace_status without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Frames the tool as the 'Preview step of a GTM plan' and rules out any follow-up ('there is nothing to apply'), which tells the agent when in a workflow to call it. It does not explicitly name alternative siblings (e.g. gtm_workspace_status) or exclusions, so it stops short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_plan_tag_upsertPlan a GTM tag changeARead-only
PLAN (nothing is written): create or update a tag in a non-default workspace of the client's GTM container. An update needs the fingerprint from gtm_get_tag. Nothing goes live: publishing stays in the GTM interface. Custom HTML tags are high risk. Apply with google_apply after the user agreed; an update can be undone with rollback_plan.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | The tag as a GTM API object: name, type, parameter [{type, key, value}], firingTriggerId, blockingTriggerId, paused, notes. For an update pass only the fields to change (the others are kept); output fields (path, ids, fingerprint) may be left in and must match | |
| tag_id | No | Numeric id of the tag to update; empty creates a new tag | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| fingerprint | No | Update only: the fingerprint returned by gtm_get_tag / gtm_get_trigger / gtm_get_variable (required; refused when stale) | |
| workspace_id | Yes | Numeric GTM workspace id (gtm_workspace_status lists them); never the Default Workspace for a change |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is partly covered. The description strengthens this with 'nothing is written', 'nothing goes live: publishing stays in the GTM interface', the Custom HTML risk warning, and the rollback path — all meaningful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with 'PLAN (nothing is written)', then scope, then workflow. Every clause (fingerprint, no-publish, Custom HTML risk, apply/rollback) carries actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested-object, mutation-style planning tool with no output schema, the description covers the plan/apply lifecycle, risk, and reversibility well. It lacks detail on the plan artifact itself (e.g., what plan_get returns or plan_id handling), and client_id selection is left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the workspace constraint, the fingerprint-staleness rule, client_id selection, and the partial-update semantics. The description's mention of the fingerprint duplicates that structured data, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create or update = upsert) and resource (GTM tag in a non-default workspace), explicitly marked as a plan-only operation. An agent can distinguish this from gtm_plan_trigger_upsert, gtm_plan_variable_upsert, and gtm_get_tag without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routes the agent explicitly: names gtm_get_tag as the source for an update fingerprint, google_apply as the apply step after user agreement, and rollback_plan as the undo path. Conditions for using the tool vs. its alternatives are stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_plan_trigger_upsertPlan a GTM trigger changeARead-only
PLAN (nothing is written): create or update a trigger in a non-default workspace of the client's GTM container (fingerprint from gtm_get_trigger for an update). Apply with google_apply after the user agreed.
| Name | Required | Description | Default |
|---|---|---|---|
| trigger | Yes | The trigger as a GTM API object: name, type, parameter [{type, key, value}], filter, customEventFilter, autoEventFilter. For an update pass only the fields to change (the others are kept); output fields (path, ids, fingerprint) may be left in and must match | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| trigger_id | No | Numeric id of the trigger to update; empty creates one | |
| fingerprint | No | Update only: the fingerprint returned by gtm_get_tag / gtm_get_trigger / gtm_get_variable (required; refused when stale) | |
| workspace_id | Yes | Numeric GTM workspace id (gtm_workspace_status lists them); never the Default Workspace for a change |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'nothing is written' rather than contradicting it. It adds genuinely useful context beyond the annotations: the plan-then-apply handoff via google_apply and the fingerprint dependency (from gtm_get_trigger) for updates. It does not describe the plan artifact returned or its lifetime, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the critical 'PLAN (nothing is written)' signal, followed by the operation and the apply handoff. No filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a plan-only tool with no output schema, the description covers the essentials: the no-write guarantee, the workspace constraint, the update fingerprint path, and the apply step. It omits how the resulting plan is retrieved or reused (e.g., via plan_get), which is a minor gap against the plan_* sibling ecosystem.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (trigger, client_id, trigger_id, fingerprint, workspace_id) is already documented in the schema, including the update-only fingerprint requirement. The description only echoes the fingerprint-for-update point, adding no syntax or format detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (plan/create-or-update) and resource (GTM trigger) with a scope qualifier ('non-default workspace of the client's GTM container'), and the PLAN/nothing-is-written framing immediately separates it from the sibling gtm_plan_tag_upsert and gtm_plan_variable_upsert. An agent can identify exactly what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear workflow: use this to stage the change, then 'Apply with google_apply after the user agreed.' This tells the agent when to invoke it and what the follow-up is. It stops short of explicit when-not conditions or naming alternative plan tools, but the resource type plus the plan/apply pattern is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_plan_variable_upsertPlan a GTM variable changeARead-only
PLAN (nothing is written): create or update a variable in a non-default workspace of the client's GTM container (fingerprint from gtm_get_variable for an update). Custom JavaScript variables are high risk. Apply with google_apply after the user agreed.
| Name | Required | Description | Default |
|---|---|---|---|
| variable | Yes | The variable as a GTM API object: name, type, parameter [{type, key, value}], notes. For an update pass only the fields to change (the others are kept); output fields (path, ids, fingerprint) may be left in and must match | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| fingerprint | No | Update only: the fingerprint returned by gtm_get_tag / gtm_get_trigger / gtm_get_variable (required; refused when stale) | |
| variable_id | No | Numeric id of the variable to update; empty creates one | |
| workspace_id | Yes | Numeric GTM workspace id (gtm_workspace_status lists them); never the Default Workspace for a change |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'nothing is written'. It adds genuine context beyond the annotations: the fingerprint source, the 'Custom JavaScript variables are high risk' warning, and the required apply-after-consent workflow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the critical 'PLAN (nothing is written)' scoping, then update mechanics, then the apply step. 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?
With no output schema, the description still conveys the plan-then-apply workflow and the fingerprint/workspace prerequisites, which is enough for an agent to call it correctly. It does not mention what the resulting plan is or how plan_get/plan_list/rollback_plan relate, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters, including the variable object shape and fingerprint staleness rule. The description reinforces the fingerprint source and non-default workspace constraint but adds little beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (PLAN, nothing written) plus the resource (a GTM variable) and the scope constraint (non-default workspace of the client's GTM container). It cleanly distinguishes itself from gtm_get_variable and from the tag/trigger upsert siblings by naming the resource.
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?
Points to gtm_get_variable as the source of the fingerprint for updates and names google_apply as the follow-up with the condition 'after the user agreed', which is clear context. It stops short of explicit when-not-to-use exclusions against siblings like gtm_plan_tag_upsert.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_plan_workspace_createPlan a GTM workspaceARead-only
PLAN (nothing is written): create a dedicated workspace in the client's GTM container, where the tag, trigger and variable plans can then work (the Default Workspace is never written). Low risk: a workspace changes nothing live. Apply with google_apply after the user agreed. No automatic rollback.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the new workspace (unique in the container) | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| description | No | Optional description; [gem-managed] is appended |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with "nothing is written" and "Low risk: a workspace changes nothing live." It adds the important non-obvious caveat "No automatic rollback," though it doesn't address the non-idempotent hint (repeated-call behavior).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information is front-loaded and every clause carries weight (plan semantics, write scope, risk, apply path, rollback caveat). It's slightly run-on with stacked parentheticals, which costs a point but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter planning tool with full schema coverage and clear annotations, nothing an agent needs to call it correctly is missing. The plan/apply boundary and the absence of output-schema expectations are handled adequately.
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 name, client_id, and description with useful detail (uniqueness, when client_id is required). The description adds no parameter-level syntax beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("create a dedicated workspace in the client's GTM container") and immediately clarifies the planning semantics, so an agent can distinguish it from the gtm_plan_tag/trigger/variable_upsert siblings. The parenthetical "PLAN (nothing is written)" front-loads what the tool actually does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing: plan here first, then "Apply with google_apply after the user agreed," naming the concrete alternative. It also states the boundary that the Default Workspace is never written, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_versionsGTM versionsARead-onlyIdempotent
Container versions of the client's GTM container, newest first (id, name, number of tags, triggers and variables) and which one is live. Read only: publishing is not offered.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of versions to return | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuine context beyond that: the sort order (newest first), what each row contains, that the live version is marked, and an explicit statement that publishing is unavailable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler; the scope ('Read only: publishing is not offered') is stated up front rather than buried, and the returned-field parenthetical is compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields, and annotations carry the safety profile. For a two-parameter read tool this is close to complete, though it could say more about pagination/limit behavior and when this beats gtm_workspace_status.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (limit, client_id) are already documented in the schema, including the multi-client requirement. The description's 'the client's GTM container' only loosely corroborates client_id and adds nothing about the limit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource (client's GTM container versions), the ordering (newest first), the fields returned (id, name, tag/trigger/variable counts), and that the live version is flagged. It is clearly distinguishable from get-style siblings like gtm_get_tag, though it never uses an explicit verb such as 'list' and does not name a sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied — an agent infers it should call this to inspect version history or find the live version. The 'publishing is not offered' line sets a scope boundary but does not route the agent to an alternative tool (e.g. a plan/publish sibling), and no when-not conditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtm_workspace_statusGTM workspace statusARead-onlyIdempotent
Workspaces of the client's GTM container (id, name, whether it is the Default Workspace, whether this server created it) and, for each one, its pending changes (added / updated / deleted tags, triggers, variables) and merge conflicts. Read only; use a non-default workspace for any change.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| workspace_id | No | Numeric workspace id; empty lists every workspace (5 at most) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds value beyond them by disclosing the exact return shape (workspaces, pending added/updated/deleted tags, triggers, variables, merge conflicts) and the constraint to use a non-default workspace for changes.
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 resource being read, and the read-only caveat is placed last where it reads as a constraint. The first sentence is dense but every element earns its place by describing return content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates by enumerating the returned fields in detail, and the annotations cover the safety profile. For a two-parameter read tool this is close to complete; only the maximum-workspace count and pagination nuance are left to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with client_id and workspace_id both documented (including 'empty uses the only client' and 'empty lists every workspace'). The description adds no parameter-level detail beyond what the schema already provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it returns the workspaces of the client's GTM container, enumerating the exact fields (id, name, default flag, server-created flag) plus pending changes and merge conflicts. An agent can distinguish it from siblings like gtm_inventory or gtm_versions without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing clause 'Read only; use a non-default workspace for any change' gives clear read-versus-write context and a default-workspace caveat. It stops short of naming an explicit alternative tool (e.g. gtm_plan_workspace_create), so it is strong context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
indexing_statusIndexing API statusARead-onlyIdempotent
Latest Indexing API notifications (URL_UPDATED / URL_DELETED) Google holds for a URL. Read only: nothing is submitted. Most URLs were never notified, which is reported as such.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Full URL to look up | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds genuinely new behavioral context beyond that: which notification categories are returned and the fact that absent notifications are reported as such rather than erroring.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, all front-loaded with the core deliverable first. The 'Read only: nothing is submitted' clause is slightly redundant against readOnlyHint but is brief and reinforces rather than clutters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter read tool with full schema coverage and complete annotations, this covers what an agent needs, including the empty-result behavior. Only the shape of the returned notification data is left unspecified, which is minor given there is no output schema to describe anyway.
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% — both 'url' and 'client_id' are documented in the schema, including the multi-client condition for client_id. The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource and scope: 'Latest Indexing API notifications (URL_UPDATED / URL_DELETED) Google holds for a URL.' The enumeration of the two notification types makes it unambiguous and distinguishable from sibling lookups like gsc_inspect_url or gsc_sitemaps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the resource description, and the note that 'most URLs were never notified' usefully sets expectations. However, it never states when to prefer this over gsc_inspect_url or gsc_sitemaps, nor any prerequisites for having Indexing API data available.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merchant_account_issuesMerchant Center account issuesARead-onlyIdempotent
Account-level issues of the client's Merchant Center account (suspensions, policy, shipping, tax, website claim...): title, severity (CRITICAL, ERROR, SUGGESTION), detail, documentation link and impacted destinations per country, with counts by severity. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| account_id | No | Merchant Center account id of the client (empty: the configured one) | |
| language_code | No | Language of the issue texts (BCP-47, e.g. en-US, fr) | en-US |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true and destructive=false, so 'Read only' is redundant. The description nonetheless adds real behavioral context by disclosing the return shape (title, severity, detail, documentation link, impacted destinations per country) and the severity taxonomy (CRITICAL, ERROR, SUGGESTION), which matters because no output schema exists. It omits pagination, auth, or rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and scoped to one dense sentence plus a short safety tag; every clause carries information. The field enumeration is slightly list-heavy but earns its place given the missing output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, 3-optional-parameter diagnostic tool with no output schema, the description covers the resource, the issue domain, and the returned fields well enough to call it correctly. What is missing is only routing guidance toward merchant_product_issues.
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 client_id, account_id, and language_code are fully documented in the schema (including the multi-client requirement and BCP-47 language format). The description adds nothing about parameters, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (account-level issues of the client's Merchant Center account) with concrete scope and enumerates the issue categories (suspensions, policy, shipping, tax, website claim). The 'Account-level' wording cleanly separates it from the sibling merchant_product_issues, so the agent can distinguish them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implicit usage is clear from the description (diagnose account-level Merchant Center problems), but there is no explicit when-to-use statement, no exclusions, and no routing to the obvious alternative merchant_product_issues. Usage is inferable but left to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merchant_data_sourcesMerchant Center data sourcesBRead-onlyIdempotent
Merchant Center data sources (feeds): labels, countries, languages, fetch URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the practical detail that results include labels, countries, languages, and fetch URLs, which tells the agent what the feed records contain, but it says nothing about scoping, pagination, or per-account behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with the resource and returned fields front-loaded and zero filler. It is slightly clipped as a verbless fragment, which costs a little clarity but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one optional parameter, full schema coverage, and annotations carrying the safety profile, the description supplies the one thing structured data does not: the fields a data source record exposes. Missing only secondary detail like result scoping or pagination.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single client_id parameter is fully documented in the schema, including the condition for when it is required. The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource, Merchant Center data sources, and disambiguates with the parenthetical alias '(feeds)', which separates it from siblings like merchant_products and merchant_account_issues. However, it never states the operation (list/get), so the agent must infer that this is a read/list call from the noun phrase alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of alternatives, and no note about prerequisites such as when a merchant account must be configured first. The agent gets a resource name and a field list but nothing that routes it between this tool and the other merchant_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merchant_plan_product_patchPlan a Merchant Center product changeARead-only
PLAN (nothing is written): change some attributes of one product of the client's Merchant Center account, with an explicit update mask (an attribute listed without a value is refused: Google would delete it). Title and description are low risk, link and availability medium, price high and financial (needs a human approval; capped by write.merchant.max_daily_budget_micros, max_increase_pct and cap_currency). Only API data sources. Apply with google_apply after the user agreed; changes show after up to 30 minutes; rollback_plan restores the previous values. Product insert, delete and inventories are deliberately not offered.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| account_id | No | Merchant Center account id of the client (empty: the configured one) | |
| product_id | Yes | Product id contentLanguage~feedLabel~offerId, as merchant_products returns it (e.g. en~FR~SKU123) | |
| update_mask | Yes | Attributes to change, each also given in product_attributes: title, description, link, availability, price | |
| data_source_id | No | Numeric id of the API data source to patch (empty: the product's primary data source) | |
| product_attributes | Yes | New values, e.g. {"title": "...", "availability": "OUT_OF_STOCK", "price": {"amount_micros": 12990000, "currency_code": "EUR"}} |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare safety hints; the description adds rich behavior beyond them: risk tiers per attribute (title/description low, link/availability medium, price high), human approval requirement for price, budget caps (write.merchant.max_daily_budget_micros, max_increase_pct, cap_currency), the ~30-minute propagation delay, and rollback via rollback_plan. Nothing is written — consistent with readOnlyHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every clause carries information (risk tiers, caps, timing, exclusions) with the plan-only constraint front-loaded in capitals. It is dense and somewhat run-on, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating-adjacent planning tool with no output schema, the description covers the write path, approval gates, budget caps, latency, rollback, and explicit non-capabilities. An agent has everything needed to plan and then hand off to google_apply.
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, but the description adds a genuine semantic rule for update_mask: 'an attribute listed without a value is refused: Google would delete it.' That constraint is not derivable from the schema and prevents a destructive mistake.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('PLAN (nothing is written): change some attributes of one product of the client's Merchant Center account') and distinguishes itself from siblings like merchant_products by emphasizing the plan-only nature. An agent can tell exactly what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to the apply step ('Apply with google_apply after the user agreed') and states exclusions ('Product insert, delete and inventories are deliberately not offered'). This is the when/when-not/alternatives pattern at full strength.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merchant_product_issuesMerchant Center product issuesARead-onlyIdempotent
Merchant Center products with their item-level issues (disapprovals, demotions, warnings) per destination, with the attribute to fix. Scans every page of products up to max_pages. Returns {"products": [{offer_id, feed_label, title, link, issues: [{code, severity, description, attribute, destination}]}], "scanned": n, "truncated": bool}.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum products returned (1 to 1000) | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) | |
| max_pages | No | Pages of 250 products to scan at most | |
| only_with_issues | No | True: only products with at least one issue; False: every product |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and non-destructive, so the bar is lower. The description still adds real behavioral context: it scans every page of products up to max_pages, so unbounded-ish work is disclosed, and it explains the truncation semantics via the returned 'truncated' flag.
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 dense sentences with the purpose front-loaded and the return shape compactly inlined as a literal JSON sketch. No filler or hedging; only minor cost is the somewhat cramped embedded schema notation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries return-value burden and does so by enumerating the product and issue fields (offer_id, feed_label, title, link, code, severity, attribute, destination) plus scanned/truncated. Combined with annotations covering the safety profile, this is nearly complete; only the routing against account-level and patch siblings is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents limit, max_pages, only_with_issues and client_id thoroughly. The description only echoes max_pages scoping and the return shape; it adds no format or interaction detail (e.g. how limit interacts with the 'scanned' count) beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it retrieves Merchant Center products together with their item-level issues (disapprovals, demotions, warnings) broken out per destination and the attribute to fix. This clearly distinguishes it in spirit from account-level issue tools, but it never names the sibling it differs from (e.g. merchant_account_issues or merchant_products), so the differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent can infer this is the item-level diagnostic scan and that merchant_plan_product_patch would follow to fix the returned attributes, but the description never says when to choose this over merchant_account_issues or when a plain merchant_products listing would suffice. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merchant_productsMerchant Center productsARead-onlyIdempotent
One page of the client's Merchant Center products (processed view): full product id
contentLanguagefeedLabelofferId (the id merchant_plan_product_patch takes), title, link, availability,
price, primary data source, number of item issues and status per destination. Pass next_page_token for the
next page. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Products in this page (1 to 250) | |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client | |
| account_id | No | Merchant Center account id of the client (empty: the configured one) | |
| page_token | No | next_page_token of the previous page; empty = first page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the trailing 'Read only' adds little. What does add value is the pagination behavior (next_page_token for the next page), the 'processed view' framing, and the note that the returned id is the exact key merchant_plan_product_patch consumes. No auth or rate-limit context is given, but the safety profile is fully covered by 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?
A single dense paragraph that front-loads the tool's identity and the page contents before the pagination note. Nearly every clause earns its place, though the enumeration of returned fields is lengthy and could be trimmed since some of it is discoverable at call time.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields and explains pagination, and the schema covers client/account scoping. What is missing is any guidance on the read-to-patch workflow with merchant_plan_product_patch and when this listing should be preferred over the other Merchant Center 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?
Schema description coverage is 100%, so limit, client_id, account_id and page_token are already fully documented, including the next_page_token/empty-first-page semantics. The description restates the pagination rule for page_token and mixes in output-field detail (the composite id) rather than adding new parameter meaning, so baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('One page of the client's Merchant Center products') and enumerates exactly what each returned record contains (full product id, title, link, availability, price, data source, item issues, per-destination status). The composite id format contentLanguage~feedLabel~offerId makes it clearly distinguishable from sibling list tools like merchant_product_issues or meta_catalog_products.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives one concrete usage instruction ('Pass next_page_token for the next page') and cross-references merchant_plan_product_patch as the consumer of the returned id, which implies the read-plan-patch workflow. However, it never says when to choose this over merchant_report_query, merchant_product_issues, or merchant_data_sources, so the routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merchant_report_queryMerchant Center report queryARead-onlyIdempotent
Run a Merchant Center report (Merchant API reports:search) with an MCQL query, for example product status or free-listing performance. Returns Google's raw result rows.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Merchant Center Query Language (MCQL) statement. Tables include product_view (must select id) and product_performance_view (clicks, impressions by date or offer) | SELECT id, offer_id, title, aggregated_reporting_context_status FROM product_view LIMIT 50 |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is covered. The description adds one genuinely useful behavioral fact — that results are Google's raw, unprocessed rows — but says nothing about pagination, row limits, quota, or how errors surface for an open-world query tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the action front-loaded and the return behavior appended; no filler. The parenthetical API reference is arguably redundant, keeping it just short of ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does note the return shape ('raw result rows') and the schema fully documents both parameters, so an agent has enough to invoke it. Missing operational details (limits, pagination, failure modes) are the only gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents the MCQL statement, available tables, and the client_id sourcing/requirement rules. The description adds no parameter-level detail beyond restating the MCQL query concept, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run a Merchant Center report ... with an MCQL query') and gives concrete example use cases (product status, free-listing performance). It does not explicitly distinguish itself from adjacent read tools such as merchant_products or gads_query, but the MCQL/reports:search framing makes the capability identifiable.
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 examples hint at when the tool applies, but there is no explicit when-to-use/when-not guidance and no mention of the sibling alternatives (e.g. merchant_products for simple product listing vs this for arbitrary MCQL reporting). Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ad_accountsMeta ad accountsARead-onlyIdempotent
List the Meta ad accounts the access token can read (id act_..., name, status, currency, timezone).
Use it to find the account id for META_AD_ACCOUNT_ID or for the account_id argument of meta_insights. With a client registry only the client's own accounts are listed (not_owned_hidden counts the others).
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list; empty uses the only client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world. The description adds genuinely new behavioral context: under a client registry only the client's own accounts are returned and others are counted in not_owned_hidden, which tells the agent the listing can be incomplete. It stops short of covering pagination or rate limits, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs with zero waste; the scoping constraint and returned fields are front-loaded and the downstream consumer (meta_insights) is named immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields, and it covers the one optional parameter's effect via the registry note. Nothing an agent needs to invoke and interpret this read-only listing correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single client_id parameter is fully documented there ('Client id from clients_list; empty uses the only client'). The description's registry sentence adds indirect context but no new syntax or format guidance, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the Meta ad accounts the access token can read') and enumerates the returned fields (id act_..., name, status, currency, timezone). This clearly distinguishes it from sibling account-listing tools such as gads_accounts and openai_ads_account.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use it to find the account id for META_AD_ACCOUNT_ID or the account_id argument of meta_insights. It also states the conditional behavior when a client registry is in play, so the agent knows when results will be scoped rather than complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_adsetsMeta ad setsBRead-onlyIdempotent
List the ad sets of a Meta ad account (optionally of one campaign): id, name, campaign_id, status, effective_status, daily and lifetime budget (minor units and currency units), optimization goal, billing event, bid strategy, dates. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows returned (1 to 500, at most 5 pages read) | |
| statuses | No | Optional effective_status filter (ACTIVE, PAUSED, ARCHIVED, CAMPAIGN_PAUSED, ADSET_PAUSED, WITH_ISSUES...); empty = Meta's default (not deleted) | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| account_id | No | Ad account id (digits or act_<digits>); empty means the client's account | |
| campaign_id | No | Optional campaign id: only its ad sets |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so 'Read-only' is largely redundant. The description does add value by enumerating the returned fields, but it omits behavioral details like the pagination ceiling noted in the schema or how budgets are normalized.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that packs the resource, optional scope, and returned fields with no filler. The trailing field list is dense but every item earns its place given there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, enumerating the returned fields compensates well. Minor gaps remain around pagination behavior and how the client/account resolution works, but the schema covers those.
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 five parameters with defaults and constraints. The description only restates the campaign scoping ('optionally of one campaign') and adds no syntax or format 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 names a specific verb and resource ('List the ad sets of a Meta ad account') and even enumerates the returned fields, which is precise. It does not explicitly distinguish itself from close siblings like meta_campaigns or meta_ads_list, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives such as meta_campaigns or meta_ads_list, nor any stated prerequisites beyond what the schema already carries. Usage is only implied by the resource named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_listMeta adsARead-onlyIdempotent
List the ads of a Meta ad account (optionally of one ad set or campaign): id, name, campaign_id, adset_id, status, effective_status, creative_id, dates. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows returned (1 to 500, at most 5 pages read) | |
| adset_id | No | Optional ad set id: only its ads | |
| statuses | No | Optional effective_status filter (ACTIVE, PAUSED, ARCHIVED, CAMPAIGN_PAUSED, ADSET_PAUSED, WITH_ISSUES...); empty = Meta's default (not deleted) | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| account_id | No | Ad account id (digits or act_<digits>); empty means the client's account | |
| campaign_id | No | Optional campaign id: only its ads |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, so the 'Read-only' sentence is largely redundant. The description does add value beyond annotations by disclosing the returned field set, which matters since no output schema exists. It still omits pagination/rate-limit behavior and auth requirements, which live only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence that front-loads the action and scope, followed by a two-word safety tag. Every clause earns its place and nothing is repeated or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, naming the returned fields is exactly the right compensation, and the read-only nature is covered jointly with annotations. Minor residual gap: pagination/cap behavior (at most 5 pages) and the client/account resolution rules appear only in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, adset_id, statuses, client_id, account_id and campaign_id are all documented in the schema. The description adds only the adset/campaign scoping hint, no format or semantics beyond what the schema already provides; the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the ads of a Meta ad account') and further narrows scope with the optional ad set / campaign scoping. Enumerating the returned fields (id, name, campaign_id, adset_id, status, effective_status, creative_id, dates) distinguishes it from entity siblings like meta_campaigns, meta_adsets, and from metric tools like meta_insights.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'optionally of one ad set or campaign' hints at filtering usage, but there is no explicit when-to-use guidance and no alternative named (e.g., 'for performance metrics use meta_insights, for ad set entities use meta_adsets'). An agent must infer routing from the resource name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_applyApply a Meta (ads, pixel, catalog, Instagram, Page) planADestructive
WRITE: apply a signed plan for Meta (ads, pixel, catalog, Instagram, Page), after the user approved it. Pass plan_id, confirmation_token and confirm exactly as the plan_* tool returned them. Every lock is re-checked; ops run in order and stop at the first error; everything is journaled.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Confirmation string '<client_id>:<plan_id>:<digest8>' returned with the plan | |
| plan_id | Yes | Plan id returned by the plan_* tool | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| confirmation_token | Yes | confirmation_token returned by the plan_* tool, unchanged |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, and the description adds real execution semantics beyond that: locks are re-checked, operations run in order, execution halts at the first error, and everything is journaled. That failure-mode and sequencing detail is exactly the context an agent needs before invoking a destructive write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the 'WRITE' classification and the action, then the required inputs, then the execution behavior. No filler and no repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation with no output schema, the description covers the workflow position, the input contract and the failure/journaling behavior. It stops short of describing what is returned after a run (e.g. a journal/audit reference the caller would use to verify results), which is the one remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a meaningful constraint the schema does not: plan_id, confirmation_token and confirm must be passed exactly as returned by the plan_* tool, i.e. unchanged and not reconstructed. That is a substantive hint about value provenance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('apply') on a specific resource ('a signed plan for Meta'), and the 'WRITE' prefix plus the platform scoping (ads, pixel, catalog, Instagram, Page) distinguishes it from the read-oriented Meta siblings (meta_campaigns, meta_insights) and from the meta_plan_* generators. An agent can identify it as the execution step of the plan workflow without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition ('after the user approved it') and references the plan_* tools as the source of the required values, which tells the agent this must follow a plan/approval step rather than be called directly. It does not explicitly name rollback_plan or state when NOT to use it, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_campaignsMeta campaignsARead-onlyIdempotent
List the campaigns of a Meta ad account: id, name, status, effective_status, objective, daily and lifetime budget (minor units and currency units), special_ad_categories, dates. Read-only.
Use the ids with meta_plan_pause / meta_plan_budget_change, or meta_adsets(campaign_id=...).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows returned (1 to 500, at most 5 pages read) | |
| statuses | No | Optional effective_status filter (ACTIVE, PAUSED, ARCHIVED, CAMPAIGN_PAUSED, ADSET_PAUSED, WITH_ISSUES...); empty = Meta's default (not deleted) | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| account_id | No | Ad account id (digits or act_<digits>); empty means the client's account |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the description's 'Read-only' is redundant. It adds the returned field list but omits behavioral details such as pagination, rate limits, or authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences, front-loaded with the list operation and its returned fields. The downstream usage sentence is compact and no clause is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description appropriately names the returned fields. Annotations cover the safety profile, and the input schema is fully documented, so the remaining gaps are minor behavioral details rather than blockers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema. The description adds no parameter-specific meaning such as filtering behavior, account selection, or status semantics 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?
It gives a precise verb and resource: 'List the campaigns of a Meta ad account', and enumerates the returned fields. It also distinguishes itself from sibling resources by naming meta_adsets(campaign_id=...) as the child-listing alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent how to use the returned ids with meta_plan_pause and meta_plan_budget_change, but does not explicitly say when to choose this tool over other listing tools such as meta_ad_accounts, meta_insights, or openai_ads_campaigns. Usage is therefore implied rather than fully scoped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_catalog_diagnosticsMeta catalog diagnosticsBRead-onlyIdempotent
Meta catalog diagnostics: issues by type and severity (MUST_FIX, WARNING), e.g. catalog not connected to the pixel, invalid content ids, missing attributes, image quality, policy violations, with the number of affected items.
| Name | Required | Description | Default |
|---|---|---|---|
| types | No | Optional diagnostic types (e.g. EVENT_SOURCE_ISSUES); empty returns every type | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| catalog_id | No | Catalog id; empty uses the client's meta.catalog_id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds that results are grouped by severity (MUST_FIX vs WARNING) and include the number of affected items, which is useful output context beyond the annotations, but it does not disclose pagination, scope limits, or whether results are live vs cached.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the tool identity and then enumerates severities and example issue categories. Every clause contributes content; it is efficiently structured though the example list is a touch long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only diagnostics tool with three optional, fully documented parameters, the description covers the resource, the severity taxonomy, and the fact that affected-item counts are returned. With no output schema present, this is close to complete; only usage routing and result-shape edge cases are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents types, client_id, and catalog_id including their empty/default fallback behavior. The description's mention of 'issues by type and severity' loosely maps to the types parameter but adds no syntax or semantic detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (Meta catalog diagnostics) and enumerates what the tool surfaces: issues by type and severity (MUST_FIX, WARNING) with example categories like pixel connection, invalid content ids, missing attributes, image quality, and policy violations. It is clearly distinguishable from a plain product listing such as meta_catalog_products, though it does not explicitly name the closest sibling (merchant_product_issues).
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 what the tool reports but never states when to reach for it versus alternatives such as merchant_product_issues, meta_dataset_quality, or meta_catalog_products. Usage is only weakly implied by the topic; there are no explicit when/when-not conditions or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_catalog_productsMeta catalog productsARead-onlyIdempotent
Products of the client's Meta catalog (bounded list): product item id, retailer_id, name, price, sale_price, currency, availability, inventory, review status, visibility. Use the product item id with meta_eco_plan_catalog_item_update.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum products returned (1 to 500) | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| catalog_id | No | Catalog id; empty uses the client's meta.catalog_id | |
| retailer_id | No | Optional: only the product with this retailer_id (your SKU / content id) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description still adds real value by disclosing that the result is a bounded list and by enumerating the returned fields — significant because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the resource and result shape front-loaded, followed by the follow-up-tool routing. No filler, though the field enumeration makes it slightly list-heavy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully compensates by naming the returned fields, and annotations carry the safety profile. Minor gaps remain: no statement of whether results paginate beyond the limit, and no mention of filtering options other than retailer_id.
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 (limit, client_id, catalog_id, retailer_id) fully documented in the schema including defaults and fallback behavior. The description adds no parameter semantics beyond that; the field list it gives describes outputs, not inputs. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: a bounded list of products in the client's Meta catalog, and even enumerates the fields returned. 'Meta catalog' scopes it away from merchant_products, but the description never explicitly distinguishes it from that sibling by 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?
Gives one forward-looking routing hint ('Use the product item id with meta_eco_plan_catalog_item_update'), which tells the agent what to do with results, but no guidance on when to choose this tool over merchant_products or meta_catalog_diagnostics, and no prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_dataset_qualityMeta dataset qualityARead-onlyIdempotent
Conversions API / pixel dataset quality per web event: event match quality (composite score, match key feedback), event coverage, dedup feedback, data freshness and additional conversions reported (ACR). Read only: nothing is sent to the dataset.
| Name | Required | Description | Default |
|---|---|---|---|
| pixel_id | No | Dataset (pixel) id; empty uses the client's meta.pixel_id | |
| client_id | No | Client id from clients_list; empty uses the only client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), and the description reinforces it with the concrete claim 'nothing is sent to the dataset', which clarifies this is a non-mutating diagnostic read. Because no output schema exists, the enumeration of returned metrics (EMQ composite, match key feedback, coverage, dedup, freshness, ACR) adds genuine behavioral value beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the metric inventory front-loaded and the read-only assurance placed at the end where it belongs. The metric list is dense but every element is informative, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter, read-only diagnostic with no output schema, the description supplies the essential missing piece by naming the metrics in the response. It stops short of explaining interpretation or the reporting window, but an agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both pixel_id and client_id are documented in the schema, including the empty-value fallback behavior. The description adds no parameter-level detail (e.g., which id takes precedence or what time window is reported), so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource (Conversions API / pixel dataset) and enumerates the exact metrics returned (event match quality, event coverage, dedup feedback, freshness, ACR), which tells an agent precisely what the tool produces. It does not, however, distinguish itself from the close sibling meta_pixel_health, so sibling differentiation is missing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this tool versus alternatives such as meta_pixel_health, meta_catalog_diagnostics, or meta_insights. Usage must be inferred entirely from the metric list, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_eco_plan_catalog_item_updatePlan a Meta catalog item updateARead-only
PLAN (writes nothing): update one Meta catalog product item (price, sale price, availability, stock). Reads
the item first (complete snapshot, rollback restores it), validates locally, and returns a signed plan with
confirmation_token and confirm; apply it with meta_apply after the user agrees (a price change also needs
google-ecommerce-mcp approve).
| Name | Required | Description | Default |
|---|---|---|---|
| price | No | New price in MINOR units of the item currency (cents: 1299 = 12.99 EUR); empty keeps it | |
| title | No | Short title of the change (shown in the plan) | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| inventory | No | New stock quantity (0 or more); empty keeps it | |
| sale_price | No | New sale price in minor units; empty keeps it | |
| availability | No | New availability; empty keeps it | |
| product_item_id | Yes | Product item id (the id column of meta_catalog_products) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, it discloses that the tool reads the item first to capture a complete rollback snapshot, validates locally, and returns a signed plan with confirmation_token and confirm. These are operationally critical traits an agent could not infer from 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 dense sentences, front-loaded with the 'writes nothing' safety framing, with parentheticals carrying secondary details. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly explains the return value (signed plan with confirmation_token and confirm) and the follow-up tool. For a 7-param planning tool this is 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 description coverage is 100%, so the schema already documents minor-unit semantics, enums, and 'empty keeps it' behavior. The description's parenthetical field list (price, sale price, availability, stock) restates schema content without adding format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and scope — 'PLAN (writes nothing): update one Meta catalog product item' — plus the mutable fields in parentheses. It clearly distinguishes itself from the sibling apply tool (meta_apply) that actually performs the write.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit workflow: plan here, then apply with meta_apply after the user agrees, and an extra precondition for price changes ('a price change also needs google-ecommerce-mcp approve'). Alternatives and conditions are both named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ig_insightsInstagram insightsARead-onlyIdempotent
Instagram professional account insights, total over the period: reach, views, accounts engaged, interactions (likes, comments, shares, saves, replies), follows and profile link taps. Deprecated metrics (impressions, plays, video_views) are refused.
| Name | Required | Description | Default |
|---|---|---|---|
| metrics | No | Metrics (non-deprecated only); empty: reach, views, accounts_engaged, total_interactions | |
| end_date | No | YYYY-MM-DD (UTC), included; at most 30 days per request | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| ig_user_id | No | Instagram professional account id; empty uses the client's meta.ig_user_id | |
| start_date | No | YYYY-MM-DD (UTC); empty with end_date: the 28 days ending yesterday |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds genuinely useful behavior beyond that: results are aggregated totals over the period rather than a time series, and deprecated metrics are refused (impressions, plays, video_views), which tells the agent to expect a rejection rather than silent empty 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?
Two sentences, no filler, key scope (entity, aggregation, metric set) front-loaded before the constraint about deprecated metrics. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 100% schema coverage, no output schema, and no required parameters, the description supplies the remaining essentials: aggregation semantics and the deprecated-metric refusal. It could say more about what happens when metrics and dates are both omitted, but nothing needed to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so defaults, date format, the 30-day cap, and client/account fallback behavior are all documented in the schema. The description adds only the aggregation semantics of the date range and the metric whitelist, which is marginal beyond what the schema already states; 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 names a specific verb-plus-resource ('Instagram professional account insights') and scopes it to a period total, which clearly separates it from account/report-level siblings like ga4_report or gads_performance. It does not explicitly distinguish itself from the closer siblings meta_insights or meta_page_insights, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'total over the period' and the listed IG account metrics, and the deprecated-metric clause tells the agent what not to request. However, there is no explicit when-to-use guidance versus meta_insights, meta_page_insights, or openai_ads_insights, which is the key routing decision an agent faces here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_insightsMeta Ads insightsARead-onlyIdempotent
Meta Ads performance (spend, impressions, clicks, reach, purchases, purchase value, ROAS) by level.
ctr is recomputed as a ratio 0..1, ROAS = purchase value / spend (totals: sum of values / sum of spends), Meta's own purchase_roas is kept raw in meta_reported_roas. Currency is the ad account's, never converted.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Row level: account (one row per period), campaign, adset or ad | account |
| limit | No | Maximum rows returned (1 to 500), highest spend first (daily rows too); totals cover up to 5 pages of 500 rows | |
| end_date | No | YYYY-MM-DD, last day included; leave empty with start_date to use date_preset | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| account_id | No | Ad account id (digits or act_<digits>); empty means META_AD_ACCOUNT_ID | |
| breakdowns | No | Optional extra split of each row, from a fixed list: age, gender, country, region, publisher_platform, platform_position, device_platform, impression_device | |
| start_date | No | YYYY-MM-DD, first day in the ad account's timezone; leave empty with end_date to use date_preset | |
| date_preset | No | Meta relative period (e.g. last_7d, last_month), exclusive with start_date/end_date; all three empty means last_28d | |
| time_increment | No | all_days: one row for the whole period; 1: one row per day | all_days |
| attribution_windows | No | Optional attribution windows for purchases (e.g. 7d_click); empty means Meta's default 7-day click + 1-day view; several windows give one figure per window, no single total |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), but the description adds non-obvious semantics an agent cannot get from structured fields: ctr is recomputed as a 0..1 ratio rather than Meta's percentage, ROAS is defined as purchase value / spend with the totals caveat, Meta's raw purchase_roas is preserved in meta_reported_roas, and currency is never converted. It does not describe result column layout or how totals/paging behave beyond the metric definitions, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose and metric scope first, then the recomputation/definition rules, then the currency caveat. No filler and every clause carries information the agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only report tool with 10 optional parameters, no output schema, and a rich input schema, the description supplies the metric set and the computed-field semantics that would otherwise be ambiguous. What remains thin is output shape (which columns appear for each level/breakdown combination), though the schema's limit/totals notes partially cover it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents defaults, enum values, date-vs-preset exclusivity, breakdown list, and the limit/totals behavior. The description only indirectly touches parameters via 'by level' and mentions 'totals' but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (Meta Ads performance) with an explicit metric list (spend, impressions, clicks, reach, purchases, purchase value, ROAS) and the aggregation dimension ('by level'), which maps directly to the `level` enum. An agent can distinguish this reporting tool from sibling listing tools like meta_ads_list, meta_campaigns, and meta_adsets without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to choose this tool over siblings such as meta_ads_list, openai_ads_insights, gads_performance or ads_overview, and no prerequisites or exclusions are given. Usage is only inferrable from the purpose sentence, so this matches the 'no guidance' band rather than the implied-usage band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_page_insightsFacebook Page insightsARead-onlyIdempotent
Facebook Page insights per day and in total: media views (page_media_view replaces the deprecated impressions), post engagements, follows and unfollows, total actions. 90 days at most per request.
| Name | Required | Description | Default |
|---|---|---|---|
| metrics | No | Metrics (non-deprecated only); empty: page_media_view, page_post_engagements, page_daily_follows_unique | |
| page_id | No | Facebook Page id; empty uses the client's meta.page_id | |
| end_date | No | YYYY-MM-DD (UTC), included; at most 90 days per request | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| start_date | No | YYYY-MM-DD (UTC); empty with end_date: the 28 days ending yesterday |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, open-world. The description adds two genuinely behavioral facts not in the annotations: the 90-day maximum window per request and that page_media_view replaces the deprecated impressions metric. It does not cover pagination or return shape, but the annotation coverage lowers the bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the resource stated first and the 90-day cap last. The mid-sentence parenthetical about the deprecated impressions metric slightly interrupts the metric list, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter, no-required-parameter, read-only insight tool with full schema descriptions and strong annotations, the description covers scope, allowed window, and the key metric deprecation. It omits only return-granularity details, which is acceptable given there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real semantic value the schema lacks: it clarifies that page_media_view is the non-deprecated replacement for impressions, which helps an agent pick the correct enum value. Other parameters (page_id, client_id, dates) are left entirely to 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?
Names a specific verb+resource: Facebook Page insights, per day and in total, and enumerates the metric families (media views, post engagements, follows/unfollows, total actions). It is clearly the page-level insights tool, distinguishable from meta_insights and meta_ig_insights by resource, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 90-day-per-request constraint states a usage boundary, but there is no explicit when-to-use/when-not guidance relative to the many sibling insight tools (meta_insights, meta_ig_insights, openai_ads_insights). Usage is only implied by the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_pixel_healthMeta pixel healthARead-onlyIdempotent
Meta pixel health: last fire time, availability, automatic matching, and the events received per name over
the last days days (PageView, ViewContent, AddToCart, Purchase...), with plain warnings (never fired, silent
for more than 24 h, no Purchase event).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Days of event counts to read (1 to 30), ending now | |
| pixel_id | No | Pixel / dataset id; empty uses the client's meta.pixel_id | |
| client_id | No | Client id from clients_list; empty uses the only client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is fully covered by structured data. The description adds the warning conditions (never fired, silent >24h, no Purchase), which is some behavioral disclosure, but it says nothing about rate limits, auth requirements, or how empty/nulls are handled. The added context is modest against already-rich 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?
A single front-loaded sentence that names the tool then lists its outputs and warning triggers with no filler. It is dense but readable; the parenthetical event examples and warnings are the only mild padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the job of describing return values, and it does so by enumerating the metrics and warnings produced. Combined with 100% schema coverage on inputs and full annotation coverage, an agent has enough to call and interpret it; only explicit usage routing is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented in the schema, including defaults and the 1-30 bound. The description only echoes `days` as the counting window and adds no semantics for pixel_id or client_id beyond what the schema states. 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?
Specific verb+resource (pixel health) with an explicit enumeration of what is surfaced: last fire time, availability, automatic matching, and per-name event counts. An agent can distinguish this diagnostic tool from metric-oriented siblings like meta_insights or meta_dataset_quality by content. It stops short of naming a sibling, so 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: the output list (fire times, availability, warnings for never fired / silent >24h / no Purchase) tells an agent this is a pixel-diagnostics call. There is no explicit when-to-use statement, no when-not guidance, and no routing to or away from alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_plan_budget_changePlan a Meta budget changeARead-only
PLAN (nothing is written): change the daily budget of a Meta campaign or ad set. Financial: capped by the
client's policy (max daily budget in its currency, +20 % in 24 h) and applied only after a human approval
out of band (google-ecommerce-mcp approve). Rollback restores the previous budget.
| Name | Required | Description | Default |
|---|---|---|---|
| level | Yes | campaign (Advantage campaign budget) or adset | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| entity_id | Yes | Numeric id of the campaign or ad set | |
| daily_budget_minor | Yes | New daily budget in MINOR units of the account currency: 5000 = 50.00 EUR, 5000 = 5000 JPY (0 decimals) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'nothing is written'. Beyond that it discloses non-obvious behavior: policy caps (max daily budget in the client's currency, +20% per 24h), an out-of-band human approval requirement, and that rollback restores the previous budget. That is real context an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The 'PLAN (nothing is written)' framing is front-loaded and the whole definition is two dense sentences with no filler. It is slightly overloaded by the inline CLI reference, but every clause carries operative 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 no-write planning tool with no output schema and full schema coverage, the description covers the safety profile, financial constraints, approval flow, and reversibility. The only real omission is what the plan produces and how to consume it (plan_get/plan_list/meta_apply), which is a minor gap given those siblings exist.
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 all four parameters are documented in the schema itself (enum for level, minor-unit explanation for daily_budget_minor, client_id defaulting behavior). The description adds no syntax or format detail beyond what the schema already carries, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('change the daily budget of a Meta campaign or ad set') and immediately qualifies it with 'PLAN (nothing is written)'. That qualifier is exactly the axis that separates this tool from meta_apply and from the gads/openai_ads budget-change siblings, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly establishes the planning context, the approval gate ('applied only after a human approval out of band'), and the rollback path, which tells the agent when this is the right stage to call. It stops short of naming the follow-up siblings (meta_apply, plan_get) explicitly, so it is strong context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_plan_create_adPlan a Meta adARead-only
PLAN (nothing is written): create a Meta ad, always PAUSED, from an existing creative, in an ad set of the client's account (both checked). Dry-run with validate_only; apply with meta_apply. No automatic rollback.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the new entity (plain text) | |
| adset_id | Yes | Numeric id of the parent ad set (same ad account) | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| creative_id | Yes | Numeric id of an existing ad creative of the account |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true and destructive=false, so the safety bar is lower. The description adds real value beyond them: the ad is 'always PAUSED', the creative must be existing and the ad set/client are 'both checked', and there is 'No automatic rollback'. That last point is important operational context an agent cannot get from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tightly packed sentence group with the critical constraint ('nothing is written') front-loaded first. Every clause – paused state, creative source, dry-run/apply routing, no rollback – earns its place with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description covers the mutation semantics, the validate_only safety gate, the apply follow-up, and the rollback limitation. For a 4-param planner this is nearly complete; only the plan's return/handle (e.g. how to reference it in meta_apply) is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema documents all four parameters (name, adset_id, client_id, creative_id) with formats and defaults. The description restates the parent ad-set/creative relationships but adds no syntax or format detail beyond the schema. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('create a Meta ad') and immediately scopes it with 'PLAN (nothing is written)', which distinguishes it from the sibling meta_plan_create_campaign and meta_plan_create_adset. An agent can tell exactly what this does and that it produces a plan rather than a live entity.
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?
Clearly routes the agent through the workflow: 'Dry-run with validate_only; apply with meta_apply.' This names the alternative (apply) and the condition that selects it. It doesn't explicitly contrast against sibling planners, but the plan/apply pattern is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_plan_create_adsetPlan a Meta ad setARead-only
PLAN (nothing is written): create a Meta ad set, always PAUSED, in a campaign of the client's account (checked). No bid fields (bid caps are refused by the policy). Dry-run with validate_only; apply with meta_apply. No automatic rollback.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the new entity (plain text) | |
| age_max | No | Maximum age (13-65) | |
| age_min | No | Minimum age (13-65) | |
| pixel_id | No | Optional pixel id of the client (promoted_object) | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| countries | Yes | Target countries, ISO alpha-2 (FR, BE...) | |
| start_time | No | Optional ISO 8601 start with offset; empty = Meta default | |
| campaign_id | Yes | Numeric id of the parent campaign (same ad account) | |
| billing_event | Yes | Billing event, usually IMPRESSIONS | |
| custom_event_type | No | Conversion event with pixel_id, e.g. PURCHASE | |
| optimization_goal | Yes | Optimization goal, e.g. OFFSITE_CONVERSIONS | |
| advantage_audience | Yes | targeting_automation.advantage_audience, explicit: 0 (your targeting only) or 1 (Advantage+ audience) | |
| daily_budget_minor | No | Optional daily budget in MINOR units of the account currency (5000 = 50.00 EUR; 5000 = 5000 JPY); capped by the client's write policy |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description reinforces this with 'nothing is written'. Beyond the annotations it adds real behavioral context — the ad set is created 'always PAUSED', the parent campaign is 'checked', and critically 'No automatic rollback' — which an agent needs to know for recovery. It stops short of describing what the plan produces or any rate/limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, leading with the PLAN/no-write qualifier before workflow and constraints. The parenthetical, telegraphic style is efficient but slightly choppy, which keeps it just short of ideal structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 13-parameter, no-output-schema tool it covers the plan-vs-apply workflow, default paused state, ownership validation, and rollback behavior. It does not explain what the plan returns or how its result feeds meta_apply, which is the main remaining gap given the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 13 parameters including enums and defaults, making 3 the baseline. The description adds only marginal parameter meaning — the bid-field policy constraint and the mention of validate_only (which is not even a declared parameter) — without clarifying individual fields beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — 'PLAN ... create a Meta ad set' — and immediately qualifies scope with 'always PAUSED, in a campaign of the client's account (checked)'. The 'PLAN (nothing is written)' framing cleanly distinguishes it from sibling create/apply tools like meta_plan_create_ad and meta_apply.
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 explicitly names the alternative and the workflow: 'Dry-run with validate_only; apply with meta_apply', telling the agent exactly when to use this tool versus the apply sibling. It also states a when-not constraint ('No bid fields (bid caps are refused by the policy)'), removing guesswork about refused inputs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_plan_create_campaignPlan a Meta campaignARead-only
PLAN (nothing is written): create a Meta campaign, always PAUSED. Dry-run with validate_only; apply with meta_apply; activation stays in Ads Manager. No automatic rollback (archive it in Ads Manager).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the new entity (plain text) | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| objective | Yes | Campaign objective (ODAX), e.g. OUTCOME_SALES | |
| daily_budget_minor | No | Optional daily budget in MINOR units of the account currency (5000 = 50.00 EUR; 5000 = 5000 JPY); capped by the client's write policy | |
| adset_budget_sharing | No | Optional is_adset_budget_sharing_enabled flag (campaigns without a campaign budget) | |
| special_ad_categories | Yes | Explicit special ad categories: [] or ["NONE"] when none apply; HOUSING, EMPLOYMENT, FINANCIAL_PRODUCTS_SERVICES, ISSUES_ELECTIONS_POLITICS otherwise | |
| special_ad_category_country | No | ISO countries of the special ad categories (only when categories are declared) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is partly covered. The description adds meaningful context beyond that: the campaign is always created PAUSED, nothing is persisted at plan time, and there is no automatic rollback (must archive in Ads Manager). The no-rollback warning is genuinely useful operational information.
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 critical "nothing is written" framing, then the apply path and the rollback caveat. No filler; every clause carries operational meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter planning tool with no output schema and full schema coverage, the description covers the plan/apply lifecycle and the paused-state constraint adequately. It could note that a plan identifier is produced for use with meta_apply, but the sibling plan_get/plan_list tools and the workflow statement largely cover this.
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 7 parameters including budget minor units and special ad categories. The description adds no parameter-level detail, which is acceptable given the schema does the heavy lifting, but it means no value is added here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("create a Meta campaign") and immediately scopes it with "PLAN (nothing is written)" and "always PAUSED". It names the sibling that performs the write (meta_apply), so an agent can distinguish planning from execution without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit workflow routing: dry-run with validate_only, apply with meta_apply, and activation stays in Ads Manager. That is clear when-to-use guidance, though it doesn't spell out selection versus sibling planners like meta_plan_create_adset or meta_plan_create_ad (the resource name implies it).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_plan_pausePlan a Meta pauseARead-only
PLAN (nothing is written): pause Meta campaigns, ad sets or ads (status PAUSED). Reads each entity (account first, then status), checks the change locally (nothing is sent to Meta), returns the signed plan; apply it with meta_apply after the user agrees. Rollback restores the previous status.
| Name | Required | Description | Default |
|---|---|---|---|
| level | Yes | Entity level: campaign, adset or ad | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| entity_ids | Yes | 1 to 25 numeric ids of that level (from meta_campaigns / meta_adsets / meta_ads_list) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so 'nothing is written' is consistent rather than novel, but the description goes beyond them: read order (account first, then status), local-only validation, a signed plan artifact, and that rollback restores the previous status. It still does not say what the plan contains or how long it stays valid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the PLAN/no-write qualifier before anything else, so the agent gets the most decision-relevant fact first. The remaining clauses are dense but each carries information (scope, read order, apply path, rollback); a little dense for a single paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers the return artifact (signed plan) and the downstream apply/rollback lifecycle, which is what an agent needs to act. Only minor gaps remain, such as plan expiry or what the signed plan contains.
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% — level, client_id and entity_ids are each documented in the schema, including the 1-25 id bound and their source tools. The description adds no syntax or format detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb plus resource plus mode: 'PLAN (nothing is written): pause Meta campaigns, ad sets or ads (status PAUSED).' It immediately distinguishes itself from meta_apply and from sibling plan_* pause tools on other platforms (gads_plan_pause_entities, openai_ads_plan_pause) by naming Meta and the plan-only semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent forward ('apply it with meta_apply after the user agrees') and states the precondition of user agreement, which is real workflow guidance. It does not say when to prefer this over, say, a direct pause path or when NOT to plan (e.g. already-paused entities), so it falls short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_ads_accountOpenAI Ads accountARead-onlyIdempotent
OpenAI Ads (ChatGPT ads) ad account of the client's key (GET /v1/ad_account): only id, name, status, currency_code (the account currency), timezone when present; every other key is dropped and listed in raw_fields_dropped. Use it as a connection test before openai_ads_insights. Cached 300 s ("cached": true). With a registry, refused (account_mismatch) when the key answers for another account than the client's.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list; empty uses the only client (or the environment variables without a registry) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses the 300 s cache, the field-dropping behavior with raw_fields_dropped, and the account_mismatch refusal under a registry. These are concrete runtime traits the agent cannot get from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The value (returned fields) is front-loaded, followed by usage, caching, and refusal notes in compact clauses. Dense but each clause earns its place; could be marginally tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description enumerates the returned fields and their conditional presence (timezone when present), plus caching and failure modes. Combined with annotations covering the safety profile, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single client_id parameter is fully documented in the schema, so the description need not repeat it. The description adds no parameter syntax or format detail beyond what the schema provides, matching the 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?
States a specific resource (the OpenAI Ads ad account) and enumerates exactly what it returns: id, name, status, currency_code, timezone. It also clarifies its distinct role versus openai_ads_insights, so an agent can separate it from the other openai_ads_* 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?
'Use it as a connection test before openai_ads_insights' gives explicit when-to-use and names the natural follow-up tool. The account_mismatch refusal condition further signals when it won't work, though it stops short of stating when this tool is not the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_ads_ad_groupsOpenAI Ads ad groupsARead-onlyIdempotent
List the ad groups of one OpenAI Ads (ChatGPT ads) campaign (GET /v1/ad_groups?campaign_id=...): id, name,
status, bidding_config (billing_event_type, max_bid_micros in micros of the account currency),
created_at / updated_at. Reads up to limit rows (next_after while has_more). Names are third-party text.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | next_after (last_id) of a previous call to read the next rows; empty to start | |
| limit | No | Maximum rows returned (1 to 2500), over at most 5 pages of 500 | |
| order | No | Creation order: asc or desc; empty uses the API default | |
| before | No | first_id of a previous call to read the rows before it (one page); not with after | |
| client_id | No | Client id from clients_list; empty uses the only client (or the environment variables without a registry) | |
| campaign_id | Yes | Parent campaign id (from openai_ads_campaigns) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds real behavior: rows are read up to `limit` with next_after-driven paging while has_more, and names are flagged as third-party text (a useful untrusted-content warning). It omits rate limits and any auth/scoping caveats, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence delivers purpose, endpoint, returned fields, paging, and a data-provenance caveat with no filler. The field enumeration makes it dense, but each clause carries information an agent needs given no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by naming the returned fields and the paging cursor contract; client_id and order semantics are fully covered by the schema. Only minor gaps remain (no note on empty results or ordering defaults beyond what the schema 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%, so the baseline is 3, but the description adds semantics the schema does not: max_bid_micros is expressed in micros of the account currency, and next_after paging is described as a repeat-call pattern. That is meaningful clarification beyond the field 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?
Specific verb + resource + scope: 'List the ad groups of one OpenAI Ads (ChatGPT ads) campaign', with the underlying endpoint GET /v1/ad_groups?campaign_id=... . An agent can immediately distinguish this from openai_ads_campaigns (parents) and openai_ads_ads (children of an 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 scopes the call to a single parent campaign and the schema points campaign_id at openai_ads_campaigns, giving a clear entry condition. It stops short of naming alternatives or exclusions (e.g. 'for account-level inventory use openai_ads_account'), so it is clear context without explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_ads_adsOpenAI Ads adsARead-onlyIdempotent
List the ads of one OpenAI Ads (ChatGPT ads) ad group (GET /v1/ads?ad_group_id=...): id, name, status,
review_status (in_review, rejected, approved), creative (type, title, body, price, target_url, file_id),
created_at / updated_at. Reads up to limit rows (next_after while has_more). Names and creative texts are
third-party text.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | next_after (last_id) of a previous call to read the next rows; empty to start | |
| limit | No | Maximum rows returned (1 to 2500), over at most 5 pages of 500 | |
| order | No | Creation order: asc or desc; empty uses the API default | |
| before | No | first_id of a previous call to read the rows before it (one page); not with after | |
| client_id | No | Client id from clients_list; empty uses the only client (or the environment variables without a registry) | |
| ad_group_id | Yes | Parent ad group id (from openai_ads_ad_groups) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety bar is covered. The description adds real value beyond that: the pagination loop semantics (next_after while has_more) and the warning that names and creative texts are third-party text, which matters for an agent handling untrusted content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and endpoint are front-loaded, and the field list and pagination note follow compactly. The parenthetical-heavy single paragraph is dense but every clause carries information; slightly hard to scan but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by listing the returned fields and pagination behavior. Safety is covered by annotations, so nothing critical is missing for a read-only list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented. The description echoes the pagination and field behavior but contributes little parameter-specific detail beyond what the schema states (e.g. limit/pages, after/before already described there). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (ads of one OpenAI Ads ad group), gives the exact endpoint, and enumerates the returned fields. An agent can distinguish this from siblings like openai_ads_ad_groups or openai_ads_insights without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied via the pagination note ('Reads up to `limit` rows (next_after while has_more)') and the mention that ad_group_id comes from openai_ads_ad_groups. It never names an alternative tool or states when not to use this one, so guidance stays inferential.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_ads_applyApply a ChatGPT Ads (OpenAI) planADestructive
WRITE: apply a signed plan for ChatGPT Ads (OpenAI), after the user approved it. Pass plan_id, confirmation_token and confirm exactly as the plan_* tool returned them. Every lock is re-checked; ops run in order and stop at the first error; everything is journaled.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Confirmation string '<client_id>:<plan_id>:<digest8>' returned with the plan | |
| plan_id | Yes | Plan id returned by the plan_* tool | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| confirmation_token | Yes | confirmation_token returned by the plan_* tool, unchanged |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, readOnly=false, idempotent=false, but the description adds real behavioral detail beyond them: locks are re-checked, ops execute in order, execution halts at the first error, and every action is journaled. It stops short of stating irreversibility or recovery paths, which would be the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tightly packed block, front-loaded with the operation type and precondition, then parameter sourcing, then execution behavior. Every clause carries information and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive write tool with no output schema, it covers preconditions, parameter provenance, execution ordering, fail-fast behavior and audit journaling. It does not address error recovery or the relationship to rollback_plan, leaving a minor completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters, giving a baseline of 3. The description reinforces that plan_id, confirmation_token and confirm must be passed unchanged from the plan_* tool, but adds no syntax or format detail and ignores client_id entirely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('apply a signed plan'), names the platform (ChatGPT Ads/OpenAI), and prefixes the entry with 'WRITE:' so the operation type is unmistakable. It implicitly contrasts with the plan_* tools that produce the plan, letting an agent distinguish it from the other ~50 siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition ('after the user approved it') and tells the agent where the values come from ('exactly as the plan_* tool returned them'). It omits explicit exclusions and does not point to related siblings like rollback_plan or plan_get, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_ads_campaignsOpenAI Ads campaignsARead-onlyIdempotent
List the OpenAI Ads (ChatGPT ads) campaigns of the client's ad account (GET /v1/campaigns): id, name,
status (active, paused, archived), bidding_type, budget (daily_spend_limit_micros or
lifetime_spend_limit_micros, micros of the account currency), start_time / end_time (unix seconds), mode,
created_at / updated_at. Use the ids with openai_ads_ad_groups, openai_ads_insights or openai_ads_plan_pause.
Reads up to limit rows (next_after while has_more). Names are third-party text.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | next_after (last_id) of a previous call to read the next rows; empty to start | |
| limit | No | Maximum rows returned (1 to 2500), over at most 5 pages of 500 | |
| order | No | Creation order: asc or desc; empty uses the API default | |
| before | No | first_id of a previous call to read the rows before it (one page); not with after | |
| client_id | No | Client id from clients_list; empty uses the only client (or the environment variables without a registry) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered; the description adds value beyond that with pagination behavior ('Reads up to `limit` rows (next_after while has_more)') and data-shape caveats (budgets in micros of account currency, times in unix seconds, names are third-party text). It does not mention rate limits or auth/permission requirements, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource, then the returned fields, then pagination and the sibling hand-off. The field enumeration is a dense run-on sentence, but every clause carries information an agent can use; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the return-shape burden and does so fully: it lists the exposed fields and their units/formats, documents the pagination contract and the id hand-off to sibling tools. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds a meaningful tie-back the schema does not state: it links `limit` and `after` into a concrete pagination loop ('next_after while has_more') and explains that the budget value's unit is micros of the account currency. That is real semantic enrichment rather than restatement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the OpenAI Ads (ChatGPT ads) campaigns'), names the underlying endpoint, and enumerates the returned fields (id, name, status, bidding_type, budget in micros, start/end time, mode, timestamps). It is clearly distinguishable from sibling readers like openai_ads_ad_groups or openai_ads_insights.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent downstream: 'Use the ids with openai_ads_ad_groups, openai_ads_insights or openai_ads_plan_pause.' That gives clear when-to-use context for the returned ids and names the adjacent readers, though it never states when to prefer this listing over openai_ads_account or when not to call it (e.g., no client configured).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_ads_conversionsOpenAI Ads conversionsARead-onlyIdempotent
OpenAI Ads (ChatGPT ads) conversion insights (POST /v1/conversions/insights, a read query): goal conversions (click-through and view-through) and attributed order value per campaign, ad group or ad (entity_ids), or for the whole account (group_by_entity false), over whole days in the account timezone. Returns "rows" (null kept), recomputed "totals", "currency" (account_currency), "attribution" and "date_range". No pagination: more than 2000 rows answers too_many_rows (fewer entities, shorter period or fewer event_names). Warning: attributed event details may contain order or user identifiers; only documented aggregate fields are kept.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | Yes | Last day, YYYY-MM-DD (inclusive) | |
| breakdown | No | Optional breakdown: country or device; empty for none | |
| client_id | No | Client id from clients_list; empty uses the only client (or the environment variables without a registry) | |
| entity_ids | No | Ids of the entities of aggregation_level (1 to 100). Required when group_by_entity is true; must be empty when it is false | |
| start_date | Yes | First day, YYYY-MM-DD (whole days, 365 days at most) | |
| event_names | No | Optional exact event names for the event details (requires include_attributed_events; here at most 20 names of 64 characters among letters, digits, _ . : -, stricter than the API) | |
| group_by_entity | No | True (API default): one row per entity of entity_ids; false: one row for the whole ad account (no entity_ids) | |
| account_timezone | Yes | IANA timezone of the ad account, e.g. Europe/Paris (the timezone column of openai_ads_insights): the API counts whole days in it | |
| time_granularity | No | none: period totals; daily: one row per day | none |
| aggregation_level | Yes | Required row entity: campaign, ad_group or ad | |
| include_zero_rows | No | True (API default): keep rows without conversions | |
| attribution_time_basis | No | ad_event_time (API default) or conversion_time; empty sends nothing | |
| attribution_window_days | No | Click attribution window in days: 7, 14 or 30 | |
| include_attributed_events | No | True: add per-event aggregates (event_name, counts, value); may expose order or user identifiers, so only aggregate fields are kept | |
| view_through_attribution_window_days | No | View-through attribution window in days: 0 or 1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, but the description adds real behavioral detail beyond them: no pagination, a hard 2000-row cap that returns too_many_rows, and a data-handling warning that attributed event details may contain order or user identifiers with only documented aggregate fields kept. Auth needs and rate limits are not covered, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and endpoint, then layers scope, return shape, the row-limit failure mode, and the privacy warning in a single dense paragraph. Every clause carries information; nothing is padding despite the tool's 15 parameters.
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 15-parameter tool with no output schema, the description compensates by naming the return keys ('rows', 'totals', 'currency', 'attribution', 'date_range'), the null-row behavior, the pagination cap and its error, and the identifier exposure warning. An agent has everything needed to call it and interpret the result.
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 15 parameters and the baseline is 3. The description reinforces the entity_ids/group_by_entity relationship and the timezone whole-day counting, but adds little syntax or meaning beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('conversion insights', POST /v1/conversions/insights, a read query) and enumerates exactly what it returns: goal conversions (click-through/view-through) and attributed order value per campaign, ad group, ad, or whole account. This lets an agent distinguish it from the sibling openai_ads_insights without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scope ('conversion insights') implies when to reach for it versus a general insights tool, and the too_many_rows remedy ('fewer entities, shorter period or fewer event_names') is useful operational guidance. However, no sibling is named and no explicit when-to-use/when-not routing is given, so usage is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_ads_insightsOpenAI Ads insightsARead-onlyIdempotent
OpenAI Ads (ChatGPT ads) performance over a date range: impressions, clicks, spend, ctr, conversions and attributed sales for the ad account or one campaign, ad group or ad. Returns "rows" as reported (flat keys such as campaign_id; null kept, null_means "non calculable"), recomputed "totals" (roas = sum of sales / sum of spend), "currency" (from order_created_attributed_sales_currency, else None), "date_range" in the timezone returned by the API, "next_after" while has_more (reads up to max_rows rows over at most 5 pages), units (spend in major currency units, ctr ratio) and "attribution". No automatic retry.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Optional sort criteria in order: [{"field": "spend", "direction": "desc"}] (at most 5) | |
| after | No | next_after (last_id) of a previous call to read the next rows; empty to start | |
| level | No | Which endpoint: account = the whole ad account; campaign, ad_group or ad = one entity given by entity_id | account |
| before | No | first_id of a previous call to read the rows before it (one page); not with after | |
| fields | No | Canonical field names, e.g. impressions, clicks, spend, ctr, cpc, cpm, conversions, cpa, post_click_cvr, order_created_attributed_sales, order_created_attributed_sales_currency, order_created_roas, campaign.id, campaign.name, metadata.readable_time, metadata.timezone; empty for these metrics plus metadata.timezone | |
| filters | No | Optional filters, combined with AND: {"field": "campaign.id", "operator": "IN", "value": ["cmpn_1"]} or {"field": "ad.clicks", "operator": "GREATER_THAN" or "LESS_THAN", "value": 10} (at most 10) | |
| segment | No | Optional single segment: product, country, device or platform (request segment fields such as country.clicks) | |
| end_date | Yes | Last day, YYYY-MM-DD (inclusive) | |
| max_rows | No | Maximum rows returned by this call (1 to 6000), over at most 5 pages | |
| timezone | No | Optional IANA timezone of the day boundaries; empty uses the ad account timezone (keep empty for conversion or sales metrics, which require whole days in the account timezone) | |
| client_id | No | Client id from clients_list; empty uses the only client (or the environment variables without a registry) | |
| entity_id | No | Id of the campaign, ad group or ad (letters, digits, _ and -); empty for level account | |
| page_size | No | Rows per API page (1 to 2000) | |
| start_date | Yes | First day, YYYY-MM-DD | |
| time_granularity | No | none: one row per entity for the period; daily, monthly or hourly (hourly: about 30 days of history, not with a segment) | none |
| aggregation_level | No | Row entity inside the endpoint scope: ad_account, campaign, ad_group or ad; empty uses the endpoint level | |
| attribution_time_basis | No | ad_event_time (API default) or conversion_time; empty sends nothing | |
| attribution_window_days | No | Click attribution window in days: 7, 14 or 30 | |
| include_zero_impression_items | No | True: also return entities with zero impressions (only without a segment) | |
| view_through_attribution_window_days | No | View-through attribution window in days: 0 or 1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, but the description adds substantive behavior: rows are returned flat with nulls kept and a null_means of 'non calculable', totals are recomputed (roas = sum of sales / sum of spend), currency source, date_range in the API-returned timezone, next_after pagination bounded to max_rows over at most 5 pages, units (spend in major currency units, ctr as a ratio), and the explicit 'No automatic retry' note the agent must plan around.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause and every listed return element (rows, totals, currency, date_range, next_after, units, attribution) carries information. The second sentence is a long run-on string of comma-separated clauses, which slightly harms scannability but does not contain filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 20-parameter reporting tool with no output schema, the description carries the missing return-value burden well by naming the response keys, their semantics, currency/units, pagination limits and retry behavior. Combined with 100% schema coverage on inputs, an agent has what it needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 20 parameters with their enums, defaults and ranges; that sets the baseline at 3. The description reinforces a few of these (max_rows over 5 pages, null semantics, currency units) but adds little parameter meaning the schema does not already carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource+scope: 'OpenAI Ads (ChatGPT ads) performance over a date range: impressions, clicks, spend, ctr, conversions and attributed sales for the ad account or one campaign, ad group or ad.' The metric list and entity scope cleanly separate it from sibling entity-listing tools like openai_ads_campaigns/ad_groups/ads and from openai_ads_conversions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete conditional constraints — timezone should stay empty for conversion/sales metrics, hourly is 'not with a segment', include_zero_impression_items works 'only without a segment', and before is 'not with after'. However, it never routes the agent to or away from sibling tools (e.g. openai_ads_conversions, meta_insights), so the when-not/alternatives bar for a 5 is not met.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_ads_plan_budget_changePlan an OpenAI Ads budget changeARead-only
PLAN (nothing is written): set the daily budget (daily_spend_limit_micros) of one OpenAI Ads campaign. Financial: the client's cap, currency and +20 %/24 h locks apply and the user must approve it out of band (google-ecommerce-mcp approve). Lifetime budgets are refused. LOCAL dry-run only. Apply with openai_ads_apply; rollback restores the previous daily budget. An OpenAI Ads key cannot be read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list; empty uses the only client | |
| campaign_id | Yes | Campaign id (from openai_ads_campaigns); it must have a daily budget | |
| daily_budget_micros | Yes | New daily budget in micros of the account currency (1000000 = 1 unit); capped by the client's policy |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover safety hints (readOnly true, destructive false, idempotent false); the description goes well beyond them by disclosing the financial cap, currency handling, the +20%/24h rate lock, the out-of-band approval requirement, the lifetime-budget refusal, and the LOCAL dry-run plus rollback semantics. That is exactly the behavioral context an agent needs before invoking a financial planner.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the key fact (PLAN, nothing written) and keeps the rest dense but purposeful; every clause (financial cap, approval, apply, rollback) carries information. Slightly telegraphic run-on style, but no wasted 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?
No output schema exists, so the description carries the return-shape burden; it implies a plan artifact consumed by openai_ads_apply/rollback but does not say what the plan returns or how plan_get/plan_list relate to it. For a dry-run financial planner the behavioral coverage is otherwise strong.
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 financial context (client cap, currency) that helps interpret daily_budget_micros, but it also refers to the field as 'daily_spend_limit_micros' while the schema names it 'daily_budget_micros', a minor naming mismatch rather than added precision.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (PLAN/set) and resource (daily budget of one OpenAI Ads campaign), and immediately frames it as a non-writing operation. The platform-qualified name and the explicit 'nothing is written' clause distinguish it cleanly from sibling planners like gads_plan_budget_change and meta_plan_budget_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?
Gives clear context and exclusions: lifetime budgets are refused, apply happens via openai_ads_apply, rollback restores the previous daily budget, and approval is out of band. It stops short of explicitly naming which sibling planner to use for a different ad platform, but the platform is unambiguous from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_ads_plan_create_campaignPlan an OpenAI Ads campaign (paused)ARead-only
PLAN (nothing is written): create one OpenAI Ads campaign, always with an explicit status "paused" and an explicit start_time, and a daily budget (no targeting, no bidding, no product feed). Financial: cap and currency locks plus an out-of-band human approval. LOCAL dry-run only. Apply with openai_ads_apply; activate it in the ChatGPT Ads interface once its ad groups and ads are ready. An OpenAI Ads key cannot be read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Campaign name, 3 to 1000 characters | |
| end_time | No | Optional end, unix seconds after start_time | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| start_time | Yes | Explicit start, unix seconds (required: without it a campaign delivers as soon as it is active) | |
| description | No | Optional description (1000 characters at most) | |
| daily_budget_micros | Yes | Daily budget in micros of the account currency (1000000 = 1 unit); capped by the client's policy |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the dry-run claim is consistent rather than novel. The description still adds real context: it never writes, a start_time is mandatory because otherwise delivery begins on activation, and financial guards (budget caps, currency locks, out-of-band human approval) apply. The financial clause is compressed to the point of ambiguity, which keeps this from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the key fact ('PLAN (nothing is written)') and dense with useful content, but the line breaks fragment phrases mid-clause and the trailing sentence 'An OpenAI Ads key cannot be read-only' is cryptic and only loosely relevant.
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 planner tool with annotations covering the safety profile, a 100% documented schema and no output schema, the description supplies the workflow (plan -> apply -> activate in UI) and the constraints an agent needs. It does not say what the plan artifact returns, but plan_get/plan_list cover 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 description coverage is 100%, so the baseline is 3, and the description adds scope meaning on top: status is always 'paused' (not a parameter), and no targeting/bidding/product-feed parameters exist. It does not clarify budget micros semantics beyond the schema, so it stays at a solid 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?
States a specific verb and resource ('PLAN ... create one OpenAI Ads campaign') and immediately scopes it ('nothing is written', 'LOCAL dry-run only'). This separates it from openai_ads_apply and the other openai_ads_plan_* siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the downstream alternative explicitly ('Apply with openai_ads_apply') and gives the condition for the next step ('activate it in the ChatGPT Ads interface once its ad groups and ads are ready'). It also states what is out of scope (no targeting, no bidding, no product feed).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_ads_plan_pausePlan an OpenAI Ads pauseARead-only
PLAN (nothing is written): pause OpenAI Ads (ChatGPT ads) campaigns, ad groups or ads. Reads each entity (archived ones are refused, already paused ones are skipped), checks the client's write policy, runs a LOCAL dry-run (the unit endpoints have no validate_only) and returns the plan with confirmation_token and confirm; apply it with openai_ads_apply after the user agreed. Rollback reactivates what was active (that rollback spends money: allow_activate and a human approval). Note: an OpenAI Ads key cannot be read-only; only this server's policy guards writes.
| Name | Required | Description | Default |
|---|---|---|---|
| level | Yes | What to pause: campaign, ad_group or ad | |
| client_id | No | Client id from clients_list; empty uses the only client | |
| entity_ids | Yes | Ids of the entities to pause (1 to 25), from openai_ads_campaigns / openai_ads_ad_groups / openai_ads_ads |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the local dry-run because 'the unit endpoints have no validate_only', the archived-refusal and paused-skip behavior, the confirmation_token/confirm handshake, the cost-bearing rollback with its approval requirement, and the caveat that this server's write policy — not the key — guards writes. That last note is essential context the structured fields never supply.
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?
Dense but front-loaded: the PLAN/read-only guarantee leads, then the flow, then caveats. Every clause carries operational content. It is packed close to the limit for a single paragraph, which is why it lands at 4 rather than 5.
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 multi-step plan/apply workflow with no output schema, the description supplies the return shape (plan with confirmation_token and confirm), the apply step, the rollback semantics and the policy caveat. An agent has everything needed to call and sequence this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so level, client_id and entity_ids are already fully documented in the schema (including the 1-25 bound and the source list tools). The description adds no syntax or format detail beyond that, so the baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'PLAN (nothing is written): pause OpenAI Ads campaigns, ad groups or ads.' The uppercase PLAN signal and the explicit 'nothing is written' framing distinguish it cleanly from the openai_ads_apply sibling that actually performs the write.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: plan first, then 'apply it with openai_ads_apply after the user agreed'. Also states edge-case handling (archived refused, already-paused skipped) and the rollback path including the extra prerequisites (allow_activate + human approval). Nothing about when/when-not is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pagespeedPageSpeed InsightsARead-onlyIdempotent
Lighthouse performance and SEO scores (0 to 100) plus LCP, CLS and TBT for a URL, and the Chrome UX Report field category when Google has real-user data. Set PAGESPEED_API_KEY to avoid the shared anonymous quota.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Full public URL to test | |
| strategy | No | Device profile Lighthouse emulates | mobile |
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, open-world and non-destructive, so the safety profile is covered. The description adds real behavioral value beyond them: a quota/rate-limit mechanism (shared anonymous quota, mitigated by PAGESPEED_API_KEY) and the conditional nature of CRUX field data ('when Google has real-user data'). It stops short of noting the long run-time typical of Lighthouse audits.
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 dense sentences, front-loaded with what the tool returns and followed by the one operational caveat. No filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile, a fully documented schema and no output schema to explain, the description covers purpose, quota behavior and CRUX availability. The main missing piece for correct invocation is expectation-setting about result latency, which matters for a remote Lighthouse audit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (url, strategy with its mobile/desktop enum, client_id) are fully documented in the schema. The description adds no parameter-level detail, such as what the mobile/desktop default means for interpretation, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (a URL's PageSpeed/Lighthouse audit) and enumerates exactly what comes back: performance and SEO scores 0-100 plus LCP, CLS, TBT and CRUX field data. No sibling tool covers a URL's Lighthouse audit, so an agent can route here unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the output description and by the PAGESPEED_API_KEY note, which tells the agent how to avoid the shared anonymous quota. However, there is no explicit when-to-use guidance, no comparison to nearby siblings like gsc_inspect_url or indexing_status, and no stated prerequisite (public URL) beyond what the schema already requires.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_getShow a write planARead-onlyIdempotent
Show a stored write plan (ops, risk, changes, requests masked, status). Never returns its token.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes | Plan id returned by the plan_* tool | |
| client_id | No | Client id from clients_list; empty uses the only client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower. The description still adds real behavioral value: it discloses that requests are masked and that the token is never returned, which are security-relevant traits not captured by 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?
A single sentence with the core action front-loaded and the return contents compactly parenthesized. 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?
With no output schema, the description usefully carries the burden of describing return fields and the withheld token. It is complete enough to invoke correctly, though it could say more about status values or failure modes.
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 plan_id and client_id fully. The description adds no syntax or format detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Show) and resource (a stored write plan) and enumerates the returned contents (ops, risk, changes, requests masked, status). It is clearly a by-id retrieval, distinct from plan_list, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance and does not distinguish itself from plan_list or rollback_plan. The only hint of a precondition (plan_id comes from a plan_* tool) lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_listList write plansBRead-onlyIdempotent
List the newest write plans of a client (id, platform, title, status, expiry).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of entries to return | |
| client_id | No | Client id from clients_list; empty uses the only client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, and closed-world behavior. The description adds useful behavioral context by stating that results are the newest plans and by naming the returned fields, but it does not cover pagination, auth requirements, or rate limits beyond what the schema already provides.
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 wasted words. The parenthetical return-field list is compact and useful given the absence of an output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with annotations covering safety and a fully described schema, the description is mostly complete: it states resource, scope, ordering, and returned fields. It could be stronger by clarifying when to prefer plan_get or how results relate to apply/rollback workflows.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already well documented in the schema. The description does not add syntax, defaulting, or filtering semantics beyond what the schema provides, so the 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 uses a clear verb and resource ('List the newest write plans') and identifies the scope ('of a client') plus returned fields. It clearly distinguishes listing from plan_get or the various plan creation/apply siblings, though it does not explicitly name those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use plan_list versus plan_get, rollback_plan, or the many plan mutation tools. The description implies a listing use case, but leaves the agent to infer where it fits in the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rollback_planPlan a rollbackARead-only
Build a NEW plan undoing what plan_id applied (nothing is written; apply it like any plan).
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes | Plan id returned by the plan_* tool | |
| client_id | No | Client id from clients_list; empty uses the only client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint=true and destructiveHint=false, the description adds useful context by saying 'nothing is written' and that the resulting plan must be applied separately. This reinforces the non-mutating nature and clarifies the two-step rollback workflow beyond what the annotations alone 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?
The description is a single front-loaded sentence with no filler. Every clause contributes to understanding what the tool does and how it fits into the plan/apply workflow.
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 two-parameter plan-building tool, the description supplies the critical behavioral context: it creates a new plan, writes nothing, and must be applied separately. It does not describe the return value explicitly, but 'Build a NEW plan' sufficiently implies that a plan object is produced.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both plan_id and client_id are already documented in the schema. The description reinforces that plan_id refers to the plan being undone, but adds no syntax or client_id guidance beyond the structured fields, matching 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 states a specific action ('Build a NEW plan') and resource ('undoing what plan_id applied'), making clear this creates a rollback plan rather than applying one. The phrase 'apply it like any plan' distinguishes it from apply tools and clarifies its role among plan-building 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?
It explains the immediate workflow: use this to build a plan, then apply it like any other plan. It does not explicitly name alternatives such as plan_get or plan_list, but the operational context is clear enough for an agent to know when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_statusServer statusARead-onlyIdempotent
Which Google services are configured for this server (or for one client), and whether the stored OAuth token works. Call it first when another tool answers not_configured or not_authenticated. Returns one boolean per service, the token storage (os-keyring or file), "token": "ok" or the error, and the package version.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so the safety profile is covered. The description goes further by disclosing the return payload: one boolean per service, the token storage backend (os-keyring or file), token 'ok' or the error, and the package version. It does not mention auth/permission prerequisites, but the added output detail is genuine context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose first, then the trigger condition, then the return shape. Every sentence carries distinct information and nothing is repeated from the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description enumerates what is returned, and with a single optional parameter fully documented in the schema and annotations covering the safety profile, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and client_id is fully documented in the schema itself (required when several clients are registered, empty falls back to the only client or env vars). The description only gestures at this with '(or for one client)', adding little beyond structured data. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific diagnostic purpose: which Google services are configured for the server or a single client, plus whether the stored OAuth token works. This is clearly distinguishable from the many action/report siblings (ga4_report, meta_insights, gads_query), which all operate on resources rather than server configuration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit, actionable trigger: 'Call it first when another tool answers not_configured or not_authenticated.' That is stronger than implied usage. It stops short of naming or contrasting an alternative (e.g. client_check, clients_list), so it is clear context without explicit exclusions.
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.
4 tool updates
v0.6.0- Added
ga4_compare - Added
ga4_key_event_audit - Added
gsc_moves - Added
gsc_opportunities
78 tool updates
v0.5.0- Changed
ads_overview1 field changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list; empty uses the only client. Only that client's platforms are added up", + "title": "Client Id" +}
- Added
audit_log - Added
client_check - Added
client_profile - Added
clients_list - Added
ga4_custom_definitions - Added
ga4_key_events - Added
ga4_plan_custom_dimension_create - Added
ga4_plan_key_event_create - Changed
ga4_properties1 field changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry)", + "title": "Client Id" +}
- Changed
ga4_realtime2 fields changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry)", + "title": "Client Id" +} - changed
Input schema / properties / property_id / descriptionPrevious value: -"Numeric GA4 property id, as listed by ga4_properties; empty uses the configured GA4_PROPERTY_ID"New value: +"Numeric GA4 property id, as listed by ga4_properties; empty uses the configured GA4_PROPERTY_ID (or the client's property)"
- Changed
ga4_report2 fields changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry)", + "title": "Client Id" +} - changed
Input schema / properties / property_id / descriptionPrevious value: -"Numeric GA4 property id, as listed by ga4_properties; empty uses the configured GA4_PROPERTY_ID"New value: +"Numeric GA4 property id, as listed by ga4_properties; empty uses the configured GA4_PROPERTY_ID (or the client's property)"
- Changed
gads_accounts1 field changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list; empty uses the only client", + "title": "Client Id" +}
- Added
gads_apply - Added
gads_conversion_actions - Changed
gads_performance2 fields changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list; empty uses the only client", + "title": "Client Id" +} - changed
Input schema / properties / customer_id / descriptionPrevious value: -"Google Ads customer id (digits, dashes allowed), as listed by gads_accounts; empty uses the configured GADS_CUSTOMER_ID"New value: +"Google Ads customer id (digits, dashes allowed), as listed by gads_accounts; empty uses the client's (or GADS_CUSTOMER_ID)"
- Added
gads_plan_add_negatives - Added
gads_plan_budget_change - Added
gads_plan_create_campaign - Added
gads_plan_pause_entities - Changed
gads_query2 fields changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list; empty uses the only client", + "title": "Client Id" +} - changed
Input schema / properties / customer_id / descriptionPrevious value: -"Google Ads customer id (digits, dashes allowed), as listed by gads_accounts; empty uses the configured GADS_CUSTOMER_ID"New value: +"Google Ads customer id (digits, dashes allowed), as listed by gads_accounts; empty uses the client's (or GADS_CUSTOMER_ID)"
- Added
google_apply - Changed
gsc_inspect_url2 fields changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry)", + "title": "Client Id" +} - added
Input schema / properties / site_urlAdded value: +{ + "default": "", + "description": "Search Console property, e.g. sc-domain:example.com or https://www.example.com/; empty uses the configured GSC_SITE_URL (or the client's site). With a client registry it must be one of the client's sites", + "title": "Site Url", + "type": "string" +}
- Changed
gsc_performance3 fields changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry)", + "title": "Client Id" +} - added
Input schema / properties / search_typeAdded value: +{ + "default": "web", + "description": "Search type (sent to Google as `type`): web, image, video, news, discover or googleNews", + "enum": [ + "web", + "image", + "video", + "news", + "discover", + "googleNews" + ], + "title": "Search Type", + "type": "string" +} - added
Input schema / properties / site_urlAdded value: +{ + "default": "", + "description": "Search Console property, e.g. sc-domain:example.com or https://www.example.com/; empty uses the configured GSC_SITE_URL (or the client's site). With a client registry it must be one of the client's sites", + "title": "Site Url", + "type": "string" +}
- Added
gsc_plan_sitemap_submit - Changed
gsc_sitemaps2 fields changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry)", + "title": "Client Id" +} - added
Input schema / properties / site_urlAdded value: +{ + "default": "", + "description": "Search Console property, e.g. sc-domain:example.com or https://www.example.com/; empty uses the configured GSC_SITE_URL (or the client's site). With a client registry it must be one of the client's sites", + "title": "Site Url", + "type": "string" +}
- Added
gsc_sites - Added
gtm_get_tag - Added
gtm_get_trigger - Added
gtm_get_variable - Changed
gtm_inventory1 field changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry)", + "title": "Client Id" +}
- Added
gtm_plan_quick_preview - Added
gtm_plan_tag_upsert - Added
gtm_plan_trigger_upsert - Added
gtm_plan_variable_upsert - Added
gtm_plan_workspace_create - Added
gtm_versions - Added
gtm_workspace_status - Changed
indexing_status1 field changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry)", + "title": "Client Id" +}
- Added
merchant_account_issues - Changed
merchant_data_sources1 field changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry)", + "title": "Client Id" +}
- Added
merchant_plan_product_patch - Changed
merchant_product_issues1 field changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry)", + "title": "Client Id" +}
- Added
merchant_products - Changed
merchant_report_query1 field changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry)", + "title": "Client Id" +}
- Changed
meta_ad_accounts1 field changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list; empty uses the only client", + "title": "Client Id" +}
- Added
meta_ads_list - Added
meta_adsets - Added
meta_apply - Added
meta_campaigns - Added
meta_catalog_diagnostics - Added
meta_catalog_products - Added
meta_dataset_quality - Added
meta_eco_plan_catalog_item_update - Added
meta_ig_insights - Changed
meta_insights1 field changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list; empty uses the only client", + "title": "Client Id" +}
- Added
meta_page_insights - Added
meta_pixel_health - Added
meta_plan_budget_change - Added
meta_plan_create_ad - Added
meta_plan_create_adset - Added
meta_plan_create_campaign - Added
meta_plan_pause - Changed
openai_ads_account1 field changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list; empty uses the only client (or the environment variables without a registry)", + "title": "Client Id" +}
- Added
openai_ads_ad_groups - Added
openai_ads_ads - Added
openai_ads_apply - Added
openai_ads_campaigns - Changed
openai_ads_conversions1 field changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list; empty uses the only client (or the environment variables without a registry)", + "title": "Client Id" +}
- Changed
openai_ads_insights1 field changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list; empty uses the only client (or the environment variables without a registry)", + "title": "Client Id" +}
- Added
openai_ads_plan_budget_change - Added
openai_ads_plan_create_campaign - Added
openai_ads_plan_pause - Changed
pagespeed1 field changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry)", + "title": "Client Id" +}
- Added
plan_get - Added
plan_list - Added
rollback_plan - Changed
server_status1 field changed- added
Input schema / properties / client_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Client id from clients_list. Required when several clients are registered; empty uses the only client (or the environment variables when there is no client registry)", + "title": "Client Id" +}
9 tool updates
v0.4.0- Added
ads_overview - Added
gads_accounts - Added
gads_performance - Added
gads_query - Added
meta_ad_accounts - Added
meta_insights - Added
openai_ads_account - Added
openai_ads_conversions - Added
openai_ads_insights
4 tool updates
v0.3.0- Added
ga4_properties - Changed
ga4_realtime1 field changed- added
Input schema / properties / property_idAdded value: +{ + "default": "", + "description": "Numeric GA4 property id, as listed by ga4_properties; empty uses the configured GA4_PROPERTY_ID", + "title": "Property Id", + "type": "string" +}
- Changed
ga4_report2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum rows returned (1 to 1000)"New value: +"Maximum rows returned (1 to 1000); totals always cover every row" - added
Input schema / properties / property_idAdded value: +{ + "default": "", + "description": "Numeric GA4 property id, as listed by ga4_properties; empty uses the configured GA4_PROPERTY_ID", + "title": "Property Id", + "type": "string" +}
- Changed
gsc_performance2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum rows returned (1 to 1000)"New value: +"Maximum rows returned (1 to 1000); totals always cover the whole property" - changed
Input schema / properties / start_date / descriptionPrevious value: -"YYYY-MM-DD; empty means 30 days ago"New value: +"YYYY-MM-DD; empty means 30 days ago (Pacific Time)"
8 tool updates
v0.1.2- Changed
ga4_realtime2 fields changed- added
Input schema / properties / dimensions / descriptionAdded value: +"GA4 realtime dimensions, e.g. unifiedScreenName, country, deviceCategory" - added
Input schema / properties / metrics / descriptionAdded value: +"GA4 realtime metrics, e.g. activeUsers, screenPageViews, eventCount"
- Changed
ga4_report8 fields changed- added
Input schema / properties / channel_group / descriptionAdded value: +"Optional exact filter on sessionDefaultChannelGroup, e.g. 'Organic Search'; empty for all channels" - added
Input schema / properties / dimensions / descriptionAdded value: +"GA4 API dimension names, e.g. sessionDefaultChannelGroup, landingPage, sessionSource, yearMonth, itemName" - added
Input schema / properties / end_date / descriptionAdded value: +"YYYY-MM-DD, NdaysAgo, yesterday or today" - added
Input schema / properties / limit / descriptionAdded value: +"Maximum rows returned (1 to 1000)" - added
Input schema / properties / limit / maximumAdded value: +1000 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / metrics / descriptionAdded value: +"GA4 API metric names, e.g. sessions, totalUsers, ecommercePurchases, purchaseRevenue, keyEvents" - added
Input schema / properties / start_date / descriptionAdded value: +"YYYY-MM-DD, NdaysAgo, yesterday or today"
- Changed
gsc_inspect_url1 field changed- added
Input schema / properties / url / descriptionAdded value: +"Full URL to inspect; must belong to the configured Search Console property"
- Changed
gsc_performance8 fields changed- added
Input schema / properties / dimensions / descriptionAdded value: +"How to split the results" - added
Input schema / properties / dimensions / items / enumAdded value: +[ + "query", + "page", + "country", + "device", + "date", + "searchAppearance" +] - added
Input schema / properties / end_date / descriptionAdded value: +"YYYY-MM-DD; empty means 2 days ago (Search Console data lag)" - added
Input schema / properties / limit / descriptionAdded value: +"Maximum rows returned (1 to 1000)" - added
Input schema / properties / limit / maximumAdded value: +1000 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / page_contains / descriptionAdded value: +"Optional: keep only pages whose URL contains this text" - added
Input schema / properties / start_date / descriptionAdded value: +"YYYY-MM-DD; empty means 30 days ago"
- Changed
indexing_status1 field changed- added
Input schema / properties / url / descriptionAdded value: +"Full URL to look up"
- Changed
merchant_product_issues7 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum products returned (1 to 1000)" - added
Input schema / properties / limit / maximumAdded value: +1000 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / max_pages / descriptionAdded value: +"Pages of 250 products to scan at most" - added
Input schema / properties / max_pages / maximumAdded value: +200 - added
Input schema / properties / max_pages / minimumAdded value: +1 - added
Input schema / properties / only_with_issues / descriptionAdded value: +"True: only products with at least one issue; False: every product"
- Changed
merchant_report_query1 field changed- added
Input schema / properties / query / descriptionAdded value: +"Merchant Center Query Language (MCQL) statement. Tables include product_view (must select id) and product_performance_view (clicks, impressions by date or offer)"
- Changed
pagespeed3 fields changed- added
Input schema / properties / strategy / descriptionAdded value: +"Device profile Lighthouse emulates" - added
Input schema / properties / strategy / enumAdded value: +[ + "mobile", + "desktop" +] - added
Input schema / properties / url / descriptionAdded value: +"Full public URL to test"
12 tool updates
v0.1.0- First observed
ga4_realtime - First observed
ga4_report - First observed
gsc_inspect_url - First observed
gsc_performance - First observed
gsc_sitemaps - First observed
gtm_inventory - First observed
indexing_status - First observed
merchant_data_sources - First observed
merchant_product_issues - First observed
merchant_report_query - First observed
pagespeed - First observed
server_status
TDQS
Scored across 82 tools
Many tools are clearly distinct within a platform, but the set has numerous analogous reporting tools across platforms (e.g. ga4_report/ga4_compare/ga4_realtime, gsc_performance/gsc_opportunities/gsc_moves, multiple *_insights) and many parallel plan tools that an agent must map correctly. Descriptions are detailed and usually disambiguate individual tools, but the sheer breadth and cross-platform parallels create real selection risk.
Predominantly consistent platform-prefixed snake_case (ga4_, gads_, gsc_, gtm_, meta_, merchant_, openai_ads_) with clear plan_/apply/rollback patterns. Minor inconsistencies exist: google_apply bundles GA4/GSC/Merchant/GTM while Meta and OpenAI have their own apply, and meta_eco_plan_catalog_item_update is an outlier, but overall the convention is predictable.
82 tools is far above the healthy 3-15 band and well into the 'too many' range; even for a multi-platform server, the cognitive load is high. Each tool may earn its place logically, but the count is excessive and will strain an agent's tool selection.
The surface covers read, plan, apply, rollback and audit across GA4, Google Ads, GSC, GTM, Merchant, Meta and OpenAI Ads. Some lifecycle gaps exist (e.g. Meta ad group/creative creation, Google Ads keyword/ad creation, Merchant product insert/delete), but these appear deliberate and workarounds exist (e.g. platform UI, plan tools).
Maintenance
Related MCP Connectors
SEO & marketing toolkit for AI agents: GA4, Search Console, AdSense, GTM, PageSpeed, Trends.
Read-only Google Search Console and Google Analytics for AI agents.
Google Ads, GA4, Search Console and Tag Manager for AI assistants. Every change is proposed first.
Read-only Google Search Console, Bing Webmaster Tools and privacy-friendly analytics for your AI.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to manage Google Tag Manager, Google Search Console, and Google Analytics (GA4) through unified access to tags, search performance data, URL inspection, sitemaps, and analytics reporting.8 npmISC
- AlicenseAqualityAmaintenanceProvides AI agents with read-only access to Google Search Console data, including search analytics, index coverage, and sitemap status. It enables users to query clicks, impressions, and ranking performance or check URL indexing status through natural language.466 npm9MIT
- AlicenseBqualityCmaintenanceProvides AI agents with hands-on control of Google SEO and analytics tools including Search Console, GA4, Tag Manager, Indexing API, and PageSpeed Insights, with self-configuring OAuth2.3312 npmMIT
- AlicenseAqualityDmaintenanceConnects Google Search Console to AI assistants, enabling natural language analysis of SEO data. Provides read-only tools for properties, search analytics, URL inspection, and sitemaps.15MIT