Skip to main content
Glama
get-mcp-ads

TikTok Ads by Get MCP Ads

TikTok Ads MCP server

Make sense of your TikTok advertising.

Explore campaign performance, inspect native assets and prepare changes from your MCP client.

Release CI Smithery License: Apache 2.0 Node

Watch the film · What's new · Install · Tool reference · Try hosted getmcpads

Watch the getmcpads film: every ad account in one conversation with your AI assistant

Play the 45-second film

The film shows hosted getmcpads with sample data. Its MCP Apps, from creative galleries and alerts to Google Sheets exports and bulk launches, belong to the hosted product. This repository provides the standalone native API tools.

35 read tools · 30 write tools, disabled by default.

Run locally with your own platform credentials and a client that supports stdio MCP, such as Claude Desktop, Claude Code or Cursor. Your requests go directly to the platform. For managed connections, including supported ChatGPT setups, use the hosted option.

What's new

v2.1.1: Zod 4 security update · October 26, 2026

  • Update zod to 4.6.7. Every Zod release before 4.6.6 is covered by the high-severity advisory GHSA-mrhx-c7xc-m3w5: validating an oversized constrained collection can exhaust memory, and no Zod 3 release carries the fix. npm audit --omit=dev reports no vulnerability again.

  • Keep the Zod 3 validation behaviour. A parameter default is still validated and completed before use, so an omitted object must still supply its required fields.

  • Keep each parameter's own description when the parameter is optional or has a default. Zod 4 stores a description on the wrapped schema only, so the shared fallback description could otherwise replace it.

  • Tool names, parameters and descriptions published over MCP are unchanged. server-card.json is regenerated with Zod 4's JSON Schema output, which spells some constraints differently.

Earlier releases

Version

Date

Highlights

2.1.0

October 23, 2026

Advertiser scoping and account rename

2.0.1

September 23, 2026

Public repository restored

2.0.0

September 20, 2026

Gateway sync and security fixes

1.1.0

September 13, 2026

Platform capability sync and quality contracts

1.0.2

August 30, 2026

Announce the package version over MCP.

1.0.1

August 30, 2026

Add server.json and mcpName for the official MCP Registry, under com.getmcpads/tiktok-ads.

1.0.0

August 29, 2026

First open-source release

Full changelog · All releases

Source synchronization: SOURCE_SYNC.md.

Upgrade notes

Requires Node.js 22.23.4, 24.22.1, 26.12.1 or a newer release. These carry the October 2026 security fixes, and the server prints a warning on stderr when it runs on an older one. CI covers Node 22, 24 and 26.

No breaking change. A 2.0 configuration keeps working. What to know:

  • TIKTOK_ADVERTISER_IDS is optional. Without it, every advertiser the token reaches stays accessible, and the server prints one line on stderr recommending it. Set it to the advertisers this server may use.

  • TIKTOK_ENABLE_WRITES still reads 1, yes and on as true, and prints one deprecation line on stderr. Use TIKTOK_ENABLE_WRITES=true.

  • Version 2.0.1 ignored TIKTOK_ENVIRONMENT=sandbox and sent every request to production. Version 2.1.0 sends them to sandbox-ads.tiktok.com, bound to one advertiser: the single ID in TIKTOK_ADVERTISER_IDS, or TIKTOK_ADVERTISER_ID. Without either, sandbox calls are refused.

Announced for 3.0.0: TIKTOK_ADVERTISER_IDS becomes required, and only the exact value true enables writes.

Read the current tool schemas before reusing saved arguments. Writes remain optional and require explicit confirmation. Hosted creative integrations and MCP Apps UI are outside this release.

Related MCP server: Meta Ads by Get MCP Ads

Install this release

This is a GitHub source release. npm and MCP Registry versions are published separately. The commands below select this exact version; unpinned npx examples later in this document select the version currently available on npm.

git clone --branch v2.1.1 --depth 1 https://github.com/get-mcp-ads/tiktok-ads-mcp-server.git
cd tiktok-ads-mcp-server
npm ci
npm run build

Configure your MCP client to run node with the absolute path to dist/cli.js and the platform credentials documented below.

Prefer a managed connection? Use TikTok Ads with hosted getmcpads. Connect your account, select the data your assistant may access and use the hosted MCP connection. See the site for current features and plans.

What you get

35 read tools

Campaigns, ad groups, ads, creatives, audiences, pixels, events, Spark Ads, catalogs, delivery diagnostics

30 write tools

Off by default. Creation and configuration of campaigns, ad groups, ads and Smart+ entities, status, budgets, renames and media uploads. Each one previews before it applies

277 metrics

Including derived ones computed client-side

16 dimensions

With a compatibility matrix that catches invalid combinations before they hit the API

5 resources

Live catalogues the model can read: metrics, dimensions, compatibility rules, 12 workflow recipes

Keyword research

tiktok_search_keywords and tiktok_get_search_ads_maturity, for TikTok Search Ads

Forward-compatible reads

tiktok_get_read_endpoint, tiktok_get_entities_raw, tiktok_get_report_raw reach endpoints this server doesn't model yet

The query planner

TikTok rejects many metric and dimension combinations, and its error messages rarely say why. This server encodes the compatibility matrix, so it splits an impossible request into several valid API calls and merges the results instead of failing.

tiktok_validate_query lets the model check a combination before spending a call on it.

One trap this server handles for you

TikTok answers HTTP 200 even when the call failed. The applicative code field is what decides. A client that trusts the HTTP status reports imaginary successes back to the model, which then reasons on data that was never returned. Every call here checks code first.


Getting a token

TikTok needs two values, not one: an access token and the App ID it belongs to.

  1. Create a developer app on the TikTok for Business developer portal.

  2. Note the App ID and App Secret from the app's page.

  3. Authorize the advertiser accounts you want to reach. TikTok grants access per advertiser, so an account you skip here stays invisible to the server no matter what the token allows.

  4. Complete the OAuth authorization flow to exchange the returned auth_code for an access token. TikTok's long-lived tokens do not expire on a fixed schedule, but they are revoked when the authorization is withdrawn.

  5. Put the token in TIKTOK_ACCESS_TOKEN and the App ID in TIKTOK_APP_ID.

📖 TikTok API for Business documentation

Run tiktok_health_check as your first call. It verifies the credentials, lists the advertiser accounts you can actually reach, and reports what is missing, without printing your token.

Which permissions?

Scope group

When you need it

Reporting and read scopes

Always. Campaigns, ad groups, ads, insights

Campaign management scopes

Only if you set TIKTOK_ENABLE_WRITES=true

Catalog and Business Center scopes

Optional, for tiktok_get_shop_catalog_diagnostics


Setup

Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "tiktok-ads": {
      "command": "npx",
      "args": ["-y", "@getmcpads/tiktok-ads-mcp-server"],
      "env": {
        "TIKTOK_ACCESS_TOKEN": "your-token-here",
        "TIKTOK_APP_ID": "your-app-id-here",
        "TIKTOK_ADVERTISER_IDS": "your-advertiser-id"
      }
    }
  }
}

Restart Claude Desktop. Ask it: "list my TikTok advertiser accounts".

Claude Code

claude mcp add tiktok-ads --env TIKTOK_ACCESS_TOKEN=your-token --env TIKTOK_APP_ID=your-app-id --env TIKTOK_ADVERTISER_IDS=your-advertiser-id -- npx -y @getmcpads/tiktok-ads-mcp-server

Cursor

.cursor/mcp.json in your project, same shape as the Claude Desktop config above.

From source

git clone https://github.com/get-mcp-ads/tiktok-ads-mcp-server.git
cd tiktok-ads-mcp-server
npm install && npm run build
cp .env.example .env   # then fill in your credentials
npm start

Configuration

Variable

Default

Meaning

TIKTOK_ACCESS_TOKEN

none

Required. Your access token

TIKTOK_APP_ID

none

Required. The App ID the token belongs to

TIKTOK_ADVERTISER_IDS

none

Recommended, required from 3.0.0. Comma-separated advertiser IDs this server may access. When set, other advertisers are refused before any request, and discovery lists only these. When unset, every advertiser the token reaches is accessible

TIKTOK_APP_SECRET

none

Optional, for endpoints needing app authentication

TIKTOK_ADVERTISER_ID

none

Optional default, saves passing it on every call. When TIKTOK_ADVERTISER_IDS is set, it must be one of them

TIKTOK_BC_ID

none

Optional Business Center ID. TIKTOK_BUSINESS_CENTER_ID is read when it is unset

TIKTOK_ENABLE_WRITES

false

true registers the 30 write tools. 1, yes and on still work with a deprecation notice until 3.0.0

TIKTOK_ENVIRONMENT

production

production or sandbox. Sandbox binds every call to one advertiser: the single ID in TIKTOK_ADVERTISER_IDS, or TIKTOK_ADVERTISER_ID

LOG_LEVEL

info

debug, info, warn, error

Check your setup at any time:

npm run doctor

Writes, and why they preview first

Write tools are disabled by default. Enable them with TIKTOK_ENABLE_WRITES=true.

When enabled, every write tool returns a preview and changes nothing:

// tiktok_update_adgroup_budget { advertiserId: "7...", adGroupId: "1...", budget: 50 }
{
  "applied": false,
  "action": "tiktok_update_adgroup_budget",
  "change": { "advertiser": "7...", "adGroup": "1...", "newBudget": 50,
              "budgetMode": "BUDGET_MODE_DAY" },
  "message": "Preview only, nothing was changed. Repeat the same call with confirm: true to apply this change to the live account."
}

Only a second call carrying confirm: true touches the live account.

This is deliberate. An assistant composes these calls, and it can pick the wrong advertiser, the wrong campaign, or the wrong order of magnitude on a budget. A mandatory preview makes the mistake visible before it costs money, and gives a human the stopping point the protocol does not guarantee on its own.

One further guardrail: tiktok_create_campaign always creates the campaign DISABLE. There is no option to create it running.

Tool

What it changes

tiktok_update_campaign_status / tiktok_update_adgroup_status

Pause or reactivate

tiktok_update_campaign_budget / tiktok_update_adgroup_budget

Budget, in the account currency

tiktok_create_campaign

Creates a campaign, always DISABLE


Tools

Every tool is listed below. See server-card.json for complete parameter and output schemas.

Tool

Purpose

tiktok_health_check

Read-only health check for TikTok credentials, accessible advertisers, and advertiser info.

tiktok_list_advertisers

List all TikTok advertiser accounts accessible with the current token.

tiktok_get_advertiser_info

Get detailed information for specific TikTok advertiser accounts: currency, timezone, status, balance.

tiktok_get_campaigns

List campaigns for a TikTok advertiser account.

tiktok_get_adgroups

Read full native ad group configuration including targeting, custom/lookalike audience references and exclusions, geo, language, age/gender, placements, interests/behaviors, budget and schedule.

tiktok_get_targeting

Read configured ad group targeting and audience references: custom/lookalike inclusions/exclusions, geo, language, age/gender, placements, interests and behaviors.

tiktok_get_audience_report

Read TikTok AUDIENCE performance reports by age or gender at advertiser, campaign, ad group or ad level, including delivery from eligible Smart+ campaigns.

tiktok_get_ads

List ads for a TikTok advertiser.

tiktok_get_insights

Query TikTok Ads performance insights using the current native/calculated metric catalog and query planning.

tiktok_get_creatives

Get creative details (video, image, text) for specific ads in a TikTok advertiser account.

tiktok_get_audiences

List custom and lookalike audiences for a TikTok advertiser account.

tiktok_search_keywords

Get keyword suggestions for TikTok Search Ads.

tiktok_validate_query

Validate a TikTok metric/dimension combination BEFORE executing.

tiktok_get_pixels

List TikTok pixels and, when permissions allow it, pixel event metadata for an advertiser.

tiktok_get_events

Discover pixel/app events or accessible tracking diagnostics for an advertiser.

tiktok_get_delivery_status

Aggregate campaign, ad group, and ad delivery status/operation_status with simple diagnostics.

tiktok_get_async_report_status

Check a TikTok async report task status by taskId when async report endpoints are available.

tiktok_get_video_assets

Return ad-linked TikTok video asset metadata from ad/get and video material endpoints when available.

tiktok_get_spark_ads

