xdataapi
Datos públicos de solo lectura de X (Twitter): perfiles, publicaciones, hilos, respuestas, seguidores y búsqueda con los operadores de x.com. Pago por resultado; los resultados vacíos y los errores son gratuitos.
Servidor MCP alojado
npx add-mcp 'https://api.xdataapi.io/mcp'Se instala en Claude Code, Codex, Cursor y más
Documentación
Servidor MCP
Dale a un agente toda la API en una sola línea.
xdataapi.io sirve un MCP alojado en https://api.xdataapi.io/mcp.
El transporte es HTTP Streamable. Nada que instalar, nada que ejecutar y, en la mayoría de los clientes, nada que pegar:
el servidor implementa el flujo de autorización de MCP, por lo que un cliente te autentica a través de un navegador y obtiene
su propia credencial. Una clave en el encabezado también funciona, y es lo que necesita un cliente sin navegador.
Cada llamada a una herramienta es una solicitud REST internamente, al mismo precio, a través de la misma caché y límite de velocidad.
El agente ve credits_charged y balance_remaining en cada resultado.
Conectar [#connect]
Claude Code
claude mcp add --transport http xdataapi https://api.xdataapi.io/mcp
Claude.ai y Claude Desktop
Agrega https://api.xdataapi.io/mcp como conector personalizado en Configuración. Estos clientes no tienen un campo para un
encabezado de solicitud, por lo que esta es la única ruta que llega a ellos.
Cursor, Windsurf y otros clientes con un archivo de configuración MCP
{
"mcpServers": {
"xdataapi": {
"url": "https://api.xdataapi.io/mcp"
}
}
}
Clientes que solo hablan stdio
El puente mcp-remote habla stdio con el cliente y HTTP Streamable con nosotros, y se autentica en nombre del cliente.
{
"mcpServers": {
"xdataapi": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://api.xdataapi.io/mcp"]
}
}
}
Conectar con una clave en su lugar [#connect-with-a-key-instead]
Un cliente que no puede abrir un navegador (un servidor, un contenedor, un trabajo de CI) envía la clave en el mismo encabezado
que acepta la API REST, o 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, pasa la clave a través del entorno. El encabezado se escribe sin espacio después de los dos puntos: mcp-remote divide el argumento en los dos primeros puntos, y un espacio allí llega como parte de la clave.
{
"mcpServers": {
"xdataapi": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://api.xdataapi.io/mcp", "--header", "x-api-key:${XDATAAPI_KEY}"],
"env": { "XDATAAPI_KEY": "xd_live_..." }
}
}
}
Iniciar sesión, para personas que escriben clientes [#signing-in-for-people-writing-clients]
Una llamada no autenticada a /mcp responde 401 con un puntero a la cadena de descubrimiento, que es todo lo que un
cliente necesita para obtener su propia credencial:
| Paso | Dónde |
|---|---|
| El desafío | WWW-Authenticate: Bearer resource_metadata="..." en el 401 |
| Recurso protegido (RFC 9728) | https://api.xdataapi.io/.well-known/oauth-protected-resource |
| Servidor de autorización (RFC 8414) | https://xdataapi.io/.well-known/oauth-authorization-server |
| Registrar un cliente (RFC 7591) | https://xdataapi.io/api/oauth/register |
| Aprobar | https://xdataapi.io/oauth/authorize |
| Intercambiar el código | https://xdataapi.io/api/oauth/token |
| Desconectar (RFC 7009) | https://xdataapi.io/api/oauth/revoke |
Los clientes son públicos y PKCE es obligatorio, con S256 únicamente. No hay ámbitos: cada herramienta es de solo lectura
y hay un solo nivel de acceso, por lo que una lista de ámbitos serían varias palabras que significan lo mismo.
Lo que devuelve el intercambio es una clave de API ordinaria con el nombre de la aplicación. Aparece en el panel junto a las claves que creaste manualmente, gasta el mismo saldo a los mismos precios y se detiene en el momento en que la revocas. No caduca y no hay token de actualización: es la misma clase de credencial que tú mismo creas, con la misma historia de revocación.
Herramientas [#tools]
| Herramienta | Argumentos | Créditos |
|---|---|---|
get_user | handle | 1 |
get_users | handles[], hasta 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 o perfil |
get_tweet | id | 1 |
get_tweets | ids[], hasta 100 | 1 por tweet encontrado |
get_thread | id, cursor | 1 por tweet |
get_replies | id, cursor | 1 por respuesta |
get_quotes | id, count, cursor | 1 por tweet |
get_retweeters | id, count, cursor | 0.5 por perfil |
get_balance | gratis |
Cada herramienta acepta fresh: true para omitir la caché a 2x. Todas las herramientas son de solo lectura e idempotentes, y están
anotadas como tales, por lo que los clientes que autoaprueban herramientas de solo lectura no preguntan en cada llamada.
Notas [#notes]
- El servidor no tiene estado. Cada solicitud lleva la clave; no hay sesión que caduque.
- Un error REST (
not_found,no_credits,rate_limited) regresa como un error de herramienta con el mismo cuerpo JSON, para que el agente pueda leer elcodey actuar en consecuencia. - Los resultados son los mismos objetos planos
TweetyUserque la API REST, como texto JSON. - Las claves son por cuenta. Crea una clave por agente en el panel para que puedas revocarla individualmente.