Skip to main content
Glama

TikTok MCP

npm License CI YouTube X

TikTok MCP server for Claude Code and AI agents. Profile, video stats, top posts, publishing, drafts and post status for your own account.

It reads your real numbers. Views, likes, comments and shares per post, straight from TikTok rather than a scraper's guess.

It publishes too: a video or a photo carousel, or a draft into your TikTok inbox that you finish in the app.

14 tools, and everything is scoped to accounts you connect yourself.

Built and maintained by Navid Moazzez.

You:    Which of my TikToks beat my median view count this year, and what do they share?

Claude: [stats_summary → top_videos]
        Median is 4,180 views across your last 60. Eleven beat it.

        Nine of the eleven open on a face with no text overlay. Your
        median post opens on a title card. The two exceptions are both
        under 12 seconds.

        Your best is 214k, which is why your mean reads 21,600 and is
        not a number any other post of yours has come close to.

Contents

Section

1

What you can ask it

Real prompts, not features

2

Quick install

The package, no account needed

3

Set up your TikTok app

Every click

4

Connect your client

Claude Code, Desktop, Cursor

5

Check it worked

doctor

6

Tools

All 14, by what they reach

7

Writing safely

What is guarded and what is not

8

Notes and gotchas

The platform's real behaviour

9

Troubleshooting

Symptom to cause

10

FAQ

Including what an MCP server is

Related MCP server: TikTok Complete MCP Server

1. What you can ask it 💬

  • Which of my TikToks beat my median view count, and what do they have in common?

  • What is my actual engagement rate per post, not the number the app shows me?

  • How often am I posting, and has that changed over the last 60 videos?

  • Find every video where I mentioned the AI OS and tell me how they performed.

  • Rank my last 200 posts by shares rather than views. Shares are the ones that travel.

  • Draft a TikTok from this MP4 and put it in my inbox so I can review it on my phone.

  • Publish this photo carousel with the first image as the cover, comments off.

  • Did the video I posted twenty minutes ago clear moderation yet?

  • My follower count and total likes, then work out my average views per follower.

The thing you cannot do anywhere else: rank your own catalogue by a metric TikTok's app will not sort by. The app shows you a grid ordered by date. Asking "which posts actually travelled, by shares, across two hundred videos" has no answer inside TikTok, and it is one call here.

2. Quick install ⚡

Node 20 or newer. Nothing else.

npx -y @thenavidm/tiktok-mcp --version

That is the whole install. npx fetches it on demand, so there is nothing to update later.

Installing the package needs no TikTok account. Only the next section does.

3. Set up your TikTok app 🔑

TikTok has no personal access tokens. Every integration goes through an app you create, which is more work than most services and is the same for everybody.

TIP

UseSandbox mode while you set this up. A sandbox app works immediately with no review, against TikTok accounts you add to it yourself. Only switch to Production when you want other people to use it.

Before you start

You need

Check with

If missing

Node 20 or newer

node -v

nodejs.org

A TikTok developer account

developers.tiktok.com

Sign up with your email, it is free

The TikTok account you want to connect

Any account, personal or business

Step 1: Create the app

  1. Log in at developers.tiktok.com, click the profile icon in the navigation bar, then Manage apps.

  2. Click Connect an app.

  3. When asked to Select the app owner, pick an organization if you have one, or your individual developer account.

  4. Fill in the app name, icon and description. TikTok shows the description on the screen where you approve access, so write it for yourself.

  5. Under Platforms, select Desktop. This server runs on your machine, which is what that platform means.

Step 2: Add Login Kit and set the redirect URI

  1. In the Products section click Add products, and add Login Kit.

  2. In the Login Kit settings, set the Redirect URI to exactly:

    http://127.0.0.1:8481/callback/

TikTok allows loopback redirect URIs for desktop apps, which is what lets the next step happen entirely in your terminal. The trailing slash is part of the URI.

Step 3: Add the scopes

In the Scopes section, add these four:

user.info.basic
user.info.profile
user.info.stats
video.list

Add these two as well, but only if you want to publish. They need the Content Posting API product added too:

video.upload
video.publish
IMPORTANT

Only ask for scopes your app actually has. Sending an unapproved scope to TikTok's authorize URL fails the whole sign-in, not just that one permission.

Step 4: Get your refresh token

Copy the Client key and Client secret from the Credentials section of the app page, then:

export TIKTOK_CLIENT_KEY=your_client_key
export TIKTOK_CLIENT_SECRET=your_client_secret

npx -y @thenavidm/tiktok-mcp auth

It prints a URL. Open it, approve the access, and the terminal prints a refresh token valid for about 365 days. Add --publish if you added the publishing scopes.

Step 5: Verify a domain, only if you will publish

TikTok downloads media from a URL rather than accepting an upload, and it will only pull from a domain you have proved you own.

  1. Click URL properties at the top of the app page.

  2. Click Verify properties.

  3. Verify by Domain or by URL prefix, and follow the instructions shown.

Skip this if you are only reading, and skip it if you only use the drafts tools.

Revoking access later

Call the revoke_access tool, or remove the app from Settings, Security and permissions, Manage app permissions in the TikTok app.

4. Connect your client 🔌

Claude Code

claude mcp add tiktok \
  -e TIKTOK_CLIENT_KEY=your_client_key \
  -e TIKTOK_CLIENT_SECRET=your_client_secret \
  -e TIKTOK_REFRESH_TOKEN=your_refresh_token \
  -- npx -y @thenavidm/tiktok-mcp@latest

Add --scope user to make it available in every project rather than the current one.

Claude Desktop

Platform

