Skip to main content
Glama

Server Details

Ad results, CRM revenue and account alerts for AI assistants. Meta changes are previewed first.

Ownership verified
Status
Healthy
Uptime
84.9% over 20 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
DenysVolynskyi/variafy-plugins
GitHub Stars
0
ChatGPT
–
Claude
–

TDQS

A3.6/5.0

Scored across 33 tools

Disambiguation3/5

Several tools overlap substantially: get_insights, meta_ads_read, performance_dashboard, performance_overview, audit_account, get_advice, and revenue_report all answer adjacent questions about performance, while build_campaign competes with meta_ads_create's create_campaign operation. The lengthy descriptions do provide use-case guidance, but the agent must parse a lot of text to avoid misselection.

Naming Consistency3/5

Platform routers follow a clear platform_ads_action pattern (meta_ads_read, google_ads_create, tiktok_ads_update), but many standalone tools mix noun and verb styles: billing, usage, performance_dashboard, start_here, audit_account, get_advice. Everything is snake_case and readable, yet there is no single predictable convention across the full set.

Tool Count2/5

There are 33 top-level tools, and several routers expand into dozens of internal operations, making the selection surface very large for an agent. The breadth reflects a genuinely broad ad-management product, but it exceeds a well-scoped tool set and creates a heavy routing burden.

Completeness3/5

Read, audit, reporting, and monitoring coverage is very strong across Meta, Google Ads, GA4, Search Console, LinkedIn, Microsoft, and TikTok, and Meta/TikTok have meaningful write operations. However, Google Ads create/update/delete only manage this server's monitors rather than actual Google Ads objects, while LinkedIn and Microsoft are read-only and TikTok lacks campaign-creation operations, leaving notable gaps in cross-platform management.

Available Tools

33 tools
audit_accountAd account auditA
Read-onlyIdempotent
Inspect

Audit the whole ad account in one call: account status, ads Meta rejected, tracking, Learning limited ad sets, ads spending without results, creative fatigue, a rise in cost per result over a recent week and missing data — each finding with its numbers and the next step. Reads, in one call and read-only: the ad account itself (status, account spending limit, default DSA payer and beneficiary); the ads that are on in running campaigns but rejected in Meta’s review or stopped by a delivery issue, with Meta’s reasons — an ad set left with nothing to deliver that spent or was changed in the last 7 days is high; the ads with spend in the 14 days ending yesterday — the same read and rules as the daily advice; the active ad sets with Meta’s learning status; the conversion tracking of the pixel most active ad sets optimise for — the same checks as audit_conversion_tracking; creative fatigue — the same scoring as detect_creative_fatigue on the same 14 days, counting only ads whose frequency reached three quarters of its bar, when the request budget allows; the cost per result of the 7 days that end three days ago against the 30 days before them (the two latest days still collect results and are left out), by campaign and named by the result the campaigns optimise for, when the request budget allows — reported only when it rose beyond chance by 25% or more (40% is high), with how much of the rise the campaigns themselves made, the campaign that pushed it up most and, when the budget allows, that campaign's edits from Meta's change history; and, from what this account already sent in, payments, leads, the CRM and the link tags of the ads. Returns findings ordered by severity (high, medium, low), each with evidence and a next step; what is fine; what could not be checked and why; the money received; and the latest daily advice for this ad account. Running ads that spent enough to expect four results at the account’s own cost per result and got none are counted in full, not cut to three as in the daily advice. At most 15 Meta requests: a check the request budget does not allow is named under what could not be checked; when Meta’s limit, a temporary Meta failure or the request cap stops a read midway, the answer is also marked partial. Read-only and free: changes nothing and does not count toward the monthly change limit. An identical read within 30 seconds may return the same data (see data_age_seconds).

NameRequiredDescriptionDefault
pixel_idNoPixel to check when the ad account has several. Default: the pixel most of the active ad sets optimise for.
connectionNoWhich connected ad account to use: the connection id from start_here or the ad account number (act_123 or 123). Needed only when several ad accounts are connected.

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/destructive=false, but the description adds substantial behavioral context beyond them: a hard cap of at most 15 Meta requests, the request-budget mechanism, partial-answer marking when Meta limits or fails, caching behavior within 30 seconds via data_age_seconds, and that it is free and does not count toward the monthly change limit. This is exactly the kind of operational transparency an agent needs for a heavy multi-check read.

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

Conciseness2/5

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

The summary front-loads the purpose well, but the body is a single sprawling run-on paragraph packing every check, threshold, and edge case into one dense block. Large stretches (e.g. the embedded cost-per-result window arithmetic) are hard to parse and would be better as structured bullets. It is informative but far from concise, and structure works against readability.

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

Completeness4/5

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

For a high-complexity, multi-check audit with no output schema, the description covers returns in prose (findings ordered by severity with evidence and next steps, what is fine, what could not be checked, money received, latest advice) and explains budget-driven partial results. This is close to complete, with only the sheer density leaving minor risk of a missed constraint rather than any missing category.

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

Parameters3/5

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

Schema description coverage is 100% for the two parameters, so the schema already documents pixel_id and connection fully. The description only indirectly touches parameter meaning by describing 'the pixel most active ad sets optimise for', matching the schema's default note. Baseline 3 is appropriate when the schema carries the parameter documentation.

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

Purpose5/5

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

The opening sentence states a specific verb+resource (audit the whole ad account in one call) and enumerates the exact checks performed, from rejected ads to creative fatigue to cost-per-result trends. It actively distinguishes itself from siblings by naming audit_conversion_tracking and detect_creative_fatigue and noting it reuses their rules. An agent can immediately tell what this tool returns and how it differs from narrower audit tools.

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

Usage Guidelines4/5

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

The description makes the selection context clear: this is the one-call whole-account audit that bundles the same reads as audit_conversion_tracking plus other checks. That strongly implies 'prefer this for a full sweep, use the narrower tools for a single check', but it never states an explicit when-not or 'use X instead when Y' rule. 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.

audit_conversion_trackingConversion tracking auditA
Read-onlyIdempotent
Inspect

Check whether the conversion events the active ad sets optimise for are actually arriving. Reads the pixels of the ad account, the active ad sets with the event each one optimises for, the pixel fires of the last 168 hours (browser and server-side), the dataset quality Meta reports for the pixel, the custom conversions those ad sets use, and a day-by-day trend of recorded actions over the lookback window. Returns a health score from 0 to 100 with a grade, the weighted checks it is made of, the ad sets with their events and budgets, and findings in plain words. status "incomplete" means a check could not be run; a pixel that is read but silent is a failed check, not an incomplete audit. With no active ad set there is no score at all, because there is nothing optimising for an event. Read-only and free: changes nothing and does not count toward the monthly change limit. An identical read within 30 seconds may return the same data (see data_age_seconds).

NameRequiredDescriptionDefault
end_dateNoLast day of an explicit window, YYYY-MM-DD, in the ad account time zone. Needs start_date.
pixel_idNoWhich pixel to audit, from list_pixels. Needed only when the ad account has several.
raw_dataNotrue returns the measured numbers only: no severity, scores, recommendations or quick_actions.
connectionNoWhich connected ad account to use: the connection id from start_here or the ad account number (act_123 or 123). Needed only when several ad accounts are connected.
date_rangeNoWindow as a named range. Ignored when start_date and end_date are given.
start_dateNoFirst day of an explicit window, YYYY-MM-DD, in the ad account time zone. Needs end_date.
lookback_daysNoWindow of the event trend in days: 7, 14, 30, 60 or 90. Default 30.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations declare readOnlyHint, idempotentHint, and non-destructive, but the description adds substantial context beyond them: the 30-second caching behavior with data_age_seconds, the 'incomplete' status semantics, the distinction between a silent pixel (failed check) and an incomplete audit, the absence of a score when no active ad set exists, and that it doesn't count toward the monthly change limit. This is rich behavioral disclosure that annotations alone don't provide.

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

Conciseness4/5

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

The description is a single, dense paragraph that front-loads the core purpose and then layers in behavioral details. It's efficient and every sentence adds value, though the sentence describing all the data it reads is somewhat long and could be tightened.

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

Completeness4/5

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

With no output schema, the description adequately describes the return values (health score, grade, weighted checks, ad sets, findings, status) and covers key behavioral edge cases. It is nearly complete, but lacks specifics on output format structure or pagination, which would be helpful for an agent parsing the response.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all parameters and their formats. The description adds no parameter-specific syntax or usage details beyond what the schema provides, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb and resource — 'Check whether the conversion events the active ad sets optimise for are actually arriving' — which is unambiguous and distinct from siblings like get_insights or audit_account. It explains the audit's scope by listing exactly what it reads, so an agent can tell it apart from generic reporting tools.

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

Usage Guidelines4/5

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

It implies the context (auditing conversion tracking for active ad sets) but doesn't explicitly name alternatives or state when not to use it, beyond the note about no active ad sets. The explanation of the 'incomplete' status and the no-score case provides useful decision context, but explicit routing to alternatives like get_insights is absent.

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

billingPlan and billingAInspect

status — plan and usage (from the database, no call to Stripe); upgrade — a checkout link; manage — a link to the billing portal: card, invoices, cancellation. Free.

NameRequiredDescriptionDefault
planNoPlan key for upgrade, for example solo
actionYesWhat you need

TDQS

A3.7/5.0
Behavior4/5

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

Adds real context beyond the annotations: 'status' reads from the database and makes no Stripe call, while 'upgrade' and 'manage' return links rather than performing the mutation themselves, which explains why readOnlyHint is false despite the agent never directly changing billing. 'Free' hints at no cost/quota impact, though it is too terse to be unambiguous. No contradiction with 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.

Conciseness4/5

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

Extremely compact, action names front-loaded, each fragment carries distinct information. The telegraphic dash style and the dangling 'Free.' cost a little clarity but there is no wasted sentence.

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

Completeness4/5

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

For a 2-parameter tool with no output schema, the description usefully characterizes return values (status data vs. links) across all three actions, which the schema cannot convey. It stops short of noting what 'status' contains in detail or any failure modes, but nothing essential for invoking it correctly is missing.

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

Parameters3/5

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 both 'action' (with enum) and 'plan' (with the 'solo' example). The description explains what each action yields but never mentions the 'plan' parameter or when it is required, so it adds no meaning over the schema; baseline 3 applies.

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

Purpose4/5

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

The description enumerates all three modes (status, upgrade, manage) and what each produces, so an agent can identify the tool's scope as plan/billing management. It never states an overarching verb+resource in sentence form and does nothing to differentiate from siblings like 'usage', but the per-action breakdown is specific enough to act on.

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

Usage Guidelines3/5

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

Mapping each action to a need (plan/usage info, checkout link, card/invoices/cancellation) implicitly tells the agent which action to pick, which is the main routing decision for this tool. There is no explicit when-to-use/when-not wording, no mention of prerequisites, and no alternative tool named.

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

build_campaignBuild a campaign step by stepAInspect

Build a Meta campaign together with the person, two related questions at a time, shown in the chat as a form with buttons: goal and budget, page and conversion, creative and texts, audience and name — and first the ad account when several are connected. Call it when the person wants to build a campaign step by step or is unsure what to fill in. Nothing is created in the ad account and nothing counts toward the monthly change limit: the answers are kept under draft_id. When everything is answered, create_campaign with that draft_id returns the full preview and confirm_token.

NameRequiredDescriptionDefault
clearNoFields to remove from the draft, e.g. ["end_time"].
deferNoSet by the form itself: questions the person left to the assistant for the end. Leave it out.
answersNoFields of create_campaign the person chose: the "answer" of the picked options, or what they wrote, mapped to fields.
draft_idNoThe draft to continue, from an earlier answer. Omit to start a new one.
languageNoLanguage of the conversation, e.g. "ru", "uk", "pl" or "en": the form shows its questions and buttons in it. Always pass it; without it the form falls back to the language of the chat interface.
connectionNoAd account: connection id or ad account number — the answer of the ad account question.

TDQS

A4.4/5.0
Behavior5/5

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

Despite annotations marking this as non-read-only and open-world, the description clarifies that nothing is created in the ad account and nothing counts toward the change limit, with answers held under draft_id. This is precisely the extra context an agent needs to trust invoking a write-flagged tool.

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

Conciseness4/5

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

The description is a single dense paragraph but front-loads the core action and each sentence carries information (form fields, trigger condition, side-effect safety, finalization path). Some sentences run long, slightly hurting readability.

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

Completeness5/5

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

For a 6-parameter, no-output-schema tool, the description covers what the tool does, when to invoke it, its side-effect profile, and how the workflow concludes via create_campaign with the draft_id. 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.

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented in the schema. The description reinforces the draft_id lifecycle but adds little param-level syntax or format detail beyond what the schema provides, so the baseline 3 applies.

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

Purpose5/5

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