Return Spark Ads context from ad fields when available, with a conservative fallback if Spark-specific fields are not supported.

tiktok_get_audience_details

Get custom/lookalike/saved audience details where TikTok DMP endpoints are accessible.

tiktok_get_shop_catalog_diagnostics

Read-only TikTok Shop/catalog/e-commerce diagnostics.

tiktok_get_search_ads_maturity

Diagnose TikTok Search Ads maturity from keyword/search-term reporting and optional keyword recommendation endpoints.

tiktok_get_creative_fatigue_recipes

Find likely creative fatigue patterns from ad-level daily reporting and return read-only refresh recipes.

tiktok_get_audience_overlap

Read-only audience overlap diagnostics across ad groups, custom audiences, saved audiences, and targeting fields.

tiktok_get_spark_organic_joins

Join accessible Spark Ads fields with paid page/post reporting and optional organic identity/post endpoints when permissions allow.

tiktok_list_ad_videos

List the advertiser's whole video library (file/video/ad/search): file name, duration, dimensions, signature, and publicly served preview and cover URLs.

tiktok_list_ad_images

List the advertiser's whole image library (file/image/ad/search): file name, dimensions, signature, carousel usability, and a publicly served image URL signed for roughly thirty days (image_url_expires_at gives the exact instant).

tiktok_get_asset_urls

Re-resolve fresh, publicly fetchable URLs for specific TikTok library assets (file/video/ad/info and file/image/ad/info).

tiktok_get_entities_raw

List TikTok campaigns, ad groups, or ads with caller-selected native fields, filtering, sorting, and pagination.

tiktok_get_report_raw

Run a native TikTok BASIC or AUDIENCE synchronous report with caller-selected dimensions and metrics.

tiktok_get_targeting_catalog

Read TikTok targeting and planning catalogs: locations, languages, interests, behaviors, hashtags, Search Ads keyword ideas/health, devices, carriers, contextual tags, content exclusions, and time zones.

tiktok_get_read_endpoint

Advanced GET-only TikTok Business API escape hatch for documented JSON read endpoints not yet modeled by a specialized MCP tool.

tiktok_get_carousel_music

Get TikTok music recommendations for exactly the uploaded images in a standard, non-catalog image ad (one card) or carousel.

tiktok_get_uploaded_video

Read one uploaded video from this advertiser’s media library.

tiktok_get_write_context

Read the exact TikTok entity, parent settings and advertiser currency/timezone before editing or building a new configuration.

Disabled by default. Calls preview unless explicitly confirmed. Check the configuration and exact schema before use.

Tool

Purpose

tiktok_create_cta_portfolio

Create a dynamic CTA portfolio from the exact approved recommendations returned by creative/cta/recommend for this advertiser.

tiktok_create_custom_identity

Create an advertiser-owned CUSTOMIZED_USER advertising identity for Pangle or Global App Bundle.

tiktok_create_campaign_advanced

Create DISABLED classic TikTok campaign.

tiktok_update_campaign_configuration

Update classic TikTok campaign.

tiktok_create_adgroup

Create DISABLED classic TikTok adgroup.

tiktok_update_adgroup_configuration

Update classic TikTok adgroup.

tiktok_create_ads

Create DISABLED classic TikTok ads (video, image, carousel or authorized Spark content).

tiktok_update_ads

Update classic TikTok ads (video, image, carousel or authorized Spark content).

tiktok_create_smart_plus_campaign

Create DISABLED upgraded Smart+ TikTok campaign.

tiktok_update_smart_plus_campaign

Update upgraded Smart+ TikTok campaign.

tiktok_create_smart_plus_adgroup

Create DISABLED upgraded Smart+ TikTok adgroup.

tiktok_update_smart_plus_adgroup

Update upgraded Smart+ TikTok adgroup.

tiktok_create_smart_plus_ad

Create DISABLED upgraded Smart+ TikTok ads (video, image, carousel or authorized Spark content).

tiktok_update_smart_plus_ad

Update upgraded Smart+ TikTok ads (video, image, carousel or authorized Spark content).

tiktok_update_ad_status

Pause or reactivate exactly one classic ad.

tiktok_update_smart_plus_campaign_status

Pause or reactivate exactly one Smart+ campaign.

tiktok_update_smart_plus_adgroup_status

Pause or reactivate exactly one Smart+ adgroup.

tiktok_update_smart_plus_ad_status

Pause or reactivate exactly one Smart+ ad.

tiktok_update_smart_plus_material_status

Pause or reactivate selected creative materials inside one upgraded Smart+ ad.

tiktok_rename_campaign

Rename one classic TikTok campaign.

tiktok_rename_adgroup

Rename one classic TikTok adgroup.

tiktok_rename_ad

Rename one classic TikTok ad.

tiktok_rename_advertiser

Rename the TikTok ad account (advertiser) itself.

tiktok_upload_ad_image

Import a image from a public HTTPS media URL or base64 file (up to 5 MiB).

tiktok_upload_ad_video

Import a video from a public HTTPS media URL or base64 file (up to 5 MiB).

tiktok_update_campaign_status

Pause or reactivate a TikTok campaign.

tiktok_create_campaign

Create a TikTok campaign.

tiktok_update_campaign_budget

Change a TikTok campaign budget, in the account currency.

tiktok_update_adgroup_status

Pause or reactivate a TikTok ad group.

tiktok_update_adgroup_budget

Change the budget of a TikTok ad group.

URI

Contents

tiktok://manifest

What this server exposes, and its current mode

tiktok://metrics

All 277 metrics with categories and formats

tiktok://dimensions

All 16 dimensions and where they are valid

tiktok://compatibility

The compatibility matrix

tiktok://recipes

12 step-by-step workflows


Security

The server holds a credential that can read, and optionally modify, live ad accounts. Concretely:

  • The token is never logged. Debug output prints Access-Token: [redacted].

  • Requests go only to business-api.tiktok.com, or to sandbox-ads.tiktok.com when TIKTOK_ENVIRONMENT=sandbox, and only under /open_api/v1.3/. Any other host or path is refused rather than called. Covered by tests.

  • With TIKTOK_ADVERTISER_IDS set, only those advertisers are reached. Any other advertiser is refused before a request is sent, and discovery responses are filtered to the list. Covered by tests.

  • Every request has a 30-second timeout and a 20 MB response limit. Provider error text is stripped of the token and app secret before it is logged or returned.

  • Redirects are refused once a token is attached, so a redirect cannot forward your credential elsewhere.

  • Mutating and OAuth endpoints are blocked on the generic read paths. Covered by tests.

  • No telemetry. The server makes no network call other than to the TikTok Business API. You can verify this by grepping the source for fetch.

Full policy and reporting instructions: SECURITY.md.


Looking for a managed, multi-platform version?

Try hosted TikTok Ads if you want to use this source without operating a local server. getmcpads also connects advertising, Search Console and GA4 through one MCP URL. Source availability and plan limits are listed on the site; connecting an account is still required.

  1. Follow the TikTok Ads connection guide.

  2. Select the account or property your assistant may read.

  3. Connect Claude, ChatGPT or Codex.

  4. Try a read-only review: “Compare campaign delivery and conversion trends over complete periods. State missing data and do not change anything.”

See the current hosted tool catalogue and pricing before choosing a paid plan. This Apache 2.0 adapter remains independently useful with your own credentials.


Contributing

Issues and pull requests are welcome. See CONTRIBUTING.md. Please read SECURITY.md before reporting anything security-related.

Licence

Apache License 2.0. See also NOTICE.

TikTok and TikTok for Business are trademarks of ByteDance Ltd. and its affiliates. This project is not affiliated with, endorsed by, or sponsored by TikTok or ByteDance. It is an independent client of a public API.

MCP contracts and desktop bundle

Every tool declares read/write annotations, parameter descriptions and a structured output schema. Successful calls expose the payload as structuredContent.result; errors retain isError: true. The generated server card contains definitions only.

Run npm run bundle -- /path/to/output to build a .mcpb desktop bundle from the current catalog. Credentials are entered locally during installation. Write tools remain disabled unless explicitly enabled.

More from getmcpads

Meta Ads · Google Ads · Google Analytics 4 · Google Search Console · Pinterest Ads · X Ads

Maintained by Emmanuel at getmcpads. Questions: hello@getmcpads.com.

Available Tools

35 tools
tiktok_get_adgroupstiktok get adgroupsA
Read-onlyIdempotent

Read full native ad group configuration including targeting, custom/lookalike audience references and exclusions, geo, language, age/gender, placements, interests/behaviors, budget and schedule. Set smartPlus:true for upgraded Smart+ targeting_spec. Missing fields are unknown, not unrestricted targeting. Paginated.

NameRequiredDescriptionDefault
pageNoPage number to request, starting at 1.
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
smartPlusNoUse true for upgraded Smart+ ad groups: reads their native targeting_spec and exact placements via smart_plus/adgroup/get. No fallback to classic settings.
adgroupIdsNoRestrict TikTok results to these ad group IDs.
campaignIdNoExact TikTok numeric ID, as a string.
advertiserIdYesExact TikTok numeric ID, as a string.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior, so the description's value is in what it adds: 'Missing fields are unknown, not unrestricted targeting' prevents a serious misinterpretation of empty results, and the smartPlus note warns there is no fallback to classic settings. Pagination is also disclosed. Only rate-limit/scope behavior is absent.

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

Conciseness4/5

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

Two sentences, front-loaded with the resource and its field inventory, then the two operational caveats. The field list is dense but each item discriminates the tool's scope; nothing is redundant padding.

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

Completeness5/5

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

An output schema exists, so return values need not be explained. Combined with 100% parameter coverage and read-only annotations, the description supplies exactly what is missing: pagination, the smartPlus read path, and the semantics of absent targeting fields.

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

Parameters3/5

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

Schema coverage is 100%, so advertiserId, campaignId, adgroupIds, page, limit and smartPlus are all documented in the schema. The description's smartPlus sentence largely restates the schema's own explanation, so it adds little beyond the baseline.

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

Purpose4/5

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

States a specific verb (read) and resource (native ad group configuration) and enumerates the concrete contents: targeting, audience references/exclusions, geo, language, age/gender, placements, budget, schedule. This clearly separates it from tiktok_get_campaigns and tiktok_get_ads by resource level, though it never names a sibling explicitly.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: read ad groups when you need their configuration. The one real routing hint is 'Set smartPlus:true for upgraded Smart+ targeting_spec,' but there is no guidance on when to prefer tiktok_get_targeting or tiktok_get_entities_raw instead, and no exclusions.

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

tiktok_get_adstiktok get adsB
Read-onlyIdempotent

List ads for a TikTok advertiser. Returns ad ID, name, operation status, and creative info.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
adgroupIdNoFilter by ad group ID
advertiserIdYesTikTok advertiser ID

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description adds useful return-field context (ad ID, name, operation status, creative info) but says nothing about pagination behavior, result caps, or rate limits. It does not contradict 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.

Conciseness5/5

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

Two short sentences, zero filler, with the resource and scope front-loaded. Nothing to trim.

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

Completeness4/5

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

An output schema exists and annotations carry the safety semantics, so the description need not explain return values in depth. What remains missing is how this listing relates to the creatives/videos/spark-ads siblings and any pagination caveat hinted at by the limit parameter.

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

Parameters3/5

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

Schema description coverage is 100% and all three parameters are documented in the schema, so the baseline of 3 applies. The description adds no meaning beyond the schema — notably it never mentions the adgroupId filter that would let an agent scope the listing.

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

Purpose4/5

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

Clear verb+resource: 'List ads for a TikTok advertiser', which distinguishes it from get_campaigns and get_adgroups by resource level. It does not, however, contrast itself with the nearby tiktok_get_creatives or tiktok_list_ad_videos siblings, so an agent must infer the boundary.

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

Usage Guidelines2/5

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

The description supplies no when-to-use / when-not-to-use guidance and names no alternatives, despite ~30 sibling tools including creatives, spark ads, and ad videos that could plausibly be confused with this one. Only the phrase 'for a TikTok advertiser' implicitly signals the required advertiserId context.

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

tiktok_get_advertiser_infotiktok get advertiser infoB
Read-onlyIdempotent

Get detailed information for specific TikTok advertiser accounts: currency, timezone, status, balance.

