xdataapi
Dados públicos somente leitura do X (Twitter): perfis, posts, threads, respostas, seguidores e busca com os operadores do x.com. Pagamento por resultado; resultados vazios e erros são gratuitos.
Servidor MCP hospedado
npx add-mcp 'https://api.xdataapi.io/mcp'Instala no Claude Code, Codex, Cursor e outros
Documentação
Servidor MCP
Dê a um agente toda a API em uma única linha.
xdataapi.io serve um MCP hospedado em https://api.xdataapi.io/mcp.
O transporte é Streamable HTTP. Nada para instalar, nada para executar e, na maioria dos clientes, nada para colar:
o servidor implementa o fluxo de autorização do MCP, então um cliente faz você entrar por um navegador e obtém
sua própria credencial. Uma chave no cabeçalho também funciona, e é o que um cliente sem navegador precisa.
Cada chamada de ferramenta é uma requisição REST por baixo dos panos, pelo mesmo preço, através do mesmo cache e limite de taxa.
O agente vê credits_charged e balance_remaining em cada resultado.
Conectar [#connect]
Claude Code
claude mcp add --transport http xdataapi https://api.xdataapi.io/mcp
Claude.ai e Claude Desktop
Adicione https://api.xdataapi.io/mcp como um conector personalizado em Configurações. Esses clientes não têm campo para
cabeçalho de requisição, então esta é a única rota que os alcança.
Cursor, Windsurf e outros clientes com arquivo de configuração MCP
{
"mcpServers": {
"xdataapi": {
"url": "https://api.xdataapi.io/mcp"
}
}
}
Clientes que falam apenas stdio
A ponte mcp-remote fala stdio com o cliente e Streamable HTTP conosco, e faz login em nome do cliente.
{
"mcpServers": {
"xdataapi": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://api.xdataapi.io/mcp"]
}
}
}
Conectar com uma chave em vez disso [#connect-with-a-key-instead]
Um cliente que não pode abrir um navegador — um servidor, um contêiner, um job de CI — envia a chave no mesmo cabeçalho
que a API REST aceita, ou como Authorization: Bearer xd_live_....
claude mcp add --transport http xdataapi https://api.xdataapi.io/mcp --header "x-api-key: xd_live_..."
{
"mcpServers": {
"xdataapi": {
"url": "https://api.xdataapi.io/mcp",
"headers": { "x-api-key": "xd_live_..." }
}
}
}
Para mcp-remote, passe a chave pelo ambiente. O cabeçalho é escrito sem espaço após os dois pontos: mcp-remote divide o argumento no primeiro dois pontos, e um espaço ali chega como parte da chave.
{
"mcpServers": {
"xdataapi": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://api.xdataapi.io/mcp", "--header", "x-api-key:${XDATAAPI_KEY}"],
"env": { "XDATAAPI_KEY": "xd_live_..." }
}
}
}
Entrando, para pessoas que escrevem clientes [#signing-in-for-people-writing-clients]
Uma chamada não autenticada para /mcp responde 401 com um ponteiro para a cadeia de descoberta, que é tudo que um
cliente precisa para obter sua própria credencial:
| Etapa | Onde |
|---|---|
| O desafio | WWW-Authenticate: Bearer resource_metadata="..." no 401 |
| Recurso protegido (RFC 9728) | https://api.xdataapi.io/.well-known/oauth-protected-resource |
| Servidor de autorização (RFC 8414) | https://xdataapi.io/.well-known/oauth-authorization-server |
| Registrar um cliente (RFC 7591) | https://xdataapi.io/api/oauth/register |
| Aprovar | https://xdataapi.io/oauth/authorize |
| Trocar o código | https://xdataapi.io/api/oauth/token |
| Desconectar (RFC 7009) | https://xdataapi.io/api/oauth/revoke |
Os clientes são públicos e PKCE é obrigatório, apenas com S256. Não há escopos: toda ferramenta é somente leitura
e há um único nível de acesso, então uma lista de escopos seria várias palavras que significam a mesma coisa.
O que a troca retorna é uma chave de API comum nomeada após o aplicativo. Ela aparece no dashboard ao lado de chaves que você criou manualmente, gasta o mesmo saldo aos mesmos preços e para no momento em que você a revoga. Ela não expira e não há token de atualização: é a mesma classe de credencial que você mesmo emite, com a mesma história de revogação.
Ferramentas [#tools]
| Ferramenta | Argumentos | Créditos |
|---|---|---|
get_user | handle | 1 |
get_users | handles[], até 100 | 1 por perfil encontrado |
get_user_tweets | user, count, cursor | 1 por tweet |
get_followers | user, count, cursor | 0,1 por perfil |
get_follower_ids | user, count, cursor | 0,02 por id |
get_following | user, count, cursor | 0,1 por perfil |
search_tweets | q, product, count, cursor | 1 por tweet ou perfil |
get_tweet | id | 1 |
get_tweets | ids[], até 100 | 1 por tweet encontrado |
get_thread | id, cursor | 1 por tweet |
get_replies | id, cursor | 1 por resposta |
get_quotes | id, count, cursor | 1 por tweet |
get_retweeters | id, count, cursor | 0,5 por perfil |
get_balance | grátis |
Toda ferramenta aceita fresh: true para ignorar o cache a 2x. Todas as ferramentas são somente leitura e idempotentes, e são
anotadas como tal, então clientes que aprovam automaticamente ferramentas somente leitura não perguntam a cada chamada.
Notas [#notes]
- O servidor não tem estado. Cada requisição carrega a chave; não há sessão para expirar.
- Um erro REST (
not_found,no_credits,rate_limited) retorna como um erro de ferramenta com o mesmo corpo JSON, então o agente pode ler ocodee agir sobre ele. - Os resultados são os mesmos objetos planos
TweeteUserda API REST, como texto JSON. - As chaves são por conta. Crie uma chave por agente no dashboard para que você possa revogá-la individualmente.