The description states a specific verb and resource (building a Meta campaign) and makes clear this is an interactive, form-driven builder rather than a direct creator. It distinguishes itself from the sibling create_campaign by positioning that tool as the finalizing step.

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

Usage Guidelines4/5

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

"Call it when the person wants to build a campaign step by step or is unsure what to fill in" gives explicit when-to-use context. It implies the alternative (direct creation) via the create_campaign handoff, though it never states an explicit when-not-to-use condition.

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

connect_accountConnect an ad accountAInspect

Returns a single-use link where the ad account owner grants us access. The link must be opened in a regular browser. Free.

NameRequiredDescriptionDefault
platformNometa (default) for Facebook and Instagram ads, google for Google Ads accounts, Google Analytics properties and Search Console sites.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations declare a non-read-only, non-idempotent, non-destructive operation but say nothing about the mechanism. The description adds meaningful traits beyond that: the returned link is single-use, it is a grant-of-access flow, and it must be opened in a real browser rather than programmatically. It stops short of explaining expiry, latency, or what happens if the link is never used.

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

Conciseness4/5

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

Three short sentences, front-loaded with the return value and followed by the operational constraint and cost. 'Free.' is a terse fragment but earns its place as a cost signal. No wasted prose.

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

Completeness4/5

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

For a one-parameter tool with no output schema, the description covers what is produced (a single-use link), how it must be used (regular browser), and that it carries no cost. The main gaps are the absence of any statement about prerequisites or when the returned link expires.

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

Parameters3/5

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

Schema description coverage is 100% and the single platform parameter is fully documented in the schema, so the schema carries the semantics. The description never mentions platform at all, so it adds nothing beyond the baseline for a fully-covered parameter set.

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

Purpose4/5

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

States a concrete outcome — returning a single-use link that grants access to an ad account — which is a specific verb+resource combination an agent can act on. It does not explicitly differentiate itself from siblings like audit_account or the platform-specific meta_ads_* tools, 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.

Usage Guidelines3/5

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

The description implies usage context (this is how you get authorization for an ad account) and gives one hard operational constraint — the link must be opened in a regular browser. It never states when to call this versus alternatives, nor that it is a prerequisite before the platform read/write tools, leaving the agent to infer sequencing.

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

get_adviceToday's adviceA
Read-onlyIdempotent
Inspect

What is worth doing in the connected ad accounts today: at most three things per ad account, ordered by the money at stake, plus one thing missing from the data that would make the advice stronger, and once a week the findings of a read-only check of each ad account. Picked every morning from the last 14 days and the payments the account sent in, by rules backtested on real campaigns. Call it when the person asks what to do today, what needs attention, or for advice. Free.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds value beyond that: freshness (recomputed every morning over the last 14 days and inbound payments), rule provenance (backtested rules), and cost ("Free"), all of which help an agent decide whether to call it.

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

Conciseness3/5

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

The core output is front-loaded, but the first sentence is overloaded, tucking the weekly-check clause mid-list, and the provenance/marketing line ("backtested on real campaigns") adds padding. Information density is high yet the structure is harder to parse than it needs to be.

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

Completeness4/5

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-shape burden, and it does describe contents, ordering (by money at stake), cadence, and cost. For a parameterless read tool this is nearly sufficient, though it could state limits such as account coverage when none are connected.

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

Parameters4/5

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

The tool takes zero parameters and schema coverage is 100%, so there is nothing for the description to clarify. Baseline 4 applies; no parameter-level claims are needed or missing.

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

Purpose4/5

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

The description specifies the exact payload: up to three ranked recommendations per ad account, one data-gap suggestion, and a weekly read-only check. That is a concrete, distinctive resource an agent can recognize. It does not, however, explicitly contrast itself with adjacent retrieval tools such as get_insights or mark_advice, so sibling differentiation is left to inference.

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

Usage Guidelines4/5

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

It gives explicit trigger phrasing: "Call it when the person asks what to do today, what needs attention, or for advice," which maps user intent to invocation. There are no exclusions or named alternatives, so it stops short of full when/when-not guidance.

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

get_insightsAd performance metricsA
Read-onlyIdempotent
Inspect

Metrics for the ad account or an object inside it. Date ranges use the AD ACCOUNT time zone. Spend, impressions, clicks, CTR, CPC, CPM, reach, frequency, actions and cost per action, with the attribution setting and date window, for the ad account or one campaign, ad set or ad. Dates use the ad account time zone; money values are already in account currency, not minor units. Rows include the campaign, ad set and ad ids for their level. Optional: a breakdown (age, gender, country, region, placement, device, hour, creative asset), time_increment slices, extra field groups (include), a status filter, a minimum spend, sort order, attribution windows and totals. Up to 500 rows per call, fewer when the rows would not fit in one tool result; complete=false means more exist. next_after is given only when the page fit whole: pass it as after with the same other fields for the next rows; without it narrow the level, object, breakdown or date window. notes say which fields or rows Meta may leave out: a missing value is not zero. Read-only and free: changes nothing and does not count toward the monthly change limit. An identical read within 30 seconds may return the same data (see data_age_seconds).

NameRequiredDescriptionDefault
sortNoRow order, e.g. spend_descending. Reach and frequency sorts do not work with the hourly breakdown.
afterNonext_after from the previous call with the same other fields, to read the next rows.
levelNoAggregation level of the rows. Omit to report at the level of object_id.
limitNoRows per call, 1 to 500. Default 500.
totalsNotrue adds summary: totals for the whole result, as Meta computes them.
includeNoExtra field groups: names (account, campaign, ad set and ad names); results (results, cost_per_result, objective, optimization goal; not at level account); value (action_values, purchase_roas, website_purchase_roas; not at level account); links (inline and outbound link clicks, CTR and cost); video (plays, 25–100% watched, ThruPlay, average watch time; not with region or hourly); ranking (quality, engagement rate and conversion rate rankings).
min_spendNoOnly rows that spent more than this in the window, in the ad account currency (not minor units); 0 drops rows without spend.
object_idNoCampaign, ad set or ad id, or act_<ad account id>, from a read of this ad account. Omit for the whole ad account.
breakdownsNoSplit the rows by one Meta breakdown. publisher_platform with platform_position is the placement split; hourly_stats_aggregated_by_advertiser_time_zone is by hour in the ad account time zone and has no reach or frequency; device_platform is mobile or desktop; image_asset, body_asset, title_asset and description_asset split ads by creative asset.
connectionNoWhich connected ad account to use: the connection id from start_here or the ad account number (act_123 or 123). Needed only when several ad accounts are connected.
time_rangeNoExplicit inclusive window, as an object {"since":"2026-08-01","until":"2026-08-31"}, not a JSON string.
date_presetNoRelative window in the ad account time zone, e.g. today, yesterday, last_7d, last_30d, this_month, maximum. Default last_7d (applied in run). Ignored when time_range is given.
time_incrementNoTime slices: a number of days per row (1 to 90), "monthly", or "all_days" for one row per window.
effective_statusNoOnly rows of objects whose effective status is one of these, e.g. ["ACTIVE"]; needs level campaign, adset or ad. List ARCHIVED or DELETED to include such objects.
attribution_windowsNoReport actions per attribution window, e.g. ["7d_click","1d_view"]: each action gets a key for every window that has a value. Omit for the attribution setting of the ad sets.

TDQS

A3.9/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description goes well beyond them: it discloses the 500-row cap, that complete=false signals more rows, how next_after/after pagination works, that an identical read within 30 seconds may be cached (data_age_seconds), that reads are free and don't count toward the monthly change limit, and that missing values are not zero. This is rich operational context an agent cannot get from 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.

Conciseness3/5

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

The purpose and key constraints are front-loaded, but the prose is dense and redundant: 'Date ranges use the AD ACCOUNT time zone' is restated as 'Dates use the ad account time zone', and the optional-parameter list partly duplicates the schema. Several sentences are run-ons that bury the pagination contract mid-paragraph.

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

Completeness4/5

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

For a 15-parameter, no-required-arg tool with no output schema, the description covers the essentials an agent needs: scope, time zone, currency, pagination contract, caching, and status-filter level constraints. Return-shape detail is limited (no output schema exists to compensate), but complete/next_after/data_age_seconds/notes give enough to consume results safely.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, and 15 params each carry their own schema descriptions. The description still adds meaning the schema does not: money values are in account currency not minor units (relevant to min_spend), dates resolve in the ad account time zone, rows carry campaign/adset/ad ids at their level, and next_after must be replayed with identical other fields. This pushes it above the 3 baseline.

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

Purpose4/5

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

The description opens with a specific verb+resource: metrics for the ad account or an object inside it, and enumerates the returned measures (spend, impressions, CTR, CPC, CPM, reach, frequency, actions). An agent can tell what it produces without opening the schema. It does not, however, explicitly distinguish itself from siblings like performance_overview, performance_dashboard or meta_ads_read, so differentiation is left implicit.

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

Usage Guidelines3/5

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

The description gives contextual cues for specific parameters (e.g. when to use breakdowns, that hourly has no reach/frequency, that effective_status needs a non-account level, and that include results/value are not available at account level). But it never states when to prefer this tool over sibling read/performance tools, nor any prerequisite beyond 'from a read of this ad account'. Use guidance is implied rather than explicit.

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

get_tool_schemaOperation input schemasA
Read-onlyIdempotent
Inspect

For each named operation: the full input schema, description, spend, metered, reversible and the router that executes it (null: called directly). Does not call Meta. Free.

NameRequiredDescriptionDefault
tool_namesYesOperation names, e.g. ["pause_ad","update_budget"].

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds genuinely new behavior: it costs nothing and makes no Meta API call, which materially affects tool selection. It omits any statement about batch limits or latency, but that is a minor gap against the annotation coverage.

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

Conciseness5/5

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

Two tightly packed sentences, front-loaded with the return contract and finishing with the two facts that most influence selection (no Meta call, no cost). No filler.

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

Completeness4/5

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 correctly compensates by listing the returned fields, so an agent knows the response shape. It does not mention the 10-name cap or ordering, though the schema covers the cap.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter carries its own example (["pause_ad","update_budget"]), so the schema does the heavy lifting. "For each named operation" mildly confirms batch semantics that match the array type, but adds no syntax beyond the schema.

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

Purpose4/5

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

The description explicitly enumerates what is returned per operation (full input schema, description, spend, metered, reversible, router), which is a concrete resource definition an agent can act on. It does not, however, distinguish this tool from the sibling search_tools, which likely overlaps in intent, and the verb itself is only implied by the name.

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

Usage Guidelines3/5

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

"For each named operation" implies the calling pattern (pass operation names), and "Free. Does not call Meta." gives a practical incentive to prefer this over live-API siblings. There is no explicit when-to-use/when-not statement and no routing against search_tools, so 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.

google_analytics_readRead Google Analytics dataA
Read-onlyIdempotent
Inspect

Reads connected Google Analytics (GA4) properties: traffic, engagement and key events by source, campaign and landing page. action "list_tools" lists every operation of this router with its field names (get_tool_schema returns the input schema); it does not call Google and is free. action "execute" runs one read: {"action":"execute","tool_name":"ga4_report","arguments":{}}. Reads:

  • ga4_report: A Google Analytics (GA4) report of the connected property: chosen dimensions and metrics over a period, with totals and an optional comparison with the period before.

  • ga4_attribution_check: Checks where GA4 loses the source of traffic and key events: sessions with no channel, sessions without a source, key events piling up in Direct, your own domains and payment services as referrals, and Facebook or Instagram clicks without UTM tags.

  • ga4_landing_pages: Landing pages of the connected GA4 property: sessions, engagement and key events per page against the average, for all traffic or one channel or source / medium — which pages lose the traffic you pay for and which convert best.

  • ga4_google_ads_check: Compares Google Ads with GA4 campaign by campaign: paid clicks against GA4 sessions from google / cpc, and Google Ads conversions against GA4 key events — where the tracking between them loses traffic or conversions.

  • ga4_meta_ads_check: Compares Meta ads with GA4 campaign by campaign: link clicks and landing page views against GA4 sessions from Meta, and Meta results against GA4 key events — where UTM tags, visits or leads get lost between Meta and the site.

  • ga4_list_signals: What the watchdog found about this site and has not seen fixed: a missing Meta pixel, a key event that never fires, lost attribution.

  • ga4_property_setup: The setup of the connected GA4 property: time zone and currency, data streams, key events and how many of each were recorded in the last 30 days, links to Google Ads accounts and how long event data is kept — with what to fix. Read-only and free: changes nothing and does not count toward the monthly change limit. Google Analytics and Search Console have their own request quotas; they do not use this server’s Google Ads API quota.

NameRequiredDescriptionDefault
actionYeslist_tools: every operation with its field names, flags and router. execute: run the read named by tool_name.
argumentsNoFor execute: the fields of the operation, plus "connection" when several Google Analytics properties are connected. Omit or {} when it has none.
tool_nameNoFor execute: the operation name from list_tools, e.g. ga4_report.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds genuinely new context beyond them: list_tools 'does not call Google and is free', and GA4/Search Console use their own request quotas rather than the server's Google Ads API quota. It does not describe pagination or result-size behavior, 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.