NameRequiredDescriptionDefault
advertiserIdsYesOne or more advertiser IDs

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds which fields come back, but says nothing about batching limits, error behavior for invalid/unauthorized IDs, or rate limits — the remaining gaps an agent would care about.

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

Conciseness4/5

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

One front-loaded sentence with no filler; the resource and payload fields come before any optional detail. Slightly clipped grammar but nothing wasted.

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

Completeness4/5

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

With rich annotations, an output schema, and a fully documented single parameter, the definition gives enough to call the tool correctly. The only real omission is where advertiser IDs come from, which a sibling tool covers.

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

Parameters3/5

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

Single parameter with 100% schema description coverage ('One or more advertiser IDs'), so the schema carries the burden. The description adds no extra meaning such as how many IDs are practical per call or where to source valid IDs.

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

Purpose4/5

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

States a specific verb (Get) and resource (advertiser account info) and enumerates the returned fields (currency, timezone, status, balance), which separates it from bulk listing tools. It never names tiktok_list_advertisers explicitly, so 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.

Usage Guidelines2/5

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

There is no explicit when-to-use guidance and no mention of alternatives such as tiktok_list_advertisers for discovering IDs or tiktok_get_insights for performance data. The only usage signal is the implied 'you need account-level metadata', which the agent must infer.

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

tiktok_get_asset_urlstiktok get asset urlsA
Read-onlyIdempotent

Re-resolve fresh, publicly fetchable URLs for specific TikTok library assets (file/video/ad/info and file/image/ad/info). Call at display or download time: every TikTok media URL is signed and expires.

NameRequiredDescriptionDefault
imageIdsNoImage IDs to refresh
videoIdsNoVideo IDs to refresh (at most 60 per call, TikTok's documented cap)
advertiserIdYesTikTok advertiser ID

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive, open-world semantics, so the description's real contribution is the crucial fact that TikTok media URLs are signed and expire — explaining why repeated calls are expected and necessary. It stops short of rate-limit or expiry-window details, but adds meaningful context beyond the annotations.

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

Conciseness5/5

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

Two sentences, front-loaded with the action and followed by the operational trigger. Nothing is padded or redundant.

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

Completeness4/5

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

With an output schema present, return values need no explanation, and the description covers why and when to call. Minor gap: it doesn't say whether imageIds/videoIds are required together or how to batch beyond the schema's per-call caps.

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

Parameters3/5

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

Schema description coverage is 100% and both the video cap and ID semantics are already documented in the schema, so the description only echoes asset types at a high level. Baseline 3 is appropriate; no additional format or batching guidance is supplied beyond the schema.

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

Purpose5/5

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

States a specific verb ('Re-resolve') and resource ('fresh, publicly fetchable URLs for specific TikTok library assets'), and names the exact TikTok file paths involved. This clearly separates it from sibling list tools like tiktok_get_video_assets or tiktok_list_ad_videos, which enumerate assets rather than mint URLs.

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

Usage Guidelines4/5

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

'Call at display or download time' gives a concrete trigger condition that no other sibling shares. It doesn't explicitly name an alternative or exclusion, but the timing guidance is unambiguous enough that misuse is unlikely.

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

tiktok_get_async_report_statustiktok get async report statusB
Read-onlyIdempotent

Check a TikTok async report task status by taskId when async report endpoints are available. No report creation or mutation is performed.

NameRequiredDescriptionDefault
taskIdYesAsync report task ID returned by TikTok report task creation outside this read-only MCP.
advertiserIdYesTikTok advertiser ID

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered. The description's 'no report creation or mutation is performed' merely restates those hints and adds nothing about polling cadence, what a pending/failed status looks like, or error behavior for an unknown taskId.

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

Conciseness4/5

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

Two short sentences with the resource and key parameter front-loaded and no filler. The 'when async report endpoints are available' clause is slightly vague but occupies little space.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and both parameters are schema-documented. However, for a status-polling tool the description omits the practically important context — whether repeated calls are expected, how terminal states are indicated, and what happens for an expired or invalid taskId.

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

Parameters3/5

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

Schema description coverage is 100%: both advertiserId and taskId are documented in the schema, including that taskId originates from task creation outside this MCP. The description only echoes 'by taskId' and adds no format, validity, or cross-parameter meaning, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Check a TikTok async report task status') keyed to a named parameter ('by taskId'), which no sibling tool in the list covers. The qualifier 'when async report endpoints are available' introduces an odd conditional but does not obscure the core action.

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

Usage Guidelines3/5

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

Implies the usage context (polling a task created elsewhere) and explicitly excludes creation/mutation, but names no alternative tool and gives no when-not guidance or prerequisite ordering. The schema, not the description, is what tells the agent taskId must come from outside this MCP.

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

tiktok_get_audience_detailstiktok get audience detailsC
Read-onlyIdempotent

Get custom/lookalike/saved audience details where TikTok DMP endpoints are accessible. Read-only only.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
audienceIdsNoOptional custom/lookalike audience IDs. If omitted, lists available audiences.
advertiserIdYesTikTok advertiser ID
includeSavedAudiencesNoAlso include saved audience targeting details when available.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so "Read-only only" adds no information beyond structured fields. The only genuine addition is "where TikTok DMP endpoints are accessible," which hints at an availability gate but never explains what happens for non-DMP advertisers or how access is determined.

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

Conciseness4/5

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

Two short sentences with the verb and scope front-loaded; nothing is buried. The second sentence is largely redundant with the readOnlyHint annotation, so it does not fully earn its place.

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

Completeness3/5

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

Output schema and annotations carry the return-shape and safety burden, and the schema documents all params, so the definition is callable as-is. What is missing is the sibling disambiguation (this vs tiktok_get_audiences) and any explanation of the DMP accessibility condition, both of which materially affect tool selection.

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

Parameters3/5

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

Schema description coverage is 100%, so each of the four parameters is already documented in the schema (including the audienceIds/listing tradeoff and the includeSavedAudiences flag). The description adds no parameter-level meaning, which is acceptable given the baseline but leaves no extra value.

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

Purpose4/5

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

The description names a specific verb (Get) and resource (audience details) and enumerates the audience types covered (custom/lookalike/saved), so an agent knows what data comes back. However, it never distinguishes itself from close siblings like tiktok_get_audiences or tiktok_get_audience_overlap, which an agent could easily confuse it with.

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

Usage Guidelines2/5

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

"Read-only only" is a safety restatement, not guidance on when to pick this tool. There is no mention of when to use tiktok_get_audiences instead, nor any prerequisite about DMP access other than a vague caveat phrase.

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

tiktok_get_audience_overlaptiktok get audience overlapB
Read-onlyIdempotent

Read-only audience overlap diagnostics across ad groups, custom audiences, saved audiences, and targeting fields.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
smartPlusNoUse true for upgraded Smart+ ad groups: reads their native targeting_spec and exact placements via smart_plus/adgroup/get. No fallback to classic settings.
adgroupIdsNoOptional ad group IDs to compare.
campaignIdNoOptional campaign ID filter.
advertiserIdYesTikTok advertiser ID
overlapThresholdNoOverlap threshold used to flag audience pairs, in the units declared by this schema.
includeSavedAudiencesNoInclude accessible saved-audience metadata in the overlap analysis.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so 'Read-only' in the description is largely redundant. The description does add the useful disclosure that analysis spans multiple entity types including targeting fields, but says nothing about cost, result size, or how overlapThreshold triggers flagging beyond what the schema states.

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

Conciseness4/5

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

A single front-loaded sentence with no filler or repetition. It is perhaps too terse for a seven-parameter diagnostic tool, but there is no wasted language.

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

Completeness4/5

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

Output schema exists, annotations cover the safety profile, and the schema documents all seven parameters, so the description is not required to explain returns. It is, however, complete enough to identify the tool; the missing piece is comparative guidance against sibling audience tools.

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The description hints at the entity scope covered by adgroupIds, campaignId and includeSavedAudiences, but adds no semantics for overlapThreshold or smartPlus beyond what the schema already documents clearly.

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

Purpose4/5

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

States a specific verb-and-resource: 'audience overlap diagnostics' scoped to ad groups, custom audiences, saved audiences and targeting fields. An agent can tell it is an overlap analysis read, though it gives no signal to distinguish it from close siblings such as tiktok_get_audience_report or tiktok_get_audiences.

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

Usage Guidelines2/5

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

The description never says when to reach for this tool rather than tiktok_get_audience_report, tiktok_get_audiences, or tiktok_get_targeting, nor does it state preconditions (e.g. needing at least two ad groups to compare). Usage is only implied by the word 'diagnostics'.

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

tiktok_get_audience_reporttiktok get audience reportA
Read-onlyIdempotent

Read TikTok AUDIENCE performance reports by age or gender at advertiser, campaign, ad group or ad level, including delivery from eligible Smart+ campaigns. Multiple demographics return separate reports, not a joint distribution. Explicit pagination and native provider errors; no inference of configured targeting or Custom Audience membership.

NameRequiredDescriptionDefault
pageNoPage number to request, starting at 1.
adIdsNoRestrict results to these ad IDs.
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
endDateYesLast date of the reporting period, in YYYY-MM-DD format, on or after startDate.
metricsYesNative AUDIENCE metric keys, e.g. spend, impressions, clicks, ctr, cpc, conversion. Provider rejects unsupported metric combinations; BASIC metric availability does not imply AUDIENCE support.
dataLevelNoTikTok reporting aggregation level. Metrics and dimensions must be compatible with this level.AUCTION_CAMPAIGN
orderTypeNoSort direction for the selected ordering field.
startDateYesFirst date of the reporting period, in YYYY-MM-DD format.
adgroupIdsNoRestrict TikTok results to these ad group IDs.
dimensionsYesage and/or gender, optionally with the ID matching dataLevel. Multiple demographics return separate reports, never a fabricated age × gender cross-tab.
orderFieldNoProvider field used to order report rows.
campaignIdsNoRestrict results to these campaign IDs.
advertiserIdYesExact TikTok numeric ID, as a string.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the description's job is to add beyond that — and it does: multiple demographics yield separate reports rather than a joint distribution, pagination is explicit, errors are surfaced natively, and it will not infer configured targeting or Custom Audience membership. Those are real behavioral caveats an agent would otherwise get wrong. It stops short of describing result shape or limits, but the output schema covers returns.

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

Conciseness4/5

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

Two compact sentences, front-loaded with purpose and scope, with caveats trailing. Slightly dense and clause-heavy, but every clause carries information rather than filler.

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

Completeness4/5

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

For a 13-parameter reporting tool with annotations and an output schema, the description covers what is queried, at which levels, how demographics are returned, and the error/pagination posture. The remaining gap is routing guidance relative to sibling reporting tools, which is minor given full schema and output coverage.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all 13 parameters including the dimensions semantics and dataLevel compatibility. The description restates the demographic-separation rule but adds no syntax, default, or format detail beyond the schema — baseline 3 is appropriate.

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

Purpose4/5

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

States a specific verb and resource ('Read TikTok AUDIENCE performance reports') plus the breakdown axes (age/gender) and aggregation levels (advertiser → ad), which separates it from sibling list/detail tools like tiktok_get_audiences or tiktok_get_audience_details. It does not explicitly name the closest alternative (tiktok_get_insights), so sibling differentiation is implied 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.

Usage Guidelines3/5

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

The scope constraints (demographic breakdowns, eligible Smart+ delivery, supported dataLevels) imply when the tool applies, but there is no explicit when-to-use/when-not guidance or named alternative such as tiktok_get_insights for non-demographic reporting. The agent must infer selection from the purpose sentence.

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

tiktok_get_audiencestiktok get audiencesA
Read-onlyIdempotent

List custom and lookalike audiences for a TikTok advertiser account.

NameRequiredDescriptionDefault
pageNoFollow page_info.total_page to read the full audience library.
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
advertiserIdYesTikTok advertiser ID

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered. The description adds the useful fact that both custom and lookalike audience types are returned, but says nothing about pagination behavior or result size, which the schema partially covers.

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

Conciseness5/5

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

A single front-loaded sentence with zero wasted words that immediately identifies the resource and scope.

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

Completeness3/5

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

Output schema exists and the input schema is fully documented, so return values and parameters need not be explained. However, with 30+ siblings including three other audience-related read tools, the definition is too thin to reliably route an agent without opening the schema.

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

Parameters3/5

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

Schema description coverage is 100% with well-annotated page, limit and advertiserId, so the schema carries the parameter burden. The description adds no parameter-level meaning beyond naming the audience types, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb ('List') and resource ('custom and lookalike audiences') scoped to a TikTok advertiser account. It implicitly distinguishes itself from retrieval-style siblings like tiktok_get_audience_details or tiktok_get_audience_report, but never names them.

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

Usage Guidelines3/5

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

Usage is only implied: an agent can infer this tool is for enumerating the audience library. There is no explicit when-to-use guidance and no mention of the several closely-related siblings (audience_details, audience_report, audience_overlap) that a caller must choose between.

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

tiktok_get_campaignstiktok get campaignsA
Read-onlyIdempotent

List campaigns for a TikTok advertiser account. Returns campaign ID, name, status, budget, and objective.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
advertiserIdYesTikTok advertiser ID
statusFilterNoNative status values used to filter the returned entities.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds a brief return-field summary (ID, name, status, budget, objective), but it does not discuss pagination behavior, rate limits, or authentication needs beyond what annotations already imply. With annotations carrying the main behavioral load, a 3 is appropriate.

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

Conciseness5/5

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

Two sentences with zero waste. The core purpose is front-loaded, and the return-field summary follows immediately, making the definition efficient and easy to parse.

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

Completeness4/5

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

The tool has rich annotations, full schema coverage, and an output schema, so the description need not explain return values in detail. It provides enough context (scope and key return fields) for an agent to call it correctly, though it could mention pagination or filtering to be fully complete.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all three parameters including the status enum and limit bounds. The description adds no parameter-specific semantics beyond implying the advertiser account scope, so the baseline 3 is correct when the schema does the heavy lifting.

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

Purpose4/5

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

The description uses a specific verb ('List') and resource ('campaigns') and scopes it to a TikTok advertiser account. It clearly distinguishes campaign-level data from sibling tools like tiktok_get_adgroups or tiktok_get_ads, though it does not explicitly name alternatives.

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

Usage Guidelines3/5

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

Usage is implied by the resource and scope ('List campaigns for a TikTok advertiser account'), but there is no explicit guidance on when to choose this tool over siblings or any exclusions. No prerequisites or filtering recommendations are provided.

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

tiktok_get_creative_fatigue_recipestiktok get creative fatigue recipesA
Read-onlyIdempotent

Find likely creative fatigue patterns from ad-level daily reporting and return read-only refresh recipes. Does not create, edit, or upload creatives.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
endDateNoEnd date YYYY-MM-DD. Defaults to today.
startDateNoStart date YYYY-MM-DD. Defaults to 14 days ago.
advertiserIdYesTikTok advertiser ID
minImpressionsNoMinimum reported impressions required for a row to enter the analysis.
declineThresholdPctNoPercentage decline used as a candidate signal for creative fatigue, requiring further evidence.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the read-only claim largely restates structured data. The description does add real context that the output is derived from ad-level daily reporting and framed as candidate signals rather than verdicts, but says nothing about analysis cost, data freshness, or how sparse data is handled.

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

Conciseness5/5

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

Two tight sentences: the core action first, the read-only boundary second. Nothing is padding and nothing is buried.

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

Completeness4/5

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

With an output schema present, return values need not be described, and annotations cover the safety profile, so the description is nearly sufficient. It could still hint at the default 14-day window or that results are capped by limit, but those are already in the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter including declineThresholdPct and minImpressions is already documented with defaults and bounds. The description adds no parameter-level meaning beyond what the schema provides, which is the expected baseline of 3 when the schema carries the load.

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

Purpose5/5

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

States a specific verb and analytic resource: find likely creative fatigue patterns from ad-level daily reporting and return refresh recipes. The scope is narrow enough that an agent can distinguish it from generic reporting siblings like tiktok_get_insights or tiktok_get_report_raw, and the closing clause explicitly rules out creative mutation.

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

Usage Guidelines3/5

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

The description gives a useful negative boundary ('does not create, edit, or upload creatives') but never says when to prefer this over tiktok_get_insights or tiktok_get_report_raw for plain performance data, nor any prerequisites beyond the advertiser ID. Usage is implied by the topic rather than routed explicitly.

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

tiktok_get_creativestiktok get creativesA
Read-onlyIdempotent

Get creative details (video, image, text) for specific ads in a TikTok advertiser account.

NameRequiredDescriptionDefault
adIdsNoSpecific ad IDs to get creatives for
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
advertiserIdYesTikTok advertiser ID

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds that returned creative details include video, image, and text, but it does not clarify behavior when adIds is omitted or how limit/pagination affects results.

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

Conciseness5/5

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

A single front-loaded sentence with no repetition or filler. Every part of the sentence contributes to identifying the tool's action, resource, and scope.

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

Completeness3/5

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

The tool is a simple read operation with a full schema, output schema, and annotations that cover safety. However, the description leaves ambiguous how adIds and limit interact with the result set, which matters for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all three parameters. The description mentions creative types but does not add syntax, defaults, or meaning beyond the schema.

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

Purpose4/5

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

The description states a specific verb and resource: 'Get creative details (video, image, text)' for 'specific ads' in an advertiser account. It is clear what the tool does, but it does not explicitly distinguish itself from siblings such as tiktok_get_video_assets, tiktok_list_ad_videos, tiktok_list_ad_images, or tiktok_get_ads.

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

Usage Guidelines3/5

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

Usage is implied: fetch creative details for specific ads in an advertiser account. It does not say when to use this instead of related sibling tools, nor does it provide exclusions or prerequisite guidance.

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

tiktok_get_delivery_statustiktok get delivery statusB
Read-onlyIdempotent

Aggregate campaign, ad group, and ad delivery status/operation_status with simple diagnostics.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
adgroupIdNoOptional ad group ID filter.
campaignIdNoOptional campaign ID filter.
includeAdsNoInclude ad-level status diagnostics.
advertiserIdYesTikTok advertiser ID

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description adds that the operation aggregates across three levels and includes operation_status plus diagnostics, which is useful, but says nothing about pagination behavior, result volume, or latency despite it being an open-world API call.

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

Conciseness4/5

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

A single front-loaded sentence with no filler. It is efficient, though its brevity borders on under-specification for a tool spanning three entity levels.

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

Completeness3/5

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

An output schema exists so return values need not be explained, and parameters are fully documented. However, for a cross-level aggregation tool the description never clarifies what "simple diagnostics" actually surfaces or how includeAds changes granularity, leaving a gap in the agent's ability to predict what it will get back.

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

Parameters3/5

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

Schema description coverage is 100%, so all five parameters are documented in the schema; the baseline of 3 applies. The description loosely maps to campaignId/adgroupId/includeAds by naming campaign, ad group, and ad levels, but adds no meaning beyond the schema (e.g., how filters interact across aggregation levels).

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

Purpose4/5

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

The description names a concrete verb ("Aggregate") and concrete resources (campaign, ad group, ad delivery status/operation_status), so an agent can tell this is a roll-up status view rather than an entity list. It does not explicitly distinguish itself from siblings like tiktok_get_campaigns or tiktok_get_adgroups, which return entities rather than status, so differentiation is only implied.

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

Usage Guidelines3/5

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

"with simple diagnostics" hints at a triage/monitoring use case, but the description never states when to prefer this over tiktok_get_ads, tiktok_get_campaigns, or tiktok_health_check, nor any preconditions. Usage is inferable from the name and context signals rather than stated.

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

tiktok_get_entities_rawtiktok get entities rawA
Read-onlyIdempotent

List TikTok campaigns, ad groups, or ads with caller-selected native fields, filtering, sorting, and pagination. This GET-only escape hatch exposes newly released entity fields without waiting for the MCP's curated schemas.

NameRequiredDescriptionDefault
pageNoPage number to request, starting at 1.
fieldsYesNative provider fields to return. Select only fields supported by the chosen object or report.
pageSizeNoMaximum items requested per page. Follow the returned pagination information for remaining results.
filteringNoNative TikTok filtering object, for example {campaign_ids:["..."]}
orderTypeNoSort direction for the selected ordering field.
entityTypeYesProvider entity type to retrieve.
orderFieldNoProvider field used to order report rows.
advertiserIdYesTikTok advertiser account ID as a string.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, destructiveHint, so the safety profile is fully covered. The description adds the rationale for the tool's existence (uncurated fields, pass-through to the provider) but says nothing extra about rate limits, field-validation failure behavior, or how pageSize interacts with the returned pagination.

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

Conciseness5/5

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

Two sentences, zero filler. The primary action is front-loaded and the 'escape hatch' qualifier follows immediately as supporting context.

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

Completeness5/5

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

Output schema exists, annotations cover safety and world-model semantics, and the schema fully documents all eight parameters including the free-form nested filtering object. The description supplies the only thing structured fields can't: why this raw endpoint exists alongside the curated ones.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter including the nested filtering object and the entityType/orderType enums is already documented in the schema — baseline 3 applies. The description's phrasing ('caller-selected native fields', 'filtering, sorting, pagination') only restates which parameter families exist, adding no format or constraint detail beyond the schema.

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

Purpose4/5

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

States a specific verb and resource ('List TikTok campaigns, ad groups, or ads') plus the distinguishing capability set (native fields, filtering, sorting, pagination). It does not name the overlapping curated siblings (tiktok_get_campaigns, tiktok_get_adgroups, tiktok_get_ads), so the differentiator is only implicit.

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

Usage Guidelines3/5

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

'Escape hatch exposes newly released entity fields without waiting for the MCP's curated schemas' implies the when-to-use case (need fields the curated tools don't yet expose). It never states the inverse — 'use tiktok_get_campaigns instead when a curated schema exists' — nor names which sibling to prefer.

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

