HasData TikTok MCP Server
Perfis públicos do TikTok, vídeos, comentários e pesquisa por palavras-chave em vídeos ou criadores, como JSON.
Documentação
Servidor MCP do TikTok
Um servidor de Model Context Protocol (MCP) hospedado que oferece ao Claude, Cursor, Windsurf e qualquer outro cliente MCP quatro ferramentas somente leitura do TikTok. Consulte um perfil público, percorra os vídeos de uma conta, leia os comentários de um vídeo e pesquise no TikTok por vídeos ou criadores, tudo como JSON estruturado, sem conta de desenvolvedor do TikTok e sem OAuth.
Ele lê dados públicos que um visitante não autenticado pode ver. Não faz login, não publica e não age como uma conta.
1.000 créditos grátis todo mês, sem necessidade de cartão, o que equivale a 100 chamadas ao TikTok.
https://mcp.hasdata.com/mcp?apis=tiktok
Conteúdo
- O que você precisa
- Início rápido
- Exemplos de prompts
- Ferramentas
- Erros e caminhos de falha
- Preços, plano gratuito e limites
- Seleção de ferramentas
- Comparação
- Perguntas frequentes
- Links do HasData
- Desenvolvimento
- Contribuição
- Licença
O que você precisa
Um cliente MCP e uma chave de API do HasData do painel de controle, gratuita para criar. Este é um servidor remoto, então o caminho mais simples é uma URL e um cabeçalho x-api-key, sem contêiner para executar e sem conta de desenvolvedor do TikTok em nenhuma etapa do fluxo. Um cliente que só fala stdio o acessa por meio de um lançador leve, publicado como @hasdata/tiktok-mcp no npm e hasdata-tiktok-mcp no PyPI, mostrado abaixo.
Início rápido
A URL do servidor é a mesma para todos os clientes. Nós o executamos na prática no Claude Code e no Claude Desktop. Os outros blocos seguem o formato documentado de cada cliente para um servidor remoto.
| Campo | Valor |
|---|---|
| URL | https://mcp.hasdata.com/mcp?apis=tiktok |
| Transporte | HTTP, transmissível |
| Cabeçalho de autenticação | x-api-key: HASDATA_API_KEY |
Clientes com suporte a OAuth podem adicionar a mesma URL como conector e entrar sem colocar uma chave em um arquivo de configuração.
Claude Code
claude mcp add --transport http tiktok "https://mcp.hasdata.com/mcp?apis=tiktok" \
--header "x-api-key: HASDATA_API_KEY"
Claude Desktop
Configurações, depois Conectores, depois Adicionar conector personalizado, depois cole https://mcp.hasdata.com/mcp?apis=tiktok e entre.
Para o caminho via arquivo de configuração, o Claude Desktop carrega apenas servidores locais (stdio), então ele acessa um servidor remoto por meio de um lançador stdio. O pacote @hasdata/tiktok-mcp é esse lançador, e ele lê a chave do ambiente. Adicione isto ao claude_desktop_config.json:
{
"mcpServers": {
"tiktok": {
"command": "npx",
"args": ["-y", "@hasdata/tiktok-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Python em vez de Node? Troque o lançador pelo pacote do PyPI, que o uvx executa sem instalação manual:
{
"mcpServers": {
"tiktok": {
"command": "uvx",
"args": ["hasdata-tiktok-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Cursor
~/.cursor/mcp.json para cada projeto, ou .cursor/mcp.json para um único:
{
"mcpServers": {
"tiktok": {
"url": "https://mcp.hasdata.com/mcp?apis=tiktok",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Windsurf
~/.codeium/windsurf/mcp_config.json. O Windsurf chama o campo de serverUrl, não de url:
{
"mcpServers": {
"tiktok": {
"serverUrl": "https://mcp.hasdata.com/mcp?apis=tiktok",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Cline
{
"mcpServers": {
"tiktok": {
"url": "https://mcp.hasdata.com/mcp?apis=tiktok",
"type": "streamableHttp",
"headers": { "x-api-key": "HASDATA_API_KEY" },
"disabled": false
}
}
}
VS Code
.vscode/mcp.json no espaço de trabalho:
{
"servers": {
"tiktok": {
"type": "http",
"url": "https://mcp.hasdata.com/mcp?apis=tiktok",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Codex CLI
~/.codex/config.toml:
[mcp_servers.tiktok]
url = "https://mcp.hasdata.com/mcp?apis=tiktok"
[mcp_servers.tiktok.headers]
"x-api-key" = "HASDATA_API_KEY"
Gemini CLI
~/.gemini/settings.json:
{
"mcpServers": {
"tiktok": {
"httpUrl": "https://mcp.hasdata.com/mcp?apis=tiktok",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Exemplos de prompts
Prompts, não código. Cole um e o agente escolhe a ferramenta sozinho. Cada um é anotado com as chamadas que faz, porque no MCP o modelo decide quantas chamadas fazer e cada chamada bem-sucedida custa 10 créditos.
Pegue @mrbeast. Busque o perfil, depois percorra as duas primeiras páginas de vídeos e me dê a contagem mediana de reproduções entre eles.
Três chamadas, 30 créditos. O perfil é uma chamada, e cada página de vídeos é outra.
Pesquise no TikTok por criadores sobre "cold brew coffee" e classifique os dez primeiros por seguidores, cada um com sua bio.
Uma chamada, 10 créditos. Uma busca de usuários já traz contagem de seguidores e bio, então não é necessário acompanhar cada perfil.
Aqui está uma URL de vídeo. Leia os principais comentários e me diga o sentimento geral e os três comentários com mais curtidas.
Uma chamada, 10 créditos. O id numérico na URL é tudo o que a ferramenta de comentários precisa.
Pegue esse mesmo vídeo e expanda as respostas sob o comentário com mais curtidas.
Duas chamadas, 20 créditos. Primeiro os comentários de nível superior, depois uma segunda chamada com o id desse comentário para as respostas.
Pesquise vídeos de "asmr" e depois busque o perfil do autor dos três com maior contagem de reproduções.
Quatro chamadas, 40 créditos. Uma busca, depois um perfil para cada. Todo autor em um resultado de busca traz um link direto para o endpoint do perfil, então o agente nunca precisa adivinhar um nome de usuário.
Pagináginas custam uma chamada cada vez. Uma auditoria de criador que lê um perfil e depois percorre cinco páginas de vídeos são seis chamadas e 60 créditos. O plano gratuito rende mais em perguntas específicas do que em varreduras abertas.
Ferramentas
| Ferramenta | O que retorna |
|---|---|
hasdata_tiktok_comments_getTikTokComments | Busca os comentários de um vídeo público do TikTok pelo id numérico do vídeo, ou as respostas a um comentário específico quando commentId é informado. 10 créditos por chamada |
hasdata_tiktok_posts_getTikTokPosts | Uma página de ~35 vídeos mais um nextPageToken; passe esse token de volta para percorrer o histórico da conta uma página por vez. 10 créditos por chamada |
hasdata_tiktok_profile_getTikTokProfile | Busca um perfil público do TikTok pelo nome de usuário (handle) e retorna apelido, biografia, link da bio, URLs do avatar, flags de verificado/privado, data de criação da conta e…. 10 créditos por chamada |
hasdata_tiktok_search_getTikTokSearch | Pesquisa no TikTok por palavra-chave e retorna vídeos (com descrição, hashtags, menções, contagens de curtidas/comentários/compartilhamentos/reproduções, URLs de capa e vídeo reproduzível, música e…. 10 créditos por chamada |
Quatro ferramentas, todas somente leitura. Os exemplos abaixo são resumidos de chamadas reais, e os números neles mudam conforme o TikTok é atualizado. Leia-os como formatos. Cada nome de ferramenta linka para a referência do endpoint, que traz a lista completa de campos.
Os exemplos são o payload, não a resposta inteira. Um resultado tools/call traz um bloco de texto, e esse texto é em si JSON contendo url, status, text e json, com os dados extraídos sob json. De uma resposta JSON-RPC bruta, o caminho é result.content[0].text, analisado, depois .json. Um cliente de chat desembrulha isso para você, e código que fala diretamente com o endpoint não faz isso.
Handles, ids de vídeo e ids de comentário se encadeiam. Um perfil linka para suas postagens, cada postagem carrega seu próprio id de vídeo para a ferramenta de comentários, e todo autor em comentários e resultados de busca carrega um hasdataLink para seu perfil e um hasdataPostsLink para seus vídeos. Um agente percorre de uma palavra-chave a um criador, a um vídeo, a seus comentários sem nunca construir uma URL.
Obter perfil do TikTok
hasdata_tiktok_profile_getTikTokProfile
Uma conta pública por handle.
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
handle | string | sim | O nome de usuário, com ou sem o @ inicial |
Retorna username, nickname, biography, bioLink, verified, language, createTime, as URLs do avatar e as contagens de followers, follows, likes, videos e friends como inteiros. As contagens já vêm analisadas, então o followers > 1000000 compara números, não strings de exibição.
Um handle que não existe ainda retorna com
requestMetadata.statusdefinido comook, com o objetoprofilesimplesmente ausente. Verifique se o objeto está lá antes de lerusernameou qualquer outro campo, ou um agente fazendoprofile.usernamelançará erro sobre nada.
{
"username": "mrbeast",
"nickname": "MrBeast",
"verified": true,
"biography": "Checkout My New Book!👇",
"bioLink": "http://themostdangerousgames.com",
"createTime": "2018-10-20T19:26:16.000Z",
"followers": 138387571,
"follows": 354,
"likes": 1427086888,
"videos": 466,
"friends": 285
}
Obter postagens do TikTok
hasdata_tiktok_posts_getTikTokPosts
Uma página dos vídeos de uma conta por handle, do mais recente para o mais antigo.
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
handle | string | sim | O nome de usuário, com ou sem o @ inicial |
nextPageToken | string | O pagination.nextPageToken da resposta anterior. Omita-o para a primeira página |
Uma chamada retorna cerca de trinta vídeos mais pagination, que carrega hasMore e o nextPageToken que você devolve para percorrer o histórico da conta uma página por vez. Cada vídeo carrega id, description, url, duration, as URLs de capa e vídeo reproduzível, music e as contagens de likes, comments, shares, plays, collects e reposts como inteiros.
hashtagsementionsestão presentes apenas em vídeos que os carregam, e a frequência com que isso acontece segue a conta, não o endpoint. Amostras de feeds variaram de nenhuma postagem marcada a todas as postagens marcadas. Teste a chave antes de lê-la e trate um array ausente como uma conta que não marca.
{
"id": "7677375185028271391",
"description": "would you take the car or nah?",
"url": "https://www.tiktok.com/@mrbeast/video/7677375185028271391",
"createTime": "2026-08-23T23:36:59.000Z",
"duration": 41,
"likes": 129500,
"comments": 6670,
"shares": 2033,
"plays": 1100000,
"collects": 4986,
"music": { "title": "original sound", "authorName": "MrBeast", "original": true }
}
Obter comentários do TikTok
hasdata_tiktok_comments_getTikTokComments
Os comentários de um vídeo público, ou as respostas sob um comentário.
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
videoId | string | sim | O id numérico, a parte após /video/ em uma URL do TikTok. Mantenha-o como string. O id é um número de 64 bits que perde os últimos dígitos se passar por um Number de JavaScript |
commentId | string | Passe-o para obter as respostas a esse comentário em vez dos comentários de nível superior do vídeo. Uma string, pela mesma razão de 64 bits que videoId | |
nextPageToken | string | Token da resposta anterior. Omita-o para a primeira página |
Cada comentário carrega text, likes, createTime, replyCount e um author, e todo autor carrega um hasdataLink para seu perfil e um hasdataPostsLink para seus vídeos. pagination.total informa a contagem total de comentários do vídeo, então você sabe a profundidade antes de paginar. Um comentário com replyCount diferente de zero tem respostas que você alcança chamando novamente com seu id como commentId.
{
"id": "7677377150003053325",
"text": "How could someone turn down a car",
"createTime": "2026-08-23T23:45:06.000Z",
"likes": 3802,
"replyCount": 22,
"author": {
"username": "hohce.verggr",
"nickname": "Sasori",
"hasdataLink": "https://api.hasdata.com/scrape/tiktok/profile?handle=hohce.verggr",
"hasdataPostsLink": "https://api.hasdata.com/scrape/tiktok/posts?handle=hohce.verggr"
}
}
Pesquisar no TikTok
hasdata_tiktok_search_getTikTokSearch
Uma busca por palavra-chave em vídeos ou criadores.
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
keyword | string | sim | A frase a pesquisar |
type | string | video por padrão, ou user para pesquisar criadores | |
nextPageToken | string | Token da resposta anterior. Omita-o para a primeira página |
Com type: video, a resposta contém vídeos no mesmo formato que a ferramenta de postagens retorna, cada um com seu autor. Com type: user, contém criadores, cada um com username, nickname, signature (a bio), avatarUrl, followers e os mesmos hasdataLink e hasdataPostsLink para encadear em um perfil ou seus vídeos. Uma flag verified está presente em contas que a carregam.
{
"username": "la.mooncoldbrew",
"nickname": "lamoon cold brew coffee",
"signature": "อยากได้สูตรชงเมนูไหน Comment ไว้เลยน้า",
"followers": 48000,
"hasdataLink": "https://api.hasdata.com/scrape/tiktok/profile?handle=la.mooncoldbrew",
"hasdataPostsLink": "https://api.hasdata.com/scrape/tiktok/posts?handle=la.mooncoldbrew"
}
Prompts e recursos
O servidor traz 2 prompts, fluxos de trabalho prontos que um cliente pode oferecer em vez de fazer o usuário compor uma chamada de ferramenta.
| Prompt | O que faz |
|---|---|
tiktok_trend | Veja o que está sendo postado no TikTok sobre um tópico. |
tiktok_profile | Consulte um perfil público do TikTok. |
| Junto a eles, o servidor expõe um recurso: os valores aceitos do único parâmetro que aceita uma lista fixa. Ler esse recurso é mais barato do que aprender o vocabulário a partir de uma chamada rejeitada, e não custa créditos. |
| Parâmetro | Valores | O que seleciona |
|---|---|---|
type | 2 | O que pesquisar — vídeos ou usuários. O padrão é vídeo. |
O URI dele é hasdata://tiktok/type.
Ambas as listas são servidas sem chave de API, então um cliente pode lê-las antes de o usuário se cadastrar.
Erros e caminhos de falha
Seu cliente quase nunca vê um código de erro HTTP vindo de uma chamada de ferramenta. A camada MCP responde com 200 e coloca a falha dentro do resultado, com isError definido como true e o motivo como texto. O agente lê uma mensagem onde você poderia esperar uma linha de status.
Uma chave errada aparece como saída de ferramenta, não como conexão falha. tools/list aceita qualquer chave não vazia e retorna as quatro ferramentas, então o cliente completa o handshake e mostra verde. A primeira chamada de ferramenta então volta com isError: true e o texto HasData API error: 401 Unauthorized. Fique atento a essa string, porque nada antes no fluxo reporta o problema.
Uma chave ausente é o único erro HTTP real. A autorização roda antes de qualquer ferramenta, e a própria conexão falha com 401. Os cabeçalhos CORS estão presentes, e um cliente de navegador lê o status e não uma falha de rede opaca.
Um argumento que quebra o esquema de uma ferramenta é rejeitado antes de virar um scrape. O servidor responde com isError: true e o texto MCP error -32602: Input validation error, nomeando o campo problemático. Nada é buscado e nada é cobrado.
Uma chamada que tem sucesso e não encontra nada é o caso que pega as pessoas. Um handle que não existe volta como um resultado comum com requestMetadata.status definido como ok e a chave de dados simplesmente ausente. Nada no corpo diz que o resultado estava vazio. Teste pelo campo que você precisa, não por um erro.
Um identificador que a plataforma rejeita retorna 400 com requestMetadata.status definido como error.
Resultados que carregam dados também carregam um requestMetadata.id que vale citar no suporte.
Preços, plano gratuito e limites
Cada ferramenta TikTok custa 10 créditos por chamada bem-sucedida. O tamanho da resposta não muda o preço. Uma página cheia de vídeos custa o mesmo que um perfil com um único campo.
O plano gratuito é 1.000 créditos todo mês sem cartão, o que dá 100 chamadas TikTok. Ele renova com o ciclo de cobrança, então um agente de baixo volume roda no plano gratuito indefinidamente.
Os planos pagos começam em US$ 59 por mês por 200.000 créditos, o que dá 20.000 chamadas. O preço unitário cai com o volume, de US$ 2,95 por 1.000 chamadas no plano inicial para US$ 1,19 no Basic e US$ 0,83 nos níveis Growth. Os valores atuais estão na página de preços.
Seu plano também define a concorrência. O plano gratuito permite 1 requisição por vez, o Startup 5, o Basic 15, e os níveis Growth vão de 50 a 500. Trate o caso de estouro defensivamente em qualquer coisa não supervisionada, porque um agente que se expande vai atingir o teto antes de você.
Uma requisição que volta com status diferente de 200 não é cobrada. Uma chamada bem-sucedida que não encontra nada ainda é uma chamada.
Seleção de ferramentas
O parâmetro de consulta apis decide quais ferramentas seu agente vê. Menos ferramentas significa menos contexto gasto em definições de ferramentas e menos chances de o modelo escolher a errada.
?apis=tiktok the four tools in this repo
?apis=tiktok,instagram a social bundle
?apis=tiktok,google_serp add Google search
O parâmetro aceita nomes de provedores como tiktok e nomes de APIs individuais como tiktok_search. Nomes com erro de digitação são ignorados. Se todos os nomes estiverem errados, a requisição falha com 400, e o corpo lista tanto o que não foi reconhecido quanto todos os valores válidos. Remova o parâmetro e o mesmo endpoint expõe todas as 57 ferramentas HasData.
Como se compara
O próprio programa de desenvolvedores do TikTok não cobre leitura geral de conteúdo público. A Research API é restrita por uma aplicação e aberta a pesquisadores acadêmicos e sem fins lucrativos aprovados em um conjunto limitado de regiões. A Display API retorna apenas o conteúdo da conta que faz login via OAuth. Nenhuma das duas serve para um agente que precisa ler um perfil público arbitrário, seus vídeos ou os comentários de um vídeo.
| APIs oficiais do TikTok | Este servidor | |
|---|---|---|
| Acesso | Research API por aplicação, ou Display API para sua própria conta | Uma chave e uma URL |
| Escopo | Pesquisadores aprovados, ou sua própria conta autenticada | Qualquer perfil público, vídeo ou pesquisa |
| Autenticação | Revisão de aplicação ou OAuth | Um cabeçalho x-api-key |
| Comentários de vídeos que você não possui | Restrito | Sim, com threads de respostas |
| Configuração | Conta de desenvolvedor e aprovação | Nenhuma |
| Escritas e dados privados | Postagem e dados da sua própria conta via OAuth | Somente leitura, dados públicos apenas |
A maioria dos outros servidores MCP do TikTok envolve um único endpoint não oficial. Este cobre as quatro leituras que um agente realmente encadeia — perfil para posts para comentários — além de pesquisa, então uma passada inteira de pesquisa roda contra um único servidor.
O que este servidor não faz. Sem postagem, sem mensagens diretas, sem conteúdo exclusivo para seguidores ou privado, sem análises para contas que você não possui. Ele lê o que um visitante desconectado pode ver.
FAQ
Existe um servidor MCP oficial do TikTok?
O TikTok não publica um. Toda opção é construída por outra pessoa. Este é mantido pela HasData e lê páginas públicas, por isso não precisa de conta de desenvolvedor do TikTok.
O que é um servidor MCP do TikTok?
Um servidor que expõe dados do TikTok como ferramentas que um cliente de IA pode chamar. O cliente envia uma chamada de ferramenta pelo Model Context Protocol, o servidor busca os dados e retorna JSON estruturado, e o modelo trabalha com o resultado e nunca vê uma página de HTML. Este expõe quatro ferramentas e roda remotamente. O cliente conecta a uma URL e não inicia nenhum processo local.
Preciso de uma chave de API do TikTok ou conta de desenvolvedor?
Não. A única credencial é sua chave HasData. Não há aplicação de desenvolvedor para preencher nem tela de consentimento OAuth, porque as ferramentas leem páginas públicas do TikTok e não as APIs de desenvolvedor do TikTok.
Preciso hospedar ou executar algo?
Não. Este é um servidor MCP remoto em HTTP streamable. Nada para instalar, nenhum contêiner para manter aquecido, nenhum processo para reiniciar.
Os dados são ao vivo ou em cache?
Ao vivo. Cada chamada busca no momento da requisição e carrega seu próprio requestMetadata.id. Contadores como visualizações e curtidas acompanham a página, então eles se movem conforme a página se move.
Posso ler uma conta privada?
Não. As ferramentas retornam o que um visitante desconectado vê. Os vídeos de uma conta privada não são públicos, então não estão em nenhuma resposta.
Posso ler respostas de comentários, não apenas comentários de primeiro nível?
Sim. Chame a ferramenta de comentários com o id de um comentário como commentId e ela retorna as respostas desse comentário. O replyCount de um comentário informa se há respostas.
Posso usar isso junto com outras APIs HasData?
Sim. O parâmetro apis aceita uma lista, e ?apis=tiktok,instagram dá ao seu agente as quatro ferramentas TikTok mais o Instagram. Remova o parâmetro e você recebe tudo.
Conformidade e dados pessoais
A HasData acessa apenas dados publicamente disponíveis. Os termos de uma plataforma podem restringir acesso automatizado, e você é responsável pela sua própria conformidade. Onde os dados que você coleta incluem informações pessoais, certifique-se de ter uma base legal para isso sob o GDPR, CCPA ou as regras equivalentes na sua jurisdição.
Links HasData
| Página do produto e construtor de requisições | TikTok Scraper API |
| Documentação do servidor | Docs do servidor MCP |
| Todas as 57 ferramentas em um servidor | HasData/hasdata-mcp |
| Tutoriais de clientes | Clientes e integrações MCP |
| Tudo o mais que extraímos | TikTok Scraper API e mais 54 |
| Planos e custos de créditos | Planos e custos de créditos |
| Chaves e uso | Painel HasData |
| Lançador Node no npm | @hasdata/tiktok-mcp |
| Lançador Python no PyPI | hasdata-tiktok-mcp |
Desenvolvimento
Este repositório é configuração e documentação para um servidor remoto. Não há etapa de build e nada para containerizar.
Os testes em test/ verificam o contrato das ferramentas, a parte que pode quebrar sem um commit aqui. Eles verificam que ?apis=tiktok retorna exatamente quatro ferramentas, que toda ferramenta ainda declara seu parâmetro obrigatório, que nenhum nome mudou e que a chave em uso é realmente aceita. Esse último teste chama uma ferramenta de verdade e custa 10 créditos, que é o preço de um canário que pode falhar pelo motivo certo.
# macOS and Linux
HASDATA_API_KEY=your_key_here npm test
# Windows PowerShell
$env:HASDATA_API_KEY="your_key_here"; npm test
A mesma suíte roda no CI a cada push e uma vez por semana em um agendamento, porque a lista de ferramentas upstream pode mudar sem ninguém tocar neste repositório. Uma falha significa que a lista de ferramentas mudou, a chave parou de funcionar ou o endpoint ficou inacessível, e a mensagem da asserção diz qual.
Contribuindo
Correções nas tabelas de ferramentas e nos exemplos de resposta são a contribuição mais útil, porque são as partes que se desatualizam. Inclua a chamada que você fez e a resposta que obteve. Pull requests de forks rodam a suíte sem chave, e as verificações ao vivo pulam em vez de ficarem vermelhas.
Licença
MIT. Veja LICENSE.