Conciseness4/5

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

Front-loaded with purpose, then router mechanics, then a bulleted operation list — good structure for a seven-operation router. It is long, and the operation catalogue partially duplicates what action 'list_tools' returns at runtime, which is mild redundancy, but each bullet does help an agent decide whether this tool covers its question.

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

Completeness5/5

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

For a router with three parameters, full schema coverage and no output schema, the description covers everything an agent needs: what each operation returns in substance, how to discover operations, how to invoke one, and the quota/cost model. Nothing material is left undocumented.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description earns the extra point by clarifying semantics the schema cannot: that list_tools is a free non-calling discovery step, that arguments carries the operation's fields plus an optional 'connection' key, and by showing a literal execute payload. It still does not enumerate the per-operation field names, deferring that to list_tools.

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

Purpose5/5

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

The description opens with a specific verb and resource — 'Reads connected Google Analytics (GA4) properties: traffic, engagement and key events by source, campaign and landing page' — and then enumerates the seven concrete read operations available through the router. An agent can immediately distinguish this from google_ads_read, meta_ads_read and search_console_read by the data domain.

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

Usage Guidelines4/5

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

It clearly explains the router contract (list_tools to discover operations, execute to run one) and gives per-operation conditions of use, e.g. ga4_attribution_check is for finding 'where GA4 loses the source of traffic' and ga4_google_ads_check for comparing Ads against GA4 sessions. What is missing is explicit cross-sibling routing — nothing says when to prefer this over search_console_read or performance_dashboard for overlapping questions.

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

google_campaign_performanceGoogle Ads performanceA
Read-onlyIdempotent
Inspect

Google Ads metrics for the account, its campaigns, ad groups or keywords over a period: cost, impressions, clicks, CTR, CPC, conversions, value, CPA, ROAS. Period: date_preset (LAST_* periods do not include today) or since and until, in the account time zone. level: account, campaign (default), ad_group or keyword; campaign_id narrows campaign, ad group and keyword rows to one campaign. by_day adds a row per date. Rows are ordered by cost, highest first (by date with by_day). Cost is in micros and as text in the account currency; conversions_value is in the account currency. Cost and clicks update about hourly, and conversions can be added for days afterwards. totals are over the returned rows; complete=false means more rows exist than were returned. Ads: google_ad_performance; search terms: google_search_terms. Read-only and free: changes nothing and does not count toward the monthly change limit. An identical read within 30 seconds may return the same data (see data_age_seconds).

NameRequiredDescriptionDefault
levelNoaccount, campaign, ad_group or keyword. Default campaign.
limitNoMost rows to return, 1–500. Default 200.
sinceNoFirst day, YYYY-MM-DD, in the account time zone. Goes with until.
untilNoLast day, YYYY-MM-DD, in the account time zone. Goes with since.
by_dayNoA row per date instead of one row for the whole period.
connectionNoWhich connected Google Ads account to use: the connection id from start_here or the customer id (123-456-7890 or 1234567890). Needed only when several Google Ads accounts are connected.
campaign_idNoOnly this campaign: for level campaign, ad_group or keyword.
date_presetNoA predefined period. Omit with since and until; with neither, LAST_7_DAYS.

TDQS

A4.6/5.0
Behavior5/5

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, yet the description adds substantial non-obvious behavior: cost is in micros and as text in account currency, cost/clicks refresh roughly hourly while conversions can postdate days, totals cover only returned rows with complete=false signaling truncation, and an identical read within 30 seconds may return cached data (data_age_seconds). It also states the tool is free and does not consume the monthly change limit.

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

Conciseness4/5

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

Front-loaded with purpose and metric list before the period/level mechanics, then behavior and routing. It is dense and long for a single paragraph, but nearly every clause carries distinct operational information (freshness, caching, ordering, units) rather than repeating the schema.

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

Completeness5/5

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

With no output schema, the description carries the return-value burden and does so: row ordering by cost (or by date with by_day), totals scope, complete=false truncation, and data_age_seconds. Combined with unit and freshness notes, an agent has everything needed to call and interpret this tool correctly.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3, but the description goes beyond it: it warns that LAST_* presets do not include today, confirms the campaign default level, explains that campaign_id narrows campaign/ad_group/keyword rows, and specifies that cost is in micros plus text while conversions_value is plain currency. The limit parameter's default of 200 is only in the schema, so it is not fully additive.

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

Purpose5/5

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

States a specific verb+resource: Google Ads performance metrics across four levels (account/campaign/ad_group/keyword) over a period, with the exact metric list (cost, impressions, clicks, CTR, CPC, conversions, value, CPA, ROAS). It also explicitly routes to nearby siblings, naming google_ad_performance for ads and google_search_terms for search terms, so an agent can separate it from the other google_ads_* tools.

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

Usage Guidelines4/5

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

Gives clear usage context: how to pick a period (date_preset vs since/until, and the default LAST_7_DAYS), how level selects granularity, when campaign_id applies, and when by_day is useful. Two alternatives are named for adjacent result types. It stops short of exclusions against other read siblings like google_ads_read or performance_overview, so it is clear context rather than full when/when-not guidance.

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

linkedin_ads_readRead LinkedIn Ads dataB
Read-onlyIdempotent
Inspect

Reads Meta ad accounts. action "list_tools" lists every operation of every router with its field names, flags and the router that executes it (get_tool_schema returns the input schema); it does not call Meta and is free. action "execute" runs one read: {"action":"execute","tool_name":"list_campaigns","arguments":{}}. Reads:

  • linkedin_account_summary: The connected LinkedIn ad account: name, currency, status, whether it can serve ads, and on whose behalf it advertises.

  • linkedin_list_campaigns: Campaigns of the LinkedIn ad account: objective, status, whether they serve, daily and total budget, bidding.

  • linkedin_performance: What the LinkedIn ad account spent and got for it: spend, impressions, clicks, leads from lead forms and website conversions. Read-only and free: changes nothing and does not count toward the monthly change limit. An identical read within 30 seconds may return the same data (see data_age_seconds).

NameRequiredDescriptionDefault
actionYeslist_tools: every operation with its field names, flags and router. execute: run the read named by tool_name.
argumentsNoFor execute: the fields of the operation, plus "connection" when several ad accounts are connected. Omit or {} when it has none.
tool_nameNoFor execute: the operation name from list_tools, e.g. linkedin_list_campaigns.

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), but the description adds genuinely non-obvious behavior: reads are free and do not count toward the monthly change limit, and an identical read within 30 seconds may return cached data (data_age_seconds). That caching/limit disclosure is real added 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.

Conciseness3/5

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

The operation list is front-loaded and earns its space, but the first sentence ('Reads Meta ad accounts') is erroneous dead weight and the repeated 'Meta' reference later ('it does not call Meta') muddles a LinkedIn tool. Otherwise the structure is acceptable.

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

Completeness3/5

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 enumerate the fields each read returns (name, currency, status, objective, spend, impressions, clicks, leads, etc.), which is helpful. However it omits error/empty-result behavior and the multi-account 'connection' nuance (left to the schema), and the Meta/LinkedIn confusion undercuts completeness for a read router that already has many sibling reads.

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

Parameters3/5

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

Schema description coverage is 100%, so action/tool_name/arguments are already documented, making 3 the baseline. The description adds an example invocation, but the example uses 'list_campaigns' while the schema and the read list use the 'linkedin_' prefix, introducing a naming inconsistency rather than clarity.

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

Purpose3/5

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

The opening sentence says 'Reads Meta ad accounts', which names the wrong resource for a LinkedIn tool that has a separate sibling (meta_ads_read) covering Meta. The body recovers by enumerating three clearly-named LinkedIn reads (linkedin_account_summary, linkedin_list_campaigns, linkedin_performance), so the actual purpose is discernible, but the leading mislabel wastes the strongest position and risks mis-routing.

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

Usage Guidelines4/5

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

It explains the two-step router pattern explicitly: 'list_tools' to discover operations, then 'execute' with tool_name/arguments to run one read, including a concrete call example. It also states when the tool is appropriate (read-only, free, outside the monthly change limit). No explicit routing guidance versus google_ads_read/meta_ads_read/microsoft_ads_read siblings, so it stops short of a 5.

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

mark_adviceMark a piece of adviceA
Idempotent
Inspect

Record whether a piece of today's advice is right: yes, no or nonsense. Changes nothing in any ad account; the advice rules are tuned on these marks. Use the id from get_advice. Free.

NameRequiredDescriptionDefault
markYesyes — right; no — wrong for this account; nonsense — makes no sense.
advice_idYesThe id of the piece of advice, from get_advice.

TDQS

A4.5/5.0
Behavior4/5

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

With readOnlyHint=false the agent knows this writes, and the description adds valuable non-obvious context: it 'Changes nothing in any ad account', the marks tune advice rules, and it is 'Free'. This clarifies the write's true blast radius beyond what the annotations convey, though it doesn't restate the declared idempotent behavior.

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

Conciseness5/5

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

Three short sentences, zero padding, and the core action and its scope ('changes nothing in any ad account') are front-loaded. Every clause earns its place.

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

Completeness5/5

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

For a simple two-parameter, non-destructive, idempotent write with no output schema, the description covers effect, cost, safety scope, and parameter source. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and the enum values are fully documented in the schema, so the baseline is 3. The description still adds meaning beyond the schema by telling the agent where advice_id originates ('from get_advice'), which the schema does not state.

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

Purpose5/5

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

The description uses a specific verb ('Record') plus the exact resource ('whether a piece of today's advice is right') and enumerates the possible values (yes/no/nonsense). It is clearly distinguishable from the sibling get_advice, which only retrieves advice rather than rating it.

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

Usage Guidelines4/5

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

It gives clear workflow context ('Use the id from get_advice'), telling the agent where the required advice_id comes from. It stops short of stating when NOT to mark or how marks interact (e.g., overwriting a prior mark), 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.

meta_ads_createCreate Meta ads objectsAInspect

Creates new objects in a Meta ad account; nothing existing is modified. Call meta_ads_create with {"action":"execute","tool_name":"create_ad_creative","arguments":{…}}; arguments carry the fields of the operation and "connection" when several ad accounts are connected. Operations:

  • create_ad_creative: Create a single-image creative. No impressions and no spend.

  • create_video_creative: Create a creative from a video that is already in the ad account library. No impressions and no spend.

  • create_carousel_creative: Create a carousel creative of 2 to 10 cards. No impressions and no spend.

  • create_ad: Create an ad in an ad set. Always PAUSED: turning it on is a separate action by a person.

  • upload_image: Upload one image, or a batch of up to ten, from https links into the ad account library. No impressions and no spend.

  • upload_video: Upload a video from an https link to the ad account library. No impressions and no spend.

  • duplicate_adset: Copy an audience into a new ad set, WITHOUT ads, for a new creative. The copy is paused.

  • copy_ad_to_new_adset: Copy a winning ad into a new ad set: a paused copy of its ad set with only this ad, under the same name.

  • create_campaign: Create a complete campaign: creative → campaign → ad set → ad. Everything is paused.

  • create_adset: Create a paused ad set in an existing campaign, with its budget, schedule and audience.

  • create_dynamic_creative_ad: Create one paused Dynamic Creative ad: Meta combines the images and texts itself.

  • duplicate_campaign: Copy a whole campaign with its ad sets and ads. The copy is paused unless ACTIVE is asked for. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • create_monitor: Watch every campaign, ad set or ad of this ad account and email when a rule holds on one of them. Changes only this server’s own monitor, nothing in Meta, and never counts toward the monthly change limit.

  • schedule_brief: Email a performance brief of every connected ad account on a schedule: daily, weekly on Mondays, or every N days. Changes only this server’s own monitor, nothing in Meta, and never counts toward the monthly change limit.

  • send_brief_now: Send a scheduled brief right now, without waiting for its schedule; the next scheduled send stays as it is. Reads the connected ad accounts and sends an email now; nothing in them changes, and it never counts toward the monthly change limit.

  • create_audience: Create a custom audience: website visitors, people who engaged with a Facebook Page or an Instagram account, or a lookalike.

  • create_ab_test: Start an A/B test between 2–5 campaigns or ad sets: Meta splits the audience so nobody sees more than one version.

  • rebuild_adset: Rebuild an ad set with a new goal: a paused copy with the same audience, budget and ads that optimises for another result, pixel event or a minimum ROAS.

  • create_product_set: Creates a product set (a filter over existing products) in a catalog the business can access. It creates no products and changes no feed.

  • create_catalog_creative: Create a creative that shows products from a product set. No impressions and no spend.

  • create_catalog_campaign: Create a paused catalog campaign: campaign, ad set on a product set, catalog creative and one ad. Nothing delivers until a person turns it on.

  • create_catalog_adset: Create a paused ad set on a product set inside an existing catalog campaign.

  • create_catalog: Create a product catalog in the business behind this ad account, optionally with a feed that fetches products from a URL.

  • create_product: Add one product to a catalog: name, price, availability, link and image.

  • create_product_feed: Add a product feed to a catalog: a file Meta fetches on a schedule, or one filled by uploads.

  • upload_product_feed: Fetch a feed file once, right now, outside the schedule.

  • create_feed_rule: Add a rule that fixes a feed file on the way in: take an attribute from another column, map values, change letter case or set a default.

  • connect_catalog_event_source: Connect a pixel to a product catalog, so its events are matched to the catalog's products for catalog ads.

  • boost_instagram_post: Turn an existing Instagram post into an ad in an existing ad set. The ad is created PAUSED. Every operation takes two calls with the same tool_name and arguments; the first makes no change in Meta and returns a preview. If the operation cannot increase spend, the preview includes confirm_token (accepted for 10 minutes): call again with it added to arguments to apply the change. An operation that can increase spend is never executed from chat: its preview has no token, only an approve_url for a signed-in person. Executed changes count toward the monthly change limit; the preview is refused once the limit is reached. If the same change was already executed or its outcome is unknown, the preview has no confirm_token; check with a read first. If a proposal for the same change is still pending after its confirm_token expired, the call returns awaiting_human and only a person can apply it via approve_url. Input schemas: get_tool_schema for named operations; meta_ads_read {"action":"list_tools"} lists every operation with its field names.

NameRequiredDescriptionDefault
actionYesAlways "execute".
argumentsYesThe fields of the operation, "connection" when several ad accounts are connected, and on the second call the confirm_token from the first call.
tool_nameYesThe operation name, e.g. create_ad_creative.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations give only the generic profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true, idempotentHint=false); the description carries far more: the two-call preview/execute protocol, the 10-minute confirm_token, approve_url for spend-increasing operations, the monthly change-limit refusal, and the paused-by-default semantics of nearly every create. Because duplicate_campaign and create_campaign can increase spend, the description correctly flags that as opt-in by a signed-in person rather than contradicting destructiveHint=false.

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