tiktok_get_eventstiktok get eventsC
Read-onlyIdempotent

Discover pixel/app events or accessible tracking diagnostics for an advertiser. Uses best-effort endpoint checks plus reporting dimensions as fallback.

NameRequiredDescriptionDefault
bcIdNoOptional Business Center ID. Defaults to TIKTOK_BC_ID/TIKTOK_BUSINESS_CENTER_ID for BC pixel discovery.
appIdNoOptional TikTok app ID for app event lookup when the endpoint is available.
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
endDateNoEnd date YYYY-MM-DD for tracking diagnostics. Defaults to today.
pixelIdNoOptional pixel ID for pixel event lookup.
startDateNoStart date YYYY-MM-DD for tracking diagnostics. Defaults to 7 days ago.
advertiserIdYesTikTok advertiser ID

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds a genuinely useful caveat that results are best-effort and may be synthesized from reporting dimensions, but it is phrased in jargon and never says what that means for the caller (e.g. partial or approximate data, empty results when an endpoint is unavailable).

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

Conciseness4/5

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

Two sentences, no filler, with the dual purpose front-loaded before the implementation caveat. Slightly penalized because the second sentence is compression-heavy jargon that trades clarity for brevity.

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

Completeness3/5

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

With an output schema present and full parameter documentation, the return shape and inputs are covered elsewhere. What is missing is guidance on the two discovery paths (pixel vs app vs diagnostics), which is the main decision an agent faces with this 7-parameter tool.

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

Parameters3/5

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

Schema description coverage is 100% across all 7 parameters, including pixelId, appId, bcId, and the date range, so the schema carries the semantic load. The description mentions neither which parameters select which mode nor any interaction between them, so it adds nothing on top of a fully documented schema — baseline 3.

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

Purpose3/5

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

It names a verb ('Discover') and resources ('pixel/app events', 'tracking diagnostics'), but bundles two loosely related capabilities into one tool without clarifying which mode applies. It also fails to distinguish itself from close siblings like tiktok_get_pixels, so an agent cannot tell from the description alone which to pick.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance, no exclusions, and no named alternative. The clause about 'best-effort endpoint checks plus reporting dimensions as fallback' describes internal behavior rather than telling the agent when this tool is the right choice over tiktok_get_pixels or tiktok_get_audience_report.

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

tiktok_get_insightstiktok get insightsA
Read-onlyIdempotent

