{"server":{"name":"app.toptik/tiktok","title":"TopTik — TikTok data","$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","remotes":[{"url":"https://mcp.toptik.app/mcp","type":"streamable-http"}],"version":"1.0.0","websiteUrl":"https://toptik.app/","description":"TikTok data for agents: videos, creators, comments, search, transcripts. 25 tools, pay per call."},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","isLatest":true,"updatedAt":"2026-09-18T12:58:19.135445Z","publishedAt":"2026-09-18T12:58:19.135445Z","statusChangedAt":"2026-09-18T12:58:19.135445Z"},"dev.protogrid/connectability":{"class":"R0","autonomous":true,"human_steps":[],"preferred":{"kind":"remote","idx":0},"remotes":[{"idx":0,"url":"https://mcp.toptik.app/mcp","transport":"streamable-http","templated":false,"headers":[],"auth":{"type":"none","location":null,"secret_name":null,"oauth":null},"protocol":{"supported_versions":["2025-11-25"],"stateless":false},"health":{"reachable":true,"uptime_30d":0.96460176,"latency_ms_p50":457,"consecutive_failures":0,"last_probe_at":"2026-10-19T13:29:11.161Z","last_ok_at":"2026-10-19T13:29:11.161Z"}}],"packages":[]},"dev.protogrid/tools":[{"name":"tiktok_comment_replies","title":null,"description":"Replies under one comment. Worth calling only when tiktok_video_comments reported reply_count above 0.","annotations":{"title":"Comment replies","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_creator_followers","title":null,"description":"A sample of a creator's followers (most recent), plus the total. One page only: TikTok does not page this list reliably, so this is a sample and not an export.","annotations":{"title":"Creator followers","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_creator_following","title":null,"description":"A sample of the accounts a creator follows, plus the total. One page only, for the same reason as followers.","annotations":{"title":"Creator following","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_creator_liked_videos","title":null,"description":"Videos a creator has liked. Only works when the account keeps its likes public; most do not, and a private list returns no videos.","annotations":{"title":"Creator liked videos","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_creator_playlists","title":null,"description":"A creator's playlists (TikTok calls them mixes or series). Most creators have none, which returns total 0.","annotations":{"title":"Creator playlists","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_creator_profile","title":null,"description":"A creator's profile: handle, nickname, bio, follower, following and video counts, privacy and verification flags, and avatar.","annotations":{"title":"Creator profile","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_creator_videos","title":null,"description":"A creator's posts, newest first, with stats. Page by passing the previous response's max_cursor as cursor until has_more is 0. Pinned posts appear on page one only.","annotations":{"title":"Creator videos","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_explore_feed","title":null,"description":"TikTok's Explore / Discover feed: what is trending now. Not personalised and not cached, so each call returns a fresh set; call again for more.","annotations":{"title":"Explore feed","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_hashtag_resolve","title":null,"description":"Hashtag name to its id, with total video and view counts. Feed the id to tiktok_hashtag_videos.","annotations":{"title":"Resolve a hashtag","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_hashtag_videos","title":null,"description":"Videos under a hashtag. Pages hold about 12 videos whatever count asks for; page with cursor.","annotations":{"title":"Hashtag videos","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_live_streams","title":null,"description":"Live rooms matching a keyword, each with playable stream URLs per quality (FLV always, HLS when TikTok provides it), title and viewer count. URLs are signed (see expires_at), but a room usually ends long before its signature does; if one quality fails, try another.","annotations":{"title":"Live streams","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_places_search","title":null,"description":"Search TikTok places (points of interest) by name: address, coordinates, rating, review count and video count.","annotations":{"title":"Search places","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_resolve_username","title":null,"description":"Resolve a TikTok @handle to the account's numeric uid and sec_uid. Start here: every tiktok_creator_* tool takes the sec_uid this returns. An empty user_list means no exact match was found.","annotations":{"title":"Resolve a username","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_search_creators","title":null,"description":"Keyword search over accounts, with follower counts. Pages by offset, not cursor. For one exact @handle use tiktok_resolve_username instead: it is cheaper and more reliable.","annotations":{"title":"Search creators","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_search_hashtags","title":null,"description":"Keyword search over hashtags, with post and view counts. One page only.","annotations":{"title":"Search hashtags","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_search_lives","title":null,"description":"Live rooms on air right now that match a keyword, with the host's account. One page only. For playable stream URLs use tiktok_live_streams.","annotations":{"title":"Search live rooms","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_search_photos","title":null,"description":"Keyword search over photo-mode (carousel) posts, with image URLs and stats. One page only.","annotations":{"title":"Search photo posts","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_search_sounds","title":null,"description":"Keyword search over sounds, with usage counts. cursor is an offset: pass the previous response's cursor.","annotations":{"title":"Search sounds","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_search_videos","title":null,"description":"Keyword search over videos. TikTok search is a bounded, re-ranked pool, not an endless list: ask for count 30, page with cursor, dedupe on video_id, and stop when two pages add nothing new.","annotations":{"title":"Search videos","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_sound_resolve","title":null,"description":"Sound title to music id, with the closest candidates. Feed the id to tiktok_sound_videos.","annotations":{"title":"Resolve a sound","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_sound_videos","title":null,"description":"Videos TikTok associates with a sound. Treat it as a feed seeded by the sound, not a strict filter: some results use a different sound, so check music_id on each row.","annotations":{"title":"Sound videos","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_video_comments","title":null,"description":"Top-level comments on a video, with like and reply counts. cursor is an offset: pass the previous response's cursor to continue. TikTok re-ranks between pages, so dedupe on comment_id.","annotations":{"title":"Video comments","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_video_download_url","title":null,"description":"Direct media URLs for one post: no-watermark video, watermarked video, audio, covers, and the images of a photo post. Links only, no bytes; they are signed and expire (see expires), so fetch promptly.","annotations":{"title":"Video download URLs","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_video_stats","title":null,"description":"One video or photo post by id: caption, plays, likes, comments, shares, saves, duration, hashtags, sound and author.","annotations":{"title":"Video stats","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"},{"name":"tiktok_video_transcript","title":null,"description":"A video's spoken text from TikTok's own caption track: one joined string plus timed cues. has_transcript false means the video has no caption track, which is common and is not an error.","annotations":{"title":"Video transcript","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-19T13:29:11.161Z"}],"dev.protogrid/trust":{"score":79,"components":{"hygiene":80,"liveness":99,"freshness":85,"provenance":55},"drivers":["+dns-namespace","+website","+reachable","+uptime-96%","~updated-31d-ago","-no-repository"],"flags":["no-repository"],"blocked":false,"computed_at":"2026-10-19T19:33:22.947Z","disclaimer":"Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed."},"dev.protogrid/quality":{"score":85,"label":"good","components":{"auth":null,"hygiene":86,"protocol":75,"stability":100,"dependencies":null},"checks":[{"id":"protocol.modern","detail":"newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28","status":"warn","category":"protocol"},{"id":"protocol.stateless","detail":"only applies to 2026-07-28 servers","status":"na","category":"protocol"},{"id":"protocol.transport","detail":"streamable HTTP","status":"pass","category":"protocol"},{"id":"protocol.list_ttl","detail":"only applies to 2026-07-28 servers","status":"na","category":"protocol"},{"id":"auth.prm","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.as_metadata","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.cimd","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.secret_in_url","detail":"no templated URL","status":"na","category":"auth"},{"id":"tools.descriptions","detail":"every tool has a description","status":"pass","category":"hygiene"},{"id":"tools.description_length","detail":"descriptions are concise","status":"pass","category":"hygiene"},{"id":"tools.schemas","detail":"every tool has an object input schema","status":"pass","category":"hygiene"},{"id":"tools.annotations","detail":"25 of 25 tools declare readOnlyHint or destructiveHint","status":"pass","category":"hygiene"},{"id":"tools.directory_hints","detail":"no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: tiktok_creator_following (destructiveHint); tiktok_creator_profile (destructiveHint); tiktok_creator_videos (destructiveHint); …","status":"fail","category":"hygiene"},{"id":"tools.token_cost","detail":"about 5,687 tokens to load every tool","status":"pass","category":"hygiene"},{"id":"tools.api_dump","detail":"tools are not a one-to-one API dump","status":"pass","category":"hygiene"},{"id":"stability.changes","detail":"no tool changes in 30 days","status":"pass","category":"stability"},{"id":"stability.rug_pull","detail":"no tool changed its meaning under the same name","status":"pass","category":"stability"},{"id":"deps.known_vulns","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.mcp_sdk_version","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.resolvable","detail":"no npm or PyPI package","status":"na","category":"dependencies"}],"drivers":["-tools.directory_hints","~protocol.modern"],"flags":[],"tool_count":25,"token_estimate":5687,"tools_hash":"386a8bdb66aae6fd89ca82ffa5acd433","tools_changed_at":null,"computed_at":"2026-10-19T19:33:22.949Z","disclaimer":"Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed."},"dev.protogrid/identity":{"canonical_id":"app.toptik/tiktok","aliases":[],"alias_count":0,"repository_key":null,"owner":{"verified":false,"method":null,"since":null}}},"next_actions":[{"action":"list_tools","description":"Every current tool with input schemas","href":"/v1/servers/app.toptik%2Ftiktok/tools","arguments":{"name":"app.toptik/tiktok"}},{"action":"get_connection","description":"Minimal connection block for the preferred remote or package","href":"/v1/servers/app.toptik%2Ftiktok/connection?target=mcpServers","arguments":{"name":"app.toptik/tiktok","target":"mcpServers"}},{"action":"search","description":"Find other servers by intent","href":"/v1/search?q={query}","arguments":{"q":"{query}"}}]}