Conciseness4/5

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

Front-loaded with the verb, scope and invocation shape before the long operation list, and the procedural protocol is placed at the end where it is needed. The operation list is long but each entry carries distinct capability and safety information (paused state, no impressions/spend), so little is filler; only the sheer volume costs it a point.

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

Completeness5/5

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

For a high-complexity, nested-object, no-output-schema tool, the description covers execution protocol, confirmation, error/limit states and per-operation safety posture. The only omission, per-operation field names, is deliberately deferred to get_tool_schema and meta_ads_read, which is the right design.

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

Parameters4/5

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

Schema coverage is 100% and the schema already defines action/tool_name/arguments, so baseline would be 3. The description goes further by explaining what 'arguments' actually carries (the operation's fields, 'connection' when several ad accounts are connected, confirm_token on the second call), which gives the opaque additionalProperties object real meaning.

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

Purpose5/5

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

States a specific verb and resource (creates new objects in a Meta ad account) and immediately narrows scope with 'nothing existing is modified', cleanly separating it from meta_ads_update and meta_ads_delete. Every one of the ~30 operations is enumerated with a one-line purpose, so an agent knows exactly what capability it is selecting.

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

Usage Guidelines5/5

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

Explicitly routes the agent to sibling tools for schema discovery ('get_tool_schema for named operations; meta_ads_read {"action":"list_tools"}'), and states when NOT to proceed ('check with a read first'), when spend-increasing ops are refused from chat, and when a proposal expires into awaiting_human. This is about as complete a when/when-not/alternatives set as a description can carry.

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

meta_ads_deleteArchive or delete Meta ads objectsA
Destructive
Inspect

Archives or deletes objects in a Meta ad account. Delivery stops for good: Meta does not bring an archived or deleted object back, and an archived one accepts only DELETED afterwards. Call meta_ads_delete with {"action":"execute","tool_name":"archive_object","arguments":{…}}; arguments carry the fields of the operation and "connection" when several ad accounts are connected. Operations:

  • archive_object: Archive or delete a campaign, an ad set or an ad. It stops delivery for good: Meta cannot bring an archived or deleted object back. Only reduces spend, and counts toward the monthly change limit.

  • delete_monitor: Delete a monitor: it stops being checked and stops sending email. Changes only this server’s own monitor, nothing in Meta, and never counts toward the monthly change limit.

  • delete_scheduled_task: Delete a scheduled brief or a monitor: it stops for good. Changes only this server’s own monitor, nothing in Meta, and never counts toward the monthly change limit.

  • delete_audience: Delete a custom audience that no running ad uses.

  • delete_product: Delete one product from a catalog. Ads stop showing it; product sets simply no longer include it.

  • delete_product_set: Delete a product set that no catalog ad set of this ad account promotes. The products themselves stay in the catalog. Only reduces spend, and counts toward the monthly change limit.

  • delete_product_feed: Delete a product feed and its schedule. Products that came only from it are removed, and ads stop showing them. Only reduces spend, and counts toward the monthly change limit.

  • disconnect_catalog_event_source: Disconnect a pixel from a product catalog: its events stop being matched to the catalog's products. Only reduces spend, and counts toward the monthly change limit. Every operation takes two calls with the same tool_name and arguments; the first makes no change in Meta and returns a preview. If the operation cannot increase spend, the preview includes confirm_token (accepted for 10 minutes): call again with it added to arguments to apply the change. An operation that can increase spend is never executed from chat: its preview has no token, only an approve_url for a signed-in person. Executed changes count toward the monthly change limit; the preview is refused once the limit is reached. This is not the pause lane: when Meta rate limits the ad account the request may be held, so check the result with a read. If the same change was already executed or its outcome is unknown, the preview has no confirm_token; check with a read first. If a proposal for the same change is still pending after its confirm_token expired, the call returns awaiting_human and only a person can apply it via approve_url. Input schemas: get_tool_schema for named operations; meta_ads_read {"action":"list_tools"} lists every operation with its field names.

NameRequiredDescriptionDefault
actionYesAlways "execute".
argumentsYesThe fields of the operation, "connection" when several ad accounts are connected, and on the second call the confirm_token from the first call.
tool_nameYesThe operation name, e.g. archive_object.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare destructiveHint=true and idempotentHint=false; the description goes far beyond them, disclosing the two-call preview/execute flow, the 10-minute confirm_token lifetime, approve_url for spend-increasing operations, the monthly change limit, awaiting_human behavior, and that archived objects accept only DELETED afterwards. It also states that delete_monitor and delete_scheduled_task affect only the server and never touch Meta.

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

Conciseness4/5

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

Front-loaded with the operation list and the two-call mechanics, and nearly every sentence carries an actionable rule. It loses a point for redundancy: the 'stops delivery for good / cannot bring it back' warning appears twice, and the 'only reduces spend, counts toward the monthly change limit' boilerplate is repeated in most bullets where a single statement would do.

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

Completeness5/5

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

No output schema exists, so the description carries the return burden and does so: it describes what a preview returns (confirm_token or approve_url, or neither when the change was already executed) and what awaiting_human means. All prerequisite states an agent needs before calling are covered.

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

Parameters4/5

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

With 100% schema coverage the baseline is 3, but the description adds real meaning: 'arguments' carries the operation's fields plus 'connection' when multiple ad accounts are connected, and confirm_token only on the second call. It also routes the agent to get_tool_schema and meta_ads_read list_tools for per-operation field names, which the schema itself does not convey.

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

Purpose5/5

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

States a specific verb and resource ('Archives or deletes objects in a Meta ad account') and then enumerates all nine operations with what each one destroys. It also implicitly separates itself from meta_ads_update by naming 'This is not the pause lane' and from meta_ads_read by directing status checks there.

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

Usage Guidelines5/5

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

Gives explicit when-to-use guidance per operation, plus decision rules for the hard cases: use a read when the change was already executed, when the outcome is unknown, or when rate limited; only a signed-in person can apply spend-increasing changes via approve_url. Alternatives and exclusions are spelled out rather than implied.

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

meta_ads_readRead Meta ads dataA
Read-onlyIdempotent
Inspect

Reads Meta ad accounts. action "list_tools" lists every operation of every router with its field names, flags and the router that executes it (get_tool_schema returns the input schema); it does not call Meta and is free. action "execute" runs one read: {"action":"execute","tool_name":"list_campaigns","arguments":{}}. Reads:

  • account_summary: The connected ad account: name, currency, status, lifetime spend.

  • list_pages: Facebook Pages that ads can run under.

  • list_campaigns: Campaigns in the ad account: configured and effective status, objective, budget. Deleted campaigns are not shown, archived only on request.

  • campaign_details: One campaign in full: settings, budget and its ad sets with a targeting summary, optionally its ads.

  • list_adsets: Ad sets across the whole ad account or one campaign (except deleted and archived by default): configured and effective status, budgets. Join with campaigns on campaign_id.

  • list_ads: Ads in the ad account, or in one campaign or ad set: status, effective status, creative.

  • ad_statuses: Statuses for a batch of ads in one request, so you do not have to guess what is already off.

  • list_images: Images in the ad account library, with the hashes that create_ad_creative takes.

  • list_videos: Videos in the ad account library, with the ids that create_video_creative takes.

  • list_creatives: Creatives already built in this ad account: what each one says, where it links and which picture it uses.

  • preview_ad: See the ad as it looks in the feed, drawn by Meta. Answers with a link for a person; no impressions and no spend.

  • upload_link: A page where a person adds creatives and sees the ones already in the library. Nothing is sent to Meta by this call.

  • read_landing_page: What a landing page says — headline, sections, numbers, prices, buttons and its language — to write ad texts from. Nothing is sent to Meta.

  • list_instagram_accounts: Instagram accounts this ad account can run ads from.

  • list_custom_audiences: Custom and lookalike audiences that Meta lists for this ad account, with size and whether they can be used.

  • search_targeting: Search Meta targeting options by words: interests, behaviors, demographics, life events, employers, job titles, schools, majors, locations and languages.

  • list_pixels: Meta pixels (datasets) this ad account can use, and when each last fired.

  • list_custom_conversions: Custom conversions of the ad account: event type, pixel and whether they still fire.

  • pixel_stats: Event counts of one pixel, by event and by hour, for up to the last 28 days.

  • ad_issues: Ads Meta rejected or holds with a delivery issue in running campaigns, with Meta's reasons, and ad sets that are Learning limited.

  • dashboard_data: The numbers behind performance_dashboard: spend, results, cost per result, link CTR and CPM against the previous period, by day and by campaign.

  • account_playbook: A skill for the assistant made from this ad account: what it sells, how campaigns are named, which result counts, targets, house rules, pitfalls and questions with real names.

  • analyze_wasted_spend: Classify the campaigns that spent in a window: wasted, below target, lead campaigns, learning or too little data.

  • analyze_audiences: Which age and gender groups the money goes to, what each of them brings, and where a result costs more than it does across the ad account.

  • analyze_placements: Which placements the money goes to — Feed, Stories, Reels, Audience Network and the rest — what each brings and where a result costs more than across the ad account.

  • detect_creative_fatigue: Score the active ads for creative fatigue: frequency, link CTR decline and how long they have been running.

  • ad_copy_brief: Everything needed to write new Meta ad texts for a campaign: its primary texts and headlines with spend, link CTR, results and cost per result, which ones beat the other texts beyond chance, the money they brought when payments are sent in, the landing pages and Meta's recommended text lengths, overall and by placement. The assistant writes the texts.

  • explain_anomaly: Explain why a metric changed — cost per result (CPA, cost per lead or purchase), ROAS, CTR, CPC, CPM, conversions — against the 30, 60 and 90 day baselines: which campaigns and ad sets moved it, at which funnel step, whether it is beyond chance, and what was edited in the ad account in those days.

  • optimize_budget: Recommend how to split a monthly budget pool across campaigns or ad sets. It changes nothing.

  • diagnose_funnel: Walk the funnel in order — tracking, revenue, traffic, conversion, spend — and stop at the first broken step.

  • browse_targeting: Browse a whole Meta targeting category: interests, behaviors, demographics, life events, industries, income or family statuses.

  • select_campaign_type: The order of tools that builds a campaign of a given type, and what it needs before it can be built.

  • copy_status: Check an asynchronous campaign copy: whether Meta finished it and what it produced.

  • app_performance: App promotion campaigns of this ad account: spend, installs and cost per install by campaign, ad set or ad, with the in-app events Meta reports for them.

  • list_promotable_apps: Mobile apps this ad account may advertise, with their store links and the events they report.

  • list_monitors: Monitors of this ad account: their conditions, status, last check and how often they triggered.

  • get_monitor_history: When a monitor triggered, on which campaigns, ad sets or ads, with what numbers, and whether an email went out.

  • test_monitor: Dry-run a monitor now: which campaigns, ad sets or ads would trigger and which are skipped, without recording or emailing.

  • list_scheduled_tasks: Scheduled briefs of this account and monitors of this ad account, with status, schedule and last run.

  • list_signals: What the watchdog found in this ad account and has not seen resolved.

  • run_watch_now: Run the watchdog over this ad account right now instead of waiting for its next pass.

  • list_pending_actions: Changes the watchdog and monitors prepared for approval: pauses and budget changes, with what each would do.

  • get_signal_briefing: One finding of the watchdog or a monitor: what was seen, since when, and the changes prepared for it.

  • get_opportunity_score: Meta's opportunity score for this ad account (0–100) and the recommendations Meta gives to raise it.

  • audience_details: One custom or lookalike audience in full: what it is built from, its size, its status and whether it can be used.

  • audience_adsets: Which ad sets use a custom or lookalike audience, with how many of their ads do.

  • pixel_details: One pixel (dataset) in full: its settings, when it last fired, and the checks Meta runs on it.

  • pixel_quality: How well the customer information sent with a pixel's server-side events can be matched to people, per event.

  • list_creative_ads: Ads that use one creative: id, name, status and where they sit.

  • list_business_pages: Facebook Pages owned by the business behind this ad account, and Pages it manages for clients.

  • activity_log: What was changed in this ad account and when: budgets, targeting, bids, statuses, schedules and new campaigns and ad sets.

  • list_experiments: A/B tests and lift studies that involve this ad account: what each tests, its dates and whether it is running.

  • get_experiment: One A/B test: its cells and how each cell did over the test window — spend, results and cost per result.

  • get_business_profile: The business behind this ad account as its owner described it: what it sells, its goal, target cost per result or ROAS, markets and rules.

  • infer_business_profile: Suggest a business profile from this ad account and its website: main goal, markets, what it sells. Saves nothing.

  • client_report_file: Make a report file for a client: this ad account's results for a period, with the agency's name, logo and commentary.

  • why_did_this_fail: What failed lately and why: your recent failed calls and approved changes that failed, with Meta's real error and who fixes it.

  • explain_error: Explain an error message from Meta or from this server: the cause in plain words, what to do and who does it.

  • list_catalogs: Product catalogs the business behind this ad account can use.

  • list_product_sets: Product sets of one catalog: the saved rules ads can promote.

  • list_products: Products of a catalog or of one product set, one page at a time, optionally only those matching a rule.

  • check_catalog_readiness: Whether a catalog is ready for dynamic ads: products, event sources, matching and must-fix diagnostics.

  • analyze_catalog_performance: Break catalog spend down by product: what sells, what is below target, what spends without a purchase.

  • product_performance: One product across the catalog ad sets: spend, purchases, return and its funnel.

  • catalog_funnel: View, add to cart, checkout and purchase across the catalog ad sets, with the biggest drop.

  • catalog_waste: Catalog spend that is bringing nothing back, by product, with how much of it is recoverable.

  • compare_product_sets: Product sets side by side by return, and the products that spend inside more than one of them.

  • list_catalog_data_sources: Where the products of a catalog come from: its feeds with their schedules and last uploads, and other data sources.

  • list_product_sets_for_product: Which product sets of its catalog a product is in.

  • product_feed_details: One product feed in full: file, schedule, format, default currency and its last upload.

  • list_feed_uploads: Recent fetches of a product feed: when, how many products were found and kept, errors and warnings.

  • list_feed_rules: Rules a product feed applies to its file: renamed columns, mapped values, letter case, defaults.

  • list_event_source_catalogs: Which product catalogs of the business a pixel is connected to as an event source.

  • list_instagram_posts: Recent posts, reels and stories of an Instagram account linked to this ad account, with whether each can become an ad.

  • list_lead_forms: Instant forms of a Facebook Page: name, status, how many submissions each has and the keys of its questions. get_insights, audit_conversion_tracking, audit_account, revenue_report are their own tools, not behind this router. Read-only and free: changes nothing and does not count toward the monthly change limit. An identical read within 30 seconds may return the same data (see data_age_seconds).

NameRequiredDescriptionDefault
actionYeslist_tools: every operation with its field names, flags and router. execute: run the read named by tool_name.
argumentsNoFor execute: the fields of the operation, plus "connection" when several ad accounts are connected. Omit or {} when it has none.
tool_nameNoFor execute: the operation name from list_tools, e.g. list_campaigns.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, yet the description still adds substantive context: list_tools 'does not call Meta and is free', several operations send 'nothing to Meta', the whole tool 'changes nothing and does not count toward the monthly change limit', and identical reads within 30 seconds may return cached data (data_age_seconds). These are real behavioral traits 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.

Conciseness3/5

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

The action semantics and cost/caching notes are correctly front-loaded, but the description then reproduces an enormous catalog of every operation even though it also tells the agent that list_tools exists precisely to return that catalog. That redundancy makes the block far longer than it needs to be for an agent deciding whether to call the router.

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

Completeness5/5

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

For a router of this complexity, the description covers the actions, the call shape, the operation inventory, the free/read-only/no-change-limit guarantees and the caching caveat. No output schema exists, but the return behavior is adequately implied, and nothing essential for calling it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description genuinely extends the schema: it shows a worked execute payload, clarifies that arguments carry the operation's own fields plus 'connection' when multiple ad accounts exist, and the ~60-operation catalog effectively enumerates the otherwise opaque valid values of tool_name.

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

Purpose5/5

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

The opening sentence states a specific verb and resource ('Reads Meta ad accounts') and immediately defines the two actions, 'list_tools' and 'execute', with their distinct purposes. The operation catalog makes clear this is a read-only router and the closing note explicitly distinguishes it from get_insights, audit_conversion_tracking, audit_account and revenue_report, which are separate tools.

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

Usage Guidelines4/5

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

It states when to use each action ('list_tools' to enumerate operations with field names and routers, 'execute' to run one named read) and gives a concrete call shape. It also names the sibling reads that are NOT behind this router. What's missing is guidance on when an agent should reach for this router versus the sibling read tools in the first place.

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

meta_ads_updateChange existing Meta ads objectsA
Destructive
Inspect

Changes existing objects in a Meta ad account. Call meta_ads_update with {"action":"execute","tool_name":"pause_ad","arguments":{…}}; arguments carry the fields of the operation and "connection" when several ad accounts are connected. Operations:

  • pause_ad: Pause one ad, or up to ten at once. To turn them back on: launch_ad (approved by a signed-in person) or Ads Manager. Free pause.

  • launch_adset: Turn on delivery for an ad set: the campaign, the ad set, and its ads switch to ACTIVE. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • pause_campaign: Pause a whole campaign, together with all of its ad sets and ads. Free pause.

  • launch_ad: Turn on a single ad. If its ad set and campaign are on, it starts spending immediately. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • pause_adset: Pause delivery of an ad set, or up to ten at once. Spend stops. Free pause.

  • rename_object: Rename a campaign, ad set, ad or creative. Only the name changes.

  • update_budget: Raise or change a budget on an ad set or a campaign. The amount is in regular currency units. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • lower_budget: Lower a budget, or cap what an ad set may take from a campaign budget. It can only go down. Only reduces spend, and counts toward the monthly change limit.

  • swap_ad_creative: Replace the creative on an ad that cannot deliver right now. Nothing is turned on and spend does not change.

  • swap_live_ad_creative: Replace the creative on an ad that can deliver. The ad goes back to Meta review and may restart learning. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • narrow_adset_targeting: Narrow an ad set's audience: fewer locations, a tighter age range, more exclusions, fewer placements. It cannot widen anything.

  • update_adset_targeting: Change an ad set's audience: locations, age, gender, detailed targeting, custom audiences, placements. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • update_ad_tracking: Change the URL parameters on an ad, or on every ad in an ad set, or opt an ad out of multi-advertiser ads. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • launch_campaign: Turn on a campaign. Every ad set in it with its own ACTIVE status starts spending. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • update_schedule: Change when an ad set or a campaign starts and stops delivering. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • shorten_schedule: Bring the end of a schedule forward, or push a start that has not arrived yet later. It can only shorten. Only reduces spend, and counts toward the monthly change limit.

  • update_bid: Change how Meta bids for an ad set, or the bid strategy of a campaign. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • manage_scheduled_task: Pause or resume a monitor or a scheduled brief. Changes only this server’s own monitor, nothing in Meta, and never counts toward the monthly change limit.

  • manage_action: Approve or reject one prepared action. Approving runs its change the usual way; an increase in spend needs a signed-in person. Only reduces spend, and counts toward the monthly change limit.

  • apply_signal_actions: Apply every prepared action of one finding that can be applied from chat. Only reduces spend, and counts toward the monthly change limit.

  • update_audience: Rename a custom audience or change its description. Who is in it stays the same.

  • set_campaign_spend_cap: Set, change or remove a campaign's spending limit: the most it may spend in total before it stops. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • update_ab_test: Rename an A/B test, change its description or end time, or cancel it.

  • apply_recommendation: Apply one of Meta's recommendations from get_opportunity_score: Meta makes the change it describes. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • save_business_profile: Save the business profile of this ad account — or of every connected Meta ad account. Only the fields given change. Changes only this server’s own monitor, nothing in Meta, and never counts toward the monthly change limit.

  • update_optimization_goal: Change what an ad set of a traffic or awareness campaign optimises for: link clicks, landing page views, reach. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • update_catalog_campaign: Change an existing catalog campaign: name, status, budget, spend cap, bid strategy, schedule or the catalog it promotes. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • update_catalog_adset: Change an existing catalog ad set: budget, bid, optimisation, schedule and the product set it promotes. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • update_catalog_ad: Change a catalog ad: its name, status, or the creative — either another creative id, or a rebuilt product template. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • update_catalog: Rename a product catalog. Its products, feeds and product sets stay as they are.

  • update_product: Change fields of one catalog product: name, price, sale price, availability, link, image, brand.

  • update_product_set: Rename a product set or change its rule. Ad sets that promote it start showing the products the new rule matches.

  • update_product_feed: Rename a product feed, or change its file link, how often it is fetched, or its default currency.

  • update_feed_rule: Change the parameters of one rule of a product feed. Its attribute and type stay; Meta does not allow deleting rules.

  • set_adset_whatsapp_number: Change the WhatsApp number an ad set sends people to. CAN INCREASE SPEND, and this account allows it from chat: say so before executing. Every operation takes two calls with the same tool_name and arguments; the first makes no change in Meta and returns a preview. If the operation cannot increase spend, the preview includes confirm_token (accepted for 10 minutes): call again with it added to arguments to apply the change. An operation that can increase spend is never executed from chat: its preview has no token, only an approve_url for a signed-in person. Pauses are free, can only reduce spend and never count toward the monthly change limit; other changes count when executed. For changes other than pauses: If the same change was already executed or its outcome is unknown, the preview has no confirm_token; check with a read first. If a proposal for the same change is still pending after its confirm_token expired, the call returns awaiting_human and only a person can apply it via approve_url. For pauses: After an unknown outcome a new preview includes confirm_token: repeating a pause is safe. If the same pause was already executed, a repeat within 15 minutes returns already_done, and a later preview has no confirm_token. If the confirm_token of a pause expired, calling again without confirm_token returns a working confirm_token for the same proposal. Input schemas: get_tool_schema for named operations; meta_ads_read {"action":"list_tools"} lists every operation with its field names.

NameRequiredDescriptionDefault
actionYesAlways "execute".
argumentsYesThe fields of the operation, "connection" when several ad accounts are connected, and on the second call the confirm_token from the first call.
tool_nameYesThe operation name, e.g. pause_ad.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare the generic destructive/non-readOnly profile. The description goes far beyond: the two-call preview/confirm_token protocol, spend-increase flags per operation, the monthly change limit, approval requirements, awaiting_human, already_done, and idempotency caveats for pauses versus other mutations. This is rich behavioral disclosure that the 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.

Conciseness3/5

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

Front-loaded with the invocation pattern, which is good, but the body is an extremely long 30-bullet enumeration followed by dense paragraphs of protocol nuance. Much of the per-operation prose repeats the identical spend-increase sentence, inflating length without adding information.

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

Completeness5/5

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

Given a 3-param meta-tool with a nested free-form arguments object, no output schema, and openWorld-free annotations, the description covers invocation form, per-operation semantics, approval gates, token lifecycle, and error outcomes. An agent has everything needed to drive the two-call flow correctly.

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

Parameters4/5

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

Schema coverage is already 100% for the three top-level params. The description adds real meaning beyond the schema by explaining that arguments is a free-form object keyed by operation name, that it must include confirm_token on the second call, and that connection is required with multiple ad accounts, and it points agents to get_tool_schema for per-operation fields.

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

Purpose5/5

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

The description opens with a specific verb+resource (changes existing objects in a Meta ad account) and then enumerates 30 distinct operations, each with a one-line scope. An agent can distinguish this tool from meta_ads_create/delete/read purely from the text.

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

Usage Guidelines5/5

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

Extensive when-to-use guidance: it explicitly says which operations increase spend, that chat-executed increases are disallowed, when to check with a read first, how the 15-minute already_done window works, and when to route to a signed-in person via approve_url. Alternatives are named (launch_ad for un-pausing, Ads Manager, meta_ads_read list_tools).

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

microsoft_ads_readRead Microsoft Advertising dataA
Read-onlyIdempotent
Inspect

Reads Meta ad accounts. action "list_tools" lists every operation of every router with its field names, flags and the router that executes it (get_tool_schema returns the input schema); it does not call Meta and is free. action "execute" runs one read: {"action":"execute","tool_name":"list_campaigns","arguments":{}}. Reads:

  • microsoft_account_summary: The connected Microsoft Advertising ad account: name, number, currency, time zone and status.

  • microsoft_list_campaigns: Campaigns of the Microsoft Advertising account, of every type: status, type, daily budget and whether the budget is shared.

  • microsoft_performance: What the Microsoft Advertising account spent and got for it: spend, impressions, clicks, conversions and revenue, by day or in total. Read-only and free: changes nothing and does not count toward the monthly change limit. An identical read within 30 seconds may return the same data (see data_age_seconds).

NameRequiredDescriptionDefault
actionYeslist_tools: every operation with its field names, flags and router. execute: run the read named by tool_name.
argumentsNoFor execute: the fields of the operation, plus "connection" when several ad accounts are connected. Omit or {} when it has none.
tool_nameNoFor execute: the operation name from list_tools, e.g. microsoft_list_campaigns.

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive, non-open-world, so the safety profile is covered. The description adds genuinely new behavioral context beyond them: the call is free, it does not consume the monthly change limit, and an identical read inside 30 seconds may return stale data (with data_age_seconds as the tell). That is substantive disclosure.

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

Conciseness3/5

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

The three-read list is dense and well structured, but the lead sentence about Meta accounts earns nothing and actively misleads, and the passing reference to 'every router' and 'get_tool_schema' is never grounded. Front-loading a wrong claim is the worst possible use of the most prominent position.

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

Completeness4/5

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

With no output schema, the description carries the burden of describing returns and does so for all three operations (name/number/currency/time zone/status; status/type/budget; spend/impressions/clicks/conversions/revenue). Missing only date-range or pagination mechanics for the performance read, which the agent would need to guess.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by enumerating the concrete valid values for tool_name (microsoft_account_summary, microsoft_list_campaigns, microsoft_performance) and giving a worked execute payload, information the schema leaves as an open string.

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

Purpose3/5

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

The opening sentence says 'Reads Meta ad accounts,' which flatly contradicts the tool name (microsoft_ads_read) and title, and is especially dangerous in a sibling set that also contains meta_ads_read and google_ads_read. The subsequent enumeration (microsoft_account_summary, microsoft_list_campaigns, microsoft_performance) is specific and does make the real scope clear, so the purpose is eventually recoverable, but the first thing an agent reads is wrong.

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

Usage Guidelines3/5

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

It explains the internal action split usefully: list_tools to discover operations (free, no account call) versus execute to run a read. However it never says when to choose this tool over google_ads_read or meta_ads_read, which is the critical routing decision given the sibling set — and the mislabeled 'Meta' opening actively pushes the agent toward the wrong sibling.

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

performance_dashboardAd account dashboardA
Read-onlyIdempotent
Inspect

An interactive dashboard of one Meta ad account inside the chat: spend, results, cost per result, link CTR and CPM against the previous period, a chart by day and the campaigns — with 7, 14, 30, 60 and 90-day tabs the person switches in the window, and payments and ROAS from the business's own payments loading into it. Call it when the person asks how their ads are doing, or for a dashboard, overview or report of an ad account. It reads the numbers itself: do not read them first. Free and read-only.

NameRequiredDescriptionDefault
daysNoPeriod: the last 7, 14, 30, 60 or 90 full days, ending yesterday in the ad account time zone. Default 30.
partNoSet by the dashboard window itself to load payments and ROAS. Leave it out.
connectionNoAd account: connection id or ad account number. Needed when several are connected.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/destructiveHint/idempotent, so the safety profile is covered. The description adds genuine behavioral context beyond them: the dashboard is interactive with in-window tabs, payments/ROAS load into it, and the agent must not pre-read the numbers. It does not explain pagination or latency, but this is a rendering tool.

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

Conciseness4/5

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

Front-loaded: the resource and its contents come first, then the trigger, then the 'do not read first' rule, then the free/read-only note. It is a dense run-on sentence, but nearly every clause carries distinct information, so the length is largely earned.

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

Completeness4/5

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

For a zero-required-param, read-only rendering tool with no output schema, the description covers what is shown, when to invoke it, and how to avoid redundant reads. Minor gap: it does not note that a connection/ad account must be disambiguated when several are linked, though the schema covers that.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description still adds meaning by tying the 7/14/30/60/90 tabs to the day window the person switches, and by explaining that payments/ROAS load into the dashboard (the purpose of `part`, which the schema tells you to leave out). This is context the schema does not carry.

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

Purpose5/5

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

States a specific verb+resource: renders an interactive dashboard of ONE Meta ad account, and enumerates exactly what it shows (spend, results, cost per result, link CTR, CPM, daily chart, campaigns, payments/ROAS). It is clearly distinguishable from siblings like performance_overview, show_dashboard and meta_ads_read.

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

Usage Guidelines4/5

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

Gives an explicit trigger ('when the person asks how their ads are doing, or for a dashboard, overview or report of an ad account') plus a strong procedural rule ('it reads the numbers itself: do not read them first'). It never names the alternative tools it should be picked over, so the when-not/alternative half is missing.

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

performance_overviewEverything in one reportA
Read-onlyIdempotent
Inspect

One period across everything connected: spend, clicks and results of every Meta ad account, Google Ads account, TikTok ad account, Microsoft Advertising account and LinkedIn ad account, then the visits and key events the site itself recorded in Google Analytics and the clicks from Google Search — with the gaps between what the ads report and what the site sees. Start here when the question is "where did the money go and what came of it". Free; each connected Google Ads account costs one Google Ads operation.

NameRequiredDescriptionDefault
sinceNoFirst day, YYYY-MM-DD. Together with until.
untilNoLast day, YYYY-MM-DD. Together with since.
date_presetNoPeriod, ending yesterday. Default LAST_7_DAYS. Use since and until instead for exact dates.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already carry readOnly/idempotent/non-destructive, so safety is covered; the description adds genuinely new behavioral context: the cost model ("Free; each connected Google Ads account costs one Google Ads operation") and the fact that it computes a discrepancy between ad-reported and site-observed numbers. It says nothing about freshness/latency or how gaps are computed.

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

Conciseness4/5

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

The scope enumeration comes first, then the routing guidance ("Start here..."), then cost, which is good front-loading and no filler. The first sentence is long and comma-dense with vendors, which costs some readability.

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

Completeness4/5

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

With no output schema, the description should carry the burden of telling an agent what comes back; listing the covered sources and the ad-vs-site gap does that at a high level, but it never indicates the shape of the response or whether all connected sources always appear.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents YYYY-MM-DD formats, enum presets and the since/until-vs-date_preset tradeoff. The phrase "One period across everything" weakly reinforces that a single period applies to all sources, but adds little beyond structured data, so baseline 3 applies.

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

Purpose4/5

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

The description names the specific aggregation it performs (spend, clicks and results across Meta, Google, TikTok, Microsoft and LinkedIn plus GA visits/key events and Search Console clicks, with gap analysis) rather than restating the title. It does not, however, distinguish itself from siblings 'performance_dashboard' or 'revenue_report', which plausibly overlap.

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

Usage Guidelines4/5

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

"Start here when the question is 'where did the money go and what came of it'" gives an explicit entry-point trigger. It stops short of naming when NOT to use it (e.g. single-channel or revenue-specific questions that the sibling reports cover).

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

revenue_reportRevenue by campaignA
Read-onlyIdempotent
Inspect

What the ads actually earned: spend from the ad account against the payments the business sent in, per campaign, ad set, ad or creative. Spend of the window against the payments this account sent to POST /v1/revenue, matched by the tags in the ad link, precise first: ad, then ad set, then campaign — by id or by name alike; when no tag names one object alone, the tags together (ad name and ad set name) may — and matched_by says which route carried how many. A name several objects share is never guessed: that money stays in unattributed with the tags it carried. level "creative" puts together the ads that share a name — one creative reused across ad sets — so money tagged with that name lands on it: the way to compare creatives by money. by "payment_date" (default) counts money that arrived; by "lead_date" what the leads of the window have paid. Ratios only in the ad account currency. Each row carries a verdict against target_roas (default 1.0) and against how long THIS account's leads take to pay, measured from its own payments: a cohort that has not had time to pay is never called a loss. If no payments of its own have ever been sent in (not only none in this window) and Meta counted purchases, the money is what Meta counted — purchases within 7 days of a click, with their value — and money_source says so: a shop whose pixel records every purchase gets its revenue and ROAS without sending anything. Without connection, when several ad accounts are connected, each is read and summarised — totals and the campaigns that spent most; call with connection for the full report of one. Read-only and free: changes nothing and does not count toward the monthly change limit. An identical read within 30 seconds may return the same data (see data_age_seconds).

NameRequiredDescriptionDefault
byNopayment_date (default): money that arrived in the window. lead_date: money earned by the leads of this window, whenever it was paid — needs lead_at on the events.
levelNoRows per campaign (default), ad set, ad, or creative — the ads that share one name, as one creative reused across ad sets.
end_dateNoLast day of an explicit window, YYYY-MM-DD, in the ad account time zone. Needs start_date.
raw_dataNotrue returns the measured numbers only: no severity, scores, recommendations or quick_actions.
connectionNoWhich connected ad account to use: the connection id from start_here or the ad account number (act_123 or 123). Needed only when several ad accounts are connected.
date_rangeNoWindow as a named range. Ignored when start_date and end_date are given.
start_dateNoFirst day of an explicit window, YYYY-MM-DD, in the ad account time zone. Needs end_date.
target_roasNoWhat this account expects back per unit of spend. Default 1.0.
lookback_daysNoWindow in days: 7, 14, 30, 60 or 90. Default 30.

TDQS

A3.9/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint/idempotentHint/destructiveHint=false), the description adds cost and caching behavior ('free', does not count toward the monthly change limit, identical reads within 30s may return cached data via data_age_seconds), plus the full attribution fallback chain (tag matching, unattributed bucket, money_source/Meta-counted purchases, cohort that has not had time to pay never called a loss). This is genuinely useful context the annotations do not carry.

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