Query TikTok Ads performance insights using the current native/calculated metric catalog and query planning. Use tiktok://metrics resource to see available metrics. Use tiktok://dimensions for dimensions. Age/gender dimensions route automatically to AUDIENCE reports via tiktok_get_audience_report, including campaign/ad group levels. Other dimensions use the BASIC planner. Multiple audience breakdowns remain separate reports, never joined.

NameRequiredDescriptionDefault
pageNoAUDIENCE report page; follow nextPage.
adIdsNoRestrict AUCTION_AD reports to these ad IDs, including daily trends.
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
endDateYesEnd date YYYY-MM-DD
metricsYesMetric keys from tiktok://metrics (e.g., spend, impressions, clicks)
dataLevelNoTikTok reporting aggregation level. Metrics and dimensions must be compatible with this level.AUCTION_CAMPAIGN
orderTypeNoNative sort direction; defaults to DESC when orderField is selected.
startDateYesStart date YYYY-MM-DD
adgroupIdsNoRestrict audience reports to these ad groups.
dimensionsNoDimension keys from tiktok://dimensions (e.g., stat_time_day, campaign_id)
orderFieldNoOrder the native report before limiting rows. Include this metric in metrics.
reportTypeNoDefaults to AUDIENCE for age/gender, BASIC otherwise. Explicit BASIC with demographics is rejected.
campaignIdsNoRestrict audience reports to these campaigns.
advertiserIdYesTikTok advertiser ID
queryLifetimeNoQuery lifetime metrics (cannot use time dimensions)

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive, openWorld), so the description's extra value is the planner-selection behavior and the key constraint that multiple audience breakdowns stay as separate reports and are never joined. That is a non-obvious result-shape trait an agent would otherwise get wrong. Pagination/row-limit behavior is left to the schema.

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

Conciseness4/5

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

Front-loaded with the core action, then the resource pointers, then the routing exception and the no-join constraint. Every sentence carries information, though 'query planning' is filler jargon that could be dropped.

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

Completeness5/5

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

For a 15-parameter reporting tool with an output schema and full annotation coverage, the description supplies exactly the missing pieces: which resources resolve metric/dimension keys, how age/gender dimensions are routed, and that audience breakdowns are never merged. Nothing an agent needs to call it correctly is absent.

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

Parameters3/5

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

Schema description coverage is 100%, so all 15 parameters including enums and defaults are already documented. The description reinforces reportType auto-defaulting through its routing explanation but adds no syntax or compatibility detail beyond the schema. Baseline 3 applies when the schema carries this much.

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

Purpose4/5

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

States a specific verb and resource (query TikTok Ads performance insights) and names the planner/catalog model it runs against. It also names the sibling it delegates to for age/gender breakdowns (tiktok_get_audience_report), so an agent can separate the two without opening schemas. Slightly abstract wording ('query planning') keeps 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.

Usage Guidelines4/5

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

Gives concrete routing rules: use tiktok://metrics for metric keys, tiktok://dimensions for dimensions, age/gender dimensions automatically go to the AUDIENCE report, everything else uses the BASIC planner. It stops short of stating when to call tiktok_get_audience_report directly versus letting this tool route.

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

tiktok_get_pixelstiktok get pixelsA
Read-onlyIdempotent

List TikTok pixels and, when permissions allow it, pixel event metadata for an advertiser. Falls back with explicit warnings when endpoints are unavailable.

NameRequiredDescriptionDefault
bcIdNoOptional Business Center ID. Defaults to TIKTOK_BC_ID/TIKTOK_BUSINESS_CENTER_ID for BC pixel endpoints.
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
pixelIdsNoOptional pixel IDs/codes to inspect. If omitted, the tool discovers pixels from BC pixel endpoints first, then advertiser pixel/list.
advertiserIdYesTikTok advertiser ID
includeEventsNoAlso try to fetch pixel events for discovered or provided pixel IDs.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive, open-world behavior. The description adds useful context about permission-dependent enrichment and explicit fallback warnings when endpoints are unavailable, though it does not cover pagination or warning format.

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

Conciseness5/5

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

Two sentences, front-loaded with the primary purpose and then the permission-dependent caveat. Every clause contributes without repetition or filler.

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

Completeness4/5

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

An output schema exists, so return values need not be explained. The description covers purpose, permission gating, and fallback behavior, but does not mention the discovery order for pixelIds or bcId defaults, though those are handled by schema descriptions.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents all five parameters including advertiserId, bcId, limit, pixelIds, and includeEvents. The description adds no additional parameter-level meaning beyond what the schema provides, so baseline 3 applies.

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

Purpose4/5

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

The description uses a specific verb ('List') and resource ('TikTok pixels'), and clarifies that pixel event metadata may also be returned. It does not explicitly name a sibling tool, but the scope is clear enough to distinguish this from broader reporting tools.

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

Usage Guidelines3/5

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

It mentions permission-gated behavior and fallback warnings, which implies when the tool can be used. However, it does not say when to choose this over alternatives like tiktok_get_events or tiktok_list_advertisers, leaving selection guidance implicit.

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

tiktok_get_read_endpointtiktok get read endpointA
Read-onlyIdempotent

Advanced GET-only TikTok Business API escape hatch for documented JSON read endpoints not yet modeled by a specialized MCP tool. Relative v1.3 paths and JSON-compatible query parameters are validated; OAuth, mutations, downloads, and lead-record paths are blocked.

NameRequiredDescriptionDefault
endpointYesRelative endpoint such as split_test/result/get, file/video/ad/info, store/list, or business/video/list
parametersNoNative query parameters for this allowlisted read endpoint. Do not provide credentials or account overrides.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A4.4/5.0
Behavior4/5

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

Adds substantive behavior beyond the readOnly/idempotent annotations: relative v1.3 path validation, JSON-compatible parameter validation, and explicit blocking of OAuth, mutations, downloads, and lead-record paths. It does not specify what validation errors look like or how authentication is supplied, which keeps it short of a 5 even with an output schema present.

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

Conciseness5/5

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

Two dense sentences with zero filler, front-loading the escape-hatch purpose before the validation and exclusion rules. Every clause earns its place.

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

Completeness4/5

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

With an output schema, rich annotations, and fully described parameters, the description covers what an agent needs to decide to call this and how to shape inputs. It could clarify what 'documented' means and how blocked/validation failures surface, but the essentials are complete.

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

Parameters3/5

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

Schema description coverage is 100%, so both endpoint and parameters are already documented with examples and the no-credentials constraint. The description only adds the v1.3 relative-path and JSON-compatibility notes, which is marginal value over the schema — baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource: a GET-only escape hatch for documented JSON read endpoints not yet modeled by a specialized MCP tool. The phrase 'not yet modeled by a specialized MCP tool' immediately distinguishes it from every specialized sibling like tiktok_get_campaigns or tiktok_get_insights.

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

Usage Guidelines5/5

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

Explicitly scopes when to use it (unmodeled documented JSON read endpoints) and when not to use it (OAuth, mutations, downloads, lead-record paths are blocked). It also implies the alternative class — specialized MCP tools — for endpoints that are already modeled.

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

tiktok_get_report_rawtiktok get report rawA
Read-onlyIdempotent

Run a native TikTok BASIC or AUDIENCE synchronous report with caller-selected dimensions and metrics. AUDIENCE supports demographics such as age/gender at campaign/adgroup levels; tiktok_get_audience_report provides a guided path. Use when a current API field is not yet in tiktok://metrics; unlike tiktok_get_insights, this tool does not calculate aliases or auto-split incompatible selections.

NameRequiredDescriptionDefault
pageNoPage number to request, starting at 1.
endDateNoLast date of the reporting period, in YYYY-MM-DD format, on or after startDate.
metricsYesNative or documented calculated metric names to request. Check compatibility with the selected dimensions.
pageSizeNoMaximum items requested per page. Follow the returned pagination information for remaining results.
dataLevelYesTikTok reporting aggregation level. Metrics and dimensions must be compatible with this level.
filteringNoNative provider filter expressions; credentials and account overrides are not allowed.
orderTypeNoSort direction for the selected ordering field.
startDateNoFirst date of the reporting period, in YYYY-MM-DD format.
dimensionsYesNative reporting dimensions. Validate compatibility with the selected metrics.
orderFieldNoProvider field used to order report rows.
reportTypeNoNative provider report type; determines supported metrics and dimensions.BASIC
serviceTypeNoTikTok report service category.AUCTION
advertiserIdYesTikTok advertiser account ID as a string.
queryLifetimeNoRequest lifetime reporting instead of the explicit reporting period where TikTok supports it.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower, and the description still adds real behavior: it is synchronous (unlike tiktok_get_async_report_status) and it performs no alias calculation or auto-splitting of incompatible selections, meaning incompatibilities surface to the caller. It does not say how incompatibility manifests (error vs empty result) or how pagination should be followed, which keeps it below a 5.

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

Conciseness5/5

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

Three sentences, front-loaded with what the tool does, then the AUDIENCE/demographics note, then the routing rule against two siblings. No filler and no repetition of schema content.

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

Completeness4/5

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

For a 14-parameter, open-world raw-reporting tool with full schema coverage, rich annotations and an output schema, the description supplies the essentials: scope, when to prefer alternatives, and the no-alias/no-auto-split contract. The remaining gap is that it omits the other reportType values and any note on how incompatible dimension/metric combinations fail, which matters for a raw passthrough tool.

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

Parameters3/5

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

Schema description coverage is 100%, so dimensions, metrics, dataLevel, filtering and pagination are already documented; the baseline of 3 applies. The description adds one genuinely useful nuance — metric names must be native/documented because no alias resolution happens — but it says nothing about filtering, ordering, date range, or queryLifetime beyond what the schema states, and its BASIC/AUDIENCE framing under-describes the reportType parameter.

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

Purpose4/5

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

States a specific verb and resource ('Run a native TikTok ... synchronous report') and specifies that dimensions and metrics are caller-selected, which distinguishes it from the guided/curated siblings. The one weakness is that it names only 'BASIC or AUDIENCE' while the reportType enum also allows PLAYABLE_MATERIAL, CATALOG and BC, so the stated scope is narrower than the tool's actual capability.

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

Usage Guidelines5/5

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

Explicitly gives the selection condition ('Use when a current API field is not yet in tiktok://metrics') and names two alternatives with the reason to prefer them: tiktok_get_audience_report as the guided path for demographics, and tiktok_get_insights as the alias-calculating/auto-splitting option. The agent can route between all three without opening a schema.

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

tiktok_get_search_ads_maturitytiktok get search ads maturityB
Read-onlyIdempotent

Diagnose TikTok Search Ads maturity from keyword/search-term reporting and optional keyword recommendation endpoints. Read-only diagnostics only.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
endDateNoEnd date YYYY-MM-DD. Defaults to today.
dataLevelNoTikTok reporting aggregation level. Metrics and dimensions must be compatible with this level.AUCTION_ADGROUP
startDateNoStart date YYYY-MM-DD. Defaults to 14 days ago.
advertiserIdYesTikTok advertiser ID
seedKeywordsNoOptional seed keywords for keyword recommendation endpoint diagnostics.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so "Read-only diagnostics only" largely restates structured data. The one genuine addition is disclosing which endpoints feed the diagnosis and that the recommendation endpoint is optional, but nothing is said about cost, coverage limits, or what 'maturity' is measured against.

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

Conciseness4/5

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

Two short sentences, front-loaded with purpose, no filler. The second sentence is nearly redundant with the readOnlyHint annotation, which is the only small inefficiency.

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

Completeness3/5

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

Output schema exists so return shape need not be described, but the description leaves the core concept opaque: an agent cannot tell what a 'maturity' diagnosis actually yields or how it differs from a plain keyword report. For a six-parameter diagnostic tool this is adequate but thin.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented and the baseline is 3. The description only implicitly links "optional keyword recommendation endpoints" to seedKeywords and adds no format, default, or interaction details (e.g., how startDate/dataLevel affect the diagnosis) beyond the schema.

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

Purpose4/5

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

The description pairs a specific verb ("Diagnose") with a specific resource ("TikTok Search Ads maturity") and names the data sources used — keyword/search-term reporting plus optional keyword recommendation endpoints. It is clear what the tool does, though it never contrasts itself with near-neighbours like tiktok_search_keywords or tiktok_get_insights, so an agent must infer the boundary.

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

