AdsAgent — TikTok Ads MCP
Server Details
Hosted TikTok ads MCP with OAuth, bounded reads, and prepare/confirm writes.
- Status
- Healthy
- Uptime
- 55.5% over 62 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 98 tools
Several tool families overlap heavily: insights_query_overview / insights_query_consistent / insights_query_batch_overview / insights_query_rows / tiktok_get_cached_insight_overview are all cache reads of the same data with only legacy-vs-canonical distinctions, copy_ad_quick_copy vs copy_ad_clone_structure both clone ads, and creatives_confirm_upload vs creatives_reconcile vs creatives_abandon_upload all touch the same verification state. The separate bid_/budget_/delivery_status_ prepare-confirm pairs plus the generic approval_plan_* mixed-plan flow add another ambiguous layer. Very verbose descriptions mitigate this somewhat, but an agent still faces multiple plausible tools for one intent.
Nearly everything is snake_case domain-prefixed verb_noun (assets_list_*, creatives_*, templates_*, mmp_*, tasks_*, insights_query_*), which is predictable. Deviations exist: copy_* lives under a different prefix than campaigns_*, bid/budget/delivery_status pairs share no common prefix, and Meta-wire alias tools (assets_refresh_all, tiktok_get_assets_status) mix conventions. Still largely readable and consistent.
98 tools is far beyond what an agent can select among reliably, and many are thin variants or legacy/compat duplicates of the same operation (e.g. multiple insight read paths, parallel prepare/confirm families). Even for a broad advertising platform this surface should be consolidated or gated by mode rather than exposed flat.
The surface covers the ad lifecycle well: asset discovery, creative upload/verification/folders, campaign and ad-group creation, batch create, copy/clone, budget/bid/status changes, templates, insights, MMP, interests, optimization, tasks and approvals. Gaps remain (no audience listing tools despite sync_tiktok_audiences tasks, limited general entity edit/delete outside delivery status and budget/bid), but agents can work around most of them.
Available Tools
98 toolsapproval_plan_confirmExecute an approved mixed TikTok planADestructiveInspect
After explicit user approval of every displayed item, execute the stored mixed advertising plan identified by approval_ref and expected_plan_digest. Supply the exact expected_changes returned by prepare so the host can inspect targets and effects; the server rejects any mismatch. May create, copy, edit, remove or change delivery, budgets and bids of advertising resources, affecting spend. Only registered operation-specific executors run, with their current permissions and validation. Execution is sequential, not atomic at the provider. Stop on failure or uncertainty; preserve per-item receipts. A repeat returns the existing outcome or resumes only proven-unsent quota-deferred items after retry_at within the original approval expiry. Present one approval for the complete requested change set within this platform. Show account and target names, operation, before/after values, warnings and expiry. Keep approval refs, draft IDs, digests, tokens and protocol JSON in tool traffic, not normal chat. Ask for one confirmation of the whole displayed plan. Report each completed, submitted, waiting, failed or uncertain item accurately. A submitted background task is not a verified provider change. Never replay an uncertain write or retry a host safety denial. A waiting_quota plan retains its confirmation only until its original expiry; resume the exact plan after retry_at without asking for another confirmation. Changed or expired plans require review.
| Name | Required | Description | Default |
|---|---|---|---|
| approval_ref | Yes | ||
| expected_changes | Yes | ||
| connection_context | No | ||
| expected_plan_digest | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the safe/unsafe profile (destructive, openWorld); the description goes far beyond it with sequential-not-atomic execution, stop-on-failure, per-item receipts, spend impact, idempotent repeat behavior, retry_at resume semantics within expiry, and the caveat that a submitted background task is not a verified provider change.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and identity, then the constraints. It is long because the tool is high-risk, but several sentences drift into UI/approval-presentation policy ('Show account and target names, operation, before/after values...') that could be trimmed without losing invocation guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates with per-item receipt reporting, failure/uncertain states, and retry behavior. Given a destructive, open-world executor this is largely sufficient, though the return shape and connection_context usage remain unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load. It does add real meaning for expected_changes ('the exact expected_changes returned by prepare ... the server rejects any mismatch') and expected_plan_digest, but says nothing about approval_ref beyond naming it and never mentions connection_context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource (execute the stored mixed advertising plan) and pins identity to approval_ref and expected_plan_digest. It is clearly distinguishable from approval_plan_prepare, approval_plan_get and approval_plan_deny, which the sibling list shows are the near-miss alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Specifies the precondition (explicit user approval of every displayed item), the required inputs from prepare, and the failure condition (server rejects mismatches). It also spells out when to resume versus re-review ('changed or expired plans require review').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
approval_plan_denyDiscard a mixed TikTok approvalADestructiveInspect
Discard a prepared or quota-waiting mixed approval, preserving completed item receipts. No TikTok changes.
| Name | Required | Description | Default |
|---|---|---|---|
| approval_ref | Yes | ||
| connection_context | No | ||
| expected_plan_digest | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: it is a local-only discard ('No TikTok changes') that preserves completed item receipts, which the annotations cannot express. It does not cover idempotency or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler. The scope and state precondition are front-loaded, and the effect disclaimer follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive lifecycle tool with no output schema, the description covers the important unknowns: which states are deniable, what survives (completed receipts), and that no external system is touched. It stops short of saying what the caller receives back or what happens to incomplete items.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 3 parameters, so the description carries the full burden and documents none of them. approval_ref, expected_plan_digest, and the connection_context pattern are left entirely unexplained, including the digest's role as a concurrency/confirmation guard.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (discard) and resource (a prepared or quota-waiting mixed approval), and qualifies which lifecycle states are eligible. 'No TikTok changes' implicitly separates it from approval_plan_confirm, which is the sibling that does touch TikTok. The jargon 'mixed approval' is left undefined, keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'prepared or quota-waiting' gives a concrete precondition for when this tool applies, and 'No TikTok changes' contrasts with the confirm path without naming it. There is no explicit 'use X instead when...' routing, but the context is clear enough to select correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
approval_plan_getRead a mixed TikTok approvalBRead-onlyInspect
Read one stored mixed approval and its item receipts; no provider requests or state changes.
| Name | Required | Description | Default |
|---|---|---|---|
| approval_ref | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description reinforces this with 'no provider requests or state changes,' but adds nothing beyond annotations, such as error behavior when approval_ref is not found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the read scope stated first and the negative constraint second. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with no output schema, the description is minimally adequate but leaves the undocumented approval_ref identifier format and the meaning of 'item receipts' unexplained, which an agent would need to call and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for two parameters. The description says nothing about approval_ref, its expected format, or what connection_context (an mctx_v1_ pattern token) is for. With zero coverage the description should compensate and does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read one stored mixed approval and its item receipts.' This distinguishes it from the mutation siblings approval_plan_prepare/confirm/deny, though the term 'mixed approval' is domain jargon that isn't explained.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'no provider requests or state changes' implicitly contrasts with the prepare/confirm/deny siblings, giving an implied usage context. However, no alternative tool is named and no explicit when-to-use condition is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
approval_plan_preparePrepare a mixed TikTok approvalBInspect
Combine 1–20 owned, unexpired, unconfirmed advertising drafts into one immutable approval. Supports mixed operation types within this platform through the existing validated prepare/confirm adapters. Stores a private approval; sends no advertising changes. The source drafts become members and cannot be confirmed separately. Present one approval for the complete requested change set within this platform. Show account and target names, operation, before/after values, warnings and expiry. Keep approval refs, draft IDs, digests, tokens and protocol JSON in tool traffic, not normal chat. Ask for one confirmation of the whole displayed plan. Report each completed, submitted, waiting, failed or uncertain item accurately. A submitted background task is not a verified provider change. Never replay an uncertain write or retry a host safety denial. A waiting_quota plan retains its confirmation only until its original expiry; resume the exact plan after retry_at without asking for another confirmation. Changed or expired plans require review. Each item accepts a delivery approval_ref, a create approval_ref with approval_token, or the confirm_token returned by quick-create/copy preparation. Keep these handles private.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: 'sends no advertising changes', sources become immutable members, drafts 'cannot be confirmed separately', handles must stay out of normal chat, never replay an uncertain write, and waiting_quota plans retain their confirmation until original expiry. Those are exactly the behavioral traits an agent needs. Not a 5 because it doesn't clarify whether the approval later executed by approval_plan_confirm is bound to the exact captured state or how the expiry window is determined on creation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded correctly, but then crams roughly eight distinct topics (display rules, privacy rules, confirmation behavior, reporting semantics, retry safety, expiry behavior, per-item source protocols) into one undifferentiated paragraph. Sentences like 'Report each completed, submitted, waiting, failed or uncertain item accurately' and 'Keep these handles private' add little and bloat the text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no output schema and no annotation coverage of its behavioral contract, it does cover the critical semantics around immutability, expiry, and idempotency. But it leaves the connection_context parameter undocumented and never states whether the returned approval is the same object later passed to approval_plan_confirm or how it should be referenced.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the parameter burden. It does explain the three mutually exclusive source handle types (approval_ref, approval_token with approval_ref, confirm_token) and the 1–20 bound, which is genuinely useful. But it never mentions 'connection_context', its required format, or how it relates to the mctx_v1 pattern, leaving that parameter unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb and resource: 'Combine 1–20 owned, unexpired, unconfirmed advertising drafts into one immutable approval.' That is specific and hard to confuse with the sibling approval_plan_confirm or approval_plan_get. It stops short of explicitly naming those siblings as the alternatives, so it doesn't quite reach 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says the tool produces one approval for the complete requested change set and that each item accepts one of three source handles, which implies when to use it. But it never explicitly states when to prefer this over campaigns_quick_create_confirm, copy_ad_quick_copy_confirm, or the per-domain prepare/confirm pairs, which is the real ambiguity in this sibling group.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_list_ad_accountsList TikTok advertisersARead-onlyInspect
List cached TikTok ad accounts (advertisers) for the authenticated tenant. Each row carries owner_bc_name joined from the owning Business Center so the agent can render "Owner BC: XYZ" without a second round trip. Mirrors Meta MCP assets_list_ad_accounts: only advertisers the connected TikTok member can operate now are listed; ones TikTok refuses (removed from the member in Business Center) are left out.
Returns a compact bounded page. Optional: cursor from the previous response, limit (default 20, maximum 50), and search (case-insensitive native id/name lookup). Keep the same tool, filters and limit while following next_cursor serially until complete=true. A rejected or old cursor requires restarting page one. complete describes pagination, not upstream sync coverage or permission to create.
REQUIRED: none. EXAMPLE: assets_list_ad_accounts({"limit": 20})
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| search | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/non-destructive/non-openWorld, and the description adds a lot beyond them: data is cached, membership-based filtering excludes accounts TikTok refuses, cursors can be rejected/expired, and 'complete' describes pagination rather than upstream sync coverage or create permission. That last clarification is exactly the kind of trait annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded and nearly every sentence carries information about behavior, pagination, or constraints. Minor slack exists (the Meta-MCP mirroring aside and the explicit REQUIRED/EXAMPLE boilerplate), but nothing is truly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param read tool with no output schema, the description supplies the row shape (owner_bc_name), page semantics, and cursor lifecycle that an output schema would otherwise provide. The only omission is connection_context, which does not block correct invocation for the common path.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does for three of four params: limit (default 20, max 50), search (case-insensitive native id/name lookup), and cursor (sourced from previous response, stale cursors require a restart). The fourth parameter, connection_context, is never mentioned, leaving a gap that keeps this below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb+resource+scope: list cached TikTok ad accounts (advertisers) for the authenticated tenant. It distinguishes itself from siblings like assets_list_business_centers, assets_list_tt_accounts, and assets_list_apps, and even clarifies the addressee semantics ('advertisers'). An agent can pick this tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real usage context: only advertisers the connected member can currently operate are listed, and that the result mirrors the Meta MCP equivalent. It also prescribes how to iterate (keep the same tool/filters/limit, follow next_cursor serially) and when to restart page one. It stops short of naming an explicit alternative sibling or stating when NOT to use it, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_list_appsList and refresh advertiser appsADestructiveInspect
List cached TikTok app assets (App Promotion advertised apps) for the authenticated tenant. Each row carries linked_bcs: [{bc_id, bc_name}, ...] derived from linked_advertiser_ids → advertiser.owner_bc_id.
Returns a compact bounded page. Optional: cursor from the previous response, limit (default 20, maximum 50), and search (case-insensitive native id/name lookup). Keep the same tool, filters and limit while following next_cursor serially until complete=true. A rejected or old cursor requires restarting page one. complete describes pagination, not upstream sync coverage or permission to create.
For creation, pass advertiser_id from assets_list_ad_accounts to return only assets with an exact cached advertiser link. Shared BC ownership alone is not an advertiser link. The prepare step still verifies the selected asset, identity type and create-capable authorization.
Assets are not swept on a schedule. With advertiser_id, an empty cached result is checked live against TikTok once for that advertiser; pass refresh=true (first page, advertiser_id required) to re-read it even when cached rows exist. coverage.live_refresh reports refreshed, rate_limited, no_permission (TikTok refuses this advertiser; do not create on it), no_connection or failed.
REQUIRED: none. EXAMPLE: assets_list_apps({"search": "package"})
A live refresh can replace cached app rows for the selected advertiser.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| search | No | ||
| refresh | No | ||
| advertiser_id | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already flagging destructiveHint=true, the description explains the actual destructive mechanism ('A live refresh can replace cached app rows for the selected advertiser') and enumerates the refresh outcome set (refreshed, rate_limited, no_permission, no_connection, failed). It also surfaces auth constraints ('create-capable authorization', 'do not create on it') and rate-limit signaling beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded with purpose and return shape first, then parameters, then refresh semantics. It is long for a list tool and the note that a live refresh can replace cached rows slightly restates the earlier refresh guidance, but nearly every sentence carries operational meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description supplies the return contract itself: bounded page, linked_bcs rows derived from linked_advertiser_ids → advertiser.owner_bc_id, next_cursor/complete pagination semantics, and coverage.live_refresh statuses. Combined with the refresh/cursor rules, an agent has everything needed to call this correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description carries the full burden and does so: limit (default 20, maximum 50), cursor (from previous response), search (case-insensitive native id/name lookup), refresh (first page, advertiser_id required), and advertiser_id (exact cached advertiser link, not shared BC ownership). Only connection_context (an internal token) is left undocumented, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List cached TikTok app assets (App Promotion advertised apps) for the authenticated tenant') and even names the sibling asset type it relates to ('advertiser_id from assets_list_ad_accounts'). An agent can distinguish it from the other assets_list_* tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when/when-not conditions: use advertiser_id from assets_list_ad_accounts for creation, pass refresh=true only on the first page with advertiser_id, follow next_cursor serially with same filters/limit, and restart from page one on a rejected/old cursor. It also steers the agent away from creating when coverage.live_refresh reports no_permission.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_list_business_centersList TikTok Business CentersARead-onlyInspect
List cached TikTok Business Centers (Meta wire name: businesses) for the authenticated tenant, across every connection. Each row is augmented with advertiser_count and pixel_count computed from owner_bc_id, so per-BC inventory is visible without extra calls. Mirrors Meta MCP assets_list_businesses.
Returns a compact bounded page. Optional: cursor from the previous response, limit (default 20, maximum 50), and search (case-insensitive native id/name lookup). Keep the same tool, filters and limit while following next_cursor serially until complete=true. A rejected or old cursor requires restarting page one. complete describes pagination, not upstream sync coverage or permission to create.
REQUIRED: none. EXAMPLE: assets_list_business_centers({"limit": 20})
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| search | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds non-obvious context: the data is cached, rows are augmented with computed counts, cursors can be rejected/expire requiring restart, and 'complete' does not imply upstream sync coverage or creation permission. Only freshness/staleness of the cache is left unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose before pagination mechanics, and each paragraph has a distinct job (what it lists, return shape, pagination, caveats). It is somewhat dense and longer than strictly necessary, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the return shape (compact bounded page, next_cursor, complete flag) and pagination semantics. Zero required parameters is clear, and the only real gap is the undocumented connection_context parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning, and it does: limit (default 20, max 50), cursor (from previous response, can be rejected/old), and search (case-insensitive native id/name lookup). It omits connection_context entirely, which is the one parameter left undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List cached TikTok Business Centers') plus scope ('for the authenticated tenant, across every connection') and notes the enrichment fields (advertiser_count, pixel_count). Clear and specific, but it differentiates only implicitly from siblings like assets_list_ad_accounts or assets_list_pixels by resource name alone, with no explicit contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Strong operational guidance on pagination protocol (keep same tool/filters/limit, follow next_cursor serially until complete=true, restart page one on a rejected cursor) and a useful clarification that complete refers to pagination rather than sync coverage. However, it never states when to choose this tool over sibling asset-listing tools, so alternative selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_list_cta_portfoliosList and refresh CTA portfoliosADestructiveInspect
List cached TikTok CTA portfolios for one exact advertiser. Use creative_portfolio_id as ad_params.call_to_action_id for Smart+ website-conversion local image or video create. The server still verifies that the selected portfolio is linked to the same advertiser before approval. Portfolios are read from TikTok for this advertiser when the cached list is empty or refresh=true; a portfolio ID the user names is also read live during prepare. Never guess a portfolio ID.
Returns a compact bounded page. Optional: cursor from the previous response, limit (default 20, maximum 50), and search (case-insensitive native id/name lookup). Keep the same tool, filters and limit while following next_cursor serially until complete=true. A rejected or old cursor requires restarting page one. complete describes pagination, not upstream sync coverage or permission to create.
REQUIRED: advertiser_id from assets_list_ad_accounts. EXAMPLE: assets_list_cta_portfolios({"advertiser_id": "1234567890", "limit": 20})
A live refresh can replace cached CTA portfolio rows for the selected advertiser.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| search | No | ||
| refresh | No | ||
| advertiser_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With destructiveHint=true already set, the description explains the mechanism behind it ('a live refresh can replace cached CTA portfolio rows for the selected advertiser') and notes server-side verification that the portfolio belongs to the same advertiser. It clarifies that complete refers to pagination, not sync coverage or permission to create, which is valuable context beyond the annotations, though it omits permission/rate-limit detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded, followed by usage, pagination, and refresh semantics in a logical order. It is dense but nearly every sentence adds operational information; the pagination paragraph is slightly verbose but earns its length given the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, paginated, refresh-capable tool with no output schema and no schema descriptions, the description covers usage, pagination, refresh behavior, and prerequisites well. It stops short of describing the returned row shape (id/name fields), which the agent must infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and does so: it documents cursor (from previous response), limit (default 20, max 50), search (case-insensitive native id/name lookup), refresh (forces live read), and advertiser_id (required, from assets_list_ad_accounts). Only the internal connection_context is undocumented, which is acceptable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List cached TikTok CTA portfolios') scoped to 'one exact advertiser,' and names the sibling that supplies its required input ('advertiser_id from assets_list_ad_accounts'). An agent can distinguish it from the other assets_list_* tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when and how to use it: feed the returned id as ad_params.call_to_action_id for Smart+ website-conversion creation, never guess an id, refresh only when cache is empty or refresh=true, and keep filters/limit fixed while following next_cursor until complete=true. Names the prerequisite tool and the restart rule on a stale cursor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_list_identitiesList and refresh advertiser identitiesADestructiveInspect
List cached TikTok posting identities for the authenticated tenant. Meta pages analog: call this from assets discovery before campaigns_quick_create when ad_params lacks identity_id / identity_type (Smart+ App may auto-pick only when exactly one eligible BC_AUTH_TT row exists for the advertiser). Each row includes regular_local_media_eligible=true only when its exact identity_type is CUSTOMIZED_USER; regular local video/image also requires its exact advertiser link. AUTH_CODE is Spark-only on regular create: use an eligible Spark post and pass its signed receipt unchanged when available; a legacy receipt-less item incurs one bounded live provider verification before approval. TT_USER and BC_AUTH_TT are not regular-local choices and may be used only on a server-verified compatible Smart+ route. When the same identity_id appears on multiple BC rows, pass identity_authorized_bc_id from this list. Each row carries linked_bcs: [{bc_id, bc_name}, ...].
Returns a compact bounded page. Optional: cursor from the previous response, limit (default 20, maximum 50), and search (case-insensitive native id/name lookup). Keep the same tool, filters and limit while following next_cursor serially until complete=true. A rejected or old cursor requires restarting page one. complete describes pagination, not upstream sync coverage or permission to create.
For creation, pass advertiser_id from assets_list_ad_accounts to return only assets with an exact cached advertiser link. Shared BC ownership alone is not an advertiser link. The prepare step still verifies the selected asset, identity type and create-capable authorization.
Assets are not swept on a schedule. With advertiser_id, an empty cached result is checked live against TikTok once for that advertiser; pass refresh=true (first page, advertiser_id required) to re-read it even when cached rows exist. coverage.live_refresh reports refreshed, rate_limited, no_permission (TikTok refuses this advertiser; do not create on it), no_connection or failed.
REQUIRED: none. EXAMPLE: assets_list_identities({"limit": 20})
A live refresh can replace cached identity rows for the selected advertiser.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| search | No | ||
| refresh | No | ||
| advertiser_id | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive=true but not what is destroyed; the description fills that gap by stating a live refresh can replace cached identity rows, and it documents permission/auth outcomes (coverage.live_refresh values including no_permission), rate limiting, and the one-off live verification behavior. This is substantial context beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the body is a dense wall of domain jargon crammed into long parenthetical run-ons. The information earns its place, yet the presentation is hard to parse and would benefit from tighter scoping or structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with no output schema, the description covers pagination completion semantics, row fields (linked_bcs, regular_local_media_eligible), the coverage.live_refresh status vocabulary, and refresh caveats. An agent has what it needs to page, filter, and refresh correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the burden and largely does: it gives limit defaults/maximum, cursor semantics and restart-on-rejection, search as case-insensitive native id/name, refresh requiring first page + advertiser_id, and advertiser_id scoping. Only connection_context is left undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource up front ('List cached TikTok posting identities for the authenticated tenant') and extends it with the refresh capability. It also distinguishes itself from the surrounding asset-list siblings by naming the 'Meta pages analog' and its role in the discovery-before-create flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit about when to call it: 'call this from assets discovery before campaigns_quick_create when ad_params lacks identity_id / identity_type'. It also names the alternative source (assets_list_ad_accounts for advertiser_id) and the exclusion (shared BC ownership alone is not an advertiser link).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_list_musicSearch advertiser carousel musicARead-onlyInspect
Search TikTok's live advertiser-available music library for Smart+ SINGLE_IMAGE or CAROUSEL_ADS creation. Results contain public metadata and exact music_id values only; temporary media URLs, signatures, tokens, and raw provider payloads are omitted. Select a row with create_eligible=true and the required image format, then pass its music_id as ad_params.music_info.music_id. The server revalidates it on the exact create route before issuing an approval, so never guess or assume cross-advertiser availability. A saved template retains an explicit track even without a source advertiser; preparation verifies that exact choice on the target and requires a new selection if unavailable. Local carousel members come from creatives_list through ordered image_creative_ids, independently of music discovery.
REQUIRED: advertiser_id from assets_list_ad_accounts and a keyword search containing 1 to 100 characters. Optional: limit (1..50) and the opaque next_cursor returned by the previous page. Keep the same advertiser_id, search, and limit while continuing; paginate serially, never fan out. EXAMPLE: assets_list_music({"advertiser_id": "1234567890", "search": "uplifting", "limit": 20})
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| search | Yes | ||
| advertiser_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, but the description adds substantial behavior beyond them: results carry public metadata and exact music_id only (no temporary URLs, signatures, tokens, or raw provider payloads), the server revalidates the id on the exact create route before issuing an approval, and saved templates retain an explicit track that preparation re-verifies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: the library/scope statement comes first, then result-content caveats, then required/optional parameters, then an example. It is dense and every sentence is informative, though the saved-template and local-carousel sentences sit slightly off the core path of discovery and cost a bit of length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with no output schema, the description explains what results contain, what is deliberately omitted, the required/optional parameters with ranges, pagination behavior, and how the returned music_id is consumed downstream. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does so well: advertiser_id must come from assets_list_ad_accounts, search is 1-100 characters, limit ranges 1..50, and cursor is the opaque next_cursor from the previous page with serial pagination rules. An example call is included.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: searches TikTok's live advertiser-available music library, scoped to Smart+ SINGLE_IMAGE or CAROUSEL_ADS creation. It even delineates a boundary against a sibling by noting local carousel members come from creatives_list via image_creative_ids, so an agent can distinguish it without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent to select a row with create_eligible=true and the required image format, then pass its music_id as ad_params.music_info.music_id. It also gives when-not guidance ('never guess or assume cross-advertiser availability') and pagination discipline (keep the same advertiser_id/search/limit, paginate serially, never fan out).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_list_pixelsList and refresh advertiser pixelsADestructiveInspect
List cached TikTok pixels for the authenticated tenant with their owning BC list attached. Each row carries linked_bcs: [{bc_id, bc_name}, ...] derived from linked_advertiser_ids → advertiser.owner_bc_id plus any direct owner_bc_id from BC-asset-sourced rows.
Returns a compact bounded page. Optional: cursor from the previous response, limit (default 20, maximum 50), and search (case-insensitive native id/name lookup). Keep the same tool, filters and limit while following next_cursor serially until complete=true. A rejected or old cursor requires restarting page one. complete describes pagination, not upstream sync coverage or permission to create.
For creation, pass advertiser_id from assets_list_ad_accounts to return only assets with an exact cached advertiser link. Shared BC ownership alone is not an advertiser link. The prepare step still verifies the selected asset, identity type and create-capable authorization.
Assets are not swept on a schedule. With advertiser_id, an empty cached result is checked live against TikTok once for that advertiser; pass refresh=true (first page, advertiser_id required) to re-read it even when cached rows exist. coverage.live_refresh reports refreshed, rate_limited, no_permission (TikTok refuses this advertiser; do not create on it), no_connection or failed.
REQUIRED: none. EXAMPLE: assets_list_pixels({"search": "purchase"})
A live refresh can replace cached pixel rows for the selected advertiser.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| search | No | ||
| refresh | No | ||
| advertiser_id | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=true, indicating a mutation-capable tool. The description adds that a live refresh can replace cached pixel rows, which is useful context. However, it doesn't explicitly flag the destructive/overwrite nature as strongly as it could, and coverage.live_refresh outcomes are described but not the full impact.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized, front-loading the core purpose and then detailing pagination, refresh behavior, and the creation path. It's longer than minimal but each paragraph covers a distinct concern.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters, no output schema, and 0% schema coverage, the description does a good job covering pagination, refresh semantics, coverage.live_refresh outcomes, and the advertiser_id requirement. It's missing connection_context and doesn't fully explain what the returned row structure looks like beyond linked_bcs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains cursor (from previous response), limit (default 20, max 50), search (case-insensitive native id/name lookup), advertiser_id (from assets_list_ad_accounts, required for refresh), and refresh (first page, advertiser_id required). It doesn't explain connection_context, but overall adds substantial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists cached TikTok pixels for the authenticated tenant with owning BC lists attached, and explains the linked_bcs derivation. It distinguishes itself from siblings like assets_list_ad_accounts and assets_refresh_all by focusing on pixel listing with BC linkage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use advertiser_id (for creation, to get exact cached advertiser links) and when to use refresh (first page, advertiser_id required). It also warns that shared BC ownership is not an advertiser link and that the prepare step verifies authorization. Alternatives aren't explicitly named, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_list_shopsList cached TikTok shopsARead-onlyInspect
List cached TikTok Shops attached to the authenticated tenant's Business Centers (populated via /bc/asset/get/?asset_type=SHOP).
Returns a compact bounded page. Optional: cursor from the previous response, limit (default 20, maximum 50), and search (case-insensitive native id/name lookup). Keep the same tool, filters and limit while following next_cursor serially until complete=true. A rejected or old cursor requires restarting page one. complete describes pagination, not upstream sync coverage or permission to create.
REQUIRED: none. EXAMPLE: assets_list_shops({"limit": 20})
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| search | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), and the description adds meaningful context: bounded page size, cursor invalidation behavior, the warning that complete refers to pagination rather than upstream sync coverage, and that it confers no permission to create. This is real behavioral disclosure beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by pagination semantics, then REQUIRED and an example. Mostly efficient, though the 'complete describes pagination, not upstream sync coverage or permission to create' clause is slightly defensive and could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description partially describes returns (compact bounded page, next_cursor, complete flag) and covers defaults, limits, and pagination discipline. It is complete enough to call correctly, though the connection_context parameter and exact page shape are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load, and it documents three of four parameters well: limit (default 20, max 50), cursor (from the previous response, restart on rejection), and search (case-insensitive native id/name lookup). The connection_context parameter remains unexplained, though its pattern regex is largely self-describing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List cached TikTok Shops') and scopes it precisely to the authenticated tenant's Business Centers, even naming the upstream endpoint that populates the cache. An agent can immediately distinguish this from siblings like assets_list_business_centers or assets_list_tt_accounts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit operational guidance: keep the same tool/filters/limit while following next_cursor serially until complete=true, and restart from page one on a rejected or stale cursor. It clarifies the meaning of 'complete' but does not explicitly name alternative tools (e.g. assets_refresh_all) or when to prefer a live refresh over the cache.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_list_tt_accountsList cached TikTok accountsARead-onlyInspect
List cached TikTok accounts obtained from Business Center assets. These tt_account_id values are not posting identity_id values. For ad creation use assets_list_identities with the exact advertiser_id, then preserve identity_type and identity_authorized_bc_id.
Returns a compact bounded page. Optional: cursor from the previous response, limit (default 20, maximum 50), and search (case-insensitive native id/name lookup). Keep the same tool, filters and limit while following next_cursor serially until complete=true. A rejected or old cursor requires restarting page one. complete describes pagination, not upstream sync coverage or permission to create.
REQUIRED: none. EXAMPLE: assets_list_tt_accounts({"limit": 20})
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| search | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnlyHint=true, destructiveHint=false, openWorldHint=false), and the description adds real context beyond them: the data is cached rather than live, results come back as a 'compact bounded page', a rejected or old cursor forces restarting at page one, and complete means pagination finished rather than upstream sync coverage or permission to create. That last clarification actively prevents a plausible misreading of the return value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and the identity-vs-account distinction, then pagination mechanics, then requirements and an example. The pagination guidance is repeated in slightly different words ('follow next_cursor serially' vs 'a rejected or old cursor requires restarting page one'), which is defensible given the failure mode it guards against, but keeps it from being maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the work of describing the return shape: a compact bounded page with cursor and complete, plus what complete does and does not mean. Combined with the pagination loop instructions and the explicit 'REQUIRED: none', an agent has enough to invoke and iterate correctly; only connection_context is left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden, and it does for three of four parameters: cursor origin (from the previous response), limit (default 20, maximum 50), and search (case-insensitive native id/name lookup). The fourth parameter, connection_context, is never mentioned, leaving one gap that the zero-coverage schema does not fill.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List cached TikTok accounts') and immediately pins down the scope: data sourced from Business Center assets. It also explicitly disambiguates from the sibling concept of identities ('These tt_account_id values are not posting identity_id values'), so an agent can tell it apart from assets_list_identities without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-not and an alternative: for ad creation use assets_list_identities with the exact advertiser_id, then preserve identity_type and identity_authorized_bc_id. It also states the pagination protocol (same tool/filters/limit, follow next_cursor serially until complete=true) and the recovery path for a rejected or stale cursor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_lookup_business_linksRead cached business asset linksARead-onlyInspect
Read the authenticated tenant's cached TikTok asset topology. Provide exactly one native ID selector: bc_id, advertiser_id, app_id, pixel_id, identity_id, or connection_id. Names are not selectors. BC/account/connection selectors inspect forward relationships; app/pixel/identity selectors inspect exact advertiser links and BC context. This is the TikTok counterpart of Meta assets_lookup_business_links; use TikTok selectors, not Meta business_id/page_id or FB user identifiers. Returns bounded nodes and edges with per-connection evidence and source fields. Do not merge identity observations across identity_type/authorized BC. Cached owner_bc_id and observation edges do not prove ownership, current permissions or create eligibility. Shared BC membership is never an advertiser asset link. Missing matches do not prove no relationship exists. Optional limit=1..50 (default 20) and cursor. Follow next_cursor serially with identical selector and limit; complete means result pagination only. Inspect coverage for source read limits and non-atomic cache reads. Local creative upload/mapping is separate: use creatives_list and create prepare. No source refresh or provider write occurs. EXAMPLE: assets_lookup_business_links({"advertiser_id": "<advertiser_id>"})
| Name | Required | Description | Default |
|---|---|---|---|
| bc_id | No | ||
| limit | No | ||
| app_id | No | ||
| cursor | No | ||
| pixel_id | No | ||
| identity_id | No | ||
| advertiser_id | No | ||
| connection_id | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/openWorld/destructive, but the description adds substantial context: results are cached (not atomic), no refresh or provider write occurs, cache evidence does not prove ownership/permissions/create eligibility, shared BC membership is not an asset link, and missing matches are inconclusive. That is genuinely beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every sentence carries operational weight, but the block is dense and packed with caveats that could be grouped more tightly. Still appropriately sized for a high-complexity, 9-parameter lookup.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and nine parameters, the description supplies the return shape (bounded nodes/edges with per-connection evidence), pagination semantics, and a long list of interpretive caveats. The only real gap is the unexplained connection_context parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load. It documents the selector semantics (which of bc_id/advertiser_id/app_id/pixel_id/identity_id/connection_id to use and what each reveals), the exactly-one rule, and limit=1..50 default 20 plus cursor. It does not explain connection_context (the mctx_v1_ token), leaving one parameter undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: reading the authenticated tenant's cached TikTok asset topology. It explicitly differentiates itself from the Meta counterpart (assets_lookup_business_links with Meta IDs) and from local creative tooling (creatives_list, create prepare), so an agent can place it precisely among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit selection rules: exactly one native ID selector, which selector family maps to which relationship type (BC/account/connection = forward; app/pixel/identity = exact advertiser links), plus hard exclusions ('use TikTok selectors, not Meta business_id/page_id'). It also names the alternative tool for the separate creative-upload case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_refresh_allRefresh all tenant asset cachesADestructiveInspect
Refresh TikTok asset snapshots (pixels / audiences / identities / shops / TT accounts / apps / CTA portfolios) across every active pull-enabled connection for the authenticated tenant. Meta-wire-aligned alias of tiktok_refresh_assets. Returns per-task receipts and truthful admission failures. Poll returned task_ref (or task_id when no public ref is available) with tasks_get_status; submitted does not mean refreshed. Check per-task results and tiktok_get_assets_status before preparing creation.
REQUIRED: none. EXAMPLE: assets_refresh_all({})
| Name | Required | Description | Default |
|---|---|---|---|
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag a destructive, non-read-only mutation, and the description adds real behavioral value on top: it is asynchronous, returns per-task receipts and 'truthful admission failures', and warns 'submitted does not mean refreshed'. It stops short of explaining what the destructive refresh actually replaces or whether repeated calls are idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded, opening with the verb/resource and closing with the required polling workflow; every sentence carries operational information. The 'Meta-wire-aligned alias of `tiktok_refresh_assets`' phrase is slightly cryptic internal jargon but still useful routing information, so waste is minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an async mutation tool with no output schema, the description covers what an agent needs: the async task model, the polling siblings, the returned receipts/failures, and the warning that submission is not completion. The main gap is the undocumented `connection_context` parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter (`connection_context`) with 0% schema description coverage, and the description never mentions it, so it fails to compensate for the coverage gap. The only hint is 'for the authenticated tenant', which loosely implies tenant scoping but gives no format or meaning for the connection_context pattern.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb (refresh) plus a specific resource (TikTok asset snapshots) and enumerates the covered asset classes (pixels/audiences/identities/shops/TT accounts/apps/CTA portfolios) and scope (every active pull-enabled connection for the tenant). It also positions itself against siblings by naming the alias relationship to `tiktok_refresh_assets` and pointing to `tiktok_get_assets_status`, so an agent can distinguish it from the `assets_list_*` family without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear downstream context: poll the returned task_ref (or task_id) with `tasks_get_status`, and check per-task results plus `tiktok_get_assets_status` before preparing creation. It does not spell out an explicit when-not or explain when to prefer this over the aliased `tiktok_refresh_assets`, so the routing is implied rather than fully prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bid_confirmConfirm an advertising bid changeADestructiveInspect
Consume one bid approval_ref and dispatch the exact recorded TikTok ad-group change once. Never replay an uncertain result; use operations_get on the original route.
| Name | Required | Description | Default |
|---|---|---|---|
| approval_ref | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, so the mutation/live-effect profile is known. The description adds genuinely new behavior: the approval_ref is single-use, dispatch happens exactly once, and uncertain outcomes must not be replayed. It omits failure semantics and any auth/rate constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the core action and the single-use constraint front-loaded and the fallback tool named at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output-schema confirmation tool, the description covers the essential risky semantics (single-use, no replay, alternative on uncertainty). It could still say what the caller should expect on success or what the original route reference means.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains approval_ref as a consumable single-use token (useful), but says nothing about connection_context, which is left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('consume... and dispatch') and a concrete resource ('the exact recorded TikTok ad-group change'), plus a scope qualifier ('once'). It is clearly distinguishable from bid_prepare, though it never names that sibling or the other *_confirm tools explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a real when-not rule: do not replay on an uncertain result, and route to operations_get instead. It does not state the prerequisite (that bid_prepare must have produced the approval_ref) or contrast with budget_confirm/delivery_status_confirm, so context is clear but not fully bounded.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bid_preparePrepare an advertising bid changeAInspect
Validate a bounded tenant-owned TikTok ad-group bid change in advertiser-currency units and return a single-use approval_ref. This tool does not mutate TikTok. adset is only the common-wire alias.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | ||
| entity_refs | Yes | ||
| entity_type | Yes | ||
| target_value | Yes | Advertiser-currency units | |
| ad_account_id | Yes | ||
| idempotency_key | Yes | ||
| connection_context | No | ||
| rule_id_and_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, openWorldHint=false and destructiveHint=false; the description meaningfully adds that no TikTok mutation occurs, that the operation is bounded to the tenant's own entities, and that the returned approval_ref is single-use. That is real context beyond the annotations, though 'bounded' is never defined and no expiry/one-shot failure behavior is described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and the returned artifact, with no padding. The phrasing 'common-wire alias' is jargon that costs more than it communicates, but overall the density is good.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, 7-required prepare tool with no output schema, the description covers the return artifact and the non-mutating nature, which is the most important part. It is nevertheless incomplete: the meaning of run_id, rule_id_and_version, idempotency_key and entity_refs is absent from both description and schema, and validation-failure behavior is unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 13% (essentially just target_value's 'Advertiser-currency units'), so the description must carry the load for run_id, idempotency_key, rule_id_and_version, connection_context and entity_refs — and it explains none of them. It only restates the unit semantics already in the schema and the adset/ad_group alias already visible in the enum, leaving seven required-or-near-required parameters uninterpretable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (validate), resource (bounded tenant-owned TikTok ad-group bid change), unit semantics (advertiser-currency), and outputs a named artifact (single-use approval_ref). It also pre-empts a likely confusion by noting that 'adset' is only the wire alias, which cleanly separates it from the confirm-side siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The statement 'This tool does not mutate TikTok' implicitly positions it as the pre-step to a mutating confirm call, and the sibling list contains bid_confirm, so the prepare/confirm workflow is inferable. However, it never explicitly says when to use this versus bid_confirm, or whether an approval_ref must be consumed by a specific sibling before it expires.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
budget_confirmConfirm an advertising budget changeBDestructiveInspect
Consume one budget approval_ref and dispatch the exact recorded TikTok change once. A transport-uncertain result is never replayed; recover it with operations_get on the original authorization route.
| Name | Required | Description | Default |
|---|---|---|---|
| approval_ref | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as destructive, non-read-only and open-world, so the safety bar is pre-set. The description adds genuinely useful behavior beyond that: the ref is single-use ('consume one'), the dispatch happens exactly once, uncertain results are never replayed, and recovery happens through operations_get on the authorization route.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the core action and followed by the failure-handling rule. Every clause carries weight, though 'on the original authorization route' is slightly cryptic phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers idempotency and recovery well but omits the prerequisite flow (budget_prepare), the meaning of connection_context, and any notion of what is returned on success.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It references approval_ref only obliquely ('one budget approval_ref') without format or source guidance, and never mentions connection_context at all, leaving one of the two parameters fully undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: consuming an approval_ref and dispatching the recorded TikTok budget change. It clearly implies the confirm step of a prepare/confirm pair, but never names budget_prepare as the thing that produces the ref, so sibling differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies the tool is used to confirm a previously recorded change and gives a strong recovery path for transport-uncertain results (operations_get). However it never explicitly states the precondition (a change prepared via budget_prepare) or when to use this rather than budget_prepare/approval alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
budget_preparePrepare an advertising budget changeAInspect
Validate a bounded tenant-owned TikTok campaign or ad-group budget change in advertiser-currency units and return a single-use approval_ref. This tool does not mutate TikTok. adset is only the common-wire alias for TikTok ad_group.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | ||
| entity_refs | Yes | ||
| entity_type | Yes | ||
| target_value | Yes | Advertiser-currency units | |
| ad_account_id | Yes | ||
| idempotency_key | Yes | ||
| connection_context | No | ||
| rule_id_and_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it non-read-only, non-destructive, closed-world. The description adds real context beyond them: it creates no TikTok mutation, it returns a single-use approval_ref, and the change is bounded/tenant-owned in advertiser-currency units. It does not, however, describe the idempotency or run_id lifecycle.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose and no filler. The non-mutation disclaimer and the adset/ad_group alias note each carry distinct, necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and a complex 7-required-param tool, so the description carries more burden. It covers the key behavioral contract (no TikTok mutation, single-use ref) but leaves the idempotency_key, run_id, and rule_id_and_version semantics unexplained, which an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 13% schema coverage across 8 params, the description must compensate, and it only clarifies two things: target_value is in advertiser-currency units and entity_type's adset is an alias for TikTok ad_group. run_id, entity_refs, idempotency_key, rule_id_and_version, and connection_context remain undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Validate ... a budget change") plus scope (bounded, tenant-owned, TikTok campaign or ad-group) and the output (single-use approval_ref). It clearly reads as the prepare-phase counterpart to budget_confirm, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the prepare-then-confirm flow via the approval_ref return and "does not mutate TikTok," but it never states when to call this versus budget_confirm, bid_prepare, or approval_plan_prepare, nor any prerequisites. Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_quick_createPrepare one TikTok adAInspect
Prepare one TikTok create operation in new, append-campaign, or append-adgroup mode. Returns a confirm_token and a human-readable summary; does NOT publish until campaigns_quick_create_confirm is called with the token.
REQUIRED (always): advertiser_id (call assets_list_ad_accounts to discover), a saved template_id or exact template_name, plus exactly one creative source: tenant-owned creative.creative_id from creatives_list with readiness.create_eligible=true, ordered local creative.image_creative_ids for one carousel, or creative.{video_id | image_ids | tiktok_item_id}. A local creative_id is synced to the exact advertiser only after explicit confirmation. For Spark, pass the complete identity_id, identity_type, tiktok_item_id, and spark_receipt row from spark_ads_list_posts unchanged as creative; the server moves the identity fields into TikTok's native ad parameters and rejects any conflicting duplicate values. Set ad_params.ad_format to one of that row's supported_ad_formats values; the signed receipt rejects a video/carousel mismatch before approval.
TEMPLATE SETTINGS: read templates_get.effective_creation_defaults and let the server fill saved campaign/ad-group/ad settings. MCP new and append modes require a saved template; without a selector, preparation returns needs_input/template_required. The resolved campaign_params.objective_type (APP_PROMOTION / WEB_CONVERSIONS / VIDEO_VIEWS / LEAD_GENERATION), adgroup_params.{optimization_goal, billing_event, bid_type}, ad_params.ad_format (SINGLE_VIDEO / SINGLE_IMAGE / CAROUSEL_ADS) must form a supported recipe. WEB_CONVERSIONS also requires adgroup_params.pixel_id; APP_PROMOTION requires adgroup_params.app_id from assets_list_apps. APP RECIPES (Smart+): one app_id per campaign — dual Android+iOS means two prepares. iOS APP_IOS defaults campaign_type=IOS14_CAMPAIGN, campaign BUDGET_MODE_INFINITE (ABO), adgroup BUDGET_MODE_DYNAMIC_DAILY_BUDGET 50. Android APP_ANDROID defaults campaign_type=REGULAR_CAMPAIGN, campaign BUDGET_MODE_DYNAMIC_DAILY_BUDGET 50 (CBO), adgroup BUDGET_MODE_INFINITE. Both use placement AUTOMATIC (TikTok+Pangle+GAB), optimization_goal=IN_APP_EVENT, and deep_bid_type=AEO when optimization_event is set (SUBSCRIBE is the live reference event). Pass app_id and a create_eligible local creative. When the advertiser has exactly one BC_AUTH_TT identity (TikTok's FB-page analog), the server fills identity_id / identity_type / identity_authorized_bc_id. Do not rewrite IOS14_CAMPAIGN to REGULAR_CAMPAIGN. INSTALL_NOW is the default CTA when neither call_to_action nor call_to_action_id is set. Local READY_LOCAL images/videos from creatives_list with readiness.create_eligible=true are valid App ad sources via creative.creative_id — do not require a TikTok Material Center image_id first. A web landing_page_url is stripped on APP_PROMOTION unless a deeplink is also present. Regular ads that can deliver on TikTok also require ad_params.call_to_action or ad_params.call_to_action_id; for Spark Pull, LEARN_MORE is the documented minimum CTA example. REGULAR CAROUSEL: CAROUSEL_ADS is compatible only with TRAFFIC, WEB_CONVERSIONS, APP_PROMOTION, LEAD_GENERATION, PRODUCT_SALES, CATALOG_SALES, or REACH; correct the selected objective or ad_format explicitly, never auto-rewrite the objective. REGULAR LOCAL MEDIA: exact advertiser-linked CUSTOMIZED_USER is required for local video/image. AUTH_CODE is Spark-only on regular create: use an eligible Spark post and pass its signed receipt unchanged when available; a legacy receipt-less item incurs one bounded live provider verification before approval. TT_USER and BC_AUTH_TT are not regular-local choices and may be used only on a server-verified compatible Smart+ route.
REGULAR CAMPAIGN BUDGET: new regular campaigns default a missing campaign_params.budget_mode to BUDGET_MODE_INFINITE (non-CBO / ABO). Bounded DAY, DYNAMIC_DAILY_BUDGET, or TOTAL modes require a positive campaign budget, and dynamic daily mode requires budget_optimize_on=true (CBO). Meta-portable aliases campaign_params.budget_level=CBO|ABO|campaign|adgroup are accepted and rewritten to those native fields. Append modes reuse their existing campaign and do not apply this contract.
REGULAR AD-GROUP BUDGET/SCHEDULE: new and append-campaign modes require adgroup_params.budget_mode (BUDGET_MODE_DAY, BUDGET_MODE_DYNAMIC_DAILY_BUDGET, or BUDGET_MODE_TOTAL) plus a positive budget. Daily modes default a missing schedule to SCHEDULE_FROM_NOW; stale template start/end values are removed and the UTC start is stamped only at write time. BUDGET_MODE_TOTAL requires SCHEDULE_START_END with both UTC timestamps. Smart+ and append-adgroup do not use this new-ad-group contract.
WITH template_id or template_name (Meta-portable): pass just advertiser_id + template_name (or template_id) + creative — propose pulls campaign_params / adgroup_params / ad_params from the template (caller-set keys win), derives campaign_name/adgroup_name from template.campaign_naming / template.adgroup_naming, stamps ad_name as {adgroup_name}-{utc}, and reads is_smart_plus from template.campaign_params.is_smart_performance. The selected media determines the compatible image/video format; do not force SINGLE_VIDEO onto a local image from a video template. Smart+ APP_PROMOTION defaults call_to_action to INSTALL_NOW. Meta copy aliases title/headline→display_name, body/text/message→ad_text, and cta→call_to_action are accepted. App display_name defaults from the linked app name.
TEMPLATE/ROOT COMPATIBILITY: prefer the compact template selector plus creative shape above, with overrides in campaign_params / adgroup_params / ad_params and execution. adset_params is accepted as an adgroup_params alias; both maps are preserved for conflict validation. A templates_get row spread may supply id, name, and campaign_naming as selector echoes; other read-only row metadata is ignored. Supported root budget, counts, statuses, bid, schedule, Smart+ switches, copy, and identity fields are passed to the same normalizer as execution/native fields. Conflicting duplicates must be corrected before confirmation.
AUTO-FILLED FROM USER ASSETS: identity_authorized_bc_id (when identity_type=BC_AUTH_TT), promotion_type/app_type/package/app_download_url (for APP_PROMOTION when app_id is set), placements default to [PLACEMENT_TIKTOK] for PLACEMENT_TYPE_NORMAL, top-level targeting fields (location_ids, operating_systems, age_groups, …) fold into adgroup_params.targeting.
INITIAL STATUS: omit entity status fields such as campaign_params.status, adgroup_params.status, and ad_params.status; status is unsupported. Where a native field is needed for payload compatibility, use operation_status. Campaign, ad group, and ad statuses default to DISABLE; explicit ACTIVE/ENABLE is preserved in the approved plan. Smart+ adgroup/create does not accept operation_status. When a new Smart+ ad group is requested DISABLE, a separate durable post-create disable step must be acknowledged before ad creation. ENABLE requires no disable step.
SMART+ IMAGE MUSIC: SINGLE_IMAGE and CAROUSEL_ADS require a music_id because TikTok's image creative wire requires music. When music_info is omitted (or music_id is auto/random), the server selects one advertiser-available track from assets_list_music and revalidates that exact ID on the recorded create route. An explicit music_id still wins. Append-adgroup may inherit one unambiguous parent track. Preserve an explicit template track, including across advertisers, and verify that exact ID for the target; unavailable music requires another explicit selection, never silent replacement. If no usable track is available, use a video creative.
LOCAL IMAGE GROUPS: creative.image_creative_ids is an ordered list of 2..35 JPEG/PNG images for one native CAROUSEL_ADS creative, and the same field is accepted inside ad_params.creative_list[].creative_info for one carousel variant. Use only create_eligible image rows from the tenant library. SINGLE_IMAGE is a separate format; one image is not a native multi-card carousel. For TikTok Android App carousel ads, use CAROUSEL_ADS with music and the ordered image group. Do not split cards into separate creative_list entries or pass local IDs as provider image_ids. Inspect the prepared plan's final format and ordered members before confirmation. If the receipt reports creative_image_not_ready, wait the returned retry_after_seconds (10s), then prepare the same local IDs for a new approval; existing acknowledged image uploads are reused. creative_image_not_usable requires different eligible material. An uncertain upload must be reconciled, never automatically reuploaded or replayed.
META EXECUTION BLOCK: pass execution like Meta QuickCreate — execution.budget.level=campaign|adset (CBO/ABO), execution.budget.type=daily|lifetime, execution.budget.amount, execution.is_smart_plus / execution.advantage_plus / execution.is_smart_performance for Smart+, execution.statuses.{campaign,adset,ad} (ACTIVE/PAUSED -> ENABLE/DISABLE), execution.bid.{strategy,cap}, execution.start_time / execution.end_time, execution.start_mode (immediate or tomorrow = advertiser TZ next day 00:05 UTC wire), and legacy flat execution.budget_level / execution.budget_amount. execution.campaign_count and execution.adset_count expand into a bounded serial batch (product <= 20, append_mode=new only). creative_distribution=all_per_adset (default) keeps Smart+ multi-creative on one ad via ad_params.creative_list; one_per_adset expands Smart+ to one ad group per creative (not Meta ad objects).
OPTIONAL: creative_distribution (all_per_adset|one_per_adset), is_smart_plus (bool, default derived from template), execution (object), call_to_action_id (str — portfolio id, alternative to ad_params.call_to_action enum), campaign_params.budget_level (CBO/ABO).
APPEND MODES (TikTok-native): append_mode="append-campaign" with target_campaign_id creates one ad group + one ad under that exact campaign; omit campaign_params. append_mode="append-adgroup" with target_adgroup_id creates one ad under that exact ad group; omit campaign_params and adgroup_params. Existing APP_PROMOTION ad groups keep their app_id / promotion_type; pass only the new ad plus a create_eligible local creative_id, ordered image_creative_ids, or provider image_ids. The server verifies advertiser ownership, exact authorization route, parent status, hierarchy, and Smart+ compatibility before prepare and again before mutation. Do not use Meta append-adset naming, do not guess by name, and never supply both target IDs.
If required fields are missing, returns status="needs_input" with bounded rejected_paths and next_action — fix and re-call. Confirm tokens expire after 10 minutes. Successful proposals include a summary with recipe and launch_readiness, matching the dashboard's core readiness model. Smart+ is intentionally limited to locally verified recipes: APP_PROMOTION, WEB_CONVERSIONS, PRODUCT_SALES, and LEAD_GENERATION.
EXAMPLE (template path, Meta-portable name): campaigns_quick_create({"advertiser_id": "7563...", "template_name": "iOS14 AEO", "creative": {"creative_id": ""}})
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| bid | No | ||
| cta | No | ||
| body | No | ||
| name | No | ||
| text | No | ||
| title | No | ||
| budget | No | ||
| ad_name | No | ||
| ad_text | No | ||
| bid_cap | No | ||
| message | No | ||
| creative | No | ||
| end_time | No | ||
| headline | No | ||
| statuses | No | ||
| ad_params | No | ||
| ad_status | No | ||
| execution | No | ||
| smart_plus | No | ||
| start_mode | No | ||
| start_time | No | ||
| adset_count | No | ||
| append_mode | No | new | |
| budget_mode | No | ||
| budget_type | No | ||
| identity_id | No | ||
| template_id | No | ||
| adgroup_name | No | ||
| adset_params | No | ||
| adset_status | No | ||
| bid_strategy | No | ||
| budget_level | No | ||
| daily_budget | No | ||
| display_name | No | ||
| adgroup_count | No | ||
| advertiser_id | Yes | ||
| budget_amount | No | ||
| campaign_name | No | ||
| identity_type | No | ||
| is_smart_plus | No | ||
| template_name | No | ||
| adgroup_params | No | ||
| adgroup_status | No | ||
| advantage_plus | No | ||
| call_to_action | No | ||
| campaign_count | No | ||
| campaign_naming | No | ||
| campaign_params | No | ||
| campaign_status | No | ||
| call_to_action_id | No | ||
| target_adgroup_id | No | ||
| connection_context | No | ||
| target_campaign_id | No | ||
| is_smart_performance | No | ||
| campaign_daily_budget | No | ||
| creative_distribution | No | ||
| identity_authorized_bc_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far beyond what readOnlyHint=false/destructiveHint=false convey, it discloses the two-phase prepare/confirm contract, confirm-token expiry (10 minutes), server-side re-validation before mutation, status defaults (DISABLE), image upload retry behavior (retry_after_seconds 10s reuse), and that local creatives are only synced to the advertiser after explicit confirmation. These are material operational traits an agent cannot infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is mostly on-topic and front-loaded with purpose, confirm requirement, and required inputs, but the body is an extremely dense wall of ALL-CAPS sections with long run-on paragraphs and repeated restatements (e.g., create_eligible and identity handling recur). The size is defensible for a 58-param, three-mode tool, but the structure makes it hard to parse and several sentences could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool of this complexity with no output schema, the description explains return values (confirm_token, human-readable summary, recipe, launch_readiness, needs_input with rejected_paths and next_action) and covers each mode's input contract. Nothing essential to calling it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 58 parameters, so the description carries the full burden and does so impressively: it explains creative source shapes, template selector semantics, Meta aliases (execution.budget.*, budget_level, title/headline→display_name), budget/schedule contracts, and append-mode target IDs. It does not cover every one of the 58 fields (e.g., spending_power, tracking_info, many targeting fields remain unexplained), so it falls short of full compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource+mode statement ('Prepare one TikTok create operation in new, append-campaign, or append-adgroup mode') and immediately distinguishes itself from the sibling campaigns_quick_create_confirm by stating it does not publish until confirm is called. An agent can tell exactly what this tool is and how it differs from the confirm/deny siblings without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use conditions (three append modes with which fields to omit), prerequisites per mode (template required for new/append-campaign; 'without a selector, preparation returns needs_input/template_required'), and routes the caller to helper siblings (assets_list_ad_accounts, creatives_list, templates_get, assets_list_apps, spark_ads_list_posts). It also states what not to do ('never supply both target IDs', 'do not rewrite IOS14_CAMPAIGN').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_quick_create_batchPrepare a batch of TikTok adsAInspect
Prepare one bounded manual TikTok hierarchy containing 2..20 ads under the same campaign and ad group, preserving batch_items order. Each item requires exactly one creative source; ad_name is required unless the unchanged Spark listing row supplies it. Each item may override item-level ad_params (for example an AUTH_CODE identity for a Spark post). The server validates all items on one advertiser and authorization route, executes serially after confirmation, journals one receipt per created entity, and stops on uncertain outcomes. This tool never publishes by itself; show the sanitized plan and call campaigns_quick_create_confirm once only after explicit approval.
A saved template_id or exact template_name is required to fill shared campaign/ad-group/ad settings. Template identity, app, pixel, CTA portfolio, and tracking bindings are retained only for their source advertiser or after exact current-advertiser asset validation. For Spark items, the exact identity_id, identity_type, tiktok_item_id, and spark_receipt row returned by spark_ads_list_posts may be passed unchanged as item.creative; the server normalizes the TikTok-native identity fields and uses that verified item identity instead of a shared template identity. Local creative items keep the shared template identity only when it is exact advertiser-linked CUSTOMIZED_USER; Spark items use the exact AUTH_CODE row and pass its receipt unchanged when available. TT_USER and BC_AUTH_TT are not regular local-batch identities. CAROUSEL_ADS is compatible only with TRAFFIC, WEB_CONVERSIONS, APP_PROMOTION, LEAD_GENERATION, PRODUCT_SALES, CATALOG_SALES, or REACH; never auto-rewrite an objective. The legacy split shape with item ad_params identity fields remains accepted. Legacy items without a receipt incur one bounded live verification per identity.
Smart+ is intentionally excluded: a Smart+ template returns unsupported_structure and must be passed to campaigns_quick_create with one ad_params.creative_list instead. Maximum 20 ads per approval; prepare another explicit batch for additional ads. Never fan out single-create calls.
REQUIRED: advertiser_id, template_id or exact template_name, and batch_items. Missing selectors return needs_input/template_required before any draft is prepared. Resolved ad_params must include call_to_action or call_to_action_id when the ads can deliver on TikTok. Optional append_mode is new, append-campaign, or append-adgroup with the exact corresponding target and preview receipt.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_params | No | ||
| append_mode | No | new | |
| batch_items | Yes | ||
| template_id | No | ||
| adgroup_name | No | ||
| advertiser_id | Yes | ||
| campaign_name | No | ||
| template_name | No | ||
| adgroup_params | No | ||
| campaign_params | No | ||
| call_to_action_id | No | ||
| target_adgroup_id | No | ||
| connection_context | No | ||
| target_campaign_id | No | ||
| parent_preview_receipt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnly=false, destructive=false, openWorld=false. The description adds far more: server validates all items on one advertiser/authorization route, executes serially after confirmation, journals one receipt per entity, stops on uncertain outcomes, never publishes by itself, and caps at 20 ads per approval. That is exactly the context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and constraints, but it is dense and long: Spark identity normalization, legacy split shape, receipt verification, CAROUSEL_ADS objective compatibility, and Smart+ exclusion are all packed in without paragraph breaks. Much earns its place, but several sentences (legacy shape, TT_USER/BC_AUTH_TT caveat) could be tightened or moved to a reference.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter, nested, no-output-schema creation tool, this is close to complete: it covers required selectors, the two-step confirm protocol, Spark vs local creative identity handling, and constraints (2-20 ads, no Smart+, no auto-rewrite of objective). Gaps remain around the campaign_params/adgroup_params objects and connection_context, but an agent could call it correctly from this description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does for the key parameters: template_id/exact template_name selector, batch_items (one creative source per item, ad_name fallback from Spark listing), item-level ad_params overrides (AUTH_CODE identity, verified Spark identity fields), append_mode values plus required target and preview receipt, and the call_to_action/call_to_action_id requirement. It does not explain advertiser_id, connection_context, or the campaign/adgroup/params object fields, so not fully compensating.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: prepare a bounded manual TikTok hierarchy of 2..20 ads under one campaign/ad group, preserving batch_items order. It clearly distinguishes itself from campaigns_quick_create (Smart+ / single-ad path) and campaigns_quick_create_confirm (the confirmation step), so an agent can tell it apart from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: Smart+ templates must go to campaigns_quick_create with one ad_params.creative_list; confirm only after explicit approval and only once; never fan out single-create calls; prepare another explicit batch beyond 20 ads. When-to-use, when-not-to-use, and alternatives are all named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_quick_create_confirmConfirm TikTok ad creationADestructiveInspect
Confirm the durable create approval minted by campaigns_quick_create. The approval creates one durable task. If the response was lost, the same exact token within its original expiry recovers that task; do not prepare a replacement. An unavailable token does not prove that no task was created: inspect existing receipts first. The create runs asynchronously as a task; the returned opaque task_ref can be passed to tasks_get_status to watch progress and read back the published objects. task_id is a distinct legacy compatibility input, not an alias for task_ref. A failed terminal create returns bounded created objects, failure phase/reason/support_ref, and next action. Historical confirmations that mislabeled a canonical UUID as task_ref are recovered only through the tenant-scoped legacy task path, which returns the corrected opaque task_ref. If the outcome is uncertain, recover only with operations_get and the returned operation_ref on the original advertiser/authorization route; never replay or name-match.
REQUIRED: confirm_token (from a prior campaigns_quick_create call). EXAMPLE: campaigns_quick_create_confirm({"confirm_token": "a1b2c3..."})
| Name | Required | Description | Default |
|---|---|---|---|
| confirm_token | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already flagging destructive/openWorld mutation, the description adds substantial context: async task execution, idempotent token recovery within expiry, that an unavailable token does not prove absence of a task, the shape of a failed terminal response (created objects, failure phase/reason/support_ref, next action), and a legacy recovery path. This far exceeds the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is largely non-redundant and front-loaded with the core confirm action, but it is delivered as a single dense paragraph mixing core semantics with niche edge cases (historical mislabeled UUIDs, legacy tenant-scoped paths). Readability suffers from the lack of structure despite little outright waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, non-read-only, no-output-schema tool, the description covers invocation prerequisites, idempotency/recovery semantics, async follow-up via tasks_get_status, and failure-response shape. An agent has enough to call it correctly and to handle lost or failed responses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at 0%, the description carries the burden and does well for confirm_token: it must come from a prior campaigns_quick_create call and is bound to its original expiry. It also disambiguates task_id from task_ref as inputs. However, the optional connection_context parameter is never explained, leaving one of two params undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Confirm') plus the exact resource ('the durable create approval minted by campaigns_quick_create'), immediately distinguishing it from the sibling that mints the approval. An agent can tell it apart from campaigns_quick_create, campaigns_recreate_confirm, and approval_plan_confirm without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly covers when to use (recovering a lost response with the same exact token) and when-not ('do not prepare a replacement'), plus named alternatives for uncertain outcomes (operations_get with operation_ref) and progress watching (tasks_get_status). It even forbids specific wrong approaches ('never replay or name-match').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_quick_create_denyDiscard a TikTok ad draftADestructiveInspect
Deny an unclaimed campaign draft minted by campaigns_quick_create. If already claimed, preserve the original receipt and follow its recovery action. This never cancels a submitted task; an expired or missing token does not prove that no task was submitted.
REQUIRED: confirm_token. EXAMPLE: campaigns_quick_create_deny({"confirm_token": "a1b2c3..."})
| Name | Required | Description | Default |
|---|---|---|---|
| confirm_token | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuinely useful context beyond them: it clarifies that an already-claimed draft should be preserved, that submitted tasks are never cancelled, and that an expired/missing token does not prove no submission occurred.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and caveats are front-loaded in the first sentence, and the REQUIRED/EXAMPLE block aids invocation. Slightly padded by restating a schema-level requirement, but overall tight and well-ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output-schema tool the description handles the behavioral nuances well and does not need to explain return values. However, it leaves the connection_context parameter undocumented, so it is not fully complete for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for both parameters. The description restates that confirm_token is required (already in the schema) and gives a sample value, but the second parameter, connection_context, is entirely undocumented in both schema and description, leaving a real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (deny) and resource (an unclaimed campaign draft minted by campaigns_quick_create), scoping it to the 'unclaimed' case and distinguishing it from the confirm flow. It is clear enough to tell apart from the sibling confirm tool, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear when-to-use ('deny an unclaimed draft') and an implicit when-not ('if already claimed, preserve the original receipt and follow its recovery action'), plus a boundary condition ('this never cancels a submitted task'). It stops short of explicitly naming the alternative tool to use instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_recreate_confirmConfirm campaign recreationBDestructiveInspect
Confirm one prepared TikTok task recreation after explicit approval. One durable task; a lost response may be recovered with the same unexpired token. Never replay a prior task directly.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm_token | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, so the description doesn't need to restate the safety profile. It adds genuinely useful behavioral context the annotations cannot convey: idempotency semantics ("One durable task; a lost response may be recovered with the same unexpired token") and an explicit anti-replay warning, which directly addresses the risk of duplicate execution.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with the purpose front-loaded and no filler. Each sentence carries distinct information: action, recovery behavior, and replay prohibition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers the approval prerequisite and idempotency but omits what a successful confirmation returns, the meaning of connection_context, and how the token is obtained. Annotations carry the safety profile, so the gap is moderate rather than severe.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for both parameters, so the description must carry the burden. It references an "unexpired token" that maps loosely to confirm_token, but gives no format, lifetime, or sourcing detail, and the connection_context parameter is entirely undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Confirm one prepared TikTok task recreation") and scopes it to the confirm step, which distinguishes it from the sibling deny and prepare tools. It stops short of naming campaigns_recreate_from_task or campaigns_recreate_deny as its counterparts, so differentiation relies on the reader's inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a precondition ("after explicit approval") and a caution ("Never replay a prior task directly"), which implies the when-to-use context. However, it never names the sibling alternative that prepares the task or the deny counterpart, leaving the routing decision implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_recreate_denyDiscard a campaign recreation draftADestructiveInspect
Deny an unclaimed TikTok recreation. Claimed plans retain recovery references; this does not cancel submitted tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm_token | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: only unclaimed plans are discarded, claimed plans retain recovery references, and already-submitted tasks are unaffected — all non-obvious consequences of the call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core action stated first and the caveats after. Every clause carries information that the schema and annotations do not.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description explains the outcome well but omits the required token's origin and any error/eligibility conditions. It is adequate but leaves an agent guessing on the one required parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description says nothing about either parameter. The required confirm_token in particular has no explanation of its provenance (presumably a prepare/recreate step) or lifetime, so an agent gets no help from the text on how to supply it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Deny an unclaimed TikTok recreation') with a scope qualifier that the title alone does not carry. An agent can pair it with the sibling campaigns_recreate_confirm by the deny/confirm naming, though the description never names that alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'unclaimed' implies a precondition and 'this does not cancel submitted tasks' draws a boundary, but the description never states when to choose this over campaigns_recreate_confirm or what makes a recreation 'unclaimed'. Usage is inferable rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_recreate_from_taskPrepare campaign recreationAInspect
Prepare a recreation of one caller-owned, fully completed TikTok create/copy task using its opaque task_ref. The original payload is loaded server-side, internal receipt/route fields are removed, and current advertiser ownership and parent bindings are revalidated. Failed, partial, uncertain, or foreign tasks are not recreatable. Use execution.start_time/end_time for an explicitly rescheduled launch. Source end times are never extended automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| task_ref | Yes | ||
| execution | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false; the description adds substantial traits beyond that: payload is loaded server-side, internal receipt/route fields are stripped, ownership and parent bindings are revalidated at prepare time, and source end times are never auto-extended. This tells the agent this is a non-executing preparation step whose behavior is bounded and non-destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five tight sentences, front-loaded with what the tool does and then layering eligibility, scheduling, and constraints. Every sentence adds an actionable fact and none restates the title or the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only three annotation hints, the description carries the burden well: purpose, server-side processing, eligibility, and parameter usage are all covered. The remaining gap is lifecycle guidance — what state is produced, whether it expires, and the required call to campaigns_recreate_confirm/deny.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% at the top level, so the description must compensate. It explains that task_ref is an opaque handle and that execution.start_time/end_time drive an explicit reschedule, but connection_context (mctx_v1 pattern) is never mentioned, leaving one of three parameters undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Prepare a recreation of ... a TikTok create/copy task') and scopes it to caller-owned, fully completed tasks identified by task_ref. It is clear what the tool does, but it never names its natural siblings campaigns_recreate_confirm / campaigns_recreate_deny, so the two-phase prepare/confirm pattern must be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real eligibility context: only fully completed, caller-owned tasks are recreatable, and failed/partial/uncertain/foreign tasks are explicitly excluded. It also tells the caller to use execution.start_time/end_time for a rescheduled launch, but it omits the follow-up step (confirm/deny), so no alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_ad_clone_structurePrepare a TikTok structure cloneAInspect
Prepare a same-advertiser TikTok campaign or native ad-group structural clone from live TikTok structure. Use only when the user explicitly asks to clone an existing campaign/ad group. For new launches from tenant uploads, call creatives_list then campaigns_quick_create with creative.creative_id — not this tool. Provide exactly one source_campaign_id or source_adgroup_id and copies 1..5. Every source ad keeps its own TikTok provider creative; live media is often not API-reusable. No cross-advertiser transfer. One approval and one serialized task journal. Optional execution.start_time/end_time replaces the source launch schedule; old bounded starts need an explicit replacement, and source end times are preserved unless explicitly replaced.
| Name | Required | Description | Default |
|---|---|---|---|
| copies | No | ||
| execution | No | ||
| advertiser_id | Yes | ||
| source_adgroup_id | No | ||
| connection_context | No | ||
| source_campaign_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-open-world, non-destructive behavior, and the description adds substantial operational context beyond them. It discloses same-advertiser-only transfer, one approval and one serialized task journal, media reuse limitations, and precise execution-time replacement semantics. Nothing here contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense block, but it is front-loaded with the core purpose and then layers usage, constraints, and scheduling behavior. Nearly every sentence adds distinct operational value. It could be slightly more scannable, but it is appropriately sized for a complex clone-preparation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex prepare tool with confirm/deny siblings and no output schema, the description covers the essential workflow, constraints, and alternatives. It mentions approval and task journal behavior, which implies the confirmation flow, though it does not name the confirm/deny siblings explicitly. Overall it is nearly complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must carry parameter meaning and does so well for the critical parameters: exactly one of source_campaign_id or source_adgroup_id, copies 1..5, and start/end time replacement rules. It does not explain advertiser_id or connection_context, leaving some gaps, but it compensates for most of the important inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: preparing a same-advertiser TikTok campaign or ad-group structural clone from live TikTok structure. It explicitly distinguishes this tool from the new-launch path using creatives_list and campaigns_quick_create, so an agent can tell it apart from siblings. Scope is narrowed with 'same-advertiser' and 'from live TikTok structure'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: only when the user explicitly asks to clone an existing campaign or ad group. It also provides the alternative workflow for new launches and says 'not this tool,' which is direct routing. Additional constraints like providing exactly one source ID and copies 1..5 further constrain usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_ad_clone_structure_confirmConfirm a TikTok structure cloneADestructiveInspect
Confirm one prepared TikTok structural clone after explicit user approval. One durable task; poll the returned task_ref and recover through the exact operation_ref. A lost confirm response may be recovered with the same unexpired token, never a replacement plan.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm_token | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so safety is covered. The description adds real value beyond that: durability ('one durable task'), polling via task_ref, recovery via operation_ref, and idempotent token reuse for a lost response. It does not, however, explain what the confirm actually mutates or the destructive consequence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the purpose front-loaded, followed by task/recovery semantics. Every sentence carries content; slightly dense but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema confirm tool, the description usefully explains the returned task_ref/operation_ref and recovery path. It is somewhat incomplete on the connection_context parameter and on the concrete effect of confirming, but covers the operational essentials.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaning to confirm_token ('the same unexpired token', recoverable, single-use) but says nothing about connection_context, leaving one of the two parameters fully undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (confirm) and resource (one prepared TikTok structural clone), and the word 'prepared' implicitly separates it from the prepare-side sibling copy_ad_clone_structure. It does not name that sibling or the deny sibling explicitly, so sibling differentiation is inferential rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a usage precondition ('after explicit user approval') and implies a prior preparation step ('one prepared ... clone'), which is useful context. However, it never names the prepare/deny alternatives or states when NOT to use this tool, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_ad_clone_structure_denyDiscard a TikTok structure clone draftBDestructiveInspect
Deny an unclaimed TikTok structural clone. Claimed plans retain recovery references; this does not cancel submitted tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm_token | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, and the description adds real behavioral nuance beyond them: claimed plans retain recovery references and submitted tasks are not cancelled. This clarifies the blast radius of the operation, though it does not address auth requirements or confirm_token semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two terse sentences, with the core action front-loaded and the caveat about retained references following. No filler, though the second sentence is somewhat dense and could be clearer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive deny action with no output schema, the behavioral caveats are useful, but the complete absence of parameter documentation (especially the required confirm_token) leaves a notable gap an agent must fill from inference alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description says nothing about either parameter. The required confirm_token and the mctx connection_context pattern are documented nowhere, so an agent gets no guidance on what values to supply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Deny an unclaimed TikTok structural clone.' Combined with the title ('Discard a TikTok structure clone draft') it is clear this terminates a pending clone. It does not explicitly name the sibling confirm tool, but the prepare/confirm/deny pattern makes the purpose inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The qualifier 'unclaimed' implies the condition under which denial applies, and the sibling set (copy_ad_clone_structure_confirm) makes the alternative obvious. However, the description never explicitly states when to choose deny over confirm or what prerequisites exist, leaving usage to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_ad_quick_copyPrepare a TikTok ad copyAInspect
Prepare a TikTok-native copy without publishing. Single source: provide advertiser_id + source_ad_id, copies 1..10, copy_mode=reuse|fresh, and optional append_mode. Fresh requires one explicit tenant-owned creative. Grouped append: provide source_ad_ids (1..20) plus append-campaign/target_campaign_id or append-adgroup/target_adgroup_id. The server reads source campaign/ad group/ad settings once, preserves Smart+ and Spark identity semantics, keeps new ads disabled, and binds one aggregate approval. Same advertiser only; never use Meta append-adset or client-side fan-out. For a new ad group, execution.start_time/end_time may explicitly replace source timestamps (ISO8601 with offset or UTC). An old bounded start requires a new start; the source end is retained unless explicitly replaced. Grouped copy supports reuse only.
| Name | Required | Description | Default |
|---|---|---|---|
| copies | No | ||
| creative | No | ||
| copy_mode | No | reuse | |
| execution | No | ||
| append_mode | No | new | |
| source_ad_id | No | ||
| advertiser_id | Yes | ||
| source_ad_ids | No | ||
| target_adgroup_id | No | ||
| connection_context | No | ||
| target_campaign_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, destructive=false, openWorld=false; the description adds real behavioral context beyond that: the server reads source settings once, preserves Smart+/Spark identity semantics, keeps the new ads disabled, binds a single aggregate approval, and enforces same-advertiser scope. That materially changes how an agent plans the call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core purpose and every sentence carries substantive information, with no filler. The single dense paragraph makes the mode-specific rules harder to scan than a short structured list would, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation-style tool with no output schema, the description covers modes, constraints, side effects, and scheduling overrides well. It omits what the call returns (the handle feeding copy_ad_quick_copy_confirm/deny, despite referencing an "aggregate approval") and leaves connection_context undefined.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage across 11 parameters, the description carries the full burden and mostly succeeds: it constrains copies to 1..10, source_ad_ids to 1..20, names copy_mode=reuse|fresh, ties creative to fresh mode, and documents execution.start_time/end_time as ISO8601. Gaps remain: append_mode's accepted values and connection_context are never explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Prepare a TikTok-native copy without publishing") and enumerates the two operating modes, so the agent knows exactly what the tool produces. It does not, however, differentiate itself from the close sibling copy_ad_clone_structure, which an agent could easily confuse with this one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit invocation conditions per mode: single-source needs advertiser_id + source_ad_id with copies 1..10, grouped append needs source_ad_ids (1..20) plus a campaign or adgroup target, and "Grouped copy supports reuse only." It also supplies negative guidance ("never use Meta append-adset or client-side fan-out"), but it never routes the agent between this tool and copy_ad_clone_structure.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_ad_quick_copy_confirmConfirm a TikTok ad copyADestructiveInspect
Confirm exactly one prepared copy/bulk-append plan after explicit user approval. Returns one operation_ref and task_ref. Confirm once; poll tasks_get_status. On uncertainty use operations_get on the original route and never replay or recover by name. If the confirm response was lost, reuse only that exact token within its original expiry to recover the same task; never prepare a replacement copy.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm_token | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (destructiveHint=true, openWorldHint=true), yet the description adds real behavioral context beyond them: it returns operation_ref and task_ref, is single-shot ('confirm once'), and specifies idempotent recovery semantics for a lost response (reuse the exact token within its original expiry). This is genuinely useful operational disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and return refs, followed by tightly packed operational rules. Every clause is functional, though the recovery/idempotency sentences are dense. Effectively sized for a stateful confirm tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description explicitly names the returned refs (operation_ref, task_ref), the polling path, and the failure/recovery path. For a mutating confirm step, this covers the agent's decision loop end to end.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry both parameters. It conveys the token's semantics (exact, expiry-bound, single-use for recovery) but says nothing about the second parameter, connection_context, nor the token's format. Partial compensation for a two-parameter tool with zero schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Confirm) and resource (prepared copy/bulk-append plan) with scope ('exactly one... after explicit user approval'). The word 'prepared' cleanly distinguishes it from the copy_ad_quick_copy prepare sibling and copy_ad_quick_copy_deny. An agent can identify this as the commit step without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('after explicit user approval', 'confirm once'), names the follow-up alternative (poll tasks_get_status), and names the fallback for uncertainty (operations_get on the original route). It also states what NOT to do: never replay, never recover by name, never prepare a replacement copy.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_ad_quick_copy_denyDiscard a TikTok ad copy draftBDestructiveInspect
Deny an unclaimed TikTok copy plan. Claimed plans return original recovery references; this does not cancel submitted tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm_token | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, openWorldHint=false, and the description goes beyond them by describing state-dependent behavior: claimed plans return original recovery references, and submitted tasks are unaffected. That scoping of blast radius is genuinely useful, though the 'recovery references' return semantics remain vague.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and scoped with the unclaimed/claimed distinction and the task-cancellation caveat. No filler, though the second sentence is densely packed and slightly ambiguous in phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent action with no output schema, the description covers the safety-adjacent behavior reasonably but omits any parameter guidance and does not say what the tool returns on success or how it differs from approval_plan_deny / campaigns_quick_create_deny in the sibling set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Two parameters with 0% schema description coverage, and the description says nothing about either. The required confirm_token and the regex-constrained connection_context are left entirely unexplained, so an agent gets no help on supplying them correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Deny an unclaimed TikTok copy plan,' which lets an agent distinguish this from the sibling copy_ad_quick_copy_confirm without opening either schema. The mismatch between the name's 'copy_ad_quick_copy' and the title/description's 'copy draft/plan' wording is minor but slightly blurs the resource identity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the agent can infer this is the rejection counterpart to a quick-copy confirmation. It adds one useful exclusion ('this does not cancel submitted tasks') but never names the alternative tool or states the prerequisite for when denying is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creatives_abandon_uploadAbandon a creative uploadADestructiveInspect
Reconcile or discard one exact tenant-owned pending/error upload so a failed browser upload does not remain as a permanent library placeholder. Pass the same SHA-256 file_hash, stable idempotency_key, upload_attempt, and folder_id used for creatives_request_upload_v2. If bytes reached storage and verify, the creative becomes ready; otherwise the matching placeholder is discarded. It never deletes a verified ready creative and never returns the hash, storage key, provider URL, or tenant identifier.
| Name | Required | Description | Default |
|---|---|---|---|
| file_hash | Yes | ||
| folder_id | No | ||
| upload_attempt | No | ||
| idempotency_key | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description is fully consistent with them while adding context they cannot: the two outcome branches (bytes verified -> creative ready; otherwise placeholder discarded), the idempotency contract, the safety guarantee that a verified ready creative is never deleted, and an explicit non-disclosure guarantee for hash, storage key, provider URL, and tenant id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each load-bearing: purpose first, then the required matching parameters, then the outcome and safety guarantees. No restatement of the title and no filler, despite the density of information conveyed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, it covers what the call does, what it needs, what results, and what is deliberately not returned. The only true gap is error/permission behavior (e.g. what happens if the idempotency_key or parameters do not match the original request), which the description does not address.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden. It annotates four of five parameters with real semantics (file_hash as SHA-256, a stable idempotency_key, the matching upload_attempt and folder_id) and ties them to the originating request_upload_v2 call. Only connection_context is unexplained, and its pattern makes it self-evidently plumbing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: reconcile or discard one exact tenant-owned pending/error upload. It clearly distinguishes itself from creatives_delete and creatives_reconcile by describing the placeholder lifecycle it targets, so an agent can route between siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the triggering situation ('a failed browser upload does not remain as a permanent library placeholder') and the key prerequisite ('pass the same SHA-256 file_hash, stable idempotency_key, upload_attempt, and folder_id used for creatives_request_upload_v2'). It also implicitly rules out the delete tool by stating it never deletes a verified ready creative, though no sibling is named as the alternative for that case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creatives_cloud_statusRead Drive binding statusARead-onlyInspect
Read-only Google Drive library status for the current user. Binding must be completed by a human in the browser on the creatives page; agents cannot bind.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, non-destructive, non-open-world profile. The description adds genuinely new behavioral context beyond them: the binding precondition and the explicit statement that agents cannot perform binding, which prevents a fruitless attempt loop. It does not disclose what 'status' values can be returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the more decision-relevant constraint (agents cannot bind) is placed up front. Nothing to trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries some burden for return values, and it does not say what statuses are reported or what the agent should do with each. Combined with the undocumented connection_context parameter, a small but real gap remains for a tool meant to gate a human-driven workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter, connection_context, with 0% schema description coverage and a non-obvious required pattern (mctx_v1_ + 64 hex chars). The description says nothing about what this parameter is, where the agent obtains it, or whether it is optional — leaving the only parameter undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read-only Google Drive library status for the current user.' This is distinguishable from sibling creatives_list_cloud / creatives_list, which deal with creatives rather than Drive binding state. It does not explicitly name a sibling to contrast with, so a 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly frames the operational boundary: binding must be done by a human in the browser and agents cannot bind, which tells the agent this tool is for checking state, not changing it. It stops short of naming alternatives (e.g. which tool to call after binding succeeds) or stating when the status is meaningful (pre/post binding).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creatives_confirm_uploadConfirm a creative uploadADestructiveInspect
Verify or safely reconcile a tenant-owned creative in R2. Use this both after a newly prepared upload and when creatives_list reports readiness.status=verification_pending. It marks the row create-eligible only when stored size and content type match (plus checksum when R2 provides one). A successful response includes an additive upload_contract projected from the persisted ready/reconciled row. Never auto-retry a failed confirmation.
REQUIRED: creative_id (str — UUID returned by request_upload or creatives_list). EXAMPLE: creatives_confirm_upload({"creative_id": ""})
| Name | Required | Description | Default |
|---|---|---|---|
| creative_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly=false, openWorld=false, destructive=true, so the safety profile is covered structurally. The description adds real behavioral context: the exact success condition (size + content type match, plus checksum when available), the effect (marks row create-eligible), and a non-retry caution implying non-idempotence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then usage conditions, then behavioral caveats, then a params block. Sentences earn their place, though the REQUIRED/EXAMPLE block partly restates what the input schema already marks as required.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the successful response payload (an additive upload_contract projected from the persisted ready/reconciled row). Coverage is solid, with only connection_context left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It usefully documents creative_id's origin and format (UUID from request_upload or creatives_list), but leaves the optional connection_context parameter completely unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Verify or safely reconcile a tenant-owned creative in R2.' It names the sibling tools it relates to (request_upload, creatives_list), letting an agent distinguish it from creatives_reconcile without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states both trigger conditions ('after a newly prepared upload' and 'when creatives_list reports readiness.status=verification_pending') and adds a when-not ('Never auto-retry a failed confirmation'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creatives_create_folderCreate a creative folderAInspect
Create a creative folder for the authenticated tenant. Folder names must be unique within their parent (or top-level if no parent_id).
NOTE: updated_at on the returned row = "row last touched", NOT "content changed".
REQUIRED: name (str). Optional: parent_id (str — UUID of parent folder; omit for top-level). EXAMPLE: creatives_create_folder({"name": "Hero videos"})
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| parent_id | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds real value beyond them: the name-uniqueness constraint within a parent and the subtle updated_at semantics on the returned row. It still omits failure behavior (e.g., what error a duplicate name produces) and whether folders are auto-named or reordered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then a constraint, then a labeled REQUIREED/Optional/EXAMPLE block that is easy to scan. The updated_at note is tangential to creating a folder and slightly interrupts the flow, but it earns its place by preventing a misread of the returned row.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so it is helpful that the description comments on the returned row's updated_at meaning. For a three-parameter creation tool with annotations covering safety, the only real gap is duplicate-name failure behavior and the undocumented connection_context parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage the description must carry the load, and it does for two of three parameters: name is marked REQUIRED (str), parent_id is explained as the parent folder UUID with 'omit for top-level' semantics. The connection_context parameter is never mentioned, and the single example only exercises the required field with no parent_id case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (create a creative folder) plus the tenant scope, so an agent immediately knows what operation runs. It does not explicitly distinguish itself from nearby siblings like creatives_rename_folder or creatives_delete_folder, relying on the verb alone to do that work.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the agent learns the folder is tenant-scoped and that parent_id should be omitted for top-level folders, which is genuine routing guidance for the parameter. There is no explicit when-not-to-use or named alternative, and nothing about what to do when a name collision occurs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creatives_deleteDelete a saved creativeADestructiveInspect
Delete a single creative owned by the authenticated tenant by creative_id. Removes the DB row and (if no other rows reference the same R2 object) deletes the R2 object too.
REQUIRED: creative_id (str — UUID). EXAMPLE: creatives_delete({"creative_id": ""})
| Name | Required | Description | Default |
|---|---|---|---|
| creative_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds genuinely useful behavioral detail beyond annotations: it removes the DB row and conditionally deletes the R2 object only if no other rows reference it. That conditional cascade logic is not derivable from annotations or schema. It stops short of stating irreversibility or permission requirements, hence not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the cascade behavior, then the required-param note and a concrete example. Zero filler; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive single-object delete with no output schema, the description covers what it removes and the conditional R2 cleanup, which is the most important context. However it omits irreversibility, permission/tenant-auth requirements, and leaves connection_context undescribed, leaving gaps for a destructive tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It documents creative_id as a UUID string and marks it REQUIRED, which is helpful, but the second parameter (connection_context, with a strict pattern) is entirely undocumented in both schema and description. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (a single creative) scoped to the authenticated tenant by creative_id. It is clearly distinguishable from siblings like creatives_delete_folder or creatives_abandon_upload.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb 'delete' and the required creative_id, but there is no explicit guidance on when to use this vs alternatives (e.g., creatives_abandon_upload for in-progress uploads, or creatives_delete_folder for folders). No exclusions stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creatives_delete_folderDelete a creative folderADestructiveInspect
Delete a creative folder recursively for the authenticated tenant — removes all subfolders, all creatives inside them, and any orphaned R2 objects (only deletes the R2 blob when no other creative row references the same key).
REQUIRED: folder_id (str — UUID). EXAMPLE: creatives_delete_folder({"folder_id": ""})
| Name | Required | Description | Default |
|---|---|---|---|
| folder_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the safety profile is known; the description adds real value by spelling out the cascade (subfolders, contained creatives) and the conditional R2 blob deletion rule when no other creative row references the key. It does not, however, mention irreversibility/recovery, permission requirements, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The cascade behavior is front-loaded and the required-parameter note follows efficiently. The inline EXAMPLE is somewhat redundant with the schema's required list but is short and useful for call formatting.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output-schema tool, the description covers the key risk (recursive, irreversible-by-implication cascade and orphan cleanup). It stops short of stating permissions, rollback/confirmation behavior, or what happens on partial failure, which would matter for an agent invoking a destructive operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It documents folder_id (required, string, UUID format) with an example call, which is genuinely helpful, but leaves connection_context entirely undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete), resource (creative folder), and the exact scope (recursively, including subfolders and contained creatives). Combined with the name, an agent can immediately distinguish it from the sibling creatives_delete (which removes a creative, not a folder) and creatives_rename_folder.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to choose this tool over alternatives like creatives_delete, usages_list_folders, or rename_folder, nor does it state prerequisites such as folder ownership or that a confirmation step precedes it. Usage is only implied by the name and the recursive scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creatives_getRead a saved creativeARead-onlyInspect
Get a single creative owned by the authenticated tenant by creative_id. Returns an opaque artifact_ref and same-origin, authenticated download_endpoint plus the legacy download_url when the creative is storage-verified; the additive artifact_contract validates the same resolver through a credential-free ArtifactDescriptor projection. provider URLs and storage identifiers are never returned. 404-shape returned as {status: "not_found"} instead of raising.
REQUIRED: creative_id (str — UUID). EXAMPLE: creatives_get({"creative_id": ""})
| Name | Required | Description | Default |
|---|---|---|---|
| creative_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/non-destructive/closed-world, and the description goes well beyond them: it discloses the returned fields (artifact_ref, download_endpoint, download_url when storage-verified), the deliberately withheld data ('provider URLs and storage identifiers are never returned'), and the non-raising 404 shape ('{status: "not_found"}'). These are concrete behavioral traits not present in any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the REQUIRED/EXAMPLE lines add useful structure. The middle sentence is dense with jargon ('credential-free ArtifactDescriptor projection') but it does communicate the artifact_contract return, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-value burden and does so thoroughly (artifact_ref, download_endpoint, artifact_contract, 404 shape, withheld data). The only meaningful gap is the undocumented connection_context parameter and the absence of any auth/permission notes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage the description must carry the param burden. It adds real value for creative_id by specifying the UUID format ('REQUIRED: creative_id (str — UUID)'), but the optional connection_context parameter and its mctx_v1_ pattern are left entirely undocumented, so only half the parameters are compensated for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a single creative ... by creative_id') and scopes it to resources 'owned by the authenticated tenant'. This cleanly distinguishes it from the list-style sibling creatives_list and the folder/deletion siblings, so an agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys what a fetch does but gives no explicit guidance on when to use this over creatives_list, creatives_list_cloud, or creatives_list_folders, and no prerequisites or exclusions. Usage is only weakly implied by 'by creative_id'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creatives_listList saved creativesARead-onlyInspect
List creatives owned by the authenticated tenant with cursor pagination. This is the TikTok AdsAgent tenant library (tiktok.adsagent.md Creatives), not Meta adsagent.md and not TikTok Ads Manager Material Center. READY_LOCAL dashboard rows belong here and are create sources via creative.creative_id; they do not need a TikTok image_id/video_id until after confirm. For images, use one creative_id for one image or ordered creative.image_creative_ids (2..35 JPEG/PNG images) for one carousel; every member must be an eligible image row. ad_params.creative_list contains separate variants, not the ordered cards of one carousel. Rows omit content hashes and storage keys. The legacy download_url is retained as an authenticated same-origin endpoint only after storage verification; unverified historical ready rows report verification_pending. Inspect coverage (create_eligible_count / empty_reason / next_action) plus readiness.create_eligible before using creative_id in campaigns_quick_create. An empty page with coverage.empty_reason=no_tenant_creatives is the only true empty-library signal (unfiltered scope=library plus a tenant-wide existence check). no_creatives_in_query means the current folder/search/media_type/time_filter matched nothing; no_creatives_in_root means scope=root was empty while the tenant owns creatives elsewhere — retry scope=library (default) or call creatives_list_folders. Trust coverage.scope.kind; never describe a root/folder page count as the whole library. Do not treat those as a different tenant.
REQUIRED: none. Optional: scope (library|root, default library — entire tenant library across root and folders; use root for root-only reads), folder_id (str — UUID of one folder), cursor (opaque and scope-bound; reuse it only with the identical query), limit (int 1..50, default 20), search (filename substring, max 200 chars), media_type (all/image/video), time_filter (all/24h/7d/30d), include_incomplete (bool, default true). Returns count, complete, meta.has_more, next_cursor and snapshot_at (legacy top-level has_more remains). Each row exposes creative_id as an alias of id for direct creative.creative_id selection. These describe library pagination, not TikTok upload completion; continue serially with next_cursor instead of client fan-out. EXAMPLE: creatives_list({"search": "hero", "media_type": "video", "limit": 20})
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| scope | No | library | |
| cursor | No | ||
| search | No | ||
| folder_id | No | ||
| media_type | No | all | |
| time_filter | No | all | |
| connection_context | No | ||
| include_incomplete | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnlyHint=true, destructiveHint=false), but the description adds substantial behavior beyond them: cursor is opaque and scope-bound, pagination must continue serially, rows omit content hashes/storage keys, legacy download_url only works after storage verification, and unverified rows report verification_pending. It also documents the coverage/readiness fields that gate downstream use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and scope constraints are front-loaded, and most sentences carry real operational content (empty_reason taxonomy, creative_id aliasing, coverage fields). However, the definition is a dense wall of run-on sentences mixing pagination, folder semantics, carousel rules and empty-state taxonomy, making it harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must explain returns and does: count, complete, meta.has_more, next_cursor, snapshot_at, the legacy top-level has_more, per-row creative_id as an alias of id, and the coverage fields. Combined with the empty_reason and readiness guidance, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and there are no enums in the schema, so the description carries the full burden and does so: scope (library|root with semantics), folder_id, cursor (opaque, scope-bound, reusable only with the identical query), limit (1..50, default 20), search (filename substring, max 200 chars), media_type and time_filter value sets, and include_incomplete. Only connection_context is left undocumented, which is minor.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource with scope: 'List creatives owned by the authenticated tenant with cursor pagination.' It then explicitly disambiguates the resource from siblings/adjacent systems ('the TikTok AdsAgent tenant library ... not Meta adsagent.md and not TikTok Ads Manager Material Center'), letting an agent separate it from creatives_list_cloud, creatives_list_folders and creatives_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It is unusually explicit about when to use which scope ('library ... entire tenant library ... use root for root-only reads'), when to retry ('no_creatives_in_root ... retry scope=library (default) or call creatives_list_folders'), and where the output is consumed ('before using creative_id in campaigns_quick_create'). It also states the only true empty-library signal, so the agent knows how to distinguish a real empty result from a filter miss.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creatives_list_cloudList Drive creatives from the indexARead-onlyInspect
List Google Drive files from the local broker index (never calls Drive). Rows carry selection_key values (gdrive:...) usable as creative ids in create flows.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | ||
| limit | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/destructiveHint annotations, the description discloses the important behavioral trait that this reads from a local broker index and never calls Drive, implying possibly-stale cached data. It also tells the agent what the rows carry (selection_key in gdrive: form), which the annotations do not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler; the source constraint ('never calls Drive') and the downstream-use hint are both front-loaded and each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no documented parameters, the description covers the read-only nature and row payload adequately but leaves the input contract (especially q and connection_context) entirely unexplained, which is a real gap for a listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Three parameters (q, limit, connection_context) have 0% schema description coverage, and the description explains none of them - not the query semantics of q, nor the meaning/default behavior of limit, nor the connection_context pattern. The description does not compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (Google Drive files/creatives) plus the exact data source (the local broker index), which meaningfully separates it from the broader creatives_list sibling. It stops short of naming that sibling explicitly, so an agent must infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: it hints that returned selection_key values feed 'create flows', which suggests when the results are useful. There is no explicit when-to-use or when-not-to-use guidance versus creatives_list, creatives_get, or creatives_list_folders.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creatives_list_foldersList creative foldersARead-onlyInspect
List creative folders for the authenticated tenant, optionally scoped to a single parent_id (omit for top-level). Each folder carries creative_count. Zero folders is not an empty library — root creatives_list still returns READY_LOCAL files with folder_id=null. Inspect coverage.empty_reason before telling the operator the material library is empty.
NOTE: updated_at = "row last touched", NOT "content changed". Bulk maintenance bumps it without content change — to detect content changes, cache the specific field(s) you care about and diff yourself.
REQUIRED: none. Optional: parent_id (str — UUID of parent folder). EXAMPLE: creatives_list_folders({})
| Name | Required | Description | Default |
|---|---|---|---|
| parent_id | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds real behavioral value: each folder carries creative_count, empty results relate to coverage.empty_reason, and a NOTE warns that updated_at is 'row last touched' not 'content changed', advising self-diffing. This is meaningful beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by scoping, behavioral caveats, and a parameter recap with example. The NOTE and REQUIRED/OPTIONAL/EXAMPLE blocks are dense but each earns its place; slightly verbose but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still conveys return-relevant fields (creative_count, coverage.empty_reason). For a read-only, zero-required-param list tool this is nearly complete; only connection_context is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden. It documents parent_id well (str, UUID of parent folder, omit for top-level) but leaves connection_context entirely unexplained, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (creative folders) with scope (authenticated tenant, optionally parent_id-scoped). It distinguishes itself from the sibling creatives_list by clarifying that root creatives_list still returns READY_LOCAL files with folder_id=null.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: omit parent_id for top-level, and explicitly instructs the agent to inspect coverage.empty_reason before telling the operator the library is empty. It also warns that zero folders does not mean an empty library. It lacks an explicit 'use X instead of Y' routing statement, keeping it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creatives_reconcileReconcile creative storage stateADestructiveInspect
Idempotently reconcile 1..20 tenant-owned creative IDs in one server-side batch. Use readiness.reason_code to distinguish bytes still pending, storage verification, terminal upload failure, and create eligibility. The server uses fixed bounded concurrency; do not fan out creatives_confirm_upload calls. Results preserve input order and never expose storage keys, hashes, provider bodies, or tenant identifiers.
REQUIRED: creative_ids (list[str], 1..20 unique IDs from creatives_list). Retry only when readiness.retryable=true and follow readiness.next_action. EXAMPLE: creatives_reconcile({"creative_ids": [""]})
| Name | Required | Description | Default |
|---|---|---|---|
| creative_ids | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=false, and the description adds strong behavior: idempotency, fixed bounded concurrency, input-order preservation, and a data-disclosure guarantee (no storage keys, hashes, provider bodies, tenant IDs). It does not disclose the destructive side effects implied by destructiveHint=true (e.g., what storage state is altered or removed), which is the one behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and batch scope, then reason_code semantics, concurrency/security constraints, then the REQUIRED/EXAMPLE block. Dense but every sentence carries operational information; slightly packed given the single-paragraph run-on of constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the return shape (order preserved, redacted fields) and pointing at readiness.retryable/reason_code/next_action as the decision surface. Complete enough for invocation, with the only omission being the destructive side effect and connection_context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry semantics; it constrains creative_ids to 1..20 unique IDs sourced from creatives_list and supplies a call example. The second parameter (connection_context) is never mentioned, though it appears to be a platform-wide context field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('reconcile ... creative IDs') plus scope (1..20 tenant-owned IDs, single server-side batch). It explicitly distinguishes itself from the sibling it could be confused with ('do not fan out creatives_confirm_upload calls').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (use readiness.reason_code to distinguish pending bytes, verification, terminal failure, create eligibility) and when-not-to-use ('do not fan out creatives_confirm_upload'), plus a retry condition ('Retry only when readiness.retryable=true and follow readiness.next_action').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creatives_rename_folderRename a creative folderADestructiveInspect
Rename a creative folder owned by the authenticated tenant. New name must be unique within the same parent.
NOTE: updated_at on the returned row = "row last touched", NOT "content changed".
REQUIRED: folder_id (str — UUID), name (str — new name). EXAMPLE: creatives_rename_folder({"folder_id": "", "name": "Hero videos v2"})
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| folder_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description adds valuable context beyond them: tenant ownership scoping, uniqueness constraint, and a note clarifying that updated_at means row last touched rather than content changed. It omits why the rename is destructive, but the annotation covers that warning.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and constraint, then uses compact NOTE/REQUIRED/EXAMPLE sections. Every sentence adds actionable information given the 0% schema coverage, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema tool with 0% schema coverage, the description is incomplete: it fails to document connection_context and gives only a partial hint about return values (updated_at semantics). It covers the core rename behavior and prerequisites but leaves notable gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry all parameter meaning. It documents the two required parameters with type and UUID format for folder_id and clarifies name is the new name, but it completely omits the third parameter connection_context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb 'rename' and resource 'creative folder', and scopes it to folders owned by the authenticated tenant. Distinguishes from siblings like creatives_create_folder, creatives_delete_folder, and creatives_list_folders by its unique action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit statement of when to use this tool versus alternatives, but the rename action is self-evident and there is no sibling rename tool. It provides a usage prerequisite (name uniqueness within the same parent) but no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creatives_request_upload_v2Prepare a versioned creative uploadAInspect
Prepare or reconcile one tenant-owned creative upload using the credential-free P9 contract. Requires a stable idempotency_key and returns upload_endpoint=/api/upload/proxy when bytes are needed, or dedup_success only for a storage-verified ready object. Never returns upload_url, r2_key, provider credentials, or raw tenant identifiers. Send the multipart bytes to that same-origin endpoint with the same Authorization: Bearer <MCP token> header; the endpoint enforces mcp.launch.prepare, tenant ownership, rate limits, concurrency, size, type and R2-prefix checks.
REQUIRED: filename, content_type, file_size (1..500MB), lowercase 64-hex file_hash, idempotency_key. Optional: upload_attempt (1..3, default 1), folder_id. EXAMPLE: creatives_request_upload_v2({"filename": "hero.mp4", "content_type": "video/mp4", "file_size": 12345678, "file_hash": "", "idempotency_key": "upload-20260723-example", "upload_attempt": 1})
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | ||
| file_hash | Yes | ||
| file_size | Yes | ||
| folder_id | No | ||
| content_type | Yes | ||
| upload_attempt | No | ||
| idempotency_key | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, openWorldHint=false, destructiveHint=false): it discloses the idempotency requirement, the exact return branches, explicit negative scope ('never returns upload_url, r2_key, provider credentials, or raw tenant identifiers'), the required Authorization header, and the server-side enforcement set (mcp.launch.prepare, tenant ownership, rate limits, concurrency, size, type, R2-prefix checks). This is exactly the operational context an agent needs beyond the safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the idempotency requirement, then negative scope, then the follow-up mechanics and the example. Dense but every sentence carries substantive information; the final enforcement list is long but load-bearing rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only sparse annotations, the description compensates by documenting both return branches, the follow-up HTTP step, auth requirements, and enforcement behavior. An agent has everything needed to invoke it correctly and route the resulting bytes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does: file_size range (1..500MB), file_hash format (lowercase 64-hex), upload_attempt range (1..3, default 1), idempotency_key stability requirement, plus a concrete worked example. Only connection_context is left unexplained, a minor omission given the exhaustive coverage of the real inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: prepare or reconcile a tenant-owned creative upload. It clearly scopes the operation as a pre-upload step versus a byte transfer. It does not explicitly differentiate from the v1 sibling 'creatives_request_upload' or route to 'creatives_confirm_upload', so it falls short of full sibling disambiguation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the described lifecycle (call this first, then POST bytes to the returned endpoint), and it describes the two return branches (upload_endpoint when bytes are needed vs dedup_success for a ready object). However, it never names an alternative tool or states when-not to use this, so the agent must infer the flow position from the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_status_confirmConfirm an ad delivery status changeADestructiveInspect
Consume one approval_ref and execute the recorded delivery-status change once. Uncertain writes are recorded and never auto-retried.
| Name | Required | Description | Default |
|---|---|---|---|
| approval_ref | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true. The description adds genuinely useful behavior beyond them: the single-use nature of approval_ref ('one'), the one-time execution guarantee, and the retry policy ('Uncertain writes are recorded and never auto-retried'). That retry disclosure is valuable context for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero filler, and the core action is front-loaded before the retry caveat. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The behavioral story is solid for a destructive write tool with no output schema, but the 0% parameter coverage and the absence of any mention of connection_context or how to obtain an approval_ref leave the invocation path underspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden. It only implies approval_ref is a consumed single-use token, and says nothing about connection_context or the token's origin/format, leaving the optional parameter entirely undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'execute the recorded delivery-status change' via an approval_ref. The prepare/confirm pairing is implied by the approval_ref and the sibling delivery_status_prepare, but the description never names that sibling, so an agent must infer the workflow relationship.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through 'Consume one approval_ref' and 'execute the recorded delivery-status change once', suggesting this is the second step after a prepare. However, it never states when to use this over alternatives like delivery_status_prepare or other *_confirm tools, nor any prerequisites beyond the token.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_status_preparePrepare an ad delivery status changeBInspect
Validate a bounded tenant-owned TikTok delivery-status change and return a single-use approval_ref. This tool never mutates TikTok. Use native ad_group; adset remains an explicit adapter alias.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | ||
| entity_refs | Yes | ||
| entity_type | Yes | ||
| ad_account_id | Yes | ||
| target_status | Yes | ||
| idempotency_key | Yes | ||
| connection_context | No | ||
| rule_id_and_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give readOnlyHint=false with destructiveHint=false, which is potentially confusing, and the description usefully resolves it: the tool writes an approval artifact but 'never mutates TikTok'. It also adds the 'bounded tenant-owned' scope and the single-use nature of the returned reference. It omits auth requirements, idempotency behavior, and validation failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the core behavior front-loaded and zero filler. Phrasing like 'bounded tenant-owned' is slightly opaque jargon, but nothing is wasted or buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description conveys the essential model (validate, no mutation, return approval_ref), which partially compensates for the absent output schema. However, for a tool with 7 required parameters and no schema descriptions, leaving nearly every input unexplained is a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 8 parameters, so the description must carry the burden, yet it clarifies only entity_type (ad_group vs adset alias). run_id, rule_id_and_version, idempotency_key, entity_refs, target_status, ad_account_id, and connection_context are left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Validate a ... TikTok delivery-status change') and states the artifact produced ('return a single-use approval_ref'). It also separates itself from the confirm counterpart via 'This tool never mutates TikTok', though it never explicitly names the delivery_status_confirm sibling as the downstream step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only routing guidance is parameter-level ('Use native ad_group; adset remains an explicit adapter alias'), which addresses enum choice rather than when to call this tool instead of delivery_status_confirm or bid_prepare/budget_prepare. The prepare-then-confirm relationship is only implied by the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insights_export_csvCreate an insight CSV exportAInspect
Export insights as CSV. export_mode='grouped' emits per-entity totals over the window; export_mode='daily' emits one row per (date, entity). Requires date_from, date_to, one scope filter (ad_account_id or product_id), and confirm_export=true. Returns an artifact_ref and authenticated download_endpoint valid for one hour (maximum 5 MiB). GET the endpoint on this server with the same tenant Bearer credential; never append credentials to URLs. Attribution: omit or value (TikTok configured window).
Persists a private, expiring CSV artifact; this is not a read-only call.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | ||
| date_to | No | ||
| group_by | Yes | ||
| date_from | No | ||
| product_id | No | ||
| attribution | No | ||
| export_mode | No | grouped | |
| ad_account_id | No | ||
| confirm_export | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the artifact_ref + one-hour download_endpoint contract, the 5 MiB cap, same-tenant credential requirement, the rule never to embed credentials in URLs, and the attribution options. The closing line 'this is not a read-only call' correctly reinforces readOnlyHint=false without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the two paragraphs are dense with actionable constraints. There is mild redundancy between the return-value sentence and the closing 'private, expiring CSV artifact' line, but each statement still adds distinct operational guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-param export tool with no output schema, the description covers the return shape, auth model, size/time limits, and required inputs. The main gap is the required group_by parameter and search filter, which an agent must infer from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage the description carries the load and explains date_from, date_to, the ad_account_id/product_id scope choice, confirm_export, export_mode, and attribution semantics. However, group_by (a required enum of account/campaign/ad_group/adset/ad) and search are left unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Export insights as CSV') and immediately clarifies the two emission granularities (grouped per-entity totals vs. daily date/entity rows). The CSV-artifact framing makes it distinguishable from the many insights_* query siblings, though none are named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete prerequisites (date_from, date_to, exactly one scope filter, confirm_export=true) and explains which export_mode to pick for which output shape. It stops short of explicitly routing the agent away from siblings like insights_query_rows or insights_pull_insights.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insights_get_date_rangeRead cached insight date rangeARead-onlyInspect
Returns the min/max stat_date present in cache for the authenticated tenant. Use to bound query_overview windows.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the agent knows this is a safe, closed read. The description adds that the result is tenant-scoped and reads from cache, which is useful. It doesn't say what happens on an empty cache, which would matter for bounding windows.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with what is returned and followed by the intended use. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a trivial no-required-param read with annotations covering safety, the description is nearly complete: it says what is returned, scoped to the tenant, and why. Missing only empty-cache behavior, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single parameter connection_context is undocumented in both schema and description. With one optional param and no facts to add, the description says nothing about it; a 3 reflects that no compensating meaning is provided but the param is likely internal plumbing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (returns) and resource (min/max stat_date in cache) for a scoped tenant. Clearly distinguishes itself from insights_query_overview, which it references as the consumer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it to bound query_overview windows, giving clear context. Does not name exclusions or alternatives beyond that, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insights_pull_insightsRefresh insight dataADestructiveInspect
Async refresh of cached insights from the TikTok Marketing API. Submits one or more pull_tiktok_insights tasks (one per active connection) and returns legacy task_id values. This is the manual refresh compatibility path; Agent Method clients should follow the opaque task_ref returned by insights_query_consistent and consume the terminal result directly.
REQUIRED: none. Optional: days (int 1..90, default 30 — window length, NOT a date pair). EXAMPLE: insights_pull_insights({"days": 7})
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered; the description adds real operational context beyond that — it is asynchronous, spawns one task per active connection, and returns legacy task_id values. It does not explain what the destructive flag actually affects (cache invalidation/overwrite cost) or how to poll the returned task_id, leaving a couple of behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, and the REQUIRED/OPTIONAL plus EXAMPLE blocks are well-structured and immediately scannable. The middle sentence is dense with product jargon ('legacy task_id', 'Agent Method clients', 'opaque task_ref'), but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no schema descriptions, so the description carries the burden for an async, task-submitting tool. It states the return is a task_id but never tells the agent how to consume that id (e.g., the tasks_* polling siblings) and omits connection_context, leaving the workflow incomplete for a caller without prior product knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so well for 'days' (range 1..90, default 30, and the key clarification that it is a window length, NOT a date pair), but 'connection_context' is never mentioned, so half the parameters remain undocumented in both the schema and the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Async refresh of cached insights from the TikTok Marketing API') and explains the mechanism (submits one pull_tiktok_insights task per active connection). It also explicitly distinguishes itself from the sibling insights_query_consistent, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative path explicitly ('Agent Method clients should follow the opaque task_ref returned by insights_query_consistent') and labels this the 'manual refresh compatibility path', giving a clear condition for choosing it. The guidance is framed around a specific client concept ('Agent Method clients'), which an arbitrary caller may not self-map cleanly, so it falls short of a fully general when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insights_query_batch_overviewCompare cached insight totalsARead-onlyInspect
Server-side batch overview for comparing multiple explicit scopes. Cache-only read from tiktok_insights_daily; accepts 1 to 20 scopes and avoids client-side concurrent fan-out.
Attribution: omit or use value (TikTok configured window). Custom attribution windows are rejected.
REQUIRED: group_by ∈ {account, campaign, adset, ad}, scopes[] where each scope has date_from, date_to, and one scope filter (ad_account_id or product_id). DATE PARAMS: use date_from / date_to inside each scope (NOT start_date / end_date). EXAMPLE: insights_query_batch_overview({"group_by": "account", "scopes": [{"ad_account_id": "<advertiser_id_1>", "date_from": "2026-04-23", "date_to": "2026-04-29"}, {"ad_account_id": "<advertiser_id_2>", "date_from": "2026-04-23", "date_to": "2026-04-29"}]})
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| scopes | Yes | ||
| group_by | Yes | ||
| sort_dir | No | desc | |
| sort_key | No | spend | |
| page_size | No | ||
| view_mode | No | grouped | |
| attribution | No | ||
| consistency | No | cached | |
| connection_context | No | ||
| require_complete_range | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/openWorldHint/destructiveHint, so the safety profile is covered. The description adds real behavioral context beyond that: cache-only sourcing from tiktok_insights_daily, the 1-20 scope ceiling, and that custom attribution windows are rejected at the server.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, then attribution, required fields, date-param gotcha, and a concrete example, each on its own labeled line. Dense but zero waste, and the ordering matches how an agent would construct the call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-param, no-output-schema tool it covers the call-critical pieces (group_by, scopes, dates, attribution) and an example. It remains incomplete on pagination, sorting, view_mode and consistency, and the group_by/product_id discrepancies against the schema could actively mislead.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 11 params, so the description must carry the load. It documents group_by, the scopes[] shape, and the date_from/date_to naming gotcha, but leaves page, page_size, sort_dir, sort_key, view_mode, consistency, connection_context and require_complete_range unexplained. Worse, it lists group_by as {account, campaign, adset, ad} (omitting the schema's ad_group) and claims a product_id scope filter that the schema explicitly does not expose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: a server-side batch overview that compares multiple explicit scopes, reading cache-only from tiktok_insights_daily. The batch framing inherently distinguishes it from single-scope siblings like insights_query_overview, but no sibling is named explicitly, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: use it for comparing multiple scopes without client-side concurrent fan-out, with constraints on attribution (omit or use value; custom windows rejected) and the 1-20 scope limit. It stops short of explicitly stating when to prefer this over insights_query_overview or insights_query_consistent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insights_query_consistentQuery insights with freshness and paginationADestructiveInspect
Canonical Agent Method Profile V1 insight read. Accepts one scope or one server-side batch of up to 20 scopes and returns one ordered compact evidence envelope. TikTok ad_group is accepted natively; adset is only its common-wire adapter alias. Start at page one and follow the server-returned opaque single-use continuation serially when has_more=true. It preserves the original tenant, advertiser, authorization route, dates, grouping, filters, order, effective page size, and source snapshot. Legacy min_as_of is only a freshness lower bound, never a pagination anchor or substitute for continuation/source_snapshot. Each scope requires one tenant-owned ad_account_id; product_ref mapping is not advertised. A wait_ms=0 fresh request has a bounded acknowledgement deadline: poll a returned task_ref, or honor dependency_unavailable backoff once.
May enqueue a data refresh, replace cached data and persist pagination state; this is not a read-only call.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| scope | No | ||
| fields | No | ||
| scopes | No | ||
| date_to | Yes | ||
| wait_ms | No | ||
| group_by | Yes | ||
| date_from | Yes | ||
| min_as_of | No | Legacy freshness lower bound only. Never use it as a TikTok pagination anchor; continue pages only with the opaque continuation. | |
| page_size | No | ||
| consistency | No | cached | |
| response_mode | No | compact | |
| date_range_mode | No | explicit | |
| after_mutation_ref | No | ||
| connection_context | No | ||
| query_contract_version | Yes | ||
| require_complete_range | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, and the description corroborates rather than contradicts: 'May enqueue a data refresh, replace cached data and persist pagination state; this is not a read-only call.' It adds non-obvious behavior beyond annotations — single-use opaque continuation tokens, an ordered compact envelope, freshness acknowledgement deadlines, and the adset adapter alias — which materially changes how an agent must 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core contract and each sentence carries distinct information (scope shape, pagination rule, freshness bound, polling behavior, side effects). The 'Canonical Agent Method Profile V1' framing and some compound sentences are jargon-heavy, but there is little pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter, high-complexity tool with no output schema, the description covers the contract essentials: response shape, pagination protocol, freshness/polling behavior, scope cardinality, and destructive side effects. Remaining gaps are the consistency/freshness enum modes and date_range_mode/after_mutation_ref semantics, which matter for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 6% across 17 parameters, so the description must carry the load and largely does: it explains scope vs. scopes (max 20), the ad_account_id requirement, ad_group vs. adset alias, min_as_of's narrow meaning, continuation and source_snapshot semantics, and effective page-size preservation. Several parameters (consistency, response_mode, date_range_mode, require_complete_range, connection_context) still get no explanation, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific operation (an insight read returning one ordered compact evidence envelope) and its input shape (one scope or one batch of up to 20 scopes), which is clearly more than the title. However, in a sibling cluster dense with insight tools (insights_query_rows, insights_query_overview, insights_query_batch_overview, insights_pull_insights), it never explicitly says what distinguishes this 'canonical' method from those, so an agent cannot route on name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives genuine operational guidance: start at page one, follow the single-use continuation serially when has_more=true, treat min_as_of only as a freshness lower bound, and poll task_ref / honor dependency_unavailable backoff for a wait_ms=0 fresh request. But it offers no when-to-use-this-versus-sibling guidance, and the 'one scope or one batch' choice is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insights_query_consistent_continueConsume an insight continuationADestructiveInspect
Continue one Agent Method insight read using the opaque tenant-bound continuation returned by the prior page. The server pins every page to the original route, query shape, page size, and source snapshot. The continuation is single-use. Do not pass or synthesize min_as_of; on snapshot_expired or replay rejection, restart the identical page-1 request serially.
Consumes the single-use continuation and may persist the next page's continuation.
| Name | Required | Description | Default |
|---|---|---|---|
| continuation | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Explains behavior the annotations cannot: the continuation is single-use, tenant-bound, pinned to the original route/query shape/page size/snapshot, and the call may persist the next page's continuation. This also reconciles the destructiveHint/readOnlyHint=false annotations, since consuming a single-use token mutates server-side pagination state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then constraints and failure remediation. The trailing paragraph ('Consumes the single-use continuation and may persist the next page's continuation') restates the opening sentence and adds little, slightly diluting the otherwise tight structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description does explain that a next-page continuation is produced, which is what an agent needs to chain calls. However, 'may persist the next page's continuation' is ambiguous about who persists and how the continuation is returned, leaving a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden. It fully characterizes the required 'continuation' (opaque, tenant-bound, from the prior page, single-use) and adds a relevant negative constraint on min_as_of, but says nothing about the optional connection_context parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Continue one Agent Method insight read') plus the exact input it consumes ('the opaque tenant-bound continuation returned by the prior page'). An agent can distinguish it from the sibling that starts the read without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage conditions and exclusions: use only with a continuation from the prior page, do not pass or synthesize min_as_of, and on snapshot_expired or replay rejection restart the identical page-1 request serially. It never names the page-1 sibling tool explicitly, so the alternative is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insights_query_overviewRead insight totalsARead-onlyInspect
Aggregated insight rows for the authenticated tenant, paginated and sortable. Cache-only read from tiktok_insights_daily — call insights_pull_insights first if data is stale. This legacy common-wire surface maps adset to TikTok's native ad group role.
Attribution: omit or use value (TikTok configured window); custom 1d/7d windows are unsupported. Daily mode returns all day rows in items. result/cost_per_result are separate from conversions/CPA. Metadata describes the latest row within the requested period.
REQUIRED: group_by ∈ {account, campaign, adset, ad}, date_from, date_to, and one scope filter (ad_account_id or product_id). DATE PARAMS: use date_from / date_to (NOT start_date / end_date). EXAMPLE: insights_query_overview({"group_by": "account", "ad_account_id": "<advertiser_id>", "date_from": "2026-04-23", "date_to": "2026-04-29"})
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| search | No | ||
| date_to | No | ||
| group_by | Yes | ||
| sort_dir | No | desc | |
| sort_key | No | spend | |
| date_from | No | ||
| page_size | No | ||
| view_mode | No | grouped | |
| management | No | ||
| product_id | No | ||
| attribution | No | ||
| consistency | No | cached | |
| ad_account_id | No | ||
| connection_context | No | ||
| query_contract_version | No | ||
| require_complete_range | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint=false, so safety is covered; beyond that the description adds genuine behavioral context: cache-only reads, staleness handling, daily-mode row behavior, attribution limitations, and how metadata/result fields relate to conversions. It adds materially more than the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and the cache workflow, then organizes required/date/example guidance into labeled sections. Density is high but each block earns its place; the example call is a strong addition. Minor redundancy around required/scope phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-param tool with no output schema, the description covers the critical calling contract (required group_by/date/scope, correct date param names, attribution constraints) and even anticipates the connection_context requirement indirectly. Remaining gaps are the auxiliary params whose names are largely self-explanatory.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 17 params, so the description must compensate, and it does for the high-value ones (group_by values, date_from/date_to with an explicit warning NOT to use start_date/end_date, the ad_account_id/product_id scope choice, and attribution rules). It leaves many params undocumented (management, consistency, require_complete_range, query_contract_version, search, page/page_size), so it only partially fills the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Aggregated insight rows for the authenticated tenant, paginated and sortable') and clarifies the underlying source (tiktok_insights_daily) plus the legacy mapping nuance ('maps adset to TikTok's native ad group role'). This lets an agent distinguish it from siblings like insights_query_rows or insights_query_batch_overview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states it is a cache-only read and routes the agent to insights_pull_insights when data is stale, which is real when-to-use guidance. It does not, however, distinguish itself from the other insight query siblings (rows/batch_overview/consistent), leaving that gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insights_query_rowsRead cached insight rowsARead-onlyInspect
Raw insight rows (capped at 5000) for the authenticated tenant. Use for debugging or detail drilldown; query_overview is the main read path.
REQUIRED: date_from, date_to, and one scope filter (ad_account_id or product_id). DATE PARAMS: use date_from / date_to (NOT start_date / end_date). EXAMPLE: insights_query_rows({"ad_account_id": "<advertiser_id>", "date_from": "2026-04-23", "date_to": "2026-04-29"})
| Name | Required | Description | Default |
|---|---|---|---|
| date_to | No | ||
| date_from | No | ||
| product_id | No | ||
| ad_account_id | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so safety is covered. The description adds genuine behavioral context beyond that: the 5000-row cap and the tenant-scoping constraint. It stops short of describing pagination or return shape, but the cap is a meaningful trait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence, then labeled sections (REQUIRED, DATE PARAMS, EXAMPLE) that make the critical constraints scannable. The example earns its place by demonstrating the required-parameter combination and date format.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, annotation-covered tool with no output schema, the description supplies what the schema omits: required params, naming caveat, row cap, and sibling routing. Only the connection_context parameter and any row-shape expectations are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and all five params are nullable with defaults, so the schema implies nothing is required. The description compensates strongly: it declares the actual required set (date_from, date_to, and one of ad_account_id/product_id), warns against the start_date/end_date naming trap, and supplies a concrete call example. connection_context is left unexplained, keeping this from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (raw insight rows) with its scope (authenticated tenant) and an explicit cap (5000), then contrasts directly with the sibling query_overview as 'the main read path.' An agent can tell this apart from the other insights_* tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes usage: 'Use for debugging or detail drilldown; query_overview is the main read path.' This names both the when-to-use and the preferred alternative for the common case, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
interests_archiveDelete an interest packADestructiveInspect
Archive an existing saved interest pack owned by the authenticated user. Mirrors Meta interests_archive — wire name preserved across products even though TikTok implements this as a hard delete (the TikTok schema does not yet expose a soft-archive status column). After this call the pack no longer appears in interests_list.
REQUIRED: interest_pack_id (str). EXAMPLE: interests_archive({"interest_pack_id": ""})
| Name | Required | Description | Default |
|---|---|---|---|
| interest_pack_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds genuinely non-obvious context: the 'archive' name masks an irreversible hard delete because no soft-archive status column exists yet. It also states ownership scoping ('owned by the authenticated user') and the observable post-condition. This is exactly the kind of disclosure an agent needs before invoking a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the critical naming caveat before the mechanics. The REQUIRED/EXAMPLE block is efficient, though the example line restating the same call format is slightly redundant against the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with no output schema, it covers the key concerns: ownership, irreversibility, and post-call state. The only gap is the undocumented optional connection_context parameter, which is a minor omission given the tool's single required input.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter burden. It documents the required interest_pack_id as a str with a UUID-shaped example, which is useful, but says nothing about connection_context (the second, optional param) or any format constraints on it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Archive an existing saved interest pack owned by the authenticated user') and immediately resolves the naming ambiguity by explaining that the wire name is preserved from Meta but TikTok implements it as a hard delete. It also positions the tool relative to siblings by noting the pack disappears from interests_list afterward.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to call it (removing an existing, user-owned pack) plus a post-condition that lets an agent verify the outcome against interests_list. It does not explicitly name alternatives (e.g. why to archive vs. simply stop listing) or state exclusions, so it falls short of a full when/when-not treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
interests_fetch_from_adsetPreview or save ad group interestsAInspect
Preview a reusable interest pack from one live TikTok adgroup's targeting. Calls /adgroup/get/ + /tool/interest_category/ + /tool/interest_keyword/get/ to resolve category and keyword IDs to human-readable names. Mirrors the Meta sister-product's interests_fetch_from_adset (adset is the MCP wire name for what TikTok calls adgroup — either spelling is accepted).
When name is omitted, returns an unsaved preview only; pass it through to interests_save_fetched_pack to persist. When name IS supplied, fetches and saves in one call.
REQUIRED: advertiser_id (str — TikTok advertiser_id this user owns), adgroup_id OR adset_id (str — TikTok adgroup_id; both names work). OPTIONAL: name (str — when supplied, persists immediately). EXAMPLE: interests_fetch_from_adset({"advertiser_id": "7390000000000000000", "adset_id": "1820000000000000000"})
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| adset_id | No | ||
| adgroup_id | No | ||
| advertiser_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only tell the agent this is a non-read-only, non-destructive operation; the description adds the far more important trait that the absence of `name` makes it a pure preview with no persistence, and it discloses the internal resolution chain (adgroup/get → interest_category → interest_keyword). This is meaningful behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose with clearly delimited REQUIRED/OPTIONAL/EXAMPLE blocks; the internal-endpoint sentence and the 'Mirrors the Meta sister-product' aside are mildly expendable but do convey real information. Nothing is buried and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with no output schema and 0% schema coverage, the description covers required inputs, the mutually-exclusive id naming, and the default preview semantics. The one notable gap is that it never sketches what the preview or saved pack returns, and the schema (advertiser_id alone required) conflicts with the prose claiming adgroup_id/adset_id is required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the load: it documents advertiser_id, explains that adgroup_id and adset_id are interchangeable names for the same value, and clarifies that `name` changes behavior from preview to persist. Only connection_context is left unexplained, so the compensation is strong but not total.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (preview/save) on a specific resource (an interest pack derived from one live TikTok adgroup's targeting). The opening sentence lets an agent distinguish it from interests_get, interests_list, and interests_save_fetched_pack without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly defines the two branches: omitting `name` yields an unsaved preview; supplying `name` fetches and saves in one call. It also names the follow-on tool (interests_save_fetched_pack) for persisting a preview, giving clear when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
interests_getRead an interest packARead-onlyInspect
Get one saved interest pack owned by the authenticated user by interest_pack_id. Mirrors Meta interests_get. Returns both TikTok-native (source_adgroup_id) and Meta-wire (source_adset_id) keys on the same row so portable agents reading either name work unchanged.
REQUIRED: interest_pack_id (str — UUID from interests_list). EXAMPLE: interests_get({"interest_pack_id": ""})
| Name | Required | Description | Default |
|---|---|---|---|
| interest_pack_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, non-destructive, closed-world behavior, so the bar is lower. The description adds genuine value beyond that: ownership scoping and a disclosure of the returned row shape (source_adgroup_id plus source_adset_id aliases).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, followed by the aliasing rationale and a concrete example. Efficient overall, though the dual-key explanation is slightly verbose for a read tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully sketches the returned row's keys, and with annotations covering safety there is little else an agent needs. Only the optional connection_context parameter is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It documents the required interest_pack_id as a str UUID sourced from interests_list and shows a call example, though it leaves the optional connection_context undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (get one saved interest pack) with an explicit scoping constraint (owned by the authenticated user, keyed by interest_pack_id). It is clearly distinguishable from siblings like interests_list, interests_archive, and interests_fetch_from_adset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It signals the retrieval workflow by telling the agent the ID is a 'UUID from interests_list' and that the pack must be owned by the authenticated user. There is no explicit when-not-or-alternatives guidance, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
interests_listList saved interest packsBRead-onlyInspect
List saved interest packs (reusable audience targeting bundles) for the authenticated user. The wire name is shared, but rows retain TikTok-native targeting semantics.
REQUIRED: none. EXAMPLE: interests_list({})
| Name | Required | Description | Default |
|---|---|---|---|
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds the user-scoping constraint and the note that 'rows retain TikTok-native targeting semantics', which is genuinely useful context, but says nothing about result size, ordering, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, followed by scoping, then REQUIRED and an EXAMPLE; little waste. The 'wire name is shared, but rows retain TikTok-native targeting semantics' sentence is slightly opaque but short.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool whose annotations already cover safety, this is nearly adequate, but with no output schema the description should hint at what a returned pack looks like, and the undocumented connection_context parameter leaves a gap an agent must guess at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load for the single parameter, connection_context. It only asserts 'REQUIRED: none', which is helpful for required-ness but leaves the one parameter's meaning and expected mctx_v1 format entirely unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (saved interest packs) and even glosses the resource as 'reusable audience targeting bundles', which an agent can act on. It does not, however, distinguish itself from siblings like interests_get or interests_fetch_from_adset, so the scope is clear but the differentiation is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description scopes usage to 'the authenticated user' and states 'REQUIRED: none' plus a call example, which implies it is the entry-point listing call. But it never says when to prefer this over interests_get or interests_fetch_from_adset, so alternatives are left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
interests_save_fetched_packSave a new interest packAInspect
Fetch one live TikTok adgroup's interest targeting and save it as a reusable interest pack. Mirrors Meta interests_save_fetched_pack (adset is the MCP wire name for what TikTok calls adgroup — either spelling is accepted). Equivalent to calling interests_fetch_from_adset with name supplied, but matches the Meta two-step flow so portable agent code stays identical.
REQUIRED: advertiser_id (str), name (str, the saved pack's label), adgroup_id OR adset_id (str — TikTok adgroup_id; both names work). EXAMPLE: interests_save_fetched_pack({"advertiser_id": "7390000000000000000", "adset_id": "1820000000000000000", "name": "VN broad interests"})
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| adset_id | No | ||
| adgroup_id | No | ||
| advertiser_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds useful context — that it fetches live data and persists it as a named pack — but does not say whether an existing pack of the same name is overwritten or what auth scopes are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first sentence, followed by routing rationale, a REQUIRED block, and an example. Slightly verbose on the Meta-parity justification, but every element is functional.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description should ideally describe what a saved pack returns (e.g., its identifier for later reuse). It covers inputs well but stops short of describing the result, leaving a gap for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden and largely does: it documents advertiser_id, name, and the adgroup_id/adset_id alias equivalence, plus a worked example. Only connection_context is left undocumented, a small residual gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: fetch one live TikTok adgroup's interest targeting and save it as a reusable pack. It is clearly distinguishable from siblings like interests_fetch_from_adset, interests_archive, interests_get, and interests_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative (interests_fetch_from_adset) and the condition that selects this tool — matching the Meta two-step flow so portable agent code stays identical. That is a clear when/when-not routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mmp_delete_connectionDelete an attribution connectionADestructiveInspect
Delete one existing MMP connection by connection_id. WRITE — call is IMMEDIATE and IRREVERSIBLE; Meta cascades the delete to mmp_apps + cohort_configs + cached cohort rows. To re-add, use the MMP connection page in the AdsAgent dashboard; never request an API token in chat. Show the exact target, obtain explicit user confirmation in the current interaction, call once, and never retry an uncertain outcome. No mutation receipt is advertised. Mirror of Meta MCP mmp_delete_connection.
REQUIRED: connection_id (str — UUID from mmp_get_state). EXAMPLE: mmp_delete_connection({"connection_id": ""})
| Name | Required | Description | Default |
|---|---|---|---|
| connection_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description goes well beyond them: it names the cascaded deletions (mmp_apps, cohort_configs, cached cohort rows), states the call is immediate and irreversible, and discloses that no mutation receipt is advertised.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the destructive warning before the confirmation protocol, and every sentence carries operational weight. Slightly dense with the confirmation and token cautions, but nothing is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations explaining cascade behavior, so the description properly covers irreversibility, cascade scope, and confirmation. The only meaningful omission is any mention of the connection_context parameter in a 2-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It documents connection_id as a required UUID sourced from mmp_get_state and provides a call example, which is genuinely useful. However the optional connection_context parameter is never mentioned.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (one existing MMP connection) scoped by connection_id, and names the operation as the mirror of Meta MCP mmp_delete_connection. Clearly distinguishable from siblings like mmp_refresh_connection or mmp_save_cohort_config.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes re-adding to the dashboard MMP connection page, forbids requesting an API token in chat, and prescribes a confirm-then-call-once workflow with 'never retry an uncertain outcome'. When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mmp_fetch_cohortsRefresh attribution cohortsADestructiveInspect
Fetch and persist cohort rows for one app under one MMP connection. WRITE — call is SYNCHRONOUS and can take 30-60s (Meta calls AppsFlyer in the same thread; loopback timeout is 90s). date_from / date_to range cannot exceed 31 days (AppsFlyer cohort API cap). Treat this as an explicit read refresh, never an onboarding side effect. Mirror of Meta MCP mmp_fetch_cohorts.
REQUIRED: connection_id (str — UUID), app_ref (str), date_from (str, YYYY-MM-DD), date_to (str, YYYY-MM-DD). DATE PARAMS: use date_from / date_to (NOT start_date / end_date), range ≤ 31 days. Optional: selected_source_refs (list[str] — override the config's source list for this fetch only). EXAMPLE: mmp_fetch_cohorts({"connection_id": "", "app_ref": "ai.hailuo.video", "date_from": "2026-04-12", "date_to": "2026-05-12"})
| Name | Required | Description | Default |
|---|---|---|---|
| app_ref | Yes | ||
| date_to | Yes | ||
| date_from | Yes | ||
| connection_id | Yes | ||
| connection_context | No | ||
| selected_source_refs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, and the description adds substantial operational context the annotations don't carry: synchronous execution, 30-60s duration, 90s loopback timeout, and the AppsFlyer 31-day API cap. It does not reconcile the destructiveHint flag (what existing rows are overwritten), which is the one gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose, then the WRITE/sync warning, then required params, date constraints, optional param, and a concrete example. Every line adds operational value and the sectioning makes it skimmable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description tells the agent what persists, how long it takes, the timeout, and the date cap — the essentials for a long-running write. It leaves connection_context unexplained, the only meaningful omission for a 6-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage the description must carry the load, and it does for the four required params (UUID format, date YYYY-MM-DD) plus the optional selected_source_refs override semantics and an explicit 'use date_from/date_to not start_date/end_date' disambiguation. It omits the connection_context parameter present in the schema, so not full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Fetch and persist cohort rows for one app under one MMP connection.' This clearly separates it from siblings like mmp_save_cohort_config (config) and mmp_get_state (read-only state), and the 'Mirror of Meta MCP mmp_fetch_cohorts' note anchors intent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit context ('treated as an explicit read refresh, never an onboarding side effect') and a concrete precondition (date range ≤ 31 days), which tells the agent when this is the right call. It doesn't name a specific alternative sibling tool to route to, 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.
mmp_get_stateRead attribution connection statusARead-onlyInspect
Summarise MMP connections and synced apps for the current user (one row per app: name, platform, source refs, event count, whether a cohort config exists), paged with limit/cursor. Pass connection_id (and optionally app_ref) to expand one connection/app into {connections, metadata_by_connection, cohort_configs_by_connection} with full event mappings. TikTok and Meta share the same MMP connections for a user, so this returns the same data the user would see on adsagent.md/dashboard/mmp. Mirror of Meta MCP mmp_get_state.
Call this BEFORE mmp_save_cohort_config or mmp_fetch_cohorts to discover valid connection_id + app_ref + kpi event names. Typing a kpi that the AppsFlyer app doesn't send silently returns zero rows.
REQUIRED: nothing. Optional: connection_id, app_ref (expand), limit (1..100, default 50), cursor. EXAMPLE: mmp_get_state({}) then mmp_get_state({"connection_id": "", "app_ref": "<app_ref>"})
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| app_ref | No | ||
| connection_id | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds valuable behavioral context: pagination via limit/cursor, the two response shapes (summary vs expanded mappings), and the silent-zero-rows failure mode. It does not state cursor expiry or auth requirements, keeping it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: what it returns, then expansion, then call-ordering guidance, then parameter summary and example. Slightly long but nearly every sentence carries useful information; the 'Mirror of Meta MCP' and dashboard parity notes are marginal but harmless.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-param read tool with no output schema, the description fully specifies both response shapes, pagination, expansion semantics, and the critical ordering relative to sibling cohort tools. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains connection_id and app_ref as expansion selectors, limit as 1..100 default 50, cursor for paging, and required/optional status. It omits any explanation of the connection_context parameter (the mctx_v1 token), leaving one of five params undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (summarise) and resource (MMP connections and synced apps), and describes the exact row shape (name, platform, source refs, event count, cohort config existence). It clearly distinguishes its summary mode from its expand mode and from sibling cohort tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to call this BEFORE mmp_save_cohort_config or mmp_fetch_cohorts to discover valid connection_id, app_ref, and kpi event names, and warns that invalid kpis silently return zero rows. This is near-ideal when/why guidance with a named failure mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mmp_insights_get_product_event_todayRead today's product attributionARead-onlyInspect
Read today's AppsFlyer count, unique-user, and revenue aggregate for one saved product and event, scoped by the server to channel_pid=tiktokglobal_int. Product and MMP data are shared with the Meta channel; this tool reads the same saved product for the current tenant.
REQUIRED: product_id (the product_ref from products_list), event_name (from products_get_actions). Optional breakdown: country, placement, campaign, adset, or ad. adset is the AppsFlyer source field and maps to TikTok's native ad_group role; it is not a Meta ad set.
EXAMPLE: mmp_insights_get_product_event_today({"product_id": "<product_ref>", "event_name": "purchase"})
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | ||
| breakdown | No | ||
| event_name | Yes | ||
| product_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so safety is covered; the description adds genuinely new context beyond that – server-side scoping to channel_pid=tiktokglobal_int, cross-channel data sharing with Meta, and the semantics of the `adset` field (AppsFlyer source field mapping to TikTok's ad_group role, not a Meta ad set). No pagination or rate-limit behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what is read, then REQUIRED, optional breakdown, a clarifying caveat, and an example – the labelled structure makes it skimmable. Slightly dense and the Meta-sharing sentence is tangential, but no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, no-output-schema tool it adequately describes the returned metrics and required inputs, including a working example. The missing pieces are the undocumented cursor (implying pagination that is never described) and connection_context, which leaves a small gap in an otherwise complete definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden; it meaningfully explains product_id, event_name, and the five breakdown options, and clarifies the adset mapping. However cursor and connection_context are never mentioned, leaving two of five parameters undocumented anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (AppsFlyer count, unique-user, revenue aggregate for one saved product and event) with explicit scope ('today', server-scoped to channel_pid=tiktokglobal_int). It does not name the nearest sibling mmp_insights_query_product_event_summary, so an agent must infer the today-vs-summary distinction from the tool name rather than the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear prerequisites and provenance: product_id comes from products_list (product_ref) and event_name from products_get_actions, with a labelled EXAMPLE invocation. It never states when to prefer this over the sibling summary tool or any exclusion, so guidance is strong on 'how' but silent on 'when not'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mmp_insights_query_product_event_summaryRead product attribution totalsARead-onlyInspect
Read AppsFlyer count, unique-user, and revenue aggregates for one saved product/event over an inclusive range of at most 90 days. The server fixes channel_pid=tiktokglobal_int and delegates to the Meta-owned product/MMP service, preserving its completeness and source-coverage fields. Do not fan out by date or channel.
REQUIRED: product_id (the product_ref from products_list), event_name, date_from, date_to. DATE PARAMS use YYYY-MM-DD. Detail rows are capped at 1000 rows and 256KiB; when truncated=true pass next_cursor back as cursor. Optional breakdown: country, placement, campaign, adset, or ad. adset is an AppsFlyer adapter field for TikTok's native ad_group role.
EXAMPLE: mmp_insights_query_product_event_summary({"product_id": "<product_ref>", "event_name": "purchase", "date_from": "2026-07-01", "date_to": "2026-07-07"})
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | ||
| date_to | Yes | ||
| breakdown | No | ||
| date_from | Yes | ||
| event_name | Yes | ||
| product_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true/destructiveHint=false, so safety is covered; the description adds real behavioral context beyond that: the server pins channel_pid=tiktokglobal_int, delegates to the Meta-owned MMP service, preserves completeness and source-coverage fields, and caps detail rows at 1000 rows/256KiB with truncation surfaced via next_cursor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then uses REQUIRED/date-format and EXAMPLE blocks to organize dense content; every sentence carries information the schema does not. It is somewhat packed (delegation, completeness fields, caps, cursor, breakdown nuances in one block), but there is little dead weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent what comes back (completeness and source-coverage fields), how results are bounded (1000 rows/256KiB), and how to continue (pass next_cursor as cursor). Constraints, required inputs, and an example are all present, so nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does so: it enumerates the four required params, fixes the YYYY-MM-DD date format, explains cursor semantics on truncation, and clarifies the breakdown enum (including that 'adset' maps to TikTok's native ad_group role). This is meaning well beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: read AppsFlyer count, unique-user, and revenue aggregates for one saved product/event. It scopes the operation tightly (single product/event, inclusive range ≤90 days) and implicitly distinguishes itself from the sibling mmp_insights_get_product_event_today and the broader insights_query_* family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: an inclusive range capped at 90 days and an explicit 'Do not fan out by date or channel' exclusion. It does not name a competing sibling (e.g. the 'today' variant) or state the condition that selects one over the other, so routing between MMP insights tools is still partly inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mmp_refresh_connectionRefresh attribution metadataADestructiveInspect
Refresh one existing MMP connection by connection_id — re-fetches AppsFlyer app list + event mappings and updates the cached metadata. WRITE — call is IMMEDIATE and synchronous (~5-10s while AppsFlyer responds). Use after the user adds/removes apps or changes Sending Events in AppsFlyer, and only on explicit user request. This legacy proxy has no mutation receipt. Mirror of Meta MCP mmp_refresh_connection.
REQUIRED: connection_id (str — UUID from mmp_get_state connections[*].id).
EXAMPLE: mmp_refresh_connection({"connection_id": ""})
| Name | Required | Description | Default |
|---|---|---|---|
| connection_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, but the description adds real value beyond them: synchronous/immediate execution, the ~5-10s latency while AppsFlyer responds, and the notable 'no mutation receipt' caveat for this legacy proxy. It explains what the update touches (cached metadata), which is useful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then the WRITE/sync warning, then usage, then REQUIRED and EXAMPLE blocks. Efficient and scannable, though the 'Mirror of Meta MCP' line adds little for an agent selecting this tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers action, timing, side effects, prerequisites, required parameter, and an example. The only gap is that it does not state what the caller receives on success beyond noting there is no mutation receipt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry parameter meaning. It documents the required connection_id thoroughly (str, UUID, sourced from mmp_get_state connections[*].id) and provides an example, but the optional connection_context parameter is never mentioned.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (refresh) and resource (one existing MMP connection) and details exactly what is re-fetched (AppsFlyer app list + event mappings) and what is updated (cached metadata). This is distinguishable from the other mmp_* siblings like mmp_delete_connection and mmp_get_state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear triggering context ('Use after the user adds/removes apps or changes Sending Events in AppsFlyer') and an explicit restriction ('only on explicit user request'). It stops short of naming an alternative tool to use instead, so it is strong but not fully complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mmp_save_cohort_configUpdate attribution cohort settingsADestructiveInspect
Save one cohort config for a specific app under one MMP connection. WRITE — call is IMMEDIATE; the new config drives the next scheduled cohort pull. kpis should be picked from the app's Sending Events — call mmp_get_state first and inspect each metadata row's event_mappings / mapped_events for valid event names. Typing a kpi that the AF app doesn't send silently returns zero rows. Call only for an explicit user-requested config change; no mutation receipt is advertised. Mirror of Meta MCP mmp_save_cohort_config.
REQUIRED: connection_id (str — UUID from mmp_get_state), app_ref (str — the AF app reference, e.g. "ai.hailuo.video" for Android, "id6741675037" for iOS). Optional config fields (any subset; unset = leave existing value alone): cohort_type, min_cohort_size, selected_source_refs (list[str]), preferred_timezone, preferred_currency, partial_data, aggregation_type, period_filters (list[int]), groupings (list[str]), kpis (list[str]). EXAMPLE: mmp_save_cohort_config({"connection_id": "", "app_ref": "ai.hailuo.video", "kpis": ["ug_new_user_payment"], "selected_source_refs": ["tiktokglobal_int"]})
| Name | Required | Description | Default |
|---|---|---|---|
| kpis | No | ||
| app_ref | Yes | ||
| groupings | No | ||
| cohort_type | No | ||
| partial_data | No | ||
| connection_id | Yes | ||
| period_filters | No | ||
| min_cohort_size | No | ||
| aggregation_type | No | ||
| connection_context | No | ||
| preferred_currency | No | ||
| preferred_timezone | No | ||
| selected_source_refs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=true), so the bar is lower, and the description still adds real signal: the write is IMMEDIATE and drives the next scheduled cohort pull, unset fields are left alone, a bad kpi silently returns zero rows, and 'no mutation receipt is advertised.' It stops short of describing what existing settings get overwritten or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the WRITE/immediacy warning, then required, then optional, then a concrete example. Sized sensibly for 13 undocumented parameters; only minor redundancy in the user-requested-change / no-receipt sentence pair.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 13-param mutation with no output schema, the definition covers prerequisites, partial-update semantics, a silent-failure trap, and a worked example. Gaps remain on the undocumented connection_context parameter and on what a failed or rejected save looks like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and only partially compensates: it identifies both required params with UUID/format examples and lists the optional fields with types plus the 'unset = leave existing value alone' default semantics. It gives no meaning for cohort_type, aggregation_type, period_filters, or min_cohort_size, and omits connection_context entirely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Save one cohort config for a specific app under one MMP connection.' It is clearly separable from siblings like mmp_get_state (discovery), mmp_fetch_cohorts (read), and mmp_delete_connection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('Call only for an explicit user-requested config change'), prerequisite ordering ('call mmp_get_state first and inspect each metadata row's event_mappings / mapped_events'), and a named alternative for the discovery step. Not left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notifications_listList workspace notificationsCRead-onlyInspect
List bounded tenant-owned TikTok in-app optimization notifications. This capability does not advertise external webhook delivery.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| state | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds that these are in-app only and not webhook-delivered, which is genuinely additive scoping, but it omits anything about pagination, ordering, or result volume for a list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action, with no filler. The second sentence is slightly cryptic but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A three-parameter list tool with no output schema and no annotation detail beyond safety hints needs more: what notifications are returned, how limit/state filter results, and what connection_context does. The description leaves the agent unable to call it precisely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and there are three parameters (limit, state, connection_context), yet the description explains none of them. With no param documentation in either place, the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb ("List") and resource ("notifications") with scope qualifiers ("bounded tenant-owned TikTok in-app optimization"). However, it never distinguishes itself from the sibling notifications_mark_read nor clarifies what a notification actually is here, leaving the purpose adequate but imprecise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no reference to alternatives such as notifications_mark_read. The second sentence only excludes a capability (external webhooks) rather than telling the agent when to choose this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notifications_mark_readMark a notification as readBDestructiveInspect
Mark one owned TikTok in-app notification as read.
| Name | Required | Description | Default |
|---|---|---|---|
| notification_ref | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=false, so the mutation profile is covered structurally. The description adds the useful constraint that only owned notifications and only a single notification can be affected, but says nothing about idempotency, already-read behavior, or required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler and the verb front-loaded. It is efficient, though arguably too terse given that the schema documents none of the parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter, single-purpose mutation with annotations and no output schema, the description is minimally adequate. It omits any parameter explanation and any statement of effect or return, leaving gaps that the 0%-coverage schema does not fill.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and largely fails: it never mentions notification_ref or connection_context, their formats, or the ttnotif_ prefix. 'One ... notification' loosely maps to the single required ref parameter but adds no syntax or meaning beyond the schema's pattern.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Mark ... notification as read') and scopes it to 'one owned TikTok in-app notification', which cleanly separates it from the sibling notifications_list. It never names that sibling, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance and no reference to an alternative such as notifications_list. The only implicit hint is 'one owned', which suggests per-notification, ownership-restricted operation, but this is left for the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
operations_getRead and reconcile an operation receiptADestructiveInspect
Recover tnapi_ native API receipts independently of Agent Method feature gates. Read or safely recover a bounded TikTok write receipt by the canonical operation_ref returned by create or delivery confirmation. The legacy mutation_ref argument remains accepted for older delivery-status clients; pass exactly one reference. Recovery uses TikTok getters on the exact original tenant, advertiser, and authorization route. It never replays a write or name-matches an uncertain result.
Recovery can update the stored operation receipt after provider readback; it never replays the advertising write.
| Name | Required | Description | Default |
|---|---|---|---|
| mutation_ref | No | ||
| operation_ref | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, and the description earns credit by disclosing exactly why: recovery reads back from the provider and can update the stored receipt, but never replays the write. That is meaningful safety context beyond the annotations. It does not cover auth/permission requirements or rate limits on the TikTok getters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The safety-critical constraint is front-loaded, which is good, but the 'never replays a write' guarantee is stated twice and the opening sentence about feature gates is dense jargon. A sentence could be trimmed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no schema description coverage, the description should say more about what a recovered receipt contains and what the connection_context is. It covers the read-vs-replay distinction well but leaves the return shape and one parameter entirely opaque for a state-mutating reconciliation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning, and it does explain operation_ref (canonical) versus mutation_ref (legacy) and the exactly-one rule. However, connection_context is left completely undocumented in both schema and description, and the required parameters list is empty, so the mutual-exclusion contract is only partially conveyed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource: read/recover a bounded TikTok write operation receipt by its canonical operation_ref. It partially differentiates from siblings by referencing the delivery-status clients that still send mutation_ref, though it never names the sibling tools directly. Purpose is clear but loaded with internal jargon ('tnapi_', 'Agent Method feature gates') that adds noise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the trigger condition (use the operation_ref returned by create or delivery confirmation) and the mutual-exclusion rule ('pass exactly one reference'), plus an implicit when-not ('never name-matches an uncertain result'). It stops short of naming a concrete alternative tool to use when no reference exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
optimization_dismiss_decisionDismiss an optimization decisionCDestructiveInspect
Dismiss one open tenant-owned recommendation without mutation.
| Name | Required | Description | Default |
|---|---|---|---|
| decision_ref | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=true, i.e. a write operation with destructive potential. The description asserts the opposite with 'without mutation', which tells an agent the call changes nothing. Beyond that conflict, it discloses nothing about what a dismissal does to the decision's state, whether it is reversible, or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded eight-word sentence with no padding or redundancy. It is efficient, though arguably over-terse for a state-changing tool, so it is not maximally sized for the job.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-read-only tool with no output schema and 0% parameter documentation, the description omits the essentials: what state the decision ends in, whether dismissal is reversible, side effects on the underlying campaign, and how to obtain the required decision_ref. It is not adequate for correct, confident invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across two parameters, so the description carries the full burden. It only loosely implies that decision_ref points at a recommendation; it says nothing about the ttdecision_... identifier format or the mctx_v1_... connection_context token, both of which the agent must infer solely from regex patterns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Dismiss one open tenant-owned recommendation') with built-in scope constraints ('one', 'open', 'tenant-owned') that make the action identifiable. The only slight weakness is terminology drift: the title/name say 'decision' while the body says 'recommendation', and no sibling is named to differentiate it from the optimization_list_decisions / optimization_prepare_action family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The qualifiers 'one open tenant-owned' imply a precondition (only open decisions you own can be dismissed) but it never says where to obtain a valid decision_ref or whether listing tools should be used first. There is no explicit when-not or alternative-tool guidance, 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.
optimization_evaluateSave optimization decisionsADestructiveInspect
Evaluate one owned TikTok advertiser from complete, fresh cached ledger evidence and persist bounded read-only recommendations. This never mutates TikTok. Choose native campaign or ad_group; do not use Meta adset fields. A pause candidate requires an explicit advertiser-currency max_cost_without_conversion. Budget scaling is capped at 30 percent and remains only a recommendation.
Persists decisions and notifications and may update an existing evaluation.
| Name | Required | Description | Default |
|---|---|---|---|
| date_to | Yes | ||
| group_by | Yes | ||
| date_from | Yes | ||
| target_roas | Yes | ||
| advertiser_id | Yes | ||
| min_conversions | No | ||
| connection_context | No | ||
| budget_increase_percent | No | ||
| max_cost_without_conversion | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the write profile is known; the description adds real value by scoping the write ('This never mutates TikTok', it only persists decisions/notifications and may update an existing evaluation) and by bounding behavior ('budget scaling is capped at 30 percent and remains only a recommendation'). What gets overwritten on an 'existing evaluation' is only hinted at, but this is well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb and the strongest constraint ('never mutates TikTok') in the first two sentences, and the trailing paragraph on persistence is short. There is mild redundancy between 'persist bounded read-only recommendations' and 'Persists decisions and notifications', but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with no output schema and 0% schema description coverage, the description covers the behavioral contract well but under-serves the inputs: over half the parameters are unexplained, and there is no mention of what the persisted evaluation or notifications look like to the caller. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains group_by's two valid values, the advertiser-currency semantics and pause-conditionality of max_cost_without_conversion, and the 30% ceiling relevant to budget_increase_percent, but leaves advertiser_id, target_roas, min_conversions, the date range, and connection_context completely undocumented. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Evaluate one owned TikTok advertiser... and persist bounded read-only recommendations') and explicitly distinguishes its scope from the Meta-side siblings ('do not use Meta adset fields'). An agent can tell this apart from optimization_list_decisions, optimization_dismiss_decision, and optimization_prepare_action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies call-level rules ('Choose native campaign or ad_group', a pause candidate requires max_cost_without_conversion) but never states when to use this tool versus the sibling optimization_prepare_action or dismiss/list tools, nor what prerequisite state ('complete, fresh cached ledger evidence') must be satisfied first. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
optimization_list_decisionsList optimization decisionsBRead-onlyInspect
List tenant-owned TikTok optimization recommendations. Decisions contain source snapshot and evidence coverage; they are not proof that any mutation occurred.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| status | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, read-only, closed-world operation, so the safety profile is covered. The description earns credit by adding non-obvious semantics: decisions carry a source snapshot and evidence coverage, and crucially are 'not proof that any mutation occurred' — a meaningful clarification for an agent interpreting results. Pagination, ordering, and default-limit behavior remain undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the subject and scope front-loaded and no filler. Nothing is wasted, though the second sentence is doing heavier lifting than its brevity suggests.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description does explain what a decision record represents, which helps for a list tool. However, with 0% parameter coverage and no mention of result shape, pagination, or how the status filter narrows results, an agent still lacks enough to invoke it reliably.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for three parameters (limit, status, connection_context), none of which are described in the schema. The description mentions neither the limit/default-50 semantics, the open/prepared/dismissed status filter, nor the connection context string, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (tenant-owned TikTok optimization recommendations/decisions), and the scope is clear enough to distinguish it from siblings like optimization_dismiss_decision and optimization_prepare_action. Minor muddle: the name says 'decisions' while the description says 'recommendations', leaving the two terms implicitly equated rather than defined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No statement of when to use this tool versus optimization_evaluate, optimization_prepare_action, or optimization_dismiss_decision, and no prerequisites or exclusions are given. The reading is only inferable from the verb 'List'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
optimization_prepare_actionPrepare an optimization decisionBDestructiveInspect
Prepare the exact management action for one open owned decision. The server performs a fresh native TikTok read on the original advertiser route. Show the sanitized approval and obtain explicit confirmation with the returned delivery_status_confirm or budget_confirm tool. Never auto-confirm or replay uncertainty.
Persists an approval draft and replaces the decision's preparation state.
| Name | Required | Description | Default |
|---|---|---|---|
| decision_ref | Yes | ||
| idempotency_key | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint/openWorldHint annotations, the description discloses the server-side behavior: a fresh native TikTok read on the original advertiser route, persistence of an approval draft, and replacement of the decision's preparation state. This is consistent with destructiveHint=true and adds genuine behavioral 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, front-loaded with the core action and followed by the safety directive and the state-change note. Nearly every sentence carries weight, with only mild redundancy between the approval/confirmation instructions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation the description does well on workflow and state change, and annotations cover the safety profile. But with no output schema and 0% parameter coverage, the tool's inputs remain unexplained, leaving a real gap an agent must fill from the raw schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three parameters, yet the description does not explain decision_ref, idempotency_key, or connection_context. It only alludes to 'one open owned decision,' leaving the idempotency and connection-context semantics entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Prepare the exact management action for one open owned decision,' which is distinct from optimization_list_decisions or optimization_evaluate. It is clear what the tool does, though it never explicitly contrasts itself with the sibling optimization tools that also prepare/confirm actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent forward, instructing it to obtain confirmation via delivery_status_confirm or budget_confirm and never auto-confirm, which is useful workflow context. However, it gives no criteria for choosing this tool over optimization_evaluate or the other *_prepare tools, so the when-to-use guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
overview_get_live_configsRead live TikTok ad configurationARead-onlyInspect
Read allowlisted current TikTok configuration for up to 50 tenant-owned campaigns, native ad groups, or ads in one server-side request. Returns configured and effective status, advertiser-currency budget/bid, objective, optimization, billing, schedule, Smart+, Spark, format, and source coverage when TikTok exposes them. configured includes actual parent IDs, app_id, optimization_event and schedule times; ad configured.creative preserves actual copy, ordered text/CTA variants, video/image references, music, destination/deeplink variants, attribution links and authorized BC. Absent links are unavailable; rejected links are null with omitted_fields. Check null values and readback_omitted_fields/creative.omitted_fields before comparing with an approved draft; complete means entity coverage, not field equality. For a response_budget_exceeded entity, follow its exact-ID next_action with a smaller read; do not retry the same oversized batch or fan out. An ad may include its exact parent campaign_id to retrieve Smart+ fields when generic ad readback omits the ad; hints are bounded to 20 unique campaigns per advertiser. adset is only the common-wire alias for ad_group. This is a live read, not a mutation receipt; uncertain writes must still recover with operations_get on the exact original route.
| Name | Required | Description | Default |
|---|---|---|---|
| entities | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive), yet the description adds substantial behavioral context the schema cannot convey: null-vs-omitted semantics, readback_omitted_fields/creative.omitted_fields, the bounded 20-campaign hint limit, and the response_budget_exceeded recovery path. It also clarifies that 'complete' means entity coverage, not field equality.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core read scope and batch limit are front-loaded in the first sentence, and every subsequent sentence carries non-redundant operational detail. It is a dense single paragraph rather than a structured breakdown, which makes the later caveats slightly harder to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the burden itself and does so: it enumerates the returned field families (status, budget/bid, objective, schedule, Smart+/Spark, creative variants, attribution links). Combined with the null/omission semantics, an agent has everything needed to interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning, and it does for the entities array: max 50 items, entity_type scope, the campaign_id parent hint for Smart+ fields, and the adset/ad_group alias. connection_context is never explained, which is the one gap preventing a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (live allowlisted TikTok configuration) with scope (up to 50 tenant-owned campaigns/ad groups/ads in one server-side request). It also explicitly distinguishes itself from the write-recovery sibling operations_get, so the agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance: use this to compare against an approved draft, and use operations_get to recover uncertain writes. It also prescribes batch behavior on response_budget_exceeded (follow next_action, do not retry or fan out). It never states when this read is the wrong choice versus metric/insight siblings, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
products_get_actionsRead product action availabilityARead-onlyInspect
Return AppsFlyer MMP event candidates for one product. This is metadata discovery, not a product mutation. Returns {events: [{event_name, metrics: [...]}, ...], product_id}. This server exposes the candidates read-only; product-card edits remain outside standard MCP. The backing store is shared, but this is a TikTok tenant-scoped read contract.
REQUIRED: product_id (str — the product_ref returned by products_list; legacy internal ids are still accepted). EXAMPLE: products_get_actions({"product_id": "<product_ref>"})
| Name | Required | Description | Default |
|---|---|---|---|
| product_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint/destructiveHint/openWorldHint; the description adds genuine context beyond them—return shape, shared backing store, tenant scoping, and that edits live outside MCP. That extra context earns above the annotation-adjusted baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence, then return shape and caveats, then REQUIRED and EXAMPLE. Slightly dense with tenant/backing-store asides but each sentence carries usable signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, yet the description supplies the return shape; required param and example are present. The undocumented connection_context parameter is the main remaining gap for an otherwise complete read tool definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (only required product_id typed, connection_context undocumented), so the description must compensate. It documents product_id origin (product_ref from products_list), legacy id acceptance, and a call example; connection_context remains undocumented, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: returns AppsFlyer MMP event candidates for one product, and explicitly labels it metadata discovery rather than mutation. Distinguishes from product mutations, though not sharply from sibling products_list / products_get_top_campaigns beyond the 'event candidates' framing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies discovery usage and clarifies it is read-only, but does not say when to choose this over products_list or mmp_insights_get_product_event_today, nor when not to use it. Usage is inferable but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
products_get_top_campaignsRead top product campaignsARead-onlyInspect
Top-N TikTok campaigns by spend for a single TikTok-owned product card. Reads tiktok_insights_daily filtered by the card's matching_rules — a product-card rollup, NOT a live campaign inventory.
For campaign names, cached status, and spend, use insights_query_overview or insights_query_consistent with ad_account_id, date_from/date_to, and group_by=campaign. Native overview returns status/secondary_status; compact reads return configured_status/effective_status. These report only the returned cached entities, not exhaustive current inventory. An empty report does not prove all campaigns paused or no ads created. Use overview_get_live_configs for current configuration of known IDs; that bounded read does not discover other campaigns.
REQUIRED: product_id (str — the product_ref returned by this server's read-only products_list; legacy internal ids are still accepted). EXAMPLE: products_get_top_campaigns({"product_id": "<product_ref-from-products_list>", "limit": 10})
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| product_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal readOnly/openWorld=false/destructive=false, but the description adds critical traits beyond them: results reflect only returned cached entities, an empty report does not prove campaigns were paused or never created, and the 'bounded read does not discover other campaigns.' These caveats materially change how an agent should interpret and trust the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then routing, then required-param detail and an example. Every sentence carries routing or semantics value, though the middle block is dense and slightly repetitive about status-field naming (status/secondary_status vs configured_status/effective_status).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains return semantics (cached entities only, which status fields appear per read type) and gives the required parameter plus a realistic invocation. For a read-only rollup with sibling-heavy surface area, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage the description must carry the load, and it documents product_id substantively (the product_ref from products_list, legacy internal ids still accepted) plus a concrete call example showing limit. connection_context is never mentioned, so it is not fully complete, but the key required parameter is well explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb+resource+scope: 'Top-N TikTok campaigns by spend for a single TikTok-owned product card,' and immediately disambiguates the underlying data ('product-card rollup, NOT a live campaign inventory'). An agent can distinguish this from the many insights_* siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to alternatives with the conditions that select them: 'For campaign names, cached status, and spend, use insights_query_overview or insights_query_consistent' with the exact argument set, and 'Use overview_get_live_configs for current configuration of known IDs.' It also states what the tool is NOT for (live inventory, discovery), which is exactly when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
products_listList tenant productsARead-onlyInspect
List TikTok-owned product cards for the current user. Product card identity is shared with the Meta channel: the same card appears with the same identity in both.
REQUIRED: none. Optional: limit (1..50, default 20), cursor (next_cursor from the previous page; keep limit/expand identical), expand (list of matching_rules, mmp_matches — heavy fields omitted by default). Only TikTok-owned cards are returned; each carries product_ref (use it in the other product tools) and never the internal id. EXAMPLE: products_list({"limit": 20})
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| expand | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/non-destructive/local-only, and the description adds genuinely useful behavior: only TikTok-owned cards are returned, identity is shared with the Meta channel, product_ref (not internal id) is exposed, and heavy expand fields are omitted by default. It stops short of describing ordering or empty-result behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then REQUIRED/Optional params, then a return-shape note, then a concrete example call. Dense but every line earns its place with no redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param read tool with no output schema, the description supplies the essential return semantics (product_ref vs internal id, TikTok-only scope) and pagination contract. The unexplained connection_context pattern and absent output schema are the only minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage the description carries the load and does so well: it documents limit's 1..50 range and default 20, explains cursor must come from the prior next_cursor with limit/expand held constant, and lists valid expand values with their cost. Only connection_context is left undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List TikTok-owned product cards for the current user') and clarifies the cross-channel identity model. This clearly separates it from siblings like products_get_actions and products_get_top_campaigns, which operate on derived data rather than the card list itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (paginate, then reuse product_ref in other product tools) and it hints downstream usage, but it never names an alternative or states when NOT to use this tool. No explicit routing versus the other product_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setup_begin_channel_connectBegin channel browser connectionAInspect
Tri-channel alias for TikTok connect. Arg channel must be 'tiktok'. Returns authorize_url, connect_id (session id), and expires guidance. Delegates to tiktok_begin_auth_onboarding. Do NOT poll automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, openWorldHint=true, destructiveHint=false). The description adds genuinely new context the annotations don't: it enumerates the returned fields (authorize_url, connect_id, expires) and warns against auto-polling, hinting at a session/expiry lifecycle. It still doesn't state auth prerequisites or what expiration actually means in practice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences that each carry information — action, constraint, return contract, and caution. The only waste is the vague 'Tri-channel alias' opener and 'expires guidance', which is imprecise phrasing for a return value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 0% schema coverage, the description must compensate, and it does name the return fields and delegation target. But it omits the purpose/format of connection_context and gives no indication of when the session must be consumed before it expires, leaving an agent unable to call this fully informed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the burden. It usefully supplies the missing constraint that 'channel' must be 'tiktok' (the schema has no enum or description), which is real added value. However, connection_context is never mentioned, despite its strict mctx_v1_ pattern, so half the parameters remain opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (begin a browser channel connection) and resource, and names the delegate tool tiktok_begin_auth_onboarding, which helps distinguish it from siblings. The 'Tri-channel alias for TikTok connect' framing is confusing, since the next sentence says channel must be 'tiktok' — it implies a multi-channel capability that doesn't exist.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives one hard constraint ('channel' must be 'tiktok') and one behavioral instruction ('Do NOT poll automatically'), which implies polling belongs elsewhere. It never names setup_check_channel_connect or explains when to prefer this over calling tiktok_begin_auth_onboarding directly, so the routing decision is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setup_check_channel_connectCheck channel connection progressARead-onlyInspect
Check TikTok authorization AFTER the user confirms they finished. Args: channel='tiktok' and connect_id from setup_begin_channel_connect. Reads that exact tenant-owned session even if a newer session exists; never substitute the latest session or poll before user confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | ||
| connect_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, non-destructive, closed-world profile, so the bar is lower. The description adds genuinely useful behavior beyond that: it reads the exact tenant-owned session even when a newer one exists, and forbids substituting the latest session or polling. It does not describe what the check returns on success vs. pending vs. failure, which is a mild gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and timing constraint, then the arguments, then the session-selection rule. Every sentence earns its place; slightly dense but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so return values need not be explained, and annotations cover the safety profile. The main omission is the undocumented connection_context parameter, which an agent cannot infer at 0% schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the 3-param description carries the burden. It documents channel='tiktok' and the provenance of connect_id, but says nothing about the optional connection_context (which has a strict mctx_v1_ pattern) and gives no format hints for connect_id itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check TikTok authorization') and ties it to the connect flow with a specific gating condition ('AFTER the user confirms they finished'). An agent can distinguish it from setup_begin_channel_connect and setup_get_status without reading either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (after user confirmation), explicit when-not ('never poll before user confirmation'), and names the source of the required connect_id ('from setup_begin_channel_connect'). The routing information is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setup_get_statusRead setup readinessARead-onlyInspect
Read the current TikTok-side setup state for the authenticated user — connection email, advertiser counts, effective auto-pull cadence and capabilities.creation (prepare/confirm grants, input values, native routes). Asset mode=on_demand has no scheduled next refresh.
TOKEN-IDENTITY CHECK: connection.email echoes the auth account this token resolved to. Verify it matches the user you expect; mismatch means the token is bound to the wrong account, NOT that the user switched. This is the TikTok-native setup envelope.
REQUIRED: nothing. EXAMPLE: setup_get_status({})
| Name | Required | Description | Default |
|---|---|---|---|
| connection_context | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| support_ref | No | Opaque request support reference. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld=false/destructive=false, so the safety bar is covered. The description earns credit beyond that by disclosing the on_demand asset-mode behavior (no scheduled next refresh) and the token-identity semantics of connection.email—mismatch means wrong account binding, not a user switch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then headers for the identity check and requirements. Efficient overall, though the all-caps blocks and the restated example add minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be re-explained (the description still helpfully summarizes them), and read-only annotations cover the safety profile. The only real gap is the undocumented connection_context parameter, which is optional.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single parameter connection_context (pattern mctx_v1_...), so the description must carry it—and it does not. It only says "REQUIRED: nothing," which ignores the optional connection_context param without explaining its purpose or format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Read the current TikTok-side setup state") and enumerates what it returns (connection email, advertiser counts, cadence, capabilities.creation). It labels itself "the TikTok-native setup envelope," which loosely separates it from setup_begin/check_channel_connect, but it doesn't explicitly contrast those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (call to read current setup readiness) and the TOKEN-IDENTITY CHECK tells the agent how to interpret the result, but there is no explicit when-to-use vs alternatives guidance. The "REQUIRED: nothing" line plus the example give a minimal invocation cue but no selection criteria among the many setup_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spark_ads_list_postsList authorized Spark postsARead-onlyInspect
List reusable Spark posts already authorized for one exact TikTok advertiser. Each item includes identity_id, identity_type=AUTH_CODE, tiktok_item_id, media_kind, supported_ad_formats, create_eligible=true, bounded authorization status and expiry evidence, and a short-lived spark_receipt binding the exact tenant/advertiser/identity/item/media tuple. Set ad_params.ad_format to one returned supported_ad_formats value. Expired, revoked, unverified, or too-soon-expiring posts are excluded and counted in coverage.ineligible_reasons. Pass eligible fields unchanged to campaigns_quick_create or campaigns_quick_create_batch. This is read-only and does not authorize new codes or publish ads.
REQUIRED: advertiser_id from assets_list_ad_accounts. Optional: limit (1..50), search (up to 200 characters), and the opaque next_cursor returned by the previous page. Continue until has_more=false and coverage.complete=true before treating the listing as exhaustive. Refresh and re-list when a receipt expires; never reuse a receipt across advertisers or OAuth routes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| search | No | ||
| advertiser_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only/non-destructive/non-open-world; the description goes well beyond that by disclosing the receipt lifetime, the cross-tenant/cross-OAuth reuse prohibition, and the exclusion rules with where the filtered-out posts show up (coverage.ineligible_reasons). This is the kind of operational context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and dense with zero filler; the field enumeration earns its place because there is no output schema. It runs long in a single paragraph and mixes purpose, return shape, and validation rules, so structure could be tighter, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema tool it describes the returned item shape, pagination termination condition, and receipt lifecycle well enough to drive correct repeated calls. The remaining gap is the fully undocumented connection_context parameter and the absence of any error/failure behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage the description must carry parameter meaning, and it does for advertiser_id (source: assets_list_ad_accounts), limit (1..50), search (up to 200 chars) and the paging cursor. However it silently omits the connection_context parameter and calls the cursor 'next_cursor' while the schema names it 'cursor', which could cause a minor mismatch.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('List reusable Spark posts already authorized for one exact TikTok advertiser') and scopes the concept tightly enough that no sibling tool overlaps. An agent can tell this apart from the write-side tools it feeds (campaigns_quick_create) without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when/when-not guidance: pull the listing only until has_more=false and coverage.complete=true, feed eligible fields to campaigns_quick_create(_batch), refresh when a receipt expires, and never reuse a receipt across advertisers or OAuth routes. It also states the negative case ('does not authorize new codes or publish ads').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
support_get_report_statusRead support report statusBRead-onlyInspect
Read the customer-safe state of one tenant-owned TikTok support report. It returns no internal issue URL, operator note, stack trace, provider response, or other tenant data.
| Name | Required | Description | Default |
|---|---|---|---|
| report_ref | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered structurally. The description adds genuine behavioral context by disclosing what is deliberately withheld from the payload (internal issue URL, operator notes, stack traces, provider responses), which tells the agent what it will NOT be able to inspect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, both front-loaded and free of filler. The redaction clause earns its place given the absence of an output schema, though the description still leaves the positive return shape unstated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with no output schema, an agent would benefit from knowing the possible state values, not just what is redacted. The privacy guarantee is well covered, but the actual returned content is only described as 'customer-safe state', leaving a noticeable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for two parameters, so the description must carry the burden of explaining them. It implies report_ref selects a single tenant-owned report but gives no syntax or format, and it never mentions the connection_context parameter at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (Read) and resource (the state of one tenant-owned TikTok support report), making the intent unambiguous. It reads clearly against a catalog of many unrelated siblings, though it never names the natural counterpart support_report_error to sharpen the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this tool versus support_report_error or any other status reader. Usage is only implicit from 'read the state of one report'; no prerequisites, no exclusions, and no routing guidance are offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
support_report_errorSubmit a support reportADestructiveInspect
Manually submit one tenant-scoped TikTok support_ref with bounded classification fields after explicit user approval. When the user disputes data or numbers, use the most recent relevant successful result support_ref. Read setup_get_status.support_reporting first. This tool never collects prompts, request bodies, tokens, advertiser IDs, provider responses, or free-form descriptions, and never retries or replays an ad operation.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | ||
| locale | No | ||
| task_stage | Yes | ||
| support_ref | Yes | ||
| user_impact | Yes | ||
| idempotency_key | Yes | ||
| submission_mode | Yes | ||
| observation_code | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, destructive, non-open-world write, so the bar is lower, and the description adds real value: it requires explicit user approval, mandates a prerequisite status check, and enumerates data classes never collected (prompts, tokens, advertiser IDs, provider responses). It does not explain why destructiveHint is set or how idempotency affects repeat submissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then eligibility, then constraints; every sentence adds information. Slightly dense but no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, 7-required write tool with no output schema, the description covers purpose, gating, and privacy boundaries but omits how to obtain valid values for the enum fields, how idempotency_key should be formed, and what a caller gets back on success. It is minimally adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, yet it explains none of the nine parameters (task_stage, user_impact, observation_code, client, locale, idempotency_key, connection_context). 'Bounded classification fields' gestures at the enums but supplies no meaning or accepted values, and the 'never collects' list constrains content without defining any field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Manually submit one tenant-scoped TikTok support_ref') plus the scope constraint ('bounded classification fields'). This is clearly distinguishable from the read-side sibling support_get_report_status, which the name and verb contrast with explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger ('When the user disputes data or numbers, use the most recent relevant successful result support_ref'), a prerequisite ('Read setup_get_status.support_reporting first'), and a gate ('after explicit user approval'). It stops short of naming alternatives or stating explicit when-not conditions beyond the 'never retries or replays' clause.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_cancelCancel a pending taskADestructiveInspect
Cancel one pending task owned by the current user. WRITE — call is IMMEDIATE. Only tasks in pending state can be cancelled (already-running tasks must complete on their own). Tenant-isolated. Mirror of Meta MCP tasks_cancel.
REQUIRED: task_id (str — UUID). EXAMPLE: tasks_cancel({"task_id": ""})
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is known. The description adds non-obvious context the annotations don't: the pending-only state constraint, immediate execution, and tenant isolation. It stops short of describing what a cancelled task's downstream effect is (e.g., whether resources are released or errors occur).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then behavior, then the required-parameter/example block. Nearly every sentence earns its place; the one marginal element is 'Mirror of Meta MCP tasks_cancel', an internal-implementation note with little selection value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with a destructive annotation and no output schema, the definition covers state preconditions, immediacy, isolation, and the required argument with an example. The only missing piece is documentation of the connection_context parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden. It documents task_id as a required UUID string and supplies an example call, but says nothing about the second parameter (connection_context) or its mctx_v1_ pattern. It compensates for the most important parameter but leaves a gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Cancel one pending task') and scopes ownership ('owned by the current user'). This clearly distinguishes it from sibling read tools like tasks_list, tasks_get_status, and tasks_latest without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a real when-not rule: 'Only tasks in `pending` state can be cancelled (already-running tasks must complete on their own).' It also flags immediacy ('call is IMMEDIATE'), which governs how an agent should sequence the call. It does not name an alternative tool for non-pending tasks, but no sibling appears to serve that case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_get_create_detailRead ad creation detailARead-onlyInspect
Return a sanitized TikTok creation snapshot for one create task. The creation_snapshot is from the task's original payload/result; set include_live=true to also fetch current TikTok campaign/adgroup/ad config via /campaign/get, /adgroup/get, /ad/get. Agents should compare the snapshots themselves and use live_snapshot to detect later manual TikTok Ads Manager edits.
REQUIRED: task_id. Optional: include_live (bool, default false). EXAMPLE: tasks_get_create_detail({"task_id": "", "include_live": true})
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ||
| include_live | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive/closed-world, and the description adds real behavioral context: the snapshot is sanitized and taken from the task's original payload/result, while include_live triggers additional reads against /campaign/get, /adgroup/get and /ad/get. It also warns that comparison is the agent's responsibility. It could still note auth or failure behavior, but this is well beyond the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then return semantics, then required/optional params, then an example call. Dense and mostly waste-free, though the EXAMPLE line largely restates information already implied by the schema and REQUIRED/Optional line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description usefully characterizes the returned creation_snapshot and live_snapshot and the intended comparison workflow. Missing details are minor: connection_context is untouched and no mention of error or empty-result behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the load and does so for the two meaningful parameters: task_id is marked REQUIRED and include_live is described as optional with default false and with the concrete downstream effect of fetching live config. connection_context is left unexplained, which is the only real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Return a sanitized TikTok creation snapshot for one create task') and explains what the snapshot contains and its origin. It implicitly distinguishes itself from read-only siblings like tasks_get_status or overview_get_live_configs, but never names an alternative tool outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly tells the agent when to set include_live=true (to also fetch current TikTok config and detect later manual Ads Manager edits) and assigns the comparison work to the agent. No explicit when-not or named alternative among the many sibling task tools, 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.
tasks_get_statusRead task progressARead-onlyInspect
Poll an Agent Method task by opaque task_ref using the bounded common response, or inspect an existing tnapi_ report task_ref from a first-party native workflow on its original connection/token. A completed report task returns the native download next_action. Legacy task_id input remains accepted but returns the same bounded status-only envelope, never raw result or logs. At terminal=true, consume result and source_anchor directly; never resubmit the original page-one Agent Method query merely to recover that task. A later user request to check again starts a new cached page-one query without old cursors/anchors; it does not request a provider refresh.
REQUIRED: exactly one of task_ref (opaque ref from insights_query_consistent) or task_id (legacy UUID). Optional: response_mode=compact for task_ref. EXAMPLE: tasks_get_status({"task_ref": ""})
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | No | ||
| task_ref | No | ||
| response_mode | No | compact | |
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover readOnly/destructive/openWorld, but the description adds substantive behavior beyond them: responses are bounded and 'never raw result or logs', legacy task_id returns a status-only envelope, and a completed report task returns a native download next_action. That is genuine disclosure not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary action, and the terminal-consumption rule is useful, but several sentences are dense with private vocabulary and slightly repetitive around resubmission/refresh semantics. It is longer than it needs to be for three parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 0% schema coverage, the description carries full burden; it does well on response shape (status-only, next_action at terminal) but leaves connection_context unexplained and does not enumerate the bounded envelope's fields, so an agent still has gaps for a 4-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 4 params, so the description must carry the load. It documents task_ref (opaque ref), task_id (legacy UUID), and response_mode=compact, but connection_context is only obliquely gestured at ('on its original connection/token') and its format/purpose is never explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('Poll an Agent Method task by opaque task_ref', 'inspect an existing tnapi_ report task_ref') and names the bounded status-only envelope. It is distinguishable from tasks_list/tasks_latest in that it targets a single task by ref, though the heavy private jargon ('bounded common response', 'tnapi_ report task_ref') forces the agent to parse rather than instantly recognize the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real when-to-use guidance: poll by task_ref from insights_query_consistent, do not resubmit the original page-one query at terminal=true, and a later 'check again' starts a new cached query rather than a provider refresh. It does not explicitly contrast against the closest siblings (tasks_list, tasks_latest, tasks_get_create_detail), which is the one missing piece.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_latestRead the latest taskARead-onlyInspect
Return the latest completed-or-partial task for one task_type. Returns has_task=false when nothing is found. Mirror of Meta MCP tasks_latest.
REQUIRED: task_type (str — one of: pull_tiktok_insights, sync_tiktok_binding, sync_tiktok_pixels, sync_tiktok_audiences, sync_tiktok_identities, sync_tiktok_shops, sync_tiktok_tt_accounts, sync_tiktok_apps, sync_tiktok_cta_portfolios, create_tiktok_ad, handle_create_tiktok_ad, create_ad, refresh_assets). EXAMPLE: tasks_latest({"task_type": "pull_tiktok_insights"})
| Name | Required | Description | Default |
|---|---|---|---|
| task_type | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered externally. The description does add genuine behavior beyond that by disclosing the has_task=false sentinel and the 'completed-or-partial' state semantics, but it says nothing about ordering guarantees, task object contents, or staleness of the returned record.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb and return semantics, followed by the required-parameter block and example. The 14-value enum list is long but earns its place given 0% schema coverage; there is no filler prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the useful work of naming the has_task=false case, but it does not describe the shape of the returned task (status, timestamps, task id) or explain the second parameter. Adequate for invocation, incomplete for interpreting the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden — and it does document the required task_type thoroughly, including all 14 allowed values and a worked example the bare schema lacks. It leaves connection_context (the mctx_v1_ pattern param) entirely unexplained, which is the one remaining gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Return), resource (the latest completed-or-partial task), and scope (for one task_type), which distinguishes it from tasks_list and tasks_get_status. It does not explicitly name those siblings, but the 'latest' + 'one task_type' framing is specific enough for an agent to select it correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The example call shows the intended invocation and the enum list constrains valid task_type values, but there is no explicit statement of when to use this over tasks_list, tasks_get_status, or tasks_get_create_detail. The 'Mirror of Meta MCP tasks_latest' note is cross-referential rather than actionable guidance, so usage is implied rather than declared.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_listList tenant tasksARead-onlyInspect
List recent async task summaries for the current user. Returns bounded items, count, complete, meta.has_more and next_cursor ordered most-recent-first. Continue cursors serially with identical status/days/limit until complete=true before claiming absence. snapshot_at fences new tasks; task status can still change.
REQUIRED: none. Optional: status (comma-separated subset of pending,running,completed,partial_completed,failed,cancelled), days (1..365, default 7), limit (1..50, default 20), cursor (opaque, bound to tenant/tool/filters). Use returned task_ref with tasks_get_status, or legacy id as task_id.
EXAMPLE: tasks_list({"status": "running,pending", "days": 3})
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| limit | No | ||
| cursor | No | ||
| status | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial non-obvious behavior: bounded result sets, most-recent-first ordering, cursor serialization requirements, snapshot fencing semantics, and the caveat that task status can change mid-listing. This is exactly the context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then structured REQUIRED/optional params and a concrete EXAMPLE call. Dense but every sentence (ordering, cursor discipline, snapshot caveat) earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly enumerates the return shape (bounded items, count, complete, meta.has_more, next_cursor) and explains how to advance pagination. All parameters, return fields, and the follow-up tool handoff are covered, so an agent can call and consume this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and largely succeeds: it enumerates the status enum values, gives ranges and defaults for days (1..365, 7) and limit (1..50, 20), and explains that cursor is opaque and bound to tenant/tool/filters. Only connection_context is left undocumented, which is a minor gap for an internal auth-context field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List recent async task summaries for the current user') with scope qualifiers ('recent', 'current user'). It also routes to a sibling (tasks_get_status) for follow-up. It does not explicitly distinguish itself from tasks_latest or tasks_list_create_history, which is the only gap keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong operational guidance: continue cursors serially with unchanged filters until complete=true 'before claiming absence', and notes snapshot_at fences new tasks while status can still change. It lacks an explicit statement of when to choose this over sibling list tools like tasks_latest or tasks_list_create_history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_list_create_historyList ad creation historyARead-onlyInspect
List recent TikTok create task history for the current user. Use this before comparing two launches such as '16号 cardyes 和昨天 targeting 有什么不同'. Returns public task summaries plus creation_snapshot_summary; it does NOT call TikTok live APIs.
REQUIRED: none. Optional: status (terminal status filter), days (1..365, default 30), search (campaign/adgroup/ad/id substring), limit (1..50, default 20). EXAMPLE: tasks_list_create_history({"search": "cardyes", "days": 14, "limit": 5})
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| limit | No | ||
| search | No | ||
| status | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is free. The description adds real behavioral value on top: it returns 'public task summaries plus creation_snapshot_summary' and explicitly does not hit the live TikTok API, implying snapshot/cached data with possible staleness. Pagination behavior is the one notable omission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose, then the when-to-use rationale, then a compact REQUIRED/optional parameter summary, then a callable example — zero filler sentences and nothing redundant, since the schema documents none of the parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does sketch the return shape (task summaries + creation_snapshot_summary), which is the key completeness risk for a list tool. It leaves pagination/ordering semantics unstated, but for a non-destructive, no-required-param read tool this is close to sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does: it defines status as a terminal-status filter, days as 1..365 default 30, search as a campaign/adgroup/ad/id substring, and limit as 1..50 default 20. Only connection_context is left unexplained (a patterned context token, likely injected), which keeps this at 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource: 'List recent TikTok create task history for the current user.' The 'create task history' scope cleanly separates it from tasks_get_status or tasks_cancel, though it never explicitly contrasts with near-neighbors like tasks_list, tasks_latest, or tasks_get_create_detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger scenario ('Use this before comparing two launches such as ...') and rules out one misreading ('it does NOT call TikTok live APIs'). It stops short of naming an alternative tool or stating when NOT to call it, so an agent still has to infer the boundary against tasks_list / tasks_get_create_detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
templates_createSave a new templateAInspect
Create a new saved template for the authenticated user. Mirrors Meta templates_create. adset_params is accepted as the Meta wire alias for adgroup_params (TikTok native); pass either — adset is the MCP wire name for what TikTok calls adgroup. Same shape on both products. Image templates may store ad_params.music_info={music_id:} with one nonempty ID of at most 256 characters. Select it with assets_list_music for the intended advertiser; omit music_info to select music during create preparation. Store media selections on the create request, not in the template.
REQUIRED: name (str, <= 200 chars). OPTIONAL: tags (list[str]), campaign_params (dict), adset_params / adgroup_params (dict), ad_params (dict), source_advertiser_id (str), source_adset_id / source_adgroup_id (str), source_receipt (str; required for reverse-engineered source fields), source_campaign_name (str), source_adset_name / source_adgroup_name (str), campaign_naming (str), adset_naming / adgroup_naming (str). EXAMPLE: templates_create({"name": "WebConv VN", "tags": ["vn", "prospecting"], "campaign_params": {"objective_type": "WEB_CONVERSIONS"}, "adset_params": {"bid_type": "BID_TYPE_NO_BID"}})
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| tags | No | ||
| ad_params | No | ||
| adset_naming | No | ||
| adset_params | No | ||
| adgroup_naming | No | ||
| adgroup_params | No | ||
| source_receipt | No | ||
| campaign_naming | No | ||
| campaign_params | No | ||
| source_adset_id | No | ||
| source_adgroup_id | No | ||
| source_adset_name | No | ||
| connection_context | No | ||
| source_adgroup_name | No | ||
| source_advertiser_id | No | ||
| source_campaign_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this is a non-destructive write (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the description's job is to add context. It does: it explains the adset_params/adgroup_params wire alias, the music_info music_id format constraint (one nonempty ID, <=256 chars), and that source_receipt is required when reverse-engineered source fields are supplied. Auth scope is only loosely hinted at with 'authenticated user'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: the core action leads, followed by alias handling, then REQUIRED/OPTIONAL parameter blocks and an EXAMPLE. The REQUIRED/OPTIONAL/EXAMPLE scaffolding is scannable. The music_info paragraph is somewhat niche and dense, but it is relevant rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter mutation tool with no output schema and 0% schema coverage, the definition gives the agent the essentials: required vs optional split, the alias mapping, key constraints, and a worked example. What remains thin is the internal shape of the various *_params dicts, though the example partially demonstrates them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 17 parameters, so the description must carry the load. It adds real value by documenting the name length limit (<=200 chars), the adset/adgroup alias equivalence, and the source_receipt requirement, and the example shows concrete campaign_params/adset_params keys. But most dict and source_* parameters are listed by name only with no format or content guidance, so the compensation is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Create a new saved template for the authenticated user.' The word 'create' cleanly separates it from siblings like templates_update, templates_delete, templates_get and templates_list without needing to name them. It is clear but does not explicitly route away from templates_reverse_engineer, which also produces templates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides targeted guidance for one case — selecting music via assets_list_music and omitting music_info to defer selection to create preparation — and clarifies that media selections belong on the create request, not the template. However, it never states the general when-to-use vs templates_reverse_engineer or templates_update, leaving the primary routing decision implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
templates_deleteDelete a saved templateADestructiveInspect
Hard-delete an existing saved template owned by the authenticated user. Mirrors Meta templates_delete. Destructive — confirm with the user before calling.
REQUIRED: template_id (str). EXAMPLE: templates_delete({"template_id": ""})
| Name | Required | Description | Default |
|---|---|---|---|
| template_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the bar is lower. The description adds real value beyond them: it clarifies 'hard-delete' (irreversible, no soft-delete/recovery), scopes the operation to templates owned by the authenticated user, and notes it mirrors the Meta API endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, follows with the destructive warning, then required params and a concrete call example. No filler sentences; every line carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output-schema tool, the description covers irreversibility, ownership scoping, and user-confirmation. The only gap is the undocumented connection_context parameter, which is minor given it appears to be standard transport context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 2 parameters, so the description must compensate. It documents template_id as required with a type and a worked example, but says nothing about connection_context, leaving one parameter entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('hard-delete') and resource ('saved template') with an ownership scope, and distinguishes itself from the other templates_* siblings (create/get/list/update) without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs the agent to confirm with the user before calling, which is the key usage constraint for a destructive tool. It doesn't name alternatives (no other delete tool exists), so there is little else to route between, but it stops short of stating prerequisites such as ownership checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
templates_getRead a saved templateARead-onlyInspect
Get one saved template owned by the authenticated user by exact template_name (preferred, Meta-portable) or template_id. Mirrors Meta templates_get. A missing exact selector returns complete=true, found=false, status=not_found as a normal read — it does not authorize a write. Returns Meta-wire (adset_params) and TikTok-native (adgroup_params) keys plus effective_creation_defaults (CBO/ABO budget_level, is_smart_plus, identity, copy/CTA, ad_format and music_info). Create preparation preserves the template's explicit music choice and verifies that exact track for the target advertiser before approval. An unavailable track requires a new explicit choice, not silent replacement.
REQUIRED: template_id OR template_name. EXAMPLE: templates_get({"template_name": "iOS14 AEO"}) EXAMPLE: templates_get({"template_id": ""})
| Name | Required | Description | Default |
|---|---|---|---|
| template_id | No | ||
| template_name | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), and the description adds genuine context beyond them: the not-found contract ('complete=true, found=false, status=not_found as a normal read — it does not authorize a write') and the returned key families. It loses a point because the create-preparation/music-verification paragraph describes downstream behavior that isn't this tool's own contract. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The required-selector rule and examples are front-loaded and efficient, but the definition sprawls into return-key enumeration and create-preparation/music-verification detail that belongs to sibling flows. Those sentences inflate length without helping the agent select or invoke this read tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully names the returned structures (adset_params, adgroup_params, effective_creation_defaults), and the not-found semantics close the main gap for a read tool. The undocumented connection_context and the tangential music-approval paragraph keep it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter burden and it partly does — it explains that template_name is preferred and exact, and that either selector satisfies the requirement. However, connection_context (an mctx_v1_ pattern param) is never explained, and format expectations for template_name casing/matching are left implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Get one saved template owned by the authenticated user' — and the exact single-record scope immediately distinguishes it from templates_list, templates_create, and templates_update. It even names the upstream analog it mirrors ('Mirrors Meta templates_get'), so the agent knows the semantics without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The selector guidance is explicit: 'by exact template_name (preferred, Meta-portable) or template_id', with two concrete call examples. It gives clear context for how to invoke, but never states when to reach for this tool versus templates_list or when a template lookup should happen before a create — no explicit alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
templates_listList saved templatesARead-onlyInspect
List saved ad templates for the authenticated user as a bounded summary page (id, name, tags, objective, optimization goal, CBO/ABO, Smart+, ad format, source advertiser, timestamps). Use templates_get for one template's params, naming and defaults. Mirrors the Meta sister product's templates_list so the same agent code works on either MCP server.
REQUIRED: none. Optional: limit (1..50; default 50, or 5 with detail=full), cursor (next_cursor from the previous page; keep detail/limit identical), detail (summary | full — full returns the complete rows, keep limit small). EXAMPLE: templates_list({})
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| detail | No | summary | |
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/non-destructive, but the description adds real value: bounded summary page vs full rows, the detail=full limit-shrinking behavior, and pagination contract ('keep detail/limit identical'). It does not state rate limits or ordering of results, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then REQUIRED/optional breakdown, then an EXAMPLE. Dense but every clause earns its place. The 'mirrors the Meta sister product templates_list' sentence is slightly tangential but justified as cross-server portability guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema and 0% schema coverage, the description supplies parameter meaning, pagination contract, and the sibling handoff. It omits what 'next_cursor' absence means (null = last page) and result ordering, but overall is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning — and it does: limit range (1..50, defaults 50/5-with-full), cursor sourced from next_cursor with identical detail/limit on continuation, and detail enum semantics distinguished (summary vs complete rows). This is exactly the compensation required by the low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (saved ad templates) plus scope (authenticated user), and enumerates the summary fields returned. It also explicitly distinguishes itself from the sibling templates_get, which handles the per-template params.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use templates_get for one template's params, naming and defaults.' It also documents pagination discipline (keep detail/limit identical to the cursor's page) and the limit default caveat for detail=full. Clear when-to-use and how-to-chain.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
templates_reverse_engineerPreview a template from an ad groupARead-onlyInspect
Reverse-engineer a template preview from one live TikTok adgroup. Fans out /campaign/get/ + /adgroup/get/ + /ad/get/ and returns an unsaved preview plus a signed source_receipt. Review the preview, then pass its extracted fields and source_receipt unchanged to templates_create before expiry. Mirrors Meta templates_reverse_engineer (Meta adset_id == TikTok adgroup_id — adset is the MCP wire name for what TikTok calls adgroup; either spelling is accepted). Image music is retained only when every actual image variant uses one unambiguous track. Video cover images and Spark post previews do not supply reusable image music. Conflicting or missing source tracks are omitted for target-specific selection.
REQUIRED: advertiser_id (str — TikTok advertiser_id this user owns), adgroup_id OR adset_id (str — TikTok adgroup_id; both names work). EXAMPLE: templates_reverse_engineer({"advertiser_id": "7390000000000000000", "adset_id": "1820000000000000000"})
| Name | Required | Description | Default |
|---|---|---|---|
| adset_id | No | ||
| adgroup_id | No | ||
| advertiser_id | Yes | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description still adds substantial behavior beyond that: the three fan-out endpoints, the fact the preview is unsaved, the signed source_receipt and its expiry, and the nuanced image-music retention/omission rules. A 4 rather than 5 because expiry timing is not quantified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and the create-handoff, then packs required params and an example. The image-music retention detail is verbose but relevant to correctness. Dense yet well-ordered; not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe returns — it does (unsaved preview plus signed source_receipt), and it covers the critical handoff constraint and naming aliases. Nothing an agent needs to call and chain this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load. It documents advertiser_id and the adgroup_id/adset_id alias with types and the Meta-vs-TikTok naming rationale, adding real meaning. It leaves connection_context undocumented, which is a gap for a fully compensating description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('reverse-engineer a template preview from one live TikTok adgroup') and explains the mechanism (fans out /campaign/get/, /adgroup/get/, /ad/get/). It clearly distinguishes itself from templates_create by positioning itself as the preceding preview step, so an agent can route correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit workflow: review the preview, then pass its extracted fields and source_receipt unchanged to templates_create before expiry. This is a concrete when-to-use and next-step instruction, not just implied context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
templates_updateUpdate a saved templateADestructiveInspect
Update an existing saved template owned by the authenticated user. Mirrors Meta templates_update. Only the fields you pass get patched; provenance / source_* fields are immutable after save (re-run templates_reverse_engineer to refresh those). adset_params is the Meta wire alias for adgroup_params — pass either. ad_params may retain a validated music_info={music_id:} image setting; the create route preserves and checks this exact track for its target advertiser.
REQUIRED: template_id (str). OPTIONAL: name, tags, campaign_params, adset_params / adgroup_params, ad_params, campaign_naming, adset_naming / adgroup_naming. EXAMPLE: templates_update({"template_id": "", "tags": ["vn", "retargeting"]})
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| tags | No | ||
| ad_params | No | ||
| template_id | Yes | ||
| adset_naming | No | ||
| adset_params | No | ||
| adgroup_naming | No | ||
| adgroup_params | No | ||
| campaign_naming | No | ||
| campaign_params | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, and the description usefully adds that provenance/source_* fields are immutable after save and must be refreshed via reverse_engineer, plus the music_info validation behavior. These add real context beyond the annotations, though it doesn't cover auth requirements or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then structured REQUIRED/OPTIONAL/EXAMPLE sections. The music_info sentence is dense but earns its place; minor verbosity in the Meta mirroring reference.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation tool with 0% schema coverage and no output schema, the description covers the most surprising fields (aliases, immutability, music_info) but leaves several parameters (campaign_params, naming fields, connection_context) and the response behavior unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description compensates by explaining the adset_params/adgroup_params alias relationship, the immutability of source_* fields, and the music_info={music_id:...} setting on ad_params. It omits details on naming fields and connection_context, which the schema doesn't describe either.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update) and resource (existing saved template), scoped to the authenticated user's templates, and names the Meta endpoint it mirrors. Clearly distinguishable from templates_create, templates_delete, and templates_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the patch semantics (only passed fields updated) and names an alternative workflow for provenance fields (re-run templates_reverse_engineer). However, it doesn't explicitly say when to use this vs templates_create or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tiktok_get_assets_statusRead TikTok asset statusARead-onlyInspect
Read cached TikTok authorization asset status for the authenticated tenant, optionally scoped to one connection_id.
REQUIRED: none. Optional: connection_id (str — UUID of one tiktok_auths row). EXAMPLE: tiktok_get_assets_status({})
| Name | Required | Description | Default |
|---|---|---|---|
| connection_id | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds a genuine behavioral trait beyond them — that the status is read from a cache rather than fetched live — which tells the agent results may be stale and that refresh is a separate tool. It still omits rate limits, auth prerequisites, and what the status represents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then a compact REQUIRED/Optional block and a concrete zero-argument example call. 'REQUIRED: none' is mildly redundant with the schema, but every other line earns its place and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless-required read tool with no output schema, the description is adequate on inputs but says nothing about what 'asset status' returns or how to interpret it, which the agent must guess. It also does not mention authtoken/tenant prerequisites despite referencing 'the authenticated tenant'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden, and it documents only one of the two parameters ('connection_id — UUID of one tiktok_auths row'). The second parameter, connection_context (pattern ^mctx_v1_[0-9a-f]{64}$), is left entirely unexplained, presumably because it is injected by the harness, but the agent gets no confirmation of that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Read cached TikTok authorization asset status' — with an explicit scope ('for the authenticated tenant'). The word 'cached' separates it from the sibling tiktok_refresh_assets, but no sibling is named outright, so an agent must infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'cached' hints that this is the cheap, non-refreshing read and 'optionally scoped to one connection_id' hints at the filtered vs unfiltered case. There is no explicit when-to-use/when-to-prefer-tiktok_refresh_assets statement or mention of prerequisites such as an existing tiktok_auths row.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tiktok_get_cached_insight_overviewRead cached TikTok insightsCRead-onlyInspect
Read the authenticated tenant's cached TikTok insight overview without leaving the read-only MCP surface.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| search | No | ||
| date_to | No | ||
| group_by | No | account | |
| sort_dir | No | desc | |
| sort_key | No | spend | |
| date_from | No | ||
| page_size | No | ||
| connection_context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds one genuine behavioral fact beyond the annotations — that the data is cached rather than freshly pulled — but says nothing about staleness, refresh behavior, or the tenant-scoping requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence with no filler, which is efficient. But for a 9-parameter tool it is under-specified rather than genuinely concise, and the phrase "read-only MCP surface" is internal jargon that spends words without informing the agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 undocumented parameters, no output schema, and a rich set of sibling insight tools, the description omits everything an agent needs: what the overview returns, how grouping/sorting/dates shape it, and when to prefer it over live-query siblings. Only the read-only safety profile is adequately covered, and that comes from the annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 9 parameters at 0% description coverage, including date_from/date_to, search, group_by, sort_key/sort_dir, and pagination fields. The description mentions none of them, so it does nothing to compensate for the complete absence of schema documentation on filter, grouping, or paging semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Read ... cached TikTok insight overview") and the word "cached" hints at a distinction from live pulls. However, it never differentiates itself from the many sibling insight tools (insights_query_overview, insights_query_batch_overview, insights_pull_insights), so an agent cannot tell which one to pick from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no conditions selecting this tool over the sibling insight queries, and no mention of prerequisites. The only contextual signal is the vague phrase "without leaving the read-only MCP surface," which does not route the agent to a correct choice.
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.
2 tool updates
- Changed
mmp_insights_get_product_event_today1 field changed- added
Input schema / properties / cursorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Cursor" +}
- Changed
mmp_insights_query_product_event_summary1 field changed- added
Input schema / properties / cursorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Cursor" +}
7 tool updates
- Removed
creatives_request_upload - Changed
mmp_get_state4 fields changed- added
Input schema / properties / app_refAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "App Ref" +} - added
Input schema / properties / connection_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Connection Id" +} - added
Input schema / properties / cursorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Cursor" +} - added
Input schema / properties / limitAdded value: +{ + "default": 50, + "maximum": 100, + "minimum": 1, + "title": "Limit", + "type": "integer" +}
- Changed
products_list4 fields changed- removed
Input schema / properties / channel_pidRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Channel Pid" -} - added
Input schema / properties / cursorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Cursor" +} - added
Input schema / properties / expandAdded value: +{ + "anyOf": [ + { + "items": { + "enum": [ + "matching_rules", + "mmp_matches" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expand" +} - added
Input schema / properties / limitAdded value: +{ + "default": 20, + "maximum": 50, + "minimum": 1, + "title": "Limit", + "type": "integer" +}
- Changed
templates_list3 fields changed- added
Input schema / properties / cursorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Cursor" +} - added
Input schema / properties / detailAdded value: +{ + "default": "summary", + "enum": [ + "summary", + "full" + ], + "title": "Detail", + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "anyOf": [ + { + "maximum": 50, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Limit" +}
- Removed
tiktok_begin_auth_onboarding - Removed
tiktok_continue_auth_onboarding - Removed
tiktok_refresh_assets
3 tool updates
- Added
creatives_cloud_status - Added
creatives_list_cloud - Changed
tiktok_get_cached_insight_overview2 fields changed- added
Input schema / properties / page / minimumAdded value: +1 - added
Input schema / properties / page_size / minimumAdded value: +1
100 tool updates
- Changed
approval_plan_confirm1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
approval_plan_deny1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
approval_plan_get1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
approval_plan_prepare1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
assets_list_ad_accounts1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
assets_list_apps1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
assets_list_business_centers1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
assets_list_cta_portfolios1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
assets_list_identities1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
assets_list_music1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
assets_list_pixels1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
assets_list_shops1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
assets_list_tt_accounts1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
assets_lookup_business_links1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
assets_refresh_all1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
bid_confirm1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
bid_prepare1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
budget_confirm1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
budget_prepare1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
campaigns_quick_create1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
campaigns_quick_create_batch1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
campaigns_quick_create_confirm1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
campaigns_quick_create_deny1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
campaigns_recreate_confirm1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
campaigns_recreate_deny1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
campaigns_recreate_from_task1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
copy_ad_clone_structure1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
copy_ad_clone_structure_confirm1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
copy_ad_clone_structure_deny1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
copy_ad_quick_copy1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
copy_ad_quick_copy_confirm1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
copy_ad_quick_copy_deny1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
creatives_abandon_upload1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
creatives_confirm_upload1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
creatives_create_folder1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
creatives_delete1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
creatives_delete_folder1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
creatives_get1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
creatives_list1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
creatives_list_folders1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
creatives_reconcile1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
creatives_rename_folder1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
creatives_request_upload1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
creatives_request_upload_v21 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
delivery_status_confirm1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
delivery_status_prepare1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
insights_export_csv1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
insights_get_date_range1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
insights_pull_insights1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
insights_query_batch_overview1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
insights_query_consistent1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
insights_query_consistent_continue1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
insights_query_overview1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
insights_query_rows1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
interests_archive1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
interests_fetch_from_adset1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
interests_get1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
interests_list1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
interests_save_fetched_pack1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
mmp_delete_connection1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
mmp_fetch_cohorts1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
mmp_get_state1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
mmp_insights_get_product_event_today1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
mmp_insights_query_product_event_summary1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
mmp_refresh_connection1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
mmp_save_cohort_config1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
notifications_list1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
notifications_mark_read1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
operations_get1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
optimization_dismiss_decision1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
optimization_evaluate1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
optimization_list_decisions1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
optimization_prepare_action1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
overview_get_live_configs1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
products_get_actions1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
products_get_top_campaigns1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
products_list1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
setup_begin_channel_connect1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
setup_check_channel_connect1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
setup_get_status1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
spark_ads_list_posts1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
support_get_report_status1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
support_report_error1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
tasks_cancel1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
tasks_get_create_detail1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
tasks_get_status1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
tasks_latest1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
tasks_list1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
tasks_list_create_history1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
templates_create1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
templates_delete1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
templates_get1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
templates_list1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
templates_reverse_engineer1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
templates_update1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
tiktok_begin_auth_onboarding1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
tiktok_continue_auth_onboarding1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
tiktok_get_assets_status1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
tiktok_get_cached_insight_overview1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
- Changed
tiktok_refresh_assets1 field changed- added
Input schema / properties / connection_contextAdded value: +{ + "pattern": "^mctx_v1_[0-9a-f]{64}$", + "type": "string" +}
4 tool updates
- Added
approval_plan_confirm - Added
approval_plan_deny - Added
approval_plan_get - Added
approval_plan_prepare
8 tool updates
- Removed
assets_query_native - Removed
campaigns_query_native - Removed
creatives_query_native - Removed
insights_query_native - Removed
mmp_connect - Removed
operations_confirm_native - Removed
operations_prepare_native - Removed
spark_ads_authorize_codes
1 tool update
- Changed
setup_get_status1 field changed- added
Output schema / propertiesAdded value: +{ + "support_ref": { + "description": "Opaque request support reference.", + "type": "string" + } +}
5 tool updates
- Changed
assets_query_native1 field changed- added
Input schema / properties / sourceAdded value: +{ + "default": "live", + "enum": [ + "live", + "cache" + ], + "title": "Source", + "type": "string" +}
- Changed
campaigns_query_native1 field changed- added
Input schema / properties / sourceAdded value: +{ + "default": "live", + "enum": [ + "live", + "cache" + ], + "title": "Source", + "type": "string" +}
- Changed
creatives_query_native1 field changed- added
Input schema / properties / sourceAdded value: +{ + "default": "live", + "enum": [ + "live", + "cache" + ], + "title": "Source", + "type": "string" +}
- Changed
insights_query_native1 field changed- added
Input schema / properties / sourceAdded value: +{ + "default": "live", + "enum": [ + "live", + "cache" + ], + "title": "Source", + "type": "string" +}
- Changed
operations_get2 fields changed- changed
Input schema / properties / mutation_ref / anyOfPrevious value: -[ - { - "maxLength": 160, - "minLength": 12, - "pattern": "^(?:tmut_|tcreate[_-])[A-Za-z0-9_-]+$", - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 160, + "minLength": 12, + "pattern": "^(?:(?:tmut_|tcreate[_-])[A-Za-z0-9_-]+|tnapi_[a-f0-9]{64})$", + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / operation_ref / anyOfPrevious value: -[ - { - "maxLength": 160, - "minLength": 12, - "pattern": "^(?:tmut_|tcreate[_-])[A-Za-z0-9_-]+$", - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 160, + "minLength": 12, + "pattern": "^(?:(?:tmut_|tcreate[_-])[A-Za-z0-9_-]+|tnapi_[a-f0-9]{64})$", + "type": "string" + }, + { + "type": "null" + } +]
6 tool updates
- Added
assets_query_native - Added
campaigns_query_native - Added
creatives_query_native - Added
insights_query_native - Added
operations_confirm_native - Added
operations_prepare_native
1 tool update
- Changed
assets_list_cta_portfolios1 field changed- added
Input schema / properties / refreshAdded value: +{ + "default": false, + "title": "Refresh", + "type": "boolean" +}
3 tool updates
- Changed
assets_list_apps1 field changed- added
Input schema / properties / refreshAdded value: +{ + "default": false, + "title": "Refresh", + "type": "boolean" +}
- Changed
assets_list_identities1 field changed- added
Input schema / properties / refreshAdded value: +{ + "default": false, + "title": "Refresh", + "type": "boolean" +}
- Changed
assets_list_pixels1 field changed- added
Input schema / properties / refreshAdded value: +{ + "default": false, + "title": "Refresh", + "type": "boolean" +}
98 tool updates
- First observed
assets_list_ad_accounts - First observed
assets_list_apps - First observed
assets_list_business_centers - First observed
assets_list_cta_portfolios - First observed
assets_list_identities - First observed
assets_list_music - First observed
assets_list_pixels - First observed
assets_list_shops - First observed
assets_list_tt_accounts - First observed
assets_lookup_business_links - First observed
assets_refresh_all - First observed
bid_confirm - First observed
bid_prepare - First observed
budget_confirm - First observed
budget_prepare - First observed
campaigns_quick_create - First observed
campaigns_quick_create_batch - First observed
campaigns_quick_create_confirm - First observed
campaigns_quick_create_deny - First observed
campaigns_recreate_confirm - First observed
campaigns_recreate_deny - First observed
campaigns_recreate_from_task - First observed
copy_ad_clone_structure - First observed
copy_ad_clone_structure_confirm - First observed
copy_ad_clone_structure_deny - First observed
copy_ad_quick_copy - First observed
copy_ad_quick_copy_confirm - First observed
copy_ad_quick_copy_deny - First observed
creatives_abandon_upload - First observed
creatives_confirm_upload - First observed
creatives_create_folder - First observed
creatives_delete - First observed
creatives_delete_folder - First observed
creatives_get - First observed
creatives_list - First observed
creatives_list_folders - First observed
creatives_reconcile - First observed
creatives_rename_folder - First observed
creatives_request_upload - First observed
creatives_request_upload_v2 - First observed
delivery_status_confirm - First observed
delivery_status_prepare - First observed
insights_export_csv - First observed
insights_get_date_range - First observed
insights_pull_insights - First observed
insights_query_batch_overview - First observed
insights_query_consistent - First observed
insights_query_consistent_continue - First observed
insights_query_overview - First observed
insights_query_rows - First observed
interests_archive - First observed
interests_fetch_from_adset - First observed
interests_get - First observed
interests_list - First observed
interests_save_fetched_pack - First observed
mmp_connect - First observed
mmp_delete_connection - First observed
mmp_fetch_cohorts - First observed
mmp_get_state - First observed
mmp_insights_get_product_event_today - First observed
mmp_insights_query_product_event_summary - First observed
mmp_refresh_connection - First observed
mmp_save_cohort_config - First observed
notifications_list - First observed
notifications_mark_read - First observed
operations_get - First observed
optimization_dismiss_decision - First observed
optimization_evaluate - First observed
optimization_list_decisions - First observed
optimization_prepare_action - First observed
overview_get_live_configs - First observed
products_get_actions - First observed
products_get_top_campaigns - First observed
products_list - First observed
setup_begin_channel_connect - First observed
setup_check_channel_connect - First observed
setup_get_status - First observed
spark_ads_authorize_codes - First observed
spark_ads_list_posts - First observed
support_get_report_status - First observed
support_report_error - First observed
tasks_cancel - First observed
tasks_get_create_detail - First observed
tasks_get_status - First observed
tasks_latest - First observed
tasks_list - First observed
tasks_list_create_history - First observed
templates_create - First observed
templates_delete - First observed
templates_get - First observed
templates_list - First observed
templates_reverse_engineer - First observed
templates_update - First observed
tiktok_begin_auth_onboarding - First observed
tiktok_continue_auth_onboarding - First observed
tiktok_get_assets_status - First observed
tiktok_get_cached_insight_overview - First observed
tiktok_refresh_assets
Related MCP Connectors
Hosted Meta ads MCP with OAuth, bounded reads, and prepare/confirm writes.
Hosted Google Ads MCP with OAuth, bounded reads, and prepare/confirm writes.
Run ads across 16 ad platforms from any MCP client. Hosted OAuth at mcp.synterai.com.
Google Ads MCP with 20,000+ account peer context and staged approve-then-execute writes.
Related MCP Servers
- AlicenseBqualityAmaintenanceEnables MCP clients to read and analyze TikTok advertising data, with optional preview-first write tools for managing campaigns, ad groups, and budgets.3568 npmApache 2.0
- AlicenseAqualityAmaintenanceSelf-hosted TikTok Ads MCP server with 35 read tools and 29 opt-in, preview-first write tools. Maintained source relocated from getmcpads-com/tiktok-ads-mcp-server; npm package remains @getmcpads/tiktok-ads-mcp-server.3568 npmApache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients to read ad account, campaign, ad group, and ad data plus performance insights, and optionally create, pause, activate, or update paused campaigns, ad groups, and ads through a secured Streamable HTTP endpoint.MIT
- AlicenseNot gradedqualityAmaintenanceEnables multi-tenant setup and management of Meta advertising accounts, campaigns, ad sets, creatives, audiences, reporting, and batch workflows through the Meta Marketing API, with OAuth and JWT-protected MCP access.19 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.