Config file

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "tiktok": {
      "command": "npx",
      "args": ["-y", "@thenavidm/tiktok-mcp@latest"],
      "env": {
        "TIKTOK_CLIENT_KEY": "your_client_key",
        "TIKTOK_CLIENT_SECRET": "your_client_secret",
        "TIKTOK_REFRESH_TOKEN": "your_refresh_token"
      }
    }
  }
}
TIP

Claude Desktop does not inherit your shell PATH, so a barenpx can fail silently. Use the absolute path from which npx. Then quit the app completely rather than closing the window.

Cursor

.cursor/mcp.json, same shape as Claude Desktop, key mcpServers.

Windsurf

~/.codeium/windsurf/mcp_config.json, key mcpServers.

VS Code

.vscode/mcp.json. The key is servers, not mcpServers, and each entry takes "type": "stdio".

Codex CLI

~/.codex/config.toml:

[mcp_servers.tiktok]
command = "npx"
args = ["-y", "@thenavidm/tiktok-mcp@latest"]

[mcp_servers.tiktok.env]
TIKTOK_CLIENT_KEY = "your_client_key"
TIKTOK_CLIENT_SECRET = "your_client_secret"
TIKTOK_REFRESH_TOKEN = "your_refresh_token"

Gemini CLI

~/.gemini/settings.json, key mcpServers.

Everything else

Any stdio MCP client takes the same three things: the command npx, the args above, and the env block.

Self-hosted over HTTP

npx -y @thenavidm/tiktok-mcp@latest --http --port 8000

It binds 127.0.0.1 and refuses any other host without TIKTOK_HTTP_TOKEN set, because anything that can reach the port can publish to the connected account.

More than one account

TIKTOK_ACCOUNTS=personal:refresh_token_one,brand:refresh_token_two

Then pass account: "brand" on any tool. Run auth once per account to get each token.

5. Check it worked 🩺

npx -y @thenavidm/tiktok-mcp@latest doctor

It tests every configured account, names which scopes were granted, and says which tools are unavailable and why.

The two failures that actually happen:

It says

Do this

token rejected

Your refresh token expired or was revoked. Run auth again.

publishing unavailable

The account never granted video.publish. Add the Content Posting API product, then auth --publish.

6. Tools 🛠️

Your account

Tool

list_accounts

Every account configured, and the name to target it by

get_profile

Username, bio, verified flag, followers, total likes, video count

revoke_access

Hand the token back to TikTok. Needs confirm

Your videos

Tool

list_videos

Your posts newest first, with views, likes, comments, shares and engagement rate. Pages automatically

get_videos

Up to 20 by id, and the way to refresh an expired cover image URL

top_videos

Rank by views, likes, comments, shares or engagement rate

search_my_videos

Find your posts by text in the title or description

stats_summary

Totals, mean, median, 90th percentile and posting cadence

Publishing — needs video.publish or video.upload

Tool

get_creator_info

Which privacy levels this account can post at. Call it first

post_video

Publish a video from a public URL. Needs confirm

post_photos

Publish a carousel of up to 35 images. Needs confirm

send_video_to_drafts

Send a video to your TikTok inbox to finish in the app

send_photos_to_drafts

Send photos to your inbox

get_post_status

Track a post through download, moderation and publication

7. Writing safely 🛟

Writes work by default. Publishing is the point of the tool.

The three actions that cannot be undone from a chat window take confirm: true: post_video, post_photos and revoke_access. Drafts do not, because they land in your own inbox and go nowhere until you finish them.

Variable

Effect

TIKTOK_READ_ONLY=1

Removes all six write tools from the list entirely

TIKTOK_ALLOW_DESTRUCTIVE=0

Keeps drafts, removes publishing

TIKTOK_AUDIT_LOG=<path>

One JSON line per attempted write, allowed and blocked

Captions and bios reach the model fenced and labelled as somebody else's words. That framing helps and it is not a guarantee. For an agent working unattended, TIKTOK_READ_ONLY=1 is the real defence.

8. Notes and gotchas ⚠️

  • It can only see your own account. TikTok's official API has no endpoint for anybody else's profile, videos, comments, followers, hashtags or search. Nothing here answers a question about a competitor or a trend, and no API key changes that.

  • There is no comments API. You cannot read or reply to comments on your own posts through TikTok's official API.

  • Access tokens live 24 hours. The server refreshes them for you. The refresh token behind it lasts 365 days, and rotates each time it is used.

  • An unaudited app posts privately. Until TikTok audits your app, every post lands private whatever privacy level you pass. Sandbox apps cannot post publicly at all.

  • A public URL is not enough to publish from. TikTok pulls media only from a domain verified under URL properties. An unverified domain fails with url_ownership_unverified however reachable the file is.

  • privacy_level must come from get_creator_info. TikTok rejects a value that is not in that account's current list rather than falling back to something safe.

  • Publishing returns a job, not a post. Poll get_post_status. A public post reports no post id until moderation clears it, usually a minute and sometimes hours.

  • Cover image URLs expire after 6 hours. Re-fetch with get_videos rather than storing the link.

  • Five pending drafts per 24 hours. TikTok caps unpublished API drafts per account.

  • A photo post's title caps at 90 characters, far shorter than a video caption's 2200. The long text belongs in description.

  • Rate limits are per account: six posting calls a minute, thirty status checks, twenty creator-info queries.

  • Only public videos are visible. Private and draft videos do not appear in list_videos.

9. Troubleshooting 🔧

Run doctor first. It checks every account and names what is unavailable.

Symptom

Cause

scope_not_authorized

The account never granted that scope. Re-run auth, with --publish if you need posting

Token rejected on every call

The refresh token expired after 365 days, or you revoked the app

redirect_uri error during auth

The URI in your app is not byte-identical to http://127.0.0.1:8481/callback/, usually the trailing slash