Usage Guidelines3/5

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

"Read-only diagnostics only" gives a soft usage constraint (diagnostic, not reporting/pulling raw data), but there is no explicit when-to-use / when-not-to-use guidance and no named alternative among the many sibling reporting tools. The context is implied rather than stated.

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

tiktok_get_shop_catalog_diagnosticstiktok get shop catalog diagnosticsB
Read-onlyIdempotent

Read-only TikTok Shop/catalog/e-commerce diagnostics. Tries catalog reporting first, then Shop auction metrics, and returns endpoint warnings when catalog permissions are unavailable.

NameRequiredDescriptionDefault
bcIdNoOptional TikTok Business Center ID. Defaults to TIKTOK_BC_ID/TIKTOK_BUSINESS_CENTER_ID, then advertiser discovery.
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
endDateNoEnd date YYYY-MM-DD. Defaults to today.
catalogIdNoOptional catalog ID for product/product-set inventory endpoint attempts.
dimensionNoReporting dimension used to group and compare results.product_id
startDateNoStart date YYYY-MM-DD. Defaults to 14 days ago.
productIdsNoOptional product IDs to filter report rows where supported.
advertiserIdYesTikTok advertiser ID
includeDailyNoAdd stat_time_day to report dimensions where supported.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds real context beyond that: the endpoint-fallback strategy and the fact that missing catalog permissions surface as endpoint warnings rather than an error.

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

Conciseness4/5

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

Two sentences, front-loaded with the read-only diagnostics scope before the fallback detail. Efficient, with no filler, though the fallback clause is dense enough to blur the primary purpose slightly.

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

Completeness3/5

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

An output schema exists, so return values need not be explained. However, for a 9-parameter, multi-endpoint hybrid tool, the description leaves unclear what the diagnostics actually measure and when partial results (warnings) versus real data should be expected.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented in the schema. The description adds no parameter-level meaning (e.g. how catalogId interacts with the fallback path), so the baseline 3 applies.

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

Purpose4/5

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

The description states a specific verb and domain — read-only TikTok Shop/catalog/e-commerce diagnostics — and discloses the fallback chain (catalog reporting first, then Shop auction metrics). It stops short of saying what a 'diagnostic' actually reports, which keeps 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.

Usage Guidelines2/5

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

It says nothing about when to choose this over siblings such as tiktok_get_insights, tiktok_get_report_raw, or tiktok_get_targeting_catalog, which overlap heavily with catalog/e-commerce reporting. The fallback order is internal behavior, not selection guidance.

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

tiktok_get_spark_adstiktok get spark adsC
Read-onlyIdempotent

Return Spark Ads context from ad fields when available, with a conservative fallback if Spark-specific fields are not supported.

NameRequiredDescriptionDefault
adIdsNoOptional ad IDs to inspect.
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
adgroupIdNoOptional ad group ID filter.
advertiserIdYesTikTok advertiser ID

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

C2.8/5.0
Behavior3/5

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

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description does add genuine behavioral context — that it degrades to a conservative fallback when Spark-specific fields are unsupported — but never says what that fallback yields or how an agent should detect it happened, which is the key operational detail.

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

Conciseness3/5

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

A single sentence with no padding, but the trailing fallback clause is vague relative to its length and the sentence is not front-loaded with what the tool actually returns.

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

Completeness3/5

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

An output schema exists, so return shapes need not be restated. Still, for a read tool with four filters and a documented fallback mode, the description leaves the agent without enough information to interpret results or choose the right sibling.

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

Parameters3/5

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

Schema coverage is 100%, so every parameter is already documented in the schema, and the description adds no extra meaning about filtering or scoping behavior. Baseline 3 applies.

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

Purpose3/5

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

It names a verb ('Return') and a resource ('Spark Ads context from ad fields'), but 'Spark Ads context' is loosely defined — an agent cannot tell what fields come back or how this differs from tiktok_get_ads or tiktok_get_spark_organic_joins. The purpose is recognizable but under-specified.

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

Usage Guidelines2/5

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

There is no statement of when to call this instead of tiktok_get_ads, tiktok_get_spark_organic_joins, or the raw endpoints, and no guidance on how adIds vs adgroupId vs advertiserId-only affect the result. Usage is left entirely to inference.

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

tiktok_get_spark_organic_joinstiktok get spark organic joinsC
Read-onlyIdempotent

Join accessible Spark Ads fields with paid page/post reporting and optional organic identity/post endpoints when permissions allow. Read-only only.

NameRequiredDescriptionDefault
adIdsNoOptional ad IDs to inspect.
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
endDateNoEnd date YYYY-MM-DD for page_id reporting. Defaults to today.
adgroupIdNoOptional ad group ID filter.
startDateNoStart date YYYY-MM-DD for page_id reporting. Defaults to 14 days ago.
advertiserIdYesTikTok advertiser ID
includeOrganicEndpointsNoTry identity/post metadata endpoints when Spark IDs are discovered.
includeExperimentalEndpointsNoAlso try undocumented/unstable Organic API endpoint candidates that may return 404. Disabled by default to keep warnings actionable.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so 'Read-only only' is largely redundant. The description does add the meaningful caveat that organic identity/post endpoints are permission-gated, which explains partial results — but it says nothing about how failures surface (e.g. warnings) despite the schema flagging 404-prone experimental endpoints.

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

Conciseness4/5

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

Two short sentences with no padding, and the permission qualifier is placed up front. The phrasing is dense and slightly awkward ('Join accessible Spark Ads fields with paid page/post reporting'), but nothing is wasted.

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

Completeness3/5

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

An output schema exists and all 8 params are documented, so the basics are covered. However, for a tool that merges multiple endpoints with experimental fallbacks, the description should explain the merged shape or degraded-result behavior, which it does not.

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

Parameters3/5

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

Schema coverage is 100%, so every parameter including includeOrganicEndpoints and includeExperimentalEndpoints is already documented in the schema. The description adds no parameter-level meaning beyond what is structured, so the baseline 3 applies.

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

Purpose3/5

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

The description names Spark Ads fields and paid page/post reporting, but 'Join accessible ... fields with ... reporting' is jargon that never says plainly that it returns a merged reporting dataset. It also doesn't distinguish itself from the sibling tiktok_get_spark_ads, which an agent would reasonably consider first.

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

Usage Guidelines2/5

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

'when permissions allow' hints at a precondition but there is no statement of when to pick this over tiktok_get_spark_ads or tiktok_get_report_raw, and no mention of what happens when permissions are missing. Usage 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.

tiktok_get_targetingtiktok get targetingA
Read-onlyIdempotent

Read configured ad group targeting and audience references: custom/lookalike inclusions/exclusions, geo, language, age/gender, placements, interests and behaviors. Supports classic and upgraded Smart+ (smartPlus:true), preserving targeting_spec and automatic targeting settings. Does not infer delivered audiences or hidden Smart+ signals. Use tiktok_get_audiences for audience names/types and tiktok_get_audience_report for delivered demographics.

NameRequiredDescriptionDefault
pageNoPage number to request, starting at 1.
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
smartPlusNoUse true for upgraded Smart+ ad groups: reads their native targeting_spec and exact placements via smart_plus/adgroup/get. No fallback to classic settings.
adgroupIdsNoRestrict TikTok results to these ad group IDs.
campaignIdNoExact TikTok numeric ID, as a string.
advertiserIdYesExact TikTok numeric ID, as a string.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered; the description adds genuinely value-adding behavior: Smart+ support, preservation of targeting_spec and automatic targeting settings, and the caveat that it will not infer delivered audiences or hidden Smart+ signals. It does not describe output shape or pagination behavior, but the output schema covers the former.

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

Conciseness4/5

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

Front-loaded with purpose, then capability, then exclusion, then alternatives — each sentence carries weight. The mid-sentence enumeration of targeting fields is dense but useful rather than padding.

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

Completeness4/5

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

With a full input schema, an output schema and read-only annotations, the description supplies what structured fields cannot: the classic vs. Smart+ distinction and the explicit non-coverage of delivered/hidden signals. Remaining gaps are the unmentioned targeting-catalog sibling and no word on pagination expectations for multi-adgroup reads.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The mention of 'smartPlus:true' and native smart_plus/adgroup/get reads restates what the parameter description already says in detail rather than adding new semantics for the other five parameters.

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

Purpose5/5

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

Specific verb (read) plus resource (configured ad group targeting), followed by an explicit enumeration of the targeting dimensions covered (custom/lookalike, geo, language, age/gender, placements, interests/behaviors). It also names the two nearest siblings it is not, so an agent can distinguish it without opening a schema.

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

Usage Guidelines4/5

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

'Use tiktok_get_audiences for audience names/types and tiktok_get_audience_report for delivered demographics' gives explicit routing plus the negative boundary ('Does not infer delivered audiences'). The closest confusable sibling, tiktok_get_targeting_catalog, is never mentioned, which keeps this just short of full routing coverage.

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

tiktok_get_targeting_catalogtiktok get targeting catalogB
Read-onlyIdempotent

Read TikTok targeting and planning catalogs: locations, languages, interests, behaviors, hashtags, Search Ads keyword ideas/health, devices, carriers, contextual tags, content exclusions, and time zones.

NameRequiredDescriptionDefault
queryNoSearch text used to find matching entries in the selected catalogue.
catalogYesAllowlisted targeting dictionary or catalog to inspect.
parametersNoAdditional native parameters documented for the selected GET endpoint
advertiserIdNoTikTok advertiser account ID as a string.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds that this is a catalog/reference lookup rather than campaign data, which is useful, but says nothing about pagination, result caps, or advertiser-scoped catalog requirements.

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

Conciseness4/5

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

A single front-loaded sentence with the verb and resource first, followed by an enumeration that earns its length by conveying breadth of catalogs. Slightly list-heavy but not padded.

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

Completeness3/5

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

With an output schema and fully described parameters, the definition is mostly self-sufficient. However, for a tool with 17 catalog options where some (search_keyword_ideas, search_campaign_health) presumably require an advertiserId, the description leaves that conditional context and the query-required cases unstated.

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

Parameters3/5

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

Schema coverage is 100%, so all four parameters (including the catalog enum and the free-form 'parameters' object) are already documented, establishing a baseline of 3. The description's catalog list largely restates the enum and adds no new meaning about how query text or the pass-through 'parameters' object behave per catalog.

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

Purpose4/5

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

The description uses a specific verb ('Read') plus a defined resource ('TikTok targeting and planning catalogs') and enumerates the catalog families available, so the scope is concrete. It stops short of distinguishing itself from close siblings such as tiktok_get_targeting or tiktok_search_keywords, so an agent must still infer the boundary.

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

Usage Guidelines3/5

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

Usage is only implied by 'Read ... catalogs' — the description never states when to reach for this tool instead of tiktok_get_targeting (targeting settings) or tiktok_search_keywords (keyword research). No prerequisites (e.g. which catalogs need an advertiserId) are stated.

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

tiktok_get_uploaded_videotiktok get uploaded videoA
Read-onlyIdempotent

Read one uploaded video from this advertiser’s media library. Returns ready only after its media information is available with positive duration and dimensions. Does not upload again.

NameRequiredDescriptionDefault
videoIdYesExact uploaded video ID returned by TikTok.
advertiserIdYesExact TikTok numeric ID as a string, never a rounded JavaScript number.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover readOnly, idempotent, non-destructive behavior, so the bar is lower. The description adds meaningful context beyond annotations: readiness is conditional on positive duration and dimensions, and it clarifies that this call 'Does not upload again.'

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

Conciseness5/5

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

The description is three short sentences, front-loaded with the core action, then the readiness condition, then the non-upload clarification. There is little wasted text.

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

Completeness4/5

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

For a simple two-parameter read tool with an output schema and rich annotations, the description is nearly complete. It explains scope and readiness behavior, though it could explicitly route agents away from list/asset siblings.

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

Parameters3/5

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

Schema description coverage is 100%, and both parameters are already documented as exact TikTok IDs. The description reinforces that the video belongs to 'this advertiser’s media library' but does not add syntax or format details beyond the schema.

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

Purpose4/5

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

