tiktok-studio-mcp
Allows publishing videos to your own TikTok account and reading back performance metrics through TikTok's official Content Posting and Display APIs.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@tiktok-studio-mcpupload the latest video as a draft"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
tiktok-studio-mcp
MCP server for TikTok. Publishes videos to your own TikTok account and reads back how they performed, through TikTok's official Content Posting and Display APIs.
Built as the TikTok counterpart to
yt-studio-mcp.
What it can and cannot do
TikTok's creator APIs are narrower than YouTube's. Rather than advertise tools that cannot work, this server exposes only what the platform actually supports:
capability | supported |
Upload video (drafts or direct post) | yes |
View / like / comment / share counts | yes |
List your videos | yes |
List or moderate comments | no — TikTok offers this only through the Research API, which is gated to academic institutions |
Playlists, captions, thumbnails | no — no API surface |
Related MCP server: TikTok MCP Server
Posting modes
TikTok gates direct publishing behind an app audit, so there are two modes,
selected with TIKTOK_MCP_MODE:
upload(default) — the video lands in your TikTok inbox/drafts and you finish posting it in the app. Works without an audit.publish— posts directly. Requires thevideo.publishscope, which needs TikTok's full app audit (2–4 weeks, demo video, privacy policy, domain verification).
Until the app is audited, TikTok forces everything an unaudited client posts
to private, whatever privacy_level you ask for. post_video says so in its
result rather than letting you assume something published.
Install
claude mcp add tiktok -s user -- uvx tiktok-studio-mcpAuthenticate
Register an app at developers.tiktok.com with
Login Kit, Content Posting API and Display API, requesting the scopes
user.info.basic, video.upload, video.list, video.publish. Set the
Desktop redirect URI to http://localhost:8902/.
export TIKTOK_MCP_CLIENT_KEY=...
export TIKTOK_MCP_CLIENT_SECRET=...
tiktok-studio-mcp authPrefer the environment over --client-key / --client-secret: command-line
arguments are visible to any user on the box via ps and land in shell history.
The flags still work as a fallback.
The flow is headless-friendly: it binds a fixed port and prints the consent URL rather than launching a browser. On a machine with a browser:
ssh -N -L 8902:localhost:8902 user@your-hostthen open the printed URL.
Tools
tool | purpose |
| credentials refresh, account reachable, granted scopes, active mode |
| nickname, allowed privacy levels, duration cap, interaction toggles |
| upload a file; returns |
| poll a |
| your videos, with statistics |
| counts for specific video ids |
post_video calls creator_info first and validates privacy_level against
what the account actually allows, because TikTok rejects mismatches with an
unhelpful error.
Secrets
TIKTOK_MCP_SECRETS selects the backend: file (default,
~/.config/tiktok-studio-mcp/credentials.json, mode 600), env, or vaultproxy.
TikTok rotates refresh tokens — every refresh returns a new one and invalidates the old. This server writes the new token back on every refresh; if it did not, authentication would work for 24 hours and then fail with no obvious cause.
Limits
Enforced by TikTok, surfaced by this server:
6 requests per minute per access token on the init endpoints
5 pending shares per 24 hours
chunked upload: files under 5 MB go whole; otherwise chunks are 5–64 MB, the final chunk may reach 128 MB, 1–1000 chunks, 4 GB maximum
Development
pip install -e '.[dev]'
ruff check src tests
pytestTests use an injected transport and need no TikTok credentials.
License
MIT
Available Tools
6 toolscreator_infoA
Nickname, allowed privacy levels, duration cap, interaction toggles.
Direct-Post-only. TikTok gates this endpoint on video.publish, so it is unavailable — and unnecessary — in upload mode, where the creator picks privacy in the TikTok app. Consulted automatically before a direct post, because TikTok rejects one whose privacy_level the account does not offer.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and succeeds: it discloses that the endpoint is Direct-Post-only, gated on video.publish, unavailable in upload mode, and automatically consulted to avoid rejected posts due to unsupported privacy_level. It also lists the returned fields, providing strong behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: a scannable list of returned fields followed by two sentences of critical context. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema info tool, the description covers what the tool returns (nickname, privacy levels, duration cap, interaction toggles), when it runs, and why it is needed. It leaves no major gaps for a pre-post lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing for the schema to describe; the description confirms it is a no-input lookup of fixed creator properties. Baseline 4 is appropriate because no parameter explanation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the data the tool exposes ('Nickname, allowed privacy levels, duration cap, interaction toggles'), making it clear this is a creator-info lookup, and later explains its role before direct posts. It lacks an explicit verb like 'retrieves' or 'returns,' so it falls just short of the strongest purpose statement, but it is unmistakably distinct from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it ('Consulted automatically before a direct post'), when not ('unavailable — and unnecessary — in upload mode'), and explains the underlying TikTok permission gating on video.publish. It gives clear context with no need for alternative tool mentions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_checkA
Credentials refresh, account reachable, and which posting mode is active.
Deliberately backed by /v2/user/info/ (user.info.basic) rather than creator_info: creator_info is a Direct Post endpoint gated on video.publish, so using it here made health_check fail on exactly the upload-only setup this server is built for.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the exact endpoint and scope used ('/v2/user/info/ (user.info.basic)'), the rationale for avoiding creator_info, and the behavioral checks performed. This is substantial context well beyond a mere purpose statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose, followed by a concise technical justification. Every word earns its place; no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema health check, the description fully explains what the tool checks, why it exists, and the specific infrastructure choice. The context about upload-only setups is especially valuable for an agent deciding when this is the right call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the empty schema is fully covered. The description correctly does not invent parameter details. Per rubric, 0 params earns a baseline 4; no additional semantic explanation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: 'Credentials refresh, account reachable, and which posting mode is active.' It also distinguishes itself from sibling tools by explicitly contrasting its backing endpoint with creator_info, making its scope obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-not guidance by explaining that creator_info is a Direct Post endpoint gated on video.publish and would fail on upload-only setups. This tells the agent to prefer health_check over creator_info for health monitoring in such configurations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_videosC
The account's videos, with their statistics.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior, but it only states the result includes statistics. It does not reveal pagination through the cursor/limit parameters, ordering, or whether a valid account context is required, which is critical for a listing operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, short sentence, making it highly concise and easy to parse. However, its brevity comes at the cost of substance; it is efficient but under-specified, which keeps it from being excellent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema and no annotations, and the description does not explain the return format, pagination behavior, or the scope of 'the account's videos'. This is inadequate for a listing tool with pagination parameters, as the agent cannot infer when all videos are returned versus a page.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description neither mentions limit nor cursor and provides no semantics for these parameters. Schema coverage is 0%, so the description fails to compensate, leaving the agent without guidance on pagination or result size control.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource ('the account's videos') and adds a distinguishing feature ('with their statistics'). However, it uses a noun phrase rather than an explicit verb, relying on the tool name 'list_videos' to convey the action. This is sufficient to separate it from video_stats, which likely focuses on individual video statistics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no mention of when to choose this tool over siblings such as video_stats or post_status. The description provides no context for use cases, prerequisites, or exclusions, leaving the agent to guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_statusA
Poll a publish_id returned by post_video.
| Name | Required | Description | Default |
|---|---|---|---|
| publish_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It does not disclose any behavioral traits beyond 'poll'—no mention of return format, whether to repeat calls, rate limits, or side effects. This is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no wasted words, making it highly efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite its simplicity, the description lacks essential behavioral details and workflow context. An agent may not know what the poll returns or whether to poll repeatedly, making the tool's use incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning by indicating the publish_id comes from post_video, which is helpful. However, it does not elaborate on format or constraints, so it provides only moderate compensation for the schema's 0% description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool polls a publish_id returned by post_video, providing a specific verb ('poll') and resource (publish_id). It also distinguishes itself from siblings by referencing post_video, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage after post_video, as it says to poll a publish_id 'returned by post_video.' This gives clear context for when to use the tool, 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.
post_videoA
Upload a video to the authorized account. Returns a publish_id to poll.
In upload mode the video lands in the account's inbox/drafts. In publish mode it posts directly, which requires an audited app — until the audit passes TikTok forces all content from the client to private.
| Name | Required | Description | Default |
|---|---|---|---|
| caption | No | ||
| dry_run | No | ||
| file_path | Yes | ||
| disable_duet | No | ||
| privacy_level | No | SELF_ONLY | |
| disable_stitch | No | ||
| disable_comment | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does a good job: it discloses the return format (publish_id), the behavioral difference between upload (drafts) and publish (direct post), and a platform-specific caveat (private until audit passes). This goes beyond a simple action statement, though it omits details like error handling or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: the first sentence states the primary action and return value, then the second paragraph explains the modes. Every sentence adds value, and the front-loaded structure makes the purpose immediately clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters, no schema descriptions, no annotations, and no output schema, the description covers the core purpose and mode behavior, but it leaves the majority of parameters unexplained. It's minimally viable but has clear gaps for a tool with this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must compensate, but it does not. It never mentions any parameter (e.g., dry_run, privacy_level, caption) and only vaguely refers to modes without linking them to parameters. The description adds minimal value beyond schema field names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Upload a video to the authorized account' and adds a distinct return value ('Returns a publish_id to poll'), differentiating it from sibling tools like post_status and list_videos. This is a specific verb+resource statement with no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool and the two modes (upload vs. publish), including the audited app requirement for publish mode. While it doesn't explicitly mention alternatives or when not to use it, the mode explanation gives practical usage guidance that helps an agent decide how to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video_statsB
View, like, comment and share counts for specific video ids.
| Name | Required | Description | Default |
|---|---|---|---|
| video_ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. The verb 'View' implies a read-only operation, but the description does not explicitly state that no data is modified, nor does it disclose any limitations or response format. The ambiguous phrasing further weakens transparency, preventing a higher score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one sentence and front-loaded with the action. It is concise, but the grammatical ambiguity reduces structural clarity, so it earns a 4 rather than 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter and no output schema. The description conveys the basic purpose, but lacks details on return structure or expected behavior (e.g., missing IDs, performance). For a tool of this complexity, the gaps prevent a higher score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only one parameter and 0% schema description coverage, the description must compensate. It clarifies that video_ids are 'specific video ids', aligning with the schema, but does not elaborate on array semantics, acceptable ID formats, or behavior when multiple IDs are provided. It adds some meaning but leaves gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states the tool views counts for specific video IDs, which identifies the resource and action. However, the phrasing 'View, like, comment and share counts' is grammatically ambiguous, potentially reading as a list of verbs (view, like, comment, share) rather than metric types (view count, like count, etc.). This prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus siblings like list_videos or creator_info. It does not mention prerequisites (e.g., obtaining video IDs) or exclude cases where this tool would be inappropriate.
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.
6 tool updates
v0.1.4- First observed
creator_info - First observed
health_check - First observed
list_videos - First observed
post_status - First observed
post_video - First observed
video_stats
TDQS
Scored across 6 tools
Each tool has a clear role: health_check and creator_info cover account status/capabilities, post_video and post_status handle posting, list_videos and video_stats handle video data. The only mild overlap is list_videos already includes statistics, which could make video_stats seem redundant, but it's useful for targeted lookups.
All names are lowercase snake_case and readable, but the pattern varies: verb_noun (post_video, post_status, list_videos), noun_noun (creator_info, video_stats), and noun_verb (health_check). This is a minor deviation from a uniform convention.
Six tools is well-scoped for a TikTok studio MCP, covering account health, creator capabilities, video posting, status polling, and video analytics. No tool feels extraneous.
The core lifecycle (post, poll, list, stats) is complete. Missing update/delete video operations, but the server appears designed for posting and analytics, so these are not critical gaps. Account info and post-mode checks are included.
Maintenance
Related MCP Connectors
MCP server for QPost — lets AI agents publish video and image posts to YouTube, TikTok, Instagram.
Build, run, schedule, and publish AI video pipelines to YouTube and TikTok from any MCP client.
MCP server for ByteDance Seedance AI video generation
MCP server for Kling AI video generation
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for analyzing TikTok data for insight extraction5MIT
- AlicenseBqualityNot gradedmaintenanceA comprehensive MCP server that enables AI assistants to search, download, and analyze TikTok content while also performing active tasks like publishing videos and interacting with posts. It provides full automation capabilities for TikTok through browser session management and anti-detection features.122MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables LLMs to automatically upload videos to the Douyin (TikTok China) creator platform with features like automated login, smart upload, SMS verification, and flexible publishing.9 npm1MIT
- FlicenseBqualityDmaintenanceMCP server for TikTok that enables searching videos, users, hashtags, and fetching trending content, user profiles, and video details via official API or public scraping.8-