Conciseness3/5

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

The core purpose is front-loaded, but the body is a single dense run-on block of em-dashes and semicolons that is hard to parse. Much of it earns its place, yet the size and lack of structure impose a real reading cost for a 9-parameter tool.

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

Completeness4/5

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

With no output schema and nine optional parameters, the description does substantial work: it explains return-relevant fields (matched_by, money_source, data_age_seconds), the multi-account summarise-vs-full-report behavior, and the attribution rules. It stops short of enumerating the row shape, so it is strong but not fully exhaustive.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the prose adds real meaning: it explains the payment_date vs lead_date semantics, why level 'creative' exists (ads sharing a name = one reused creative), that target_roas drives a per-row verdict, and that raw_data strips severity/scores/recommendations. These enrich parameters beyond their schema text.

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

Purpose4/5

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

The opening sentence names a concrete verb and resource — spend from the ad account matched against payments, broken down per campaign/ad set/ad/creative. It is far more specific than the title alone, but it never names or differentiates itself from siblings like get_insights, performance_dashboard or google_campaign_performance, so an agent must infer when this report is the right one.

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

Usage Guidelines3/5

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

Usage is only implied. The description explains mode switching ('call with connection for the full report of one') and defaults, but gives no explicit 'use this when you need X rather than Y' and names no alternative tool. An agent can infer the purpose but gets no routing guidance.

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