The description gives a specific verb and resource: 'Read one uploaded video from this advertiser’s media library.' The phrase 'one uploaded video' helps distinguish it from list-style siblings such as tiktok_list_ad_videos, but no sibling is explicitly named.

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

Usage Guidelines3/5

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

Usage is implied by the scope ('from this advertiser’s media library') and the required advertiserId/videoId pair, but the description never states when to use this instead of tiktok_get_video_assets or tiktok_list_ad_videos. No exclusions or prerequisites are given.

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

tiktok_get_video_assetstiktok get video assetsB
Read-onlyIdempotent

Return ad-linked TikTok video asset metadata from ad/get and video material endpoints when available.

NameRequiredDescriptionDefault
adIdsNoOptional ad IDs to inspect.
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
videoIdsNoOptional video IDs to look up directly in material endpoints.
adgroupIdNoOptional ad group ID filter.
advertiserIdYesTikTok advertiser ID

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds one useful behavioral fact: results are assembled from two endpoint families and only returned 'when available', implying the response may be partial or empty. It does not say what happens when an ad has no video asset or how the two sources are merged.

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

Conciseness4/5

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

A single front-loaded sentence with no padding or redundancy. It is efficient, though the trailing 'when available' is vague enough that it slightly weakens an otherwise tight statement.

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

Completeness4/5

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

An output schema exists, so return-value structure needn't be described, and the annotations carry the safety profile. What remains thin is behavior when no assets are found and how the two sources combine, but for a read-only metadata fetch this is close to complete.

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

Parameters3/5

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

Schema description coverage is 100%, so each of the five parameters is already documented, which sets the baseline at 3. The description adds marginal meaning by implying two lookup paths (ad-linked via adIds versus direct material lookup via videoIds), but does not explain how adIds and videoIds interact or which wins.

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

Purpose4/5

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

The description states a specific verb ('Return') and resource ('ad-linked TikTok video asset metadata'), so the agent knows what it retrieves. However, it doesn't distinguish this from close siblings such as tiktok_list_ad_videos, tiktok_get_asset_urls, or tiktok_get_uploaded_video, leaving overlap ambiguous. Naming the upstream endpoints ('ad/get and video material endpoints') is implementation detail rather than differentiation.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus the many video/creative siblings, nor any stated prerequisites or exclusions. 'When available' is a hedge about data presence, not a usage condition that helps the agent choose.

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

tiktok_get_write_contexttiktok get write contextA
Read-onlyIdempotent

Read the exact TikTok entity, parent settings and advertiser currency/timezone before editing or building a new configuration. Read-only.

NameRequiredDescriptionDefault
levelYesEntity level to inspect.
entityIdYesExact TikTok numeric ID as a string, never a rounded JavaScript number.
smartPlusNoUse the dedicated upgraded Smart+ endpoints rather than classic endpoints.
advertiserIdYesExact TikTok numeric ID as a string, never a rounded JavaScript number.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is known. The description's 'Read-only' merely repeats readOnlyHint; what it does add is scope of returned context (parent settings, currency/timezone), but it offers no further behavioral detail such as auth or rate-limit traits.

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

Conciseness5/5

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

Two short sentences with no filler, and the purpose plus timing ('before editing') is front-loaded. Every clause earns its place.

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

Completeness4/5

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 need not be explained, and the description covers the pre-write use case well. It could be slightly clearer about what 'parent settings' includes or how smartPlus affects the read, but nothing critical for invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100% and each parameter already has a description, including the important string-not-number ID constraint and the smartPlus flag. The description adds no parameter-level meaning beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb (read) plus the resources it returns: the exact entity, parent settings, and advertiser currency/timezone. This distinguishes it from generic list/get tools like tiktok_get_entities_raw or tiktok_get_campaigns, though 'exact TikTok entity' is slightly abstract without saying which fields are returned.

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

Usage Guidelines4/5

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

Explicitly says when to call it: 'before editing or building a new configuration.' It does not name an alternative to use instead or state when not to use it, but the pre-write workflow context is clear enough for an agent.

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

tiktok_health_checktiktok health checkA
Read-onlyIdempotent

Read-only health check for TikTok credentials, accessible advertisers, and advertiser info. Never returns tokens or secrets.

NameRequiredDescriptionDefault
advertiserIdNoAdvertiser ID to verify. Defaults to TIKTOK_ADVERTISER_ID, then the first accessible advertiser.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, openWorld, so the safety profile is covered. The description adds a genuinely useful guarantee beyond the schema: 'Never returns tokens or secrets', which tells the agent the output is safe to surface. It stops short of saying what happens on auth failure or how the check reports problems.

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

Conciseness5/5

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

Two tight sentences, front-loaded with the read-only scope and the key security guarantee. No filler or restatement of the title.

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

Completeness4/5

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

With an output schema present and annotations covering the safety profile, the description needs only to frame purpose and constraints, which it does. It could be slightly more complete by noting failure modes (e.g., whether an invalid advertiser ID errors or is reported in the response), but nothing essential is missing.

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

Parameters3/5

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

The single optional advertiserId parameter is fully documented in the schema (100% coverage), including its fallback chain to TIKTOK_ADVERTISER_ID and then the first accessible advertiser. The description adds no parameter guidance, so baseline 3 applies since the schema carries the load.

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

Purpose5/5

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

States a specific diagnostic verb ('health check') plus the exact resources it inspects: credentials, accessible advertisers, and advertiser info. This distinguishes it from siblings like tiktok_get_advertiser_info and tiktok_list_advertisers, which return data rather than validating access.

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

Usage Guidelines3/5

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

The implied use case (verify credentials/advertiser access before running other calls) is clear from 'health check', but the description never states when to prefer this over tiktok_list_advertisers or tiktok_get_advertiser_info, nor any prerequisites. 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.

tiktok_list_ad_imagestiktok list ad imagesA
Read-onlyIdempotent

List the advertiser's whole image library (file/image/ad/search): file name, dimensions, signature, carousel usability, and a publicly served image URL signed for roughly thirty days (image_url_expires_at gives the exact instant).

NameRequiredDescriptionDefault
pageNoPage number (page_info.total_page in the response gives the bound)
pageSizeNoItems per page (TikTok caps file library pages at 100)
advertiserIdYesTikTok advertiser ID

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior, so the bar is lower — and the description still adds real value by disclosing that image URLs expire in roughly thirty days and that image_url_expires_at carries the exact instant. That is a non-obvious operational trait an agent must know before caching or reusing a URL. It stops short of covering pagination behavior across the whole library.

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

Conciseness4/5

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

A single front-loaded sentence with zero filler; the resource and scope come first and the returned-field detail follows. The parenthetical endpoint path and expiry clause are dense but each earns its place.

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

Completeness4/5

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

With an output schema present, the description need not enumerate return values, yet it summarizes the key ones and adds the expiry caveat that the output schema would not make obvious on its own. Complete enough for a read-only paginated list tool; only the absence of sibling routing keeps it from a 5.

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

Parameters3/5

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

Schema coverage is 100%, with all three parameters documented including bounds and TikTok's 100-item page cap, so the baseline of 3 applies. The description adds nothing about advertiserId scope or paging strategy beyond what the schema already states.

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

Purpose4/5

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

Names a specific verb and resource ("List the advertiser's whole image library") and even cites the backing endpoint (file/image/ad/search), so the agent knows exactly what is returned. Sibling differentiation is implicit rather than explicit — tiktok_list_ad_videos is the obvious contrast, but the description never names it.

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

Usage Guidelines3/5

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

The word "whole" implies an unfiltered full-library enumeration, which is useful context, but there is no statement of when to reach for this versus tiktok_list_ad_videos, tiktok_get_creatives, or tiktok_get_asset_urls. No exclusions or prerequisites are given, so usage must be inferred.

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

tiktok_list_advertiserstiktok list advertisersA
Read-onlyIdempotent