auth hangs, never returns

Port 8481 is taken. Run auth --port 9000 and register that URI too

url_ownership_unverified

The media domain is not verified under URL properties

privacy_level_option_mismatch

You passed a level not in get_creator_info, often after the account went private

Post says complete, has no post id

Normal. Moderation has not cleared it yet

unaudited_client_can_only_post_to_private_accounts

Expected on a sandbox or unaudited app. Post SELF_ONLY, or apply for the audit

Only nine tools appear

TIKTOK_READ_ONLY=1 is set

Nothing appears in Claude Desktop

It does not inherit your PATH. Use the absolute npx path and fully quit the app

10. FAQ ❓

An MCP server is a standard way to give an AI assistant real access to a tool, so it can act rather than guess. You install it once, your assistant gains the tools, and it works in Claude, Cursor, ChatGPT and anything else that speaks MCP.

TikTok's API is the official way software reads and posts to a TikTok account. Unlike most services it issues no personal access tokens, so every integration goes through an app you register. That is more setup than usual and it is the same for everyone.

You need to be comfortable pasting commands into a terminal and filling in a web form. The developer-app registration is the fiddly part, and section 3 covers every click.

It cannot. TikTok's official API only reaches the account that authorised your app. There is no endpoint for another profile, for search, for hashtags or for trends, so competitor research is not something this can do at any price.

Your credentials stay in your own client's config and the server runs on your machine. It talks to TikTok and to nothing else. There is no telemetry and no intermediate service.

It is unlikely to. Publishing requires confirm: true, which the model has to set deliberately after reading a description saying why. Setting TIKTOK_READ_ONLY=1 removes every write tool, and TIKTOK_ALLOW_DESTRUCTIVE=0 keeps drafts while removing publishing.

It costs nothing. The server is MIT licensed and TikTok's Display and Content Posting APIs are free.

TikTok restricts unaudited apps to private posts, whatever privacy level you request. Apply for the Content Posting API audit in the developer portal to lift it, or keep using the drafts tools and publish from the app.

You can. Run auth once per account and list them in TIKTOK_ACCOUNTS as name:token pairs, then pass account on any tool. Each account is refreshed independently, so one expired token does not hide the others.

Access tokens expire every 24 hours and the server refreshes them silently. The refresh token behind them lasts 365 days, after which doctor reports the account as rejected and you run auth again.

It works with Cursor, Windsurf, VS Code, Codex CLI, Gemini CLI and anything else speaking MCP over stdio, all covered in section 4. For a hosted client that needs a URL, run it with --http behind your own HTTPS endpoint.

Call revoke_access, or open the TikTok app and remove the app under Settings, Security and permissions, Manage app permissions. Then delete the entry from your client's config.

Questions

Run into a problem or have a question? Open an issue and I will help.

About the author 👋

Navid Moazzez is a leading AI business strategist, and the host of the AI Creator Summit, watched by 100,000+ creators. He helps creators and founders master AI and build their own AI Operating System (AI OS) to automate their business and life. This TikTok MCP server is one piece of that system.

Links

Dependencies

Library

Licence

What it does

@modelcontextprotocol/sdk

MIT

The MCP protocol, stdio and streamable HTTP transports

zod

MIT

Tool input schemas, and the validation behind them

License

MIT. Free to use, modify, and share.

Not affiliated with, endorsed by, or sponsored by TikTok. TikTok is a trademark of ByteDance Ltd.


© 2026 NM Media. Made with ❤️ by Navid Moazzez.

Available Tools

14 tools
get_creator_infoRead posting permissionsA
Read-onlyIdempotent

What this account is allowed to post: which privacy levels are available, whether comments, duet or stitch are switched off, and the longest video it may upload. Call this before post_video or post_photos. TikTok requires the privacy level to come from the list this returns, and it changes when the creator flips their account private.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected TikTok account to act as, by the name you gave it in TIKTOK_ACCOUNTS. Defaults to the first. Call list_accounts to see them.

TDQS

A4.5/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 meaningful behavioral context beyond annotations: the returned permissions are dynamic and can change when the creator toggles account privacy, and the privacy level must come from this exact list. This is useful, non-obvious behavior.

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

Conciseness5/5

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

The description is three sentences long, front-loads the core purpose, and gives the critical usage directive immediately. Every sentence adds value: what is returned, when to call it, and why the returned value is required. No wasted words.

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

Completeness5/5

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

For a simple read-only tool with one optional parameter, no nested objects, and no output schema, this description is complete. It states what data is returned, which post operations depend on it, and why it may change. An agent has everything it needs to call the tool 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?

There is only one optional parameter, and the schema description covers 100% of it, including how to list accounts. Per the baseline rule, a high schema coverage means the description need not repeat parameter details. The description adds no direct parameter semantics, but it does not need to.

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

Purpose5/5

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

The description states exactly what the tool returns: available privacy levels, comment/duet/stitch toggles, and maximum upload duration. Although the tool name is generic ('get_creator_info'), the title and description make the specific resource—posting permissions—unmistakable and distinct from sibling tools like get_profile.

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?

The description gives explicit, actionable guidance: 'Call this before post_video or post_photos.' It also explains the critical dependency—TikTok requires the privacy level to come from the returned list—and warns that the value changes when the account flips private. This leaves no ambiguity about when to invoke it.

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

get_post_statusCheck what happened to a postA
Read-onlyIdempotent

