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:

EtapaOnde
O desafioWWW-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
Aprovarhttps://xdataapi.io/oauth/authorize
Trocar o códigohttps://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]

FerramentaArgumentosCréditos
get_userhandle1
get_usershandles[], até 1001 por perfil encontrado
get_user_tweetsuser, count, cursor1 por tweet
get_followersuser, count, cursor0,1 por perfil
get_follower_idsuser, count, cursor0,02 por id
get_followinguser, count, cursor0,1 por perfil
search_tweetsq, product, count, cursor1 por tweet ou perfil
get_tweetid1
get_tweetsids[], até 1001 por tweet encontrado
get_threadid, cursor1 por tweet
get_repliesid, cursor1 por resposta
get_quotesid, count, cursor1 por tweet
get_retweetersid, count, cursor0,5 por perfil
get_balancegrá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 o code e agir sobre ele.
  • Os resultados são os mesmos objetos planos Tweet e User da 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.