search_console_readRead Search Console dataA
Read-onlyIdempotent
Inspect

Reads connected Search Console sites: clicks, impressions, CTR and position in Google Search by query, page, country and device. action "list_tools" lists every operation of this router with its field names (get_tool_schema returns the input schema); it does not call Google and is free. action "execute" runs one read: {"action":"execute","tool_name":"search_console_performance","arguments":{}}. Reads:

  • search_console_performance: Google Search performance of the connected Search Console site: clicks, impressions, CTR and average position by query, page, country, device, date or search appearance, with the site totals for the period.

  • search_console_paid_organic: Compares Google Search results of the connected site with the search terms of a connected Google Ads account: terms Google Ads pays for where the site already ranks in the top 3, searches on page 2 and lower with no ads, and terms that convert in Google Ads where the site is not visible organically.

  • search_console_indexing: Indexing state of pages as Google sees them: whether the page is indexed, which address Google picked as canonical, whether robots.txt or a noindex tag blocks it, when Google last crawled it and whether the fetch succeeded.

  • search_console_opportunities: Where Google Search is close to paying off: pages or queries sitting just off the first page, ones shown often but rarely clicked, and ones that lost position against the previous period. Read-only and free: changes nothing and does not count toward the monthly change limit. Google Analytics and Search Console have their own request quotas; they do not use this server’s Google Ads API quota.