Track a post created by post_video, post_photos or either drafts tool. Statuses: PROCESSING_DOWNLOAD while TikTok fetches the file, SEND_TO_USER_INBOX for a draft that arrived, PUBLISH_COMPLETE when it is posted, FAILED with a fail_reason. A public post only reports its post_id after moderation clears it, which is usually a minute but can be hours, so an empty post_id on a PUBLISH_COMPLETE is normal rather than an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected TikTok account to act as, by the name you gave it in TIKTOK_ACCOUNTS. Defaults to the first. Call list_accounts to see them.
publish_idYesThe publish_id returned when the post was created.

TDQS

A4.4/5.0
Behavior5/5

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

The description adds valuable behavioral details beyond the annotations, such as the possible statuses and the specific nuance that an empty post_id on PUBLISH_COMPLETE is normal due to moderation delays. This explains expected non-error behavior and the fail_reason field, which is critical for correct interpretation. It does not contradict any 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?

The description is a single, well-structured paragraph that front-loads the purpose immediately and then adds necessary status explanations and the moderation caveat. There is no filler; every sentence 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?

For a tool with only two parameters and no output schema, the description covers the essential behavioral aspects: statuses, failure reason, and the moderation edge case. It does not detail the exact response structure, but given the simplicity and the annotations, it is sufficiently complete. A slightly more explicit mention of what the response contains would push it to 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% (both parameters have descriptions), so the baseline is 3. The description does not add extra meaning beyond the schema, although it reinforces that publish_id is the one returned at creation, which matches the schema. No additional parameter-level guidance is needed.

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

Purpose5/5

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

The description clearly states the tool's purpose: tracking the status of a post created by post_video, post_photos, or the drafts tools. It names the specific resource (a post by its publish_id) and distinguishes it from siblings like list_videos or post_video by focusing on status tracking of a known post.

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

Usage Guidelines4/5

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

The description explicitly says to use this tool for posts created by specific creation tools, which gives clear usage context. It does not explicitly mention when not to use it or name alternatives, but the intended scenario is unambiguous. Sibling tools like list_videos serve a different purpose, so the guidance is adequate.

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

get_profileRead the connected account's profileA
Read-onlyIdempotent

Profile and audience for a connected account: username, display name, bio, verified flag, follower and following counts, total likes across all videos, and how many videos are public. This is the only account it can see; TikTok's official API cannot read anybody else's profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected TikTok account to act as, by the name you gave it in TIKTOK_ACCOUNTS. Defaults to the first. Call list_accounts to see them.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds value beyond that by disclosing the API's hard limitation that only the connected account's profile is accessible, which is essential behavioral context for an agent deciding whether this tool can satisfy a request.

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 two sentences with no filler. It front-loads the useful field list and ends with a crucial scope limitation, making every sentence informative and earning its place.

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

Completeness5/5

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

For a simple read-only tool with no required parameters and a fully documented schema, the description is sufficiently complete. It enumerates the returned data, clarifies the account scope, and works alongside annotations that already communicate safety. No critical information is missing for an agent to call this tool 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?

The single parameter 'account' is already fully described in the schema, including its default behavior and guidance to use list_accounts to discover valid values. The description does not need to restate this, so the schema carries the semantic load; the description adds no new parameter-level meaning.

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

Purpose5/5

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

The description identifies a specific verb and resource: reading the connected account's profile and audience. It also lists concrete fields (username, display name, bio, verified flag, follower/following counts, total likes, public video count), making the tool's purpose unmistakable. The final constraint about only seeing the connected account distinguishes it from sibling tools that access other data.

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

Usage Guidelines4/5

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

The description provides clear context: this tool targets the connected account's profile and explicitly warns that it cannot read anybody else's profile. It does not name a specific alternative tool for other profiles, but the boundary for when to use this tool is clear from the API limitation statement.

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

get_videosGet specific videos by idA
Read-onlyIdempotent

Fetch up to 20 of your videos by id, with full stats. Also the way to refresh a cover_image_url: those links expire 6 hours after they are issued, so a cover that 404s needs this call rather than a cached URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected TikTok account to act as, by the name you gave it in TIKTOK_ACCOUNTS. Defaults to the first. Call list_accounts to see them.
video_idsYesTikTok video ids. Maximum 20 per call.

TDQS

A4.2/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, covering safety and idempotency. The description adds valuable behavioral context beyond annotations: the cover URL expiration (6 hours) and that a 404'd cover requires this call. This is a non-obvious behavioral trait that aids the agent in troubleshooting. It does not contradict annotations.

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

Conciseness5/5

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

The description is two sentences: the first states the core function, the second adds a specific use case (cover refresh). No filler, front-loaded with the primary action. Every word earns its place, and the structure is clear and scannable.

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 fetch-by-id tool with no output schema, the description covers the key operational aspects: the maximum count (20), the fact it returns full stats, and the refresh use case. It does not describe the exact return format, but that is acceptable given the tool's simplicity and existing annotations. It is complete enough for an agent to call 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%: both video_ids and account are described. The description does not add parameter-specific meaning beyond the schema; it mentions 'full stats' as a return property but not tied to parameters. The baseline of 3 applies because the schema already documents parameters adequately.

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

Purpose5/5

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

The description states a precise action ('Fetch up to 20 of your videos by id, with full stats') with a specific resource (videos) and selection criterion (by id). It clearly distinguishes from siblings like list_videos (which would list all) and search_my_videos (which searches by query). The title reinforces the purpose, and the description adds the crucial limit of 20, already present in schema, but stated clearly.

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

Usage Guidelines4/5

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

The description gives an explicit use case: refreshing cover_image_url because those links expire after 6 hours, and the cover 404s needs this call. This implies when to use it over a cached URL. However, it does not explicitly contrast with alternative tools like list_videos or search_my_videos, and does not state when not to use it. The usage guidance is strong for the specific scenario but not comprehensive.

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

list_accountsList connected TikTok accountsA
Read-onlyIdempotent