List the TikTok advertiser accounts accessible with the current token, limited to TIKTOK_ADVERTISER_IDS. Returns advertiser ID, name, and status.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds the useful disclaimer that results are restricted to the TIKTOK_ADVERTISER_IDS set (i.e., may not be the token's full access), but says nothing about pagination, ordering, or what happens when the allowlist is empty.

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

Conciseness5/5

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

Two sentences, scope first, return fields second. No filler and nothing is buried.

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

Completeness4/5

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

With no parameters and an output schema present, the description only needs to convey scope and this does so in one clause. The remaining gap is what the TIKTOK_ADVERTISER_IDS restriction actually means operationally.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to clarify; the baseline for a parameterless tool is 4 and the sentence about token-scoped access is a reasonable substitute for param guidance.

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

Purpose4/5

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

States a specific verb and resource (list TikTok advertiser accounts) and adds scope ('accessible with the current token'), which separates it from the singular tiktok_get_advertiser_info. The one weakness is the unexplained 'limited to TIKTOK_ADVERTISER_IDS' reference, which is opaque without external knowledge of config.

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

Usage Guidelines3/5

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

Usage is implied by 'list ... accessible with the current token', so an agent can infer discovery use, but there is no explicit statement of when to call this versus tiktok_get_advertiser_info or the many other tiktok_get_* retrieval tools.

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

tiktok_list_ad_videostiktok list ad videosA
Read-onlyIdempotent

List the advertiser's whole video library (file/video/ad/search): file name, duration, dimensions, signature, and publicly served preview and cover URLs. Every TikTok URL is signed and expires after roughly six hours: re-resolve with tiktok_get_asset_urls before use.

NameRequiredDescriptionDefault
pageNoPage number (page_info.total_page in the response gives the bound)
pageSizeNoItems per page (TikTok caps file library pages at 100)
advertiserIdYesTikTok advertiser ID

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real value beyond structured data by disclosing that every TikTok URL is signed and expires after roughly six hours, with a remediation path — a behavioral trait no annotation or schema field conveys.

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

Conciseness5/5

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

Two sentences, both load-bearing: the first names the resource and output fields, the second carries the expiry warning and remedy. Nothing is repeated and the critical constraint is easy to spot.

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

Completeness4/5

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

With an output schema present, the description need not explain return values, and pagination is covered in the schema. The main remaining gap is that it never positions this tool relative to the other video-retrieval siblings, which an agent would need to choose correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so page, pageSize, and advertiserId are already fully documented in the schema. The description adds no syntax or semantics for the parameters beyond what the schema supplies, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ("List the advertiser's whole video library") and enumerates the returned fields, so the agent knows what comes back without opening the output schema. It does not distinguish this listing tool from close siblings like tiktok_get_video_assets or tiktok_get_uploaded_video, which is the main clarity gap.

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

Usage Guidelines3/5

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

The description does route the agent to tiktok_get_asset_urls for re-resolving expired URLs, which is genuine conditional guidance. However, it gives no when-to-use/when-not guidance against the several sibling tools that also surface videos (tiktok_get_video_assets, tiktok_get_uploaded_video), so the core selection decision is left to inference.

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

tiktok_search_keywordstiktok search keywordsB
Read-onlyIdempotent

Get keyword suggestions for TikTok Search Ads. Returns recommended keywords with search volume estimates.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
keywordsYesSeed keywords to get suggestions for
advertiserIdYesTikTok advertiser ID

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds the useful detail that results are suggestions with search volume estimates, but says nothing about how the seed keywords are expanded or how many suggestions per seed.

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

Conciseness5/5

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

Two short sentences, purpose and return payload front-loaded, zero filler. Nothing to cut.

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

Completeness3/5

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

An output schema exists, so return values need not be described, and annotations cover safety. What's missing is how seed keywords drive the results and any usage framing, which matters for an agent deciding when to call this instead of a reporting tool.

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

Parameters3/5

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

Schema description coverage is 100%, so advertiserId, keywords and limit are already documented in the schema. The description only implies that the keywords parameter acts as seeds; it adds no format, count, or matching guidance beyond structured fields.

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

Purpose4/5

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

States a specific verb and resource ("Get keyword suggestions for TikTok Search Ads") plus the return content ("recommended keywords with search volume estimates"). No sibling tool covers keyword research, so the tool is implicitly distinguishable, though the description never names that contrast.

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

Usage Guidelines2/5

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

No when-to-use, when-not-to-use, or alternative guidance is given; the Search Ads context is the only usage signal. An agent must infer that this belongs in a keyword-research/planning step rather than reporting, and nothing explains prerequisites like needing a valid advertiserId.

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

tiktok_validate_querytiktok validate queryA
Read-onlyIdempotent

Validate a TikTok metric/dimension combination BEFORE executing. Checks dimension grouping rules, lifetime compatibility, and metric/dimension compatibility.

NameRequiredDescriptionDefault
metricsYesMetric keys to validate
dataLevelNoTikTok reporting aggregation level. Metrics and dimensions must be compatible with this level.AUCTION_CAMPAIGN
dimensionsNoDimension keys to validate
reportTypeNoNative provider report type; determines supported metrics and dimensions.
queryLifetimeNoRequest lifetime reporting instead of the explicit reporting period where TikTok supports it.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description adds real value by disclosing the three validation rule sets this preflight applies. It stops short of saying whether violations surface as an error or as a warnings payload — though the output schema may cover that.

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

Conciseness5/5

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

Two sentences, zero waste, with the preflight timing front-loaded before the list of checks. Nothing repeats the name or title.

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

Completeness5/5

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

An output schema exists and annotations cover the read-only profile, so the description only needs to explain scope and purpose — which it does. For a 5-param, fully documented validation tool this is sufficient to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, including enum documentation for dataLevel and reportType, so the schema carries the semantics. The description only loosely echoes metrics/dimensions and 'lifetime compatibility' (queryLifetime) without adding format or constraint detail beyond the schema.

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

Purpose4/5

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

States a specific verb (Validate) and a specific resource (TikTok metric/dimension combination), and enumerates the rule classes checked (dimension grouping, lifetime compatibility, metric/dimension compatibility). It clearly is not a data-fetching sibling like tiktok_get_insights, though it never names the execution tool it gates.

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

Usage Guidelines3/5

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

'BEFORE executing' establishes timing relative to a query run, which is better than pure implication. But it does not name the sibling to run afterward (presumably tiktok_get_insights), nor state what to do when validation fails, so the guidance stays implicit.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 35 tool updatesv2.1.1
    • Changedtiktok_get_adgroups6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / adgroupIds / items / $ref
        Removed value: -"#/properties/campaignId"
      • addedInput schema / properties / adgroupIds / items / description
        Added value: +"Exact TikTok numeric ID, as a string."
      • addedInput schema / properties / adgroupIds / items / pattern
        Added value: +"^\\d+$"
      • addedInput schema / properties / adgroupIds / items / type
        Added value: +"string"
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_ads2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_advertiser_info2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_asset_urls2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_async_report_status2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_audience_details2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_audience_overlap2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_audience_report15 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / adIds / $ref
        Removed value: -"#/properties/campaignIds"
      • addedInput schema / properties / adIds / items
        Added value: +{
        +  "description": "Exact TikTok numeric ID, as a string.",
        +  "pattern": "^\\d+$",
        +  "type": "string"
        +}
      • addedInput schema / properties / adIds / maxItems
        Added value: +100
      • addedInput schema / properties / adIds / minItems
        Added value: +1
      • addedInput schema / properties / adIds / type
        Added value: +"array"
      • removedInput schema / properties / adgroupIds / $ref
        Removed value: -"#/properties/campaignIds"
      • addedInput schema / properties / adgroupIds / items
        Added value: +{
        +  "description": "Exact TikTok numeric ID, as a string.",
        +  "pattern": "^\\d+$",
        +  "type": "string"
        +}
      • addedInput schema / properties / adgroupIds / maxItems
        Added value: +100
      • addedInput schema / properties / adgroupIds / minItems
        Added value: +1
      • addedInput schema / properties / adgroupIds / type
        Added value: +"array"
      • removedInput schema / properties / endDate / $ref
        Removed value: -"#/properties/startDate"
      • addedInput schema / properties / endDate / pattern
        Added value: +"^\\d{4}-\\d{2}-\\d{2}$"
      • addedInput schema / properties / endDate / type
        Added value: +"string"
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_audiences2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_campaigns2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_carousel_music2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_creative_fatigue_recipes3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / minImpressions / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_creatives2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_delivery_status2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_entities_raw8 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / filtering / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / orderField / $ref
        Removed value: -"#/properties/fields/items"
      • addedInput schema / properties / orderField / maxLength
        Added value: +120
      • addedInput schema / properties / orderField / minLength
        Added value: +1
      • addedInput schema / properties / orderField / pattern
        Added value: +"^[A-Za-z][A-Za-z0-9_]*$"
      • addedInput schema / properties / orderField / type
        Added value: +"string"
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_events2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_insights2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_pixels2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_read_endpoint3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / parameters / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_report_raw22 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / endDate / $ref
        Removed value: -"#/properties/startDate"
      • addedInput schema / properties / endDate / pattern
        Added value: +"^\\d{4}-\\d{2}-\\d{2}$"
      • addedInput schema / properties / endDate / type
        Added value: +"string"
      • removedInput schema / properties / filtering / items / additionalProperties
        Removed value: -false
      • removedInput schema / properties / filtering / items / properties / field_name / $ref
        Removed value: -"#/properties/dimensions/items"
      • addedInput schema / properties / filtering / items / properties / field_name / maxLength
        Added value: +120
      • addedInput schema / properties / filtering / items / properties / field_name / minLength
        Added value: +1
      • addedInput schema / properties / filtering / items / properties / field_name / pattern
        Added value: +"^[A-Za-z][A-Za-z0-9_]*$"
      • addedInput schema / properties / filtering / items / properties / field_name / type
        Added value: +"string"
      • changedInput schema / properties / filtering / items / properties / filter_value / anyOf
        Previous value: -[
        -  {
        -    "maxLength": 2000,
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "maxLength": 500,
        -      "type": "string"
        -    },
        -    "maxItems": 500,
        -    "type": "array"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "end": {
        -        "maxLength": 100,
        -        "type": "string"
        -      },
        -      "start": {
        -        "maxLength": 100,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "start",
        -      "end"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 2000,
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "maxLength": 500,
        +      "type": "string"
        +    },
        +    "maxItems": 500,
        +    "type": "array"
        +  },
        +  {
        +    "properties": {
        +      "end": {
        +        "maxLength": 100,
        +        "type": "string"
        +      },
        +      "start": {
        +        "maxLength": 100,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "start",
        +      "end"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties / metrics / items / $ref
        Removed value: -"#/properties/dimensions/items"
      • addedInput schema / properties / metrics / items / maxLength
        Added value: +120
      • addedInput schema / properties / metrics / items / minLength
        Added value: +1
      • addedInput schema / properties / metrics / items / pattern
        Added value: +"^[A-Za-z][A-Za-z0-9_]*$"
      • addedInput schema / properties / metrics / items / type
        Added value: +"string"
      • removedInput schema / properties / orderField / $ref
        Removed value: -"#/properties/dimensions/items"
      • addedInput schema / properties / orderField / maxLength
        Added value: +120
      • addedInput schema / properties / orderField / minLength
        Added value: +1
      • addedInput schema / properties / orderField / pattern
        Added value: +"^[A-Za-z][A-Za-z0-9_]*$"
      • addedInput schema / properties / orderField / type
        Added value: +"string"
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_search_ads_maturity2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_shop_catalog_diagnostics2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_spark_ads2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_spark_organic_joins2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_targeting6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / adgroupIds / items / $ref
        Removed value: -"#/properties/campaignId"
      • addedInput schema / properties / adgroupIds / items / description
        Added value: +"Exact TikTok numeric ID, as a string."
      • addedInput schema / properties / adgroupIds / items / pattern
        Added value: +"^\\d+$"
      • addedInput schema / properties / adgroupIds / items / type
        Added value: +"string"
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_targeting_catalog3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / parameters / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_uploaded_video2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_video_assets2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_get_write_context2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_health_check2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_list_ad_images2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_list_ad_videos2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_list_advertisers1 field changed
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_search_keywords2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedtiktok_validate_query2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {},
        -    "type": "object"
        -  },
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  2. 35 tool updatesv2.0.1
    • First observedtiktok_get_adgroups
    • First observedtiktok_get_ads
    • First observedtiktok_get_advertiser_info
    • First observedtiktok_get_asset_urls
    • First observedtiktok_get_async_report_status
    • First observedtiktok_get_audience_details
    • First observedtiktok_get_audience_overlap
    • First observedtiktok_get_audience_report
    • First observedtiktok_get_audiences
    • First observedtiktok_get_campaigns
    • First observedtiktok_get_carousel_music
    • First observedtiktok_get_creative_fatigue_recipes
    • First observedtiktok_get_creatives
    • First observedtiktok_get_delivery_status
    • First observedtiktok_get_entities_raw
    • First observedtiktok_get_events
    • First observedtiktok_get_insights
    • First observedtiktok_get_pixels
    • First observedtiktok_get_read_endpoint
    • First observedtiktok_get_report_raw
    • First observedtiktok_get_search_ads_maturity
    • First observedtiktok_get_shop_catalog_diagnostics
    • First observedtiktok_get_spark_ads
    • First observedtiktok_get_spark_organic_joins
    • First observedtiktok_get_targeting
    • First observedtiktok_get_targeting_catalog
    • First observedtiktok_get_uploaded_video
    • First observedtiktok_get_video_assets
    • First observedtiktok_get_write_context
    • First observedtiktok_health_check
    • First observedtiktok_list_ad_images
    • First observedtiktok_list_ad_videos
    • First observedtiktok_list_advertisers
    • First observedtiktok_search_keywords
    • First observedtiktok_validate_query

TDQS

B3.1/5.0

Scored across 35 tools

Disambiguation3/5

Several clusters overlap: tiktok_get_insights / tiktok_get_report_raw / tiktok_get_audience_report all do reporting; tiktok_get_campaigns/adgroups/ads overlap with tiktok_get_entities_raw; and tiktok_get_read_endpoint is a generic escape hatch shadowing everything. Detailed descriptions do a lot of disambiguation work and audience/targeting tools are meaningfully separated, but the raw escape hatches and multiple video-asset tools (get_video_assets vs list_ad_videos vs get_uploaded_video) still create ambiguous boundaries.

Naming Consistency4/5

All tools use a tiktok_ prefix and a consistent verb_noun pattern (get_*, list_*, search_*, validate_*). The only deviation is the noun-phrase tiktok_health_check, which is a minor break rather than a pattern change.

Tool Count2/5

35 tools is well above the 25-tool threshold and the surface is heavily padded with one-off diagnostics and escape hatches (shop_catalog, search_ads_maturity, spark_organic_joins, creative_fatigue_recipes, read_endpoint, get_entities_raw). Many of these are speculative probes that could be consolidated under fewer, broader tools.

Completeness2/5

The entire surface is read-only: no create/update/delete tools for campaigns, ad groups, ads, budgets, or audiences, even though tiktok_get_write_context implies editing workflows exist elsewhere. Reporting, targeting, and diagnostics are well-covered, but the missing mutation lifecycle is a major gap for an ads management server.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Self-hosted Google Ads MCP server: 35 read tools and 10 opt-in, preview-first write tools. Maintained source relocated from getmcpads-com/google-ads-mcp-server; npm package remains @getmcpads/google-ads-mcp-server.
    35
    593 npm
    1
    Apache 2.0
  • A
    license
    B
    quality
    A
    maintenance
    Self-hosted Meta Ads MCP server with 41 read tools and 23 opt-in, preview-first write tools. Maintained source relocated from getmcpads-com/meta-ads-mcp-server; npm package remains @getmcpads/meta-ads-mcp-server.
    42
    623 npm
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Self-hosted Pinterest Ads MCP server with 28 read tools and 25 opt-in, preview-first write tools. Maintained source relocated to get-mcp-ads/pinterest-ads-mcp-server; npm package remains @getmcpads/pinterest-ads-mcp-server.
    535 npm
    Apache 2.0
  • A
    license
    B
    quality
    A
    maintenance
    Self-hosted Google Analytics 4 MCP server with 27 read-only tools for the Google Analytics Data and Admin APIs. Maintained source relocated to get-mcp-ads/google-analytics-mcp-server; npm package remains @getmcpads/google-analytics-mcp-server.
    27
    530 npm
    Apache 2.0