NameRequiredDescriptionDefault
actionYeslist_tools: every operation with its field names, flags and router. execute: run the read named by tool_name.
argumentsNoFor execute: the fields of the operation, plus "connection" when several Search Console sites are connected. Omit or {} when it has none.
tool_nameNoFor execute: the operation name from list_tools, e.g. search_console_performance.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds valuable context beyond them: it is free, does not consume the monthly change limit, and uses separate quota pools from the Google Ads API. It does not cover pagination or response shape, but no output schema exists so that is less critical.

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

Conciseness4/5

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

Front-loads the tool's purpose and action mechanics, then presents each sub-operation as a structured bullet. Slightly verbose and mildly redundant with annotations on the read-only point, but for a four-operation router the detail is largely justified and easy to scan.

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

Completeness5/5

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

Covers purpose, router mechanics, all four sub-operations, parameter usage via the execute example, and cost/quota behavior. With annotations handling safety and no output schema to explain, an agent has everything needed to select and invoke it correctly.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3. The description enumerates four valid tool_name values with rich explanations of what each read returns, going beyond the schema's single example and helping the agent choose the right operation. Semantics for action and arguments remain delegated to the schema.

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

Purpose5/5

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

States a specific verb (reads) and resource (connected Search Console sites) with exact metrics, and differentiates from siblings by naming get_tool_schema and clarifying the distinct role of list_tools versus get_tool_schema. It also separates its quota from the Google Ads API quota, making its scope unmistakable.

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

Usage Guidelines4/5

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

Explains the two router actions and when to use each: list_tools is free discovery with field names, execute runs one read with a concrete example. Lacks explicit when-not guidance or direct contrast with other read tools like google_analytics_read.

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

search_toolsSearch operationsA
Read-onlyIdempotent
Inspect

Ranks the Meta operations of this server by the words of the query against their names, titles and descriptions, and returns tool_name, the router that executes each one (null: called directly), title, summary, read_only and spend. Does not call Meta. Free.

NameRequiredDescriptionDefault
queryYesWords describing the task, e.g. pause ad or daily budget.
top_kNoHow many operations to return, 1 to 25. Default 10.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety burden is covered. The description adds two useful behavioral facts not in the annotations: it does not call the Meta API and it is free, which is exactly what an agent needs before a discovery call.

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

Conciseness4/5

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

Two tight sentences, front-loaded with the core action and followed by the return contract and the cost caveat. Dense but every clause carries information; no filler.

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

Completeness4/5

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 enumerates the returned fields (tool_name, router with null meaning, title, summary, read_only, spend), which is the main completeness gap this tool would otherwise have. It is close to fully sufficient, missing only details like ranking order or what happens when top_k is omitted beyond the schema's stated default.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description goes further by explaining how 'query' is actually consumed — words are matched against operation names, titles and descriptions and used to rank results — which is semantic information the schema's example does not convey. Only top_k behavior is left entirely to the schema.

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

Purpose4/5

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

States a specific verb and resource: it ranks the server's Meta operations against query words and returns a defined set of fields. It is clearly distinguishable from siblings like get_tool_schema and start_here, though the 'Meta operations' scope could be read as excluding the non-Meta siblings (google_ads_*, audit_*, etc.).

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

Usage Guidelines3/5

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 a cheap discovery step ('Free', 'Does not call Meta'), but there is no explicit when-to-use guidance or routing against alternatives such as get_tool_schema or start_here.

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

show_dashboardShow a dashboardA
Read-onlyIdempotent
Inspect

Draws numbers as cards and a sortable table inside the chat. Call it whenever the person asks to see, show, list, compare or rank numbers, in any language — right after the read that produced them, with those numbers as the arguments. Do not write that table by hand in your reply when this tool can draw it: draw it, then add a sentence or two in words. It reads nothing itself, changes nothing, and is free; clients without a window get the same report as text. For how one Meta ad account is doing overall, call performance_dashboard instead: it reads the numbers itself and switches periods.

NameRequiredDescriptionDefault
kpisNoUp to eight cards on top. Put the numbers the person asked about first.
notesNoShort lines under the table: findings, caveats, what to do.
tableNoThe table under the cards.
titleYesHeadline of the dashboard, e.g. "Meta ads, last 28 days".
subtitleNoOne line under the headline: the account, the period, the filter.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world. The description goes beyond them by stating 'it reads nothing itself, changes nothing, and is free' and disclosing graceful degradation for clients without a window ('the same report as text') — a real behavioral fact an agent needs. It stops short of explaining rendering failure modes, so not a full 5.

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

Conciseness5/5

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

Three sentences, all load-bearing: what it draws, when to call it plus the anti-pattern, and the alternative. The primary instruction and the negative rule are front-loaded before the sibling routing note.

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

Completeness4/5

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

For a 5-parameter presentation tool with full schema coverage and no output schema, the description covers purpose, trigger, timing, side-effect profile, and fallback rendering. It does not spell out what the rendered output looks like or how failures surface, but 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.

Parameters3/5

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

Schema description coverage is 100%, so every field (kpis, table, columns, notes, title, subtitle) is already documented with examples and limits in the schema. The description only adds a usage hint that the read's numbers are 'the arguments'; it adds no new field-level meaning. Baseline 3 applies.

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

Purpose5/5

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

States a concrete verb and rendering resource: 'Draws numbers as cards and a sortable table inside the chat.' It explicitly distinguishes itself from the closest sibling by naming performance_dashboard and describing the difference (this one draws what you pass; that one reads the numbers itself and switches periods).

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

Usage Guidelines5/5

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

Gives the trigger ('whenever the person asks to see, show, list, compare or rank numbers, in any language'), the timing ('right after the read that produced them'), a negative instruction ('Do not write that table by hand'), and the routing rule for the alternative tool. When/when-not/alternative are all present.

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

start_hereStart hereA
Read-onlyIdempotent
Inspect

Who is connected, which ad accounts are available, how billing works — and the path from zero: the steps to set up, learn and grow, with the ones already done. Call it when the person asks what this can do or how to begin. Free.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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 externally. The description adds one genuinely new behavioral fact — 'Free' (no cost to call) — plus the notion that completed steps are included. With annotations carrying the burden, this modest addition merits a 3 rather than higher.

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

Conciseness3/5

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

The content is front-loaded and the usage trigger is placed last, which is reasonable ordering. But the middle clause ('the path from zero: the steps to set up, learn and grow, with the ones already done') is padded and hedged, and the em-dash construction is loose — it could be tightened to half the length without losing meaning.

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

Completeness4/5

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

With no parameters and no output schema, the description carries the burden of conveying what comes back, and it largely does so by listing the four content areas. There is no mention of format or scope limits, but for a zero-argument orientation tool the coverage is adequate.

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

Parameters4/5

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

The tool takes zero parameters and the schema is 100% documented, so there is nothing for the description to clarify; the baseline for a no-parameter tool applies. No parameter claims are made or contradicted.

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

Purpose4/5

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

The description enumerates what the tool surfaces — connection status, available ad accounts, billing behavior, and onboarding progress — which is concrete and distinguishable from sibling list/report tools. However, the verb is left implicit and the phrasing is somewhat impressionistic ('the path from zero', 'learn and grow'), so it reads more as a themed pitch than a precise capability statement.

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

Usage Guidelines4/5

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

It gives an explicit trigger: 'Call it when the person asks what this can do or how to begin.' That is clear when-to-use guidance. It does not name alternatives or exclusions (e.g., versus the 'usage' or 'billing' siblings), so it stops short of full routing guidance.

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

tiktok_ads_createCreate TikTok monitorsAInspect

Creates this server’s monitors for a TikTok ad account. Nothing in TikTok changes. Call tiktok_ads_create with {"action":"execute","tool_name":"tiktok_create_monitor","arguments":{…}}; arguments carry the fields of the operation and "connection" when several ad accounts are connected. Operations:

  • tiktok_create_monitor: Watch every campaign, ad group or ad of this TikTok ad account and email when a rule holds on one of them. Changes only this server’s own monitor, nothing in TikTok, and never counts toward the monthly change limit. Every operation takes two calls with the same tool_name and arguments; the first changes nothing and returns a preview with confirm_token (accepted for 10 minutes): call again with it added to arguments to apply the change. None of them count toward the monthly change limit. Input schemas: get_tool_schema for named operations; tiktok_ads_read {"action":"list_tools"} lists them all.

NameRequiredDescriptionDefault
actionYesAlways "execute".
argumentsYesThe fields of the operation, "connection" when several ad accounts are connected, and on the second call the confirm_token from the first call.
tool_nameYesThe operation name, e.g. tiktok_create_monitor.

TDQS

A4.4/5.0
Behavior5/5

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

Goes well past the annotations: it declares the tool is a no-op on the TikTok side, exempt from the monthly change limit, requires two calls with a confirm_token valid for 10 minutes, and that the first call changes nothing. These are exactly the behavioral facts an agent cannot infer from readOnlyHint/destructiveHint=false.

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

Conciseness4/5

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

Front-loaded and operationally ordered: scope, invocation shape, operation list, then the confirm-token protocol. It loses a point for repeating the same two facts twice ("nothing in TikTok changes" and "never counts toward the monthly change limit").

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

Completeness5/5

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

Despite the nested arguments object and no output schema, the description covers the invocation envelope, the confirm-token round trip, and how to enumerate operations. An agent can construct a correct first and second call from this text alone.

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

Parameters3/5

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

Schema coverage is 100%, so action, tool_name, and arguments are already documented. The description adds only the "connection" and confirm_token conventions for arguments, which the schema description also covers, so it does not add meaningful semantics beyond the structured fields.

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

Purpose5/5

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