Every TikTok account this server can act as, with the name to pass as account on any other tool. Does not call TikTok, so it works even when a token has expired.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

The description adds a non-obvious behavioral trait beyond the annotations: this tool does not call TikTok at all, so it succeeds even when a token has expired. This meaningfully informs the agent about network dependency and failure modes. Annotations already cover read-only and idempotent safety, so the description's extra context earns credit.

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

Conciseness5/5

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

Two tightly written sentences deliver the core purpose, the practical use of the result, and a key behavioral guarantee. There is no filler or redundancy.

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

Completeness5/5

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

Given the tool's simplicity, empty schema, and strong annotations, the description covers everything an agent needs: what the tool returns, how to use the result, and an important edge-case behavior. No output schema exists, but the description states the essential return semantics.

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 has zero parameters and the schema already defines an empty object, so there is nothing for the description to add. The description still clarifies what the returned value serves as (`account` on other tools), which is useful semantic context for an otherwise parameterless call.

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

Purpose5/5

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

The description clearly identifies the resource: all TikTok accounts the server can act as, and distinguishes this from sibling tools by stating these account names are the values to pass as `account` elsewhere. The purpose is specific and immediately actionable.

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

Usage Guidelines4/5

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

The description gives clear context for when to call this tool: when you need the canonical account identifiers to use with any other tool. It also notes that it works even with an expired token, implying it is safe to use as a fallback or first step, though it does not explicitly list exclusions or alternatives.

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

list_videosList your TikTok postsA
Read-onlyIdempotent

Your public TikTok posts, newest first, with views, likes, comments, shares and a computed engagement rate. Pages past TikTok's 20-per-page limit automatically. Only public posts appear: TikTok's API cannot see private or draft videos.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many videos to return. Default 20. Each 20 is one API call, so keep it to what you need.
cursorNoContinue from a previous page, or pass your own Unix timestamp in MILLIseconds to start from a date. Note this is milliseconds while posted_at is derived from seconds.
accountNoWhich connected TikTok account to act as, by the name you gave it in TIKTOK_ACCOUNTS. Defaults to the first. Call list_accounts to see them.

TDQS

A4/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses automatic pagination past TikTok's 20-per-page limit, newest-first ordering, and an API limitation that private/draft videos are inaccessible. This gives an agent useful expectations about scope and behavior that are not visible from annotations alone.

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

Conciseness5/5

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

Three short sentences with no filler: the core output and ordering are front-loaded, followed by pagination and visibility caveats. Every sentence contributes information beyond the tool's 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?

For a read-only list tool, the description covers what is returned, ordering, pagination, and visibility limits, while the schema covers all parameters. It is slightly incomplete on sibling differentiation—there is no guidance for choosing among get_videos, top_videos, or search_my_videos—but the invocation context is otherwise sufficient.

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 description itself adds no parameter-level explanation, but the input schema covers all three parameters (limit, cursor, account) with 100% coverage, including the milliseconds-vs-seconds warning and default account behavior. Since the schema carries the semantic load, the description does not need to compensate.

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 ('your public TikTok posts'), and states the returned metrics (views, likes, comments, shares, engagement rate) and ordering ('newest first'). It is clear but does not explicitly distinguish itself from sibling tools such as get_videos or top_videos.

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

Usage Guidelines3/5

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

The description implies usage context by specifying what the tool returns and its ordering, and it gives a clear exclusion: 'Only public posts appear: TikTok's API cannot see private or draft videos.' However, it never names alternatives like get_videos or search_my_videos, so there is no explicit when-to-use-this-vs-that guidance.

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

post_photosPublish a photo carousel to TikTokA
Destructive

Publish a photo carousel of up to 35 images from public URLs. Returns a publish_id; poll get_post_status with it. Same domain-verification and audit rules as post_video.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoPost title. Up to 90 UTF-16 units, shorter than a video caption.
accountNoWhich connected TikTok account to act as, by the name you gave it in TIKTOK_ACCOUNTS. Defaults to the first. Call list_accounts to see them.
confirmNoMust be true for this to run. A TikTok post is public the moment moderation clears it, and deleting it later does not pull it out of feeds that already have it.
is_aigcNo
photo_urlsYesPublic image URLs, in the order they should appear. Their domain must be verified in your TikTok app.
descriptionNoPost description. Up to 4000 UTF-16 units.
privacy_levelYesMust be one of the values get_creator_info returns in privacy_level_options for this account. A private account cannot use PUBLIC_TO_EVERYONE, and passing it fails the call.
auto_add_musicNoLet TikTok pick a soundtrack. The creator can change it later in the app.
disable_commentNo
photo_cover_indexNoZero-based index of the image to use as the cover. Default 0.
brand_content_toggleNoTrue if this is a paid partnership promoting somebody else's business. Defaults false.
brand_organic_toggleNoTrue if this promotes the creator's own business. Defaults false.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds the polling workflow (returns publish_id, poll get_post_status) and cross-references domain rules from post_video, which is useful behavioral context beyond the annotations. No contradiction with annotations.

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

Conciseness5/5

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

The description is three short sentences that lead with the core purpose, then the critical post-call step (polling), and finally a cross-reference to existing rules. Every sentence earns its place; there is no fluff or repetition.

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 tool with 12 parameters and no output schema, the description is surprisingly complete: it states the action, the limit, the domain requirement, and the follow-up polling step. It omits the confirm requirement and public-moderation behavior, but those are explicitly covered in the parameter descriptions. The agent gets enough to call it correctly without ambiguity.

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 high (83%), so the parameters are already well-documented. The description adds minimal parameter-specific details beyond the schema, such as the 35-image limit (already in maxItems) and public URL requirement (already in photo_urls description). It does not compensate for the remaining uncovered parameters, but with high coverage, 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?