States a specific verb and resource (creates this server's monitors for a TikTok ad account) and immediately scopes it: "Nothing in TikTok changes." That scope sentence alone separates it from tiktok_ads_update and tiktok_ads_delete, which operate on the ad platform itself.

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

Usage Guidelines4/5

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

Explains when to reach for it (watch every campaign/ad group/ad and email when a rule holds) and gives the exact two-call protocol plus the discovery path via get_tool_schema and tiktok_ads_read {"action":"list_tools"}. It does not explicitly say when to prefer a different sibling over this one, so it stops short of a 5.

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

tiktok_ads_deleteDelete TikTok monitorsA
Destructive
Inspect

Deletes this server’s monitors of a TikTok ad account. Nothing in TikTok changes. Call tiktok_ads_delete with {"action":"execute","tool_name":"tiktok_delete_monitor","arguments":{…}}; arguments carry the fields of the operation and "connection" when several ad accounts are connected. Operations:

  • tiktok_delete_monitor: Delete a TikTok monitor: it stops being checked and stops sending email. Changes only this server’s own monitor, nothing in TikTok, and never counts toward the monthly change limit. Every operation takes two calls with the same tool_name and arguments; the first changes nothing and returns a preview with confirm_token (accepted for 10 minutes): call again with it added to arguments to apply the change. None of them count toward the monthly change limit. Input schemas: get_tool_schema for named operations; tiktok_ads_read {"action":"list_tools"} lists them all.

NameRequiredDescriptionDefault
actionYesAlways "execute".
argumentsYesThe fields of the operation, "connection" when several ad accounts are connected, and on the second call the confirm_token from the first call.
tool_nameYesThe operation name, e.g. tiktok_delete_monitor.

TDQS

A4.6/5.0
Behavior5/5

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

Despite destructiveHint=true, the description supplies context annotations cannot: changes are confined to this server's own monitor, nothing in TikTok is mutated, and the action never consumes the monthly change limit. It also discloses the mandatory two-call preview/confirm_token flow with a 10-minute token window.

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

Conciseness4/5

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

Front-loaded with the core scope statement, then the call pattern, then the operation list. Slightly redundant, since 'nothing in TikTok changes' appears twice and the monthly-limit exclusion is stated in two places, but the density of useful information is high.

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

Completeness5/5

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

With no output schema, the description still explains the two-phase response (preview plus confirm_token, then apply) and the safety boundary, which is everything an agent needs to call this destructive tool correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns more by explaining that "arguments" carries the operation's fields, the optional "connection" for multi-account setups, and the confirm_token on the second call, plus that tool_name selects the named operation.

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

Purpose5/5

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

States a specific verb and resource (deletes this server's TikTok ad-account monitors) and immediately scopes it: 'Nothing in TikTok changes.' The named operation tiktok_delete_monitor is described concretely as stopping checks and email, which distinguishes it from the read/create/update siblings.

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

Usage Guidelines4/5

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

Gives explicit invocation form, the rule for passing "connection" when multiple ad accounts exist, and pointers to get_tool_schema and tiktok_ads_read {"action":"list_tools"} for discovering operations. It does not explicitly say when to prefer tiktok_ads_update over delete, but the operational context is otherwise unambiguous.

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

tiktok_ads_readRead TikTok Ads dataA
Read-onlyIdempotent
Inspect

Reads Meta ad accounts. action "list_tools" lists every operation of every router with its field names, flags and the router that executes it (get_tool_schema returns the input schema); it does not call Meta and is free. action "execute" runs one read: {"action":"execute","tool_name":"list_campaigns","arguments":{}}. Reads:

  • tiktok_account_summary: The connected TikTok ad account: name, currency, time zone, country and status.

  • tiktok_list_campaigns: Campaigns of the TikTok ad account: objective, budget, whether they are on, and what TikTok says about delivery.

  • tiktok_list_adgroups: Ad groups of the TikTok ad account, or of one campaign: budget, bid, optimisation goal and schedule.

  • tiktok_list_ads: Ads of the TikTok ad account, or of one campaign or ad group: what they say, where they lead and which video they use.

  • tiktok_performance: What the TikTok ad account spent and got for it: spend, impressions, clicks, CTR, CPC, CPM, reach, conversions and results.

  • tiktok_revenue_report: Money your CRM or payment system received beside TikTok spend, per campaign or ad group: revenue, payments, ROAS, cost per payment and a verdict. Payments that matched nothing are a line of their own.

  • tiktok_ad_review_issues: Which switched-on TikTok ads failed review or run only partly, with TikTok's reasons and suggestions: the first thing to check when an ad does not spend.

  • tiktok_audience_breakdown: Where TikTok spend goes and what it brings by age, gender, country, region, placement or operating system.

  • tiktok_change_history: Who changed what in the TikTok ad account and when: budgets, bids, on/off status, targeting, creation and deletion.

  • tiktok_list_monitors: Monitors of this TikTok ad account: their conditions, status, last check and how often they triggered.

  • tiktok_get_monitor_history: When a TikTok monitor triggered, on which campaigns, ad groups or ads, with what numbers, and whether an email went out.

  • tiktok_test_monitor: Dry-run a TikTok monitor now: which campaigns, ad groups or ads would trigger and which are skipped, without recording or emailing. Read-only and free: changes nothing and does not count toward the monthly change limit. An identical read within 30 seconds may return the same data (see data_age_seconds).

NameRequiredDescriptionDefault
actionYeslist_tools: every operation with its field names, flags and router. execute: run the read named by tool_name.
argumentsNoFor execute: the fields of the operation, plus "connection" when several ad accounts are connected. Omit or {} when it has none.
tool_nameNoFor execute: the operation name from list_tools, e.g. tiktok_list_campaigns.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, but the description adds genuinely new behavior: reads do not count toward the monthly change limit, and an identical read within 30 seconds may return cached data (see data_age_seconds). That caching disclosure is exactly the kind of non-obvious trait that saves an agent from misreading stale results.

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

Conciseness3/5

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

The twelve-operation bullet list is largely justified because the tool_name routing requires knowing available operation names, but the preamble wastes its most prominent sentences on Meta references and meta-commentary about list_tools instead of front-loading what the tool is. The critical routing example is buried mid-paragraph rather than leading.

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

Completeness4/5

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

With no output schema, the per-operation bullets usefully describe what each read returns (spend, CTR, ROAS, review reasons, change attribution), which is the main burden here. The residual gap is the platform mix-up: an agent reading only the first line could conclude this touches Meta rather than TikTok ad accounts.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, and the description exceeds it by supplying a concrete invocation example ({"action":"execute","tool_name":"list_campaigns","arguments":{}}) and noting that "connection" is needed when several ad accounts are connected. The Meta/TikTok confusion in the preamble slightly muddies which account identifiers apply.

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

Purpose3/5

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

The opening sentence, "Reads Meta ad accounts," names the wrong platform entirely and contradicts the tool name/title (TikTok), which is a real risk of misselection against meta_ads_read. The bulleted enumeration of twelve tiktok_* operations does eventually make the purpose unambiguous, but the agent has to read past a misleading lead to get there.

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

Usage Guidelines4/5

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

It clearly explains the two-mode pattern — list_tools to discover operation names and fields, execute to run one read — and states that list_tools is free and makes no API call. What it does not do is tell the agent how to choose between this router and platform siblings like meta_ads_read, google_ads_read, revenue_report or performance_dashboard.

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

tiktok_ads_updatePause, resume or change budgets in TikTok AdsA
Destructive
Inspect

Pauses or switches back on objects and changes budgets in a TikTok ad account, and pauses or resumes this server’s TikTok monitors. Call tiktok_ads_update with {"action":"execute","tool_name":"tiktok_pause_campaign","arguments":{…}}; arguments carry the fields of the operation and "connection" when several ad accounts are connected. Operations:

  • tiktok_pause_campaign: Pause one TikTok campaign: it stops delivering and spending. Free, and it can be switched back on in TikTok Ads Manager. Free pause.

  • tiktok_pause_adgroup: Pause one TikTok ad group: it stops delivering and spending. Free, and it can be switched back on in TikTok Ads Manager. Free pause.

  • tiktok_pause_ad: Pause one TikTok ad: it stops delivering and spending. Free, and it can be switched back on in TikTok Ads Manager. Free pause.

  • tiktok_lower_campaign_budget: Lower the budget of one TikTok campaign. Only lowering: a higher budget is a separate change that increases spend. Only reduces spend, and counts toward the monthly change limit.

  • tiktok_lower_adgroup_budget: Lower the budget of one TikTok ad group. A daily budget changes from the next day; a lifetime budget at once. Only reduces spend, and counts toward the monthly change limit.

  • tiktok_enable_campaign: Switch one paused TikTok campaign back on: it starts delivering and spending again. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • tiktok_enable_adgroup: Switch one paused TikTok ad group back on: it starts delivering and spending again. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • tiktok_enable_ad: Switch one paused TikTok ad back on: it starts delivering and spending again. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • tiktok_raise_campaign_budget: Raise the budget of one TikTok campaign. It increases spend: approved by a signed-in person unless this account allows it from chat. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • tiktok_raise_adgroup_budget: Raise the budget of one TikTok ad group. A daily budget changes from the next day; a lifetime budget at once. CAN INCREASE SPEND, and this account allows it from chat: say so before executing.

  • tiktok_manage_monitor: Pause or resume a TikTok monitor. Changes only this server’s own monitor, nothing in TikTok, and never counts toward the monthly change limit. Every operation takes two calls with the same tool_name and arguments; the first changes nothing in TikTok and returns a preview. If the operation cannot increase spend, the preview includes confirm_token (accepted for 10 minutes): call again with it added to arguments to apply the change. An operation that can increase spend (switching on, a higher budget) runs from chat only if this account allows it — it does: say plainly that spend will grow before you execute one; otherwise its preview has no token, only an approve_url for a signed-in person. Pauses and monitor changes are free; other changes count toward the monthly change limit. Input schemas: get_tool_schema for named operations; tiktok_ads_read {"action":"list_tools"} lists them all.

NameRequiredDescriptionDefault
actionYesAlways "execute".
argumentsYesThe fields of the operation, "connection" when several ad accounts are connected, and on the second call the confirm_token from the first call.
tool_nameYesThe operation name, e.g. tiktok_pause_campaign.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only flag destructive/idempotent hints; the description goes far beyond by disclosing the preview returns no change, confirm_token lifetime (10 minutes), the approve_url path for spend-increasing operations with no token, and the monthly change limit. It also distinguishes free operations (pauses, monitor changes) from limit-consuming ones.

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

Conciseness4/5

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

The envelope and safety rules are front-loaded and the operation list is scannable. Some boilerplate repeats verbatim across entries ('Free pause.', 'CAN INCREASE SPEND, and this account allows it from chat: say so before executing'), which bloats the text without adding per-operation information.

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

Completeness5/5

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

For a mutation tool with no output schema, the description covers everything an agent needs: what each operation does, the two-step confirmation, token expiry, the human-approval fallback, and cost/limit consequences. Nothing material about correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds the meaning of the confirm_token round-trip and the "connection" field's purpose (multiple ad accounts). It also supplies the full operation vocabulary for tool_name, which the schema only exemplifies with one value.

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

Purpose5/5

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

The opening sentence gives specific verbs (pause, switch back on, change budgets) and the resource (TikTok ad objects, plus this server's monitors), then enumerates every operation by name. It is clearly demarcated from siblings tiktok_ads_create/delete/read, which cover different mutation classes.

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

Usage Guidelines5/5

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

It states explicitly when to use it (per-operation breakdown), how to invoke it (the {"action":"execute","tool_name":...,"arguments":{...}} envelope), and the alternative reads for discovery (get_tool_schema, tiktok_ads_read list_tools). The two-call preview-then-confirm protocol is spelled out rather than implied.

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

usageMonthly change limit usageB
Read-onlyIdempotent
Inspect

How many changes were made this month and which ones. Free.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds only the scoping of the data (changes this month) and the pricing note; it says nothing about plan limits, quota thresholds, or what an empty result means.

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

Conciseness4/5

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

Two short, front-loaded sentences with no wasted framing. The telegraphic ending ('and which ones. Free.') is clipped but still readable and compact.

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

Completeness4/5

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 sketches the return (a count plus the list of changes) for a zero-parameter read tool. Missing only context on the limit itself, such as whether the count is against a quota or reset window.

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

Parameters4/5

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

The tool takes zero parameters, so per the baseline there is nothing for the description to clarify beyond what the empty schema conveys. No parameter-related value could be added here.

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

Purpose4/5

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

States a concrete verb+resource: counting this month's changes and identifying which ones, framed as monthly change-limit usage. It is distinguishable from audit/billing siblings in intent, though it never names an alternative to disambiguate. Clear but without explicit sibling differentiation.

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

Usage Guidelines2/5

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 mention of how this relates to near-neighbours like billing or audit_account. 'Free' is a cost signal rather than usage direction, so the agent must infer when to reach for this tool.

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.

  1. 4 tool updates
    • Addedtiktok_ads_create
    • Addedtiktok_ads_delete
    • Addedtiktok_ads_read
    • Addedtiktok_ads_update
  2. 1 tool update
    • Addedlinkedin_ads_read
  3. 1 tool update
    • Addedmicrosoft_ads_read
  4. 27 tool updates
    • First observedaudit_account
    • First observedaudit_conversion_tracking
    • First observedbilling
    • First observedbuild_campaign
    • First observedconnect_account
    • First observedget_advice
    • First observedget_insights
    • First observedget_tool_schema
    • First observedgoogle_ads_create
    • First observedgoogle_ads_delete
    • First observedgoogle_ads_read
    • First observedgoogle_ads_update
    • First observedgoogle_analytics_read
    • First observedgoogle_campaign_performance
    • First observedmark_advice
    • First observedmeta_ads_create
    • First observedmeta_ads_delete
    • First observedmeta_ads_read
    • First observedmeta_ads_update
    • First observedperformance_dashboard
    • First observedperformance_overview
    • First observedrevenue_report
    • First observedsearch_console_read
    • First observedsearch_tools
    • First observedshow_dashboard
    • First observedstart_here
    • First observedusage

Publisher details

Operator
Variafy (FOP Volynskyi Illia Oleksandrovych)
Operator website
https://www.variafy.com
Vendor relationship
Independent · Publisher source
Trust center
Not available
Restrictions
Private beta: sign-up is by invitation (waitlist at variafy.com/waitlist). Requires a Meta ad account. Free plan available; paid plans for more changes.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Connects Meta advertising accounts to AI assistants so users can query campaign performance, pull insights and metrics, and explore audiences and targeting options in natural language. It also allows creating, updating, and deleting campaigns, ad sets, ads, creatives, and lead forms, with new campaigns paused by default and write or destructive actions gated by admin permissions.
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables AI assistants and agents to read analytics and manage advertising across Google Ads, Google Analytics 4, and Meta Ads through natural language, with preview-confirm guardrails and configurable account and budget limits.
    21
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Connects AI assistants to Google Ads, Meta Ads, ChatGPT Ads, TikTok Ads and LinkedIn Ads so users can query live campaign performance, budgets and audiences in the account's own currency and prepare changes as proposals that only take effect after explicit approval. Reads run immediately, while every write is staged as an approvable proposal with before/after values, and newly created campaigns, ad sets and ads start paused.
    1
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables managing and analyzing ad accounts in plain language from AI assistants, including cross-account performance reports, keyword research, GAQL queries, and safe previewed changes.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.