The description opens with a specific verb and resource: 'Publish a photo carousel' with a clear constraint of up to 35 images and from public URLs. It distinguishes itself from siblings like post_video by focusing on photos and mentions the return of a publish_id, making the tool's purpose unambiguous.

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

Usage Guidelines4/5

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

The description provides clear context for using the tool: it publishes a photo carousel and instructs to poll get_post_status. It references post_video for domain-verification rules, but does not explicitly compare against alternatives like send_photos_to_drafts. This is clear enough for an agent to infer live publishing vs. drafting, but lacks explicit exclusions, so not a 5.

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

post_videoPublish a video to TikTokA
Destructive

Publish a video straight to the account from a public URL. Returns a publish_id; poll get_post_status with it, because the call returns as soon as TikTok accepts the job, long before the post is live. While your app is unaudited every post lands private no matter which privacy_level you pass.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoThe caption. Hashtags and @mentions work inline. Up to 2200 UTF-16 units.
accountNoWhich connected TikTok account to act as, by the name you gave it in TIKTOK_ACCOUNTS. Defaults to the first. Call list_accounts to see them.
confirmNoMust be true for this to run. A TikTok post is public the moment moderation clears it, and deleting it later does not pull it out of feeds that already have it.
is_aigcNoTrue if the video is AI-generated. Adds TikTok's AI-generated label to the description.
video_urlYesPublic URL of the video file. Its domain must be verified under URL Properties in your TikTok app, and TikTok has one hour to download it.
disable_duetNo
privacy_levelYesMust be one of the values get_creator_info returns in privacy_level_options for this account. A private account cannot use PUBLIC_TO_EVERYONE, and passing it fails the call.
disable_stitchNo
disable_commentNo
brand_content_toggleNoTrue if this is a paid partnership promoting somebody else's business. Defaults false.
brand_organic_toggleNoTrue if this promotes the creator's own business. Defaults false.
video_cover_timestamp_msNoWhich frame to use as the cover, in milliseconds. Defaults to the first frame.

TDQS

A4.1/5.0
Behavior5/5

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

The description adds significant behavioral detail beyond the annotations: the call returns as soon as TikTok accepts the job, long before the post is live, and unaudited apps always produce private posts regardless of the privacy_level argument. It also explains the need to poll get_post_status. These are exactly the kind of non-obvious behaviors an agent needs to know.

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

Conciseness5/5

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

Three dense sentences carry the core purpose, the async behavior, and the privacy caveat. The most important facts are front-loaded with no filler. Every sentence 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?

For a tool with 12 parameters, no output schema, and multiple sibling tools, the description covers the essential runtime behavior: what is returned, how to track the post, and the unaudited-app privacy quirk. It does not mention the required confirm parameter, but that is fully documented in the schema, so this is a minor gap overall.

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 input schema already documents 75% of the parameters, so the heavy lifting is done there. The description adds extra value for privacy_level by warning that unaudited apps override whatever value is passed, making every post private. This is a meaningful parameter-related caveat 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 clearly identifies a specific verb and resource: 'Publish a video straight to the account from a public URL.' It also communicates the key output, publish_id. However, it does not explicitly distinguish itself from sibling tools like post_photos or send_video_to_drafts, so the differentiation is implicit.

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

Usage Guidelines3/5

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

The description gives clear context for what the tool does and tells the agent to poll get_post_status afterward, which is useful. It does not, however, state when to prefer this over alternatives such as send_video_to_drafts or post_photos, nor does it explain when not to use it. Usage is implied by the purpose rather than explicitly routed.

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

revoke_accessDisconnect an account from your TikTok appA
Destructive

Hands the token back to TikTok and removes your app from the account's connected-apps list. The refresh token in your config stops working immediately and only re-running tiktok-mcp auth will restore access.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected TikTok account to act as, by the name you gave it in TIKTOK_ACCOUNTS. Defaults to the first. Call list_accounts to see them.
confirmNoMust be true for this to run. A TikTok post is public the moment moderation clears it, and deleting it later does not pull it out of feeds that already have it.

TDQS

A4/5.0
Behavior4/5

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

Annotations already mark this destructive and not read-only. The description adds useful non-obvious behavior: the refresh token stops working immediately and restoration requires re-running `tiktok-mcp auth`. That goes beyond the annotation hints, though it does not detail the exact response or further side effects.

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

Conciseness5/5

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

Two sentences carry the essential action and consequence with no filler. The destructive effect is front-loaded, and the recovery command is a useful close.

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 core effect and recovery path are covered, and the annotation hints supply the destructive safety signal. However, with no output schema, the agent is not told what a successful revocation returns, and the misleading confirm description leaves a required confirmation ambiguous. A short note on expected response or error conditions would complete it.

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

Parameters2/5

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

The account parameter is well documented (named account, default to first, call list_accounts). However, the confirm parameter's description appears copied from a deletion/post tool: it talks about a TikTok post being public and deletion not removing it from feeds, which does not explain what 'confirm' means for revoking access. With 100% schema coverage this misleading text is worse than no description at all, and the tool description does not compensate.

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

Purpose5/5

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

The description uses a specific verb and resource: it 'hands the token back to TikTok' and 'removes your app from the account's connected-apps list.' This clearly distinguishes revoke_access from sibling tools like list_accounts, get_profile, or post_video.

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

Usage Guidelines4/5

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

The description makes the context clear: it is used to disconnect an account and immediately invalidates the refresh token, and it tells the agent how access can be restored by re-running `tiktok-mcp auth`. It does not explicitly name alternatives or when-not conditions, so it stops short of full guidance.

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

search_my_videosSearch your own captionsA
Read-onlyIdempotent

Find your posts whose title or description matches a query. TikTok has no search over your own library, so this pages recent videos and filters locally. A miss means it is not in the last scan videos, not that it does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
scanNoHow many recent videos to search. Default 100, maximum 200.
queryYesText to look for in the title or description. Case-insensitive.
accountNoWhich connected TikTok account to act as, by the name you gave it in TIKTOK_ACCOUNTS. Defaults to the first. Call list_accounts to see them.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description discloses a crucial behavioral caveat: a miss means the item is not in the last `scan` videos, not that it does not exist. It also reveals the local-filtering implementation, which helps an agent set expectations about completeness.

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 with no filler. The action is front-loaded, followed by a brief implementation rationale and a vital caveat, so every sentence earns its place.

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

Completeness5/5

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

For a simple read-only search tool with fully documented parameters, the description covers purpose, local filtering behavior, and the open-world miss semantics. The annotations already provide the safety profile, and no output schema is needed to understand that this returns matching posts.

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 input schema already covers all parameters at 100% coverage, so the baseline is 3. The description adds extra meaning by tying `scan` directly to the miss semantics, clarifying that the search scope is limited to the most recent `scan` videos. It does not repeat schema details unnecessarily.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Find your posts whose title or description matches a query.' It also distinguishes itself from sibling list/get tools by explaining that TikTok has no native library search, so this tool pages recent videos and filters locally.

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

Usage Guidelines4/5

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

The description gives clear context for when this tool is appropriate: there is no TikTok-side search over your own library, so the tool compensates by scanning recent videos locally. It does not explicitly name alternatives such as list_videos, but the intended use case is evident.

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

send_photos_to_draftsSend a photo carousel to the TikTok inboxA
Idempotent

Send photos to the account's TikTok inbox for the creator to finish in the app. Needs only video.upload. The creator's TikTok app must be version 31.8 or newer or TikTok rejects it.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNo
accountNoWhich connected TikTok account to act as, by the name you gave it in TIKTOK_ACCOUNTS. Defaults to the first. Call list_accounts to see them.
photo_urlsYes
descriptionNo
photo_cover_indexNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover read-only, idempotency, and destructiveness, so the description only needs to add context. It adds useful behavioral facts: the creator must finish in the app, the request needs only the video.upload permission, and TikTok rejects the request if the app version is below 31.8. This is meaningful and goes beyond what annotations and schema provide.

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 with no filler. The core action is front-loaded, followed by the permission requirement and the version constraint, each of which earns its place. It is easy to scan and directly actionable.

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 description is adequate for understanding the basic operation and key constraints, but it leaves gaps because there is no output schema and no explanation of parameter meaning or async/result behavior. An agent can probably invoke it correctly but may not know how to interpret the response or how it relates to send_video_to_drafts and post_photos.

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

Parameters2/5

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

Schema description coverage is only 20%, with only the account parameter described. The description does not explain photo_urls requirements, photo_cover_index semantics, or how title and description are used. Because the schema leaves most parameters undocumented and the description does not compensate, an agent has to guess about important invocation details.

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

Purpose5/5

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

The description states a specific action, resource, and destination: send photos to the TikTok inbox for the creator to complete. The phrase 'for the creator to finish in the app' also distinguishes this from direct publishing, and the photo focus separates it from send_video_to_drafts. The title reinforces the photo-carousel scope without adding misleading information.

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

Usage Guidelines3/5

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

The description implies the tool is for preparing photo content as drafts rather than publishing it, and it gives valuable prerequisites such as the video.upload permission and TikTok app version 31.8+. However, it never explicitly names alternatives like send_video_to_drafts or post_photos, nor does it state when not to use this tool.

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

send_video_to_draftsSend a video to the TikTok inboxA
Idempotent

Send a video to the account's TikTok inbox instead of publishing it. The creator gets a notification and finishes the post in the app, so nothing goes public without them. Needs only video.upload, which makes this the path that works before your app passes the Content Posting audit. TikTok allows at most 5 unpublished drafts from the API in any 24 hours.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected TikTok account to act as, by the name you gave it in TIKTOK_ACCOUNTS. Defaults to the first. Call list_accounts to see them.
video_urlYesPublic URL of the video file. Its domain must be verified under URL Properties in your TikTok app, and TikTok has one hour to download it.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations, the description reveals meaningful behavioral details: the creator receives a notification, nothing goes public, the auth scope is only video.upload, and TikTok enforces a 5-draft-per-24-hour limit. These are exactly the kind of side-effect, permission, and rate-limit facts that help an agent predict tool behavior. It does not contradict the readOnlyHint=false, idempotentHint=true, or destructiveHint=false 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?

Three sentences, each earning its place: core behavior first, then the notification/privacy consequence, then the auth and quota constraints. No filler or repetition of schema details. It is front-loaded and efficiently structured.

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 description covers purpose, auth needs, quota, URL verification, and the draft-not-public outcome, which is nearly complete for a two-parameter tool. The only notable gap is that it does not describe the API response or what happens when the 24-hour draft limit is exceeded. Still, an agent has enough to select and invoke it correctly.

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

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 have thorough descriptions in the schema, so the tool description does not need to repeat them. The description's reference to video.upload is a permission scope, not parameter-level semantics. The schema carries the burden adequately, so a 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?

The description opens with the specific action: 'Send a video to the account's TikTok inbox instead of publishing it.' This clearly identifies the verb, resource, and a distinctive contrast to publishing, which separates it from siblings like post_video. The 'so nothing goes public without them' detail reinforces exactly what this tool achieves.

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

Usage Guidelines4/5

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

It gives a concrete usage context: this is 'the path that works before your app passes the Content Posting audit' and requires only video.upload. The 'instead of publishing it' phrasing implies the alternative is a publishing tool, but it never explicitly names post_video or states when not to use this tool. Strong context, but the alternative is not made fully explicit.

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

stats_summarySummarise performance across recent postsA
Read-onlyIdempotent

Aggregate stats over your recent posts: total and mean views, the median and 90th percentile, mean engagement rate, and how many days apart you post. Reach for this instead of listing videos and adding them up, and read the median rather than the mean: one viral post drags a mean far away from what a typical post of yours actually does.

ParametersJSON Schema
NameRequiredDescriptionDefault
scanNoHow many recent videos to include. Default 60, maximum 200.
accountNoWhich connected TikTok account to act as, by the name you gave it in TIKTOK_ACCOUNTS. Defaults to the first. Call list_accounts to see them.

TDQS

A4.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 the safety profile is covered. The description adds meaningful behavioral context beyond annotations: it explains the statistical skew (one viral post drags the mean) and implicitly indicates the tool computes aggregate analytics rather than raw data. This extra guidance raises it above baseline, but it doesn't describe return format or error behavior, so a 4 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 first sentence front-loads the aggregate metrics and scope ('recent posts'), and the second gives both an alternative and a statistical caveat. Every word earns its place, and the most important usage guidance appears early.

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 no output schema, but the description enumerates the exact metrics it returns, effectively serving as the output spec. It also covers usage guidance and statistical interpretation. Given annotations already handle the safety profile, and the description is sufficient for an agent to know what it will get, only minor gaps remain (e.g., explicit return structure or default account behavior, which is in the schema). This is reasonably 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% – both `scan` and `account` have complete descriptions. The description mentions 'recent posts' which loosely relates to `scan`, but it adds no additional parameter syntax or format details beyond what the schema provides. With full schema coverage, the baseline of 3 is correct; the description does not enhance parameter understanding.

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

Purpose5/5

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

The description clearly states the tool aggregates stats over recent posts and enumerates the specific metrics (total/mean views, median/90th percentile, engagement rate, posting interval). It explicitly contrasts with listing videos, distinguishing it from sibling tools like list_videos. This is a specific verb+resource with clear scope.

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?

The description explicitly says 'Reach for this instead of listing videos and adding them up,' naming the alternative and the condition that selects this tool. It also provides statistical guidance (read the median rather than the mean), giving the agent concrete direction on how to interpret results. This fully covers when-to-use vs alternatives.

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

top_videosRank your best-performing postsA
Read-onlyIdempotent

Your best posts, ranked. TikTok has no ranked endpoint, so this pages recent videos and sorts them locally: scan is how far back it looks, and anything older than that cannot win. Use this rather than calling list_videos and sorting in context, which spends the whole window on videos you discard.

ParametersJSON Schema
NameRequiredDescriptionDefault
scanNoHow many recent videos to look through before ranking. Default 60, maximum 200.
limitNoHow many to return. Default 10.
metricNoWhat to rank by. Default views.
accountNoWhich connected TikTok account to act as, by the name you gave it in TIKTOK_ACCOUNTS. Defaults to the first. Call list_accounts to see them.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnly/idempotent/destructive annotations, the description discloses non-obvious behavior: TikTok has no ranked endpoint, ranking is done locally after pagination, and anything older than scan cannot appear. This adds real behavioral context an agent would otherwise not know.

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 with no filler. The value proposition is front-loaded, the key limitation is stated early, and the alternative-use guidance is packed into one tight sentence.

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

Completeness5/5

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

Given rich annotations, full schema coverage, and clear usage guidance, the description covers the main caveat and selection criteria. There is no output schema, but the return type (ranked videos) is inferable from the title and limit parameter, so nothing critical is missing.

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

Parameters4/5

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

The input schema already covers all four parameters with 100% coverage, so the baseline is 3. The description adds meaningful interpretive value for `scan` ('how far back it looks, and anything older than that cannot win'), which justifies a slightly higher score; limit/metric/account are left to the schema.

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

Purpose5/5

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

The description states a specific task—'Your best posts, ranked'—and explains that it pages recent videos and sorts them locally. It also explicitly contrasts itself with list_videos, making its distinct purpose immediately clear.

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

Usage Guidelines5/5

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

It gives explicit, actionable guidance: use this rather than calling list_videos and sorting in context, and explains why ('spends the whole window on videos you discard'). The scan-bound caveat further clarifies when this tool is appropriate.

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

TDQS

A4.4/5.0
Disambiguation5/5

Each tool serves a clearly distinct purpose: listing accounts, fetching profiles, revoking access, listing videos, fetching by ID, ranking, searching, aggregating stats, checking posting permissions, posting video/photo, sending to drafts, and tracking post status. No two tools overlap in function, and descriptions clarify edge cases (e.g., get_videos vs list_videos).

Naming Consistency5/5

All tools follow a consistent verb_noun or verb_noun pattern in snake_case (e.g., list_accounts, get_profile, post_video, get_post_status). Even less conventional names like top_videos and stats_summary fit the imperative style, and there are no mixed conventions or vague verbs.

Tool Count5/5

With 14 tools, the surface is well-scoped for a TikTok content management and analytics server. Each tool covers a distinct operation without redundancy, and the count is within the ideal 3–15 range, demonstrating careful curation rather than bloat.

Completeness5/5

The toolkit covers the full lifecycle of content management: authentication and account listing, profile retrieval, video listing and individual fetching, ranking, search, aggregate stats, posting (video, photos, drafts), and post status tracking. It also includes auxiliary operations like refreshing cover URLs and checking creator permissions, leaving no obvious dead ends for the intended use case.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/navidmoazzez/tiktok-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server