Servidor MCP cripto para agentes de IA
Un agente de IA se conecta, descubre once herramientas, lee sus descripciones para entender qué datos existen y compone sus propias peticiones. Ninguna URL que construir, ningún esquema REST que analizar.
El servidor habla el protocolo MCP sobre transporte HTTP. Transmite cada llamada a la API con tu clave, con los nombres, unidades y convenciones de la API, y presenta el resultado para un agente de IA: filas compactas, un resumen por serie y un tamaño acotado.
#Conecta tu IA al servidor MCP cripto
Una URL y una cabecera. El servidor está cerrado por defecto: sin una X-API-KEY válida, no se anuncia ninguna herramienta y toda petición se rechaza con 401 (X-Deny-Reason: missing_api_key si falta la cabecera, invalid_api_key si la clave es desconocida o está revocada).
{
"mcpServers": {
"bytnode": {
"type": "http",
"url": "https://api.bytnode.com/mcp",
"headers": { "X-API-KEY": "your_key" }
}
}
}La forma exacta del archivo de configuración depende del agente de IA, y el bloque genérico de arriba no sirve para todos: Claude Desktop, ChatGPT y Gemini CLI lo leen de otra manera. La página del servidor MCP da la config lista para pegar de cada cliente: Claude Desktop, Claude Code, ChatGPT, Cursor, Codex, VS Code, LangChain, n8n y más.
El transporte es Streamable HTTP sin sesión: cada petición es autónoma. serverInfo.version es la versión de la superficie MCP (1.0.0) — sus herramientas, sus instrucciones y la forma de sus respuestas —, distinta de la versión del contrato de la API (1.0.2); cada respuesta la repite en mcp_version. Algunos clientes conservan las definiciones de herramientas recibidas al conectarse: cuando mcp_version cambia (una nueva versión mayor señala un cambio al que adaptarse), vuelve a conectar el conector para cargar las nuevas. Las capacidades solo anuncian lo que existe — herramientas y recursos, sin notificaciones listChanged — y un recurso desconocido responde con el error JSON-RPC -32002. CORS está abierto en /mcp: un cliente MCP que se ejecuta en un navegador puede conectarse. Los conectores que inician sesión con OAuth (claude.ai, ChatGPT, Claude Code) no necesitan clave: una petición sin clave recibe 401 con WWW-Authenticate: Bearer resource_metadata=…, que señala el servidor de autorización, bytnode.com, donde apruebas la conexión. Si no, la clave va en la cabecera X-API-KEY, o como Authorization: Bearer. Sin clave, la ficha del servidor https://api.bytnode.com/.well-known/mcp/server-card.json describe toda la superficie (herramientas, recursos, versión, autenticación), y /mcp/server.json es su entrada para el registro oficial de MCP.
#Las once herramientas de datos del mercado cripto
Las once son de solo lectura, sin efectos secundarios e idempotentes: un agente de IA puede repetirlas sin riesgo. Las cinco herramientas de datos tienen cada una su objetivo — un par, un activo, todo el mercado, la macro, on-chain — y funcionan igual: fields (los nombres de los campos que devolver), limit, since_ms / until_ms, last, columns, detail y max_tokens (detallados en get_pair_data) significan lo mismo en todas, cada respuesta lleva server_time y response_tokens, y sus convenciones comunes — modos, ventanas, resumen, unidades, presupuesto de tamaño — están en las instrucciones del servidor, enviadas una vez al conectarse en lugar de repetirse en cada descripción. rank_pairs clasifica todos los pares según una métrica, y read_export lee el resto de una respuesta recortada por su presupuesto.
get_system_info
Tu plan y, bajo demanda, los pares servidos, la frescura de los datos y los catálogos que un agente de IA necesita para apuntar a un campo. Devuelve siempre la salud del servicio y plan: el plan de tu clave — sus familias, su profundidad de histórico por timeframe, su límite por minuto y la cuota restante —, sin contar en tu cuota. include añade la lista viva de pares y/o un resumen de frescura, freshness_fields la frescura de campos concretos, catalogs las series que espera get_macro_data o las capacidades de un par. Cada parte pedida cuenta una petición.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
include | string[] | — | Entre symbols (la lista viva de pares servidos) y freshness (el resumen de frescura de los datos: state, stale_fields, stale_feeds). Ambos a la vez. |
freshness_fields | string[] | — | Nombres de campos, de cualquier herramienta de datos, cuya frescura quieres: por campo, age_s e is_stale. Implica freshness. |
catalogs | string[] | — | Entre macro_series y macro_intraday_series (las series de get_macro_data, las segundas con sus timeframes), symbol_capabilities. Varios a la vez. |
symbol | string | — | Requerido por symbol_capabilities: qué flujos están activos y qué métricas están disponibles o bloqueadas, antes de pedirlas. |
category | string | — | Filtra el catálogo macro_series. |
get_pair_brief
El estado de un par en una llamada, siempre con la misma forma, sin campos que elegir: price_change (el precio y sus variaciones móviles), funding_next, el último basis, el oi (con oi_usd) y el cvd del último bucket de 1h cerrado, las liquidaciones de las últimas 24 horas en un objeto (liquidations_24h: from y to, el inicio del primer y del último bucket de 1h, long_usd, short_usd, total_usd, bucket_count) y el índice Fear & Greed (fear_greed). Cada valor es un objeto plano: ninguna serie que leer, ningún total que buscar en summary. Cuesta alrededor de una petición de cuota por par, más una. Para todo lo demás — otros campos, un histórico, otro paso —, get_pair_data. Lee valores actuales: en Free, que no tiene la familia snapshot, se rechaza, y get_pair_data con last: "1h" da los últimos puntos.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
symbol | string[] | — | Obligatorio: un par, p. ej. BTCUSDT, o una lista de hasta 10 pares para compararlos; con varios, cada clave lleva su par delante (BTCUSDT/funding_next), y fear_greed, de todo el mercado, llega una sola vez. |
get_pair_data
Los datos de mercado de un par, o de hasta diez comparados en una llamada: precio y velas, operaciones, libro y flujo de órdenes, derivados (open interest, funding, basis, liquidaciones) y tokenomics. Una llamada, varios campos, valor actual o histórico fechado. Los campos que sirve el snapshot REST comparten una sola petición por par; los demás (las grandes operaciones, por ejemplo) van por su propia ruta, en paralelo. fields lista los campos que devolver, limit el número de últimos puntos de cada serie.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
symbol | string[] | — | Obligatorio: el par, p. ej. BTCUSDT, o una lista de hasta 10 pares para compararlos: las peticiones se cuentan por par, cada clave pasa a ser par/campo (ETHUSDT/funding_next) y un par rechazado no impide los demás (errors, partial). La lista viva se obtiene con get_system_info. |
fields | string[] | — | Obligatorio: los campos que devolver, varios por llamada, entre los 24 nombres de esta herramienta (listados más abajo). Un campo de otra herramienta se rechaza con el nombre de su herramienta. |
limit | integer | — | Los N últimos puntos de cada serie; por defecto, el último (con un timeframe, los N últimos buckets). Un campo solo de valor actual como price_change da un punto; un limit por encima del máximo propio de un campo (1000 para una serie, 10000 para las operaciones individuales) se recorta, y warnings lo indica. Con una ventana, un tope de puntos por serie. describe_fields indica qué cuenta N. |
timeframe | string | 1h | Paso de los campos marcados timeframe. Si se omite: 1h en valor actual; en histórico, un paso que da unos 200 puntos. 1w: solo klines. |
live | boolean | false | Solo valor actual: añade la vela en formación, marcada is_closed: false. |
since_ms / until_ms | string | — | Los límites de una ventana fechada: milisegundos epoch, una fecha ISO 8601 (2026-10-20T00:00:00Z; sin zona horaria, UTC) o una duración transcurrida ('48h', '30d'; unidades m, h, d, w). Si está presente, cada campo pedido devuelve su histórico. |
last | string | — | El histórico sobre la duración indicada ('48h', '30d') en buckets cerrados enteros: since_ms retrocede al inicio de su bucket, así que last: '7d' en 1h da 168 velas, frente a 167 con since_ms: '7d'. Sustituye a since_ms (los dos juntos se rechazan); until_ms puede fijar su final. |
min_usd | number | — | Umbral en USD de trades_large (100 000 por defecto, mínimo 1 000) y de liquidations_events. |
market | string | all | Mercado de cvd, buy_sell_ratio, trades_avg_size y orderbook: all (spot + futuros perpetuos), spot o futures. La herramienta lo traduce a la ruta de ese mercado. |
columns | string | — | Las columnas que conservar en cada fila, como lista (p. ej. ["close", "volume"]; también se acepta una cadena CSV), notación con puntos para los campos anidados — el equivalente de ?fields= en la API REST (aquí, fields nombra los campos de datos). Se aplica campo por campo: una columna presente en al menos un campo pedido se aplica donde existe, y warnings indica dónde se ignoró; una columna desconocida para todos los campos se rechaza, con una sugerencia. Prevalece sobre detail. |
detail | string | compact | compact: las columnas principales de las filas pesadas, is_closed omitido cuando todas las filas están cerradas, identificadores de operaciones omitidos; omitted_columns nombra lo que se dejó fuera. full: todas las columnas. |
max_tokens | integer | 6000 | Presupuesto de la respuesta en tokens estimados, de 1500 a 16 000 (por defecto 6000). El mismo parámetro en cada herramienta de datos, get_market_indicators, rank_pairs y read_export. |
get_options_data
Las opciones y los ETF spot de un activo: resumen de opciones, open interest, volumen, put/call, volatilidad implícita, max pain, griegas, OI por strike, y etf_fundamentals (las declaraciones trimestrales ante la SEC de los ETF spot por emisor; sin flujos diarios). expiries: true añade los vencimientos activos con, por vencimiento, el OI de calls y puts, el put/call, el max pain, los strikes principales y la IV ATM; options_summary y options_put_call_ratio son totales de todos los vencimientos.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
asset | string | — | Obligatorio: el activo solo, p. ej. BTC, nunca un par. |
fields | string[] | — | Los campos que devolver, entre los 11 nombres de esta herramienta (listados más abajo). La única herramienta de datos donde es opcional: expiries: true puede ir solo. |
limit | integer | — | Los N últimos puntos de cada serie; por defecto, el último (con un timeframe, los N últimos buckets). Un campo solo de valor actual como price_change da un punto; un limit por encima del máximo propio de un campo (1000 para una serie, 10000 para las operaciones individuales) se recorta, y warnings lo indica. Con una ventana, un tope de puntos por serie. describe_fields indica qué cuenta N. |
expiries | boolean | false | Añade data.expiries: los vencimientos activos y las cifras de cada uno, en una petición. Su fecha es la expiry de los demás campos. Válido por sí solo, sin ningún campo. |
timeframe | string | — | Paso del histórico de opciones (campos marcados timeframe). Si se omite, un paso que da unos 200 puntos. |
expiry | string | — | Un vencimiento, AAAA-MM-DD: options_oi_distribution, y options_max_pain en histórico, donde es obligatorio. |
ticker | string | — | Un emisor de ETF, p. ej. IBIT: filtro opcional del histórico de etf_fundamentals. |
get_market_overview
Todo el mercado cripto, sin objetivo: capitalización total, volumen y dominancia de BTC/ETH (global_market), dos índices Fear & Greed (fear_greed y el de CMC, fear_greed_cmc), altcoin_season, y los índices cmc20 y cmc100.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
fields | string[] | — | Obligatorio: los campos que devolver, varios por llamada, entre los 6 nombres de esta herramienta (listados más abajo). Un campo de otra herramienta se rechaza con el nombre de su herramienta. |
limit | integer | — | Los N últimos puntos de cada serie; por defecto, el último (con un timeframe, los N últimos buckets). Un campo solo de valor actual como price_change da un punto; un limit por encima del máximo propio de un campo (1000 para una serie, 10000 para las operaciones individuales) se recorta, y warnings lo indica. Con una ventana, un tope de puntos por serie. describe_fields indica qué cuenta N. |
timeframe | string | — | Paso de global_market solamente (1h, 4h, 1d); los índices son diarios. |
get_macro_data
La macro estadounidense y mundial. macro lee una serie FRED (DGS10, DCOILWTICO…) — sin series, el último valor de cada serie; macro_intraday lee un instrumento intradía de su catálogo (p. ej. PAXGUSDT), con series obligatoria. Cuatro campos calculados no admiten objetivo: liquidez neta, correlaciones cripto-macro, momentum y una puntuación de riesgo. Las listas de series vienen de los catálogos de get_system_info.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
fields | string[] | — | Obligatorio: los campos que devolver, varios por llamada, entre los 6 nombres de esta herramienta (listados más abajo). Un campo de otra herramienta se rechaza con el nombre de su herramienta. |
limit | integer | — | Los N últimos puntos de cada serie; por defecto, el último (con un timeframe, los N últimos buckets). Un campo solo de valor actual como price_change da un punto; un limit por encima del máximo propio de un campo (1000 para una serie, 10000 para las operaciones individuales) se recorta, y warnings lo indica. Con una ventana, un tope de puntos por serie. describe_fields indica qué cuenta N. |
series | string | — | El identificador de la serie: una serie FRED para macro (p. ej. DGS10; opcional para su valor actual), un instrumento para macro_intraday (p. ej. PAXGUSDT; obligatorio). |
timeframe | string | — | Paso de macro_intraday solamente (su catálogo da los pasos de cada instrumento). |
get_onchain_data
On-chain de Bitcoin y de Ethereum, sin objetivo: ocho campos btc_* (red, mempool, comisiones, minería, MVRV, NVT, direcciones activas, ingresos por dificultad) y ocho campos eth_* (oferta, gas, staking, deflación, DeFi, momentum del gas, contracción de la oferta, precio del ETH en BTC).
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
fields | string[] | — | Obligatorio: los campos que devolver, varios por llamada, entre los 16 nombres de esta herramienta (listados más abajo). Un campo de otra herramienta se rechaza con el nombre de su herramienta. |
limit | integer | — | Los N últimos puntos de cada serie; por defecto, el último (con un timeframe, los N últimos buckets). Un campo solo de valor actual como price_change da un punto; un limit por encima del máximo propio de un campo (1000 para una serie, 10000 para las operaciones individuales) se recorta, y warnings lo indica. Con una ventana, un tope de puntos por serie. describe_fields indica qué cuenta N. |
timeframe | string | — | Paso de btc_fees solamente (1h, 4h, 1d); las demás series conservan la cadencia de su fuente. |
dataset | string | — | concentration (por defecto), rewards, difficulty o fee_rates, para el histórico de btc_mining. |
get_market_indicators
Los diecinueve indicadores técnicos, calculados bajo demanda, para uno a diez pares. symbol (una lista, como en las demás herramientas), timeframe e indicators son obligatorios; solo limit tiene un valor por defecto, 1. Los parámetros, valores por defecto y límites de cada tipo están en el esquema JSON y en la descripción de la herramienta.
await c.call_tool("get_market_indicators", {
"symbol": "BTCUSDT",
"timeframe": "1h",
"limit": 60,
"indicators": [
{"id": "rsi_7", "type": "rsi", "period": 7},
{"id": "rsi_21", "type": "rsi", "period": 21},
{"id": "macd", "type": "macd", "fast": 12, "slow": 26, "signal": 9},
{"id": "adx_14", "type": "adx", "period": 14},
],
})Se aplican las mismas reglas que en REST: un id a tu elección para cada indicador, único en la llamada, y un máximo de limit + warm-up ≤ 1000. La respuesta tiene la forma de la de las herramientas de datos: data lleva una serie por id@timeframe (par/id@timeframe con varios pares), indicators el tipo y los parámetros de cada uno; un par en el que los indicadores no se aplican (una stablecoin) tiene sus claves en null, con not_applicable en unavailable, y un par rechazado aparece en errors. Una petición de cuota por par.
describe_fields
La definición completa de los campos de las cinco herramientas de datos: qué devuelve cada uno (columnas, convenciones, cómo se fechan sus filas), la unidad de cada columna (units), los umbrales de cada etiqueta (labels), su herramienta y su objetivo, sus timeframes, su máximo de puntos, su histórico, sus parámetros adicionales y el soporte de live. También describe las claves de salida que no son campos: liquidations_24h, oi_usd, cumulative_net_volume y ranking. Sin llamada a la API, sin cuota: la descripción de cada herramienta lleva una línea por campo, con las mismas etiquetas que el índice, y esta herramienta da el resto. Las mismas definiciones son recursos MCP: bytnode://fields (el índice, con la herramienta de cada campo) y bytnode://fields/{name}.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
fields | string[] | — | Los nombres que describir, al menos uno: campos de cualquier herramienta de datos, o las claves de salida liquidations_24h, oi_usd, cumulative_net_volume y ranking. Un nombre desconocido se rechaza con una sugerencia. |
rank_pairs
Todos los pares servidos clasificados según una métrica, devolviendo los limit primeros, por una petición de cuota sea cual sea el número de pares: oi_usd (open interest en USD), volume_usd_24h (volumen spot + futuros de las últimas 24 horas cerradas, suma del volumen horario × el cierre), funding_next (el próximo funding estimado: estimated_rate_pct, equivalente a 8 h en %, y apr_pct), price_change_pct (la variación móvil sobre window) y rsi (RSI 14 sobre la última vela cerrada de timeframe). data.ranking da para cada par su rank, su symbol, su valor y su precio. Los valores tienen como mucho 60 segundos (computed_at); un par sin la métrica — pares solo spot para oi_usd, funding_next y rsi, un flujo ausente — aparece en excluded. La petición de cuota se hace con tu clave en la ruta de la familia de la métrica, así que tu plan se aplica: derivados para oi_usd y funding_next, precio y volumen para price_change_pct y volume_usd_24h, indicadores para rsi. Para los datos completos de un par, get_pair_data.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
metric | string | — | Obligatorio: oi_usd, volume_usd_24h, funding_next, price_change_pct o rsi. |
order | string | desc | desc (el mayor primero, por defecto) o asc — el funding más negativo, por ejemplo. |
limit | integer | 10 | El número de pares devueltos, de 1 a 100. |
window | string | 1d | Solo price_change_pct: 1h, 4h, 1d (por defecto) o 1w. |
timeframe | string | 4h | Solo rsi: las velas del RSI, 1h, 4h (por defecto) o 1d. |
max_tokens | integer | 6000 | Presupuesto de la respuesta en tokens estimados, de 1500 a 16 000 (por defecto 6000). El mismo parámetro en cada herramienta de datos, get_market_indicators, rank_pairs y read_export. |
read_export
El resto de una respuesta recortada por su presupuesto de tamaño, página a página, en el mismo formato, sin petición a la API ni cuota. Una respuesta recortada lleva export.export_id, y el missing de su ranges (o, para varios pares, el missing del nivel superior) da la llamada que hacer: read_export(export_id=…, key='klines@1h', offset=N). Cada página indica row_count, total_row_count y next_offset (null al final), y keys lista cada serie del export con su número de filas. Un export dura una hora y se lee con la clave API que lo produjo.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
export_id | string | — | Obligatorio: el export.export_id de la respuesta recortada (también se acepta su URI bytnode://). |
key | string | — | La serie que leer, con su clave en el data de la respuesta (klines@1h, por ejemplo); por defecto la primera. keys las lista. |
offset | integer | 0 | La primera fila que devolver, siendo 0 la más reciente; el row_count del ranges de la respuesta recortada la da. |
max_tokens | integer | 6000 | Presupuesto de la respuesta en tokens estimados, de 1500 a 16 000 (por defecto 6000). El mismo parámetro en cada herramienta de datos, get_market_indicators, rank_pairs y read_export. |
#Dato cripto actual o histórico
El modo depende de una sola cosa: la presencia de una ventana fechada. Sin since_ms, until_ms ni last, una herramienta de datos responde con el valor actual; con uno de ellos, cada campo pedido responde con su histórico en la ventana — varias métricas fechadas en una sola llamada.
| Petición | Qué devuelve cada campo |
|---|---|
| fields: [...] | El último punto de cada campo; para una serie por buckets, el último bucket cerrado. |
| limit: N | Los N últimos puntos de cada serie; para un campo marcado timeframe, los N últimos buckets del timeframe (1h por defecto): basis, oi_change y las demás series por minuto se agregan entonces por bucket. Un campo solo de valor actual da uno. |
| since_ms / until_ms, o last | Su serie completa en el periodo, nunca recortada en silencio. Una fila se devuelve cuando su instante (el inicio de su bucket) es ≥ since_ms y ≤ until_ms; un bucket sin terminar nunca se devuelve. last retrocede since_ms al inicio de su bucket: last: '24h' en 1h da los 24 buckets cerrados, since_ms: '24h' como mucho 23. Sin timeframe, el servidor elige un paso que da unos 200 puntos para toda la llamada y lo indica en ranges.note; un timeframe impuesto que no cabe se rechaza antes de la llamada, con el motivo exacto (fuera del plan, o demasiados puntos para una llamada) y el paso que funcionaría. |
| live: true | Los campos listados abajo añaden la vela en formación, provisional. Se rechaza con una ventana, y si ningún campo pedido la sirve. |
Campos que sirven la vela en formación
klinescvdspread_interexchangetrades_klinetrades_kline_spottrades_kline_futures
#Seleccionar pares y mercados cripto
Cada herramienta de datos tiene su objetivo: un par para get_pair_data (symbol, obligatorio), un activo para get_options_data (asset, obligatorio), una serie de catálogo para get_macro_data (series), ninguno para get_market_overview y get_onchain_data. Cada campo pertenece a una sola herramienta. Lo que no encaja se rechaza antes de la primera llamada de red, nunca se absorbe, y todos los problemas se enumeran en el mismo mensaje.
| Caso | Respuesta |
|---|---|
| Un objetivo ausente | Un error que nombra el parámetro que falta, con un ejemplo: symbol y asset son obligatorios en el esquema de su herramienta, series para macro_intraday y para el histórico de macro. |
| Un campo pedido a la herramienta equivocada | Error: 'fear_greed' is a field of get_market_overview: call that tool. El mensaje nombra la herramienta del campo en lugar de un campo cercano. |
| series que ningún campo pedido espera | Error: solo macro y macro_intraday leen series; los campos macro calculados no tienen objetivo. |
| asset con un par | Error: asset espera el activo solo. No hay ninguna derivación automática. |
| Un parámetro que la ruta elegida no acepta | Error: por ejemplo expiry en el valor actual de options_max_pain, que solo acepta su histórico. |
| Un timeframe que ningún campo usa | Error: el timeframe no se aplica a ningún campo pedido (cada herramienta indica qué campos lo admiten: klines, cvd, trades_kline… para un par, global_market, macro_intraday, btc_fees). |
| Una ventana fechada en un campo que no la admite | Error: el campo no tiene histórico fechado; pide su valor actual, sin ventana, o el campo que lleva su histórico, que el mensaje nombra (price_change → klines, funding_next → funding_rate). |
| last junto con since_ms | Error: last sustituye a since_ms, hay que dar solo uno. Un límite que no es ni milisegundos epoch, ni una fecha ISO 8601, ni una duración se rechaza con las formas aceptadas. |
| Más de 10 pares en symbol | Error: 10 pares como máximo por llamada, con el número recibido. |
#Los 64 campos del mercado cripto
Los nombres son los de la API, idénticos en valor actual y en histórico, con estas diferencias: el mercado global se llama global_market aquí y global en el snapshot REST (global es una palabra reservada de Python, el lenguaje del servidor); el mercado es un parámetro aquí (market: "spot") y un sufijo de ruta en REST (/v1/cvd/spot); las cifras de cada vencimiento de opciones llegan con expiries: true de get_options_data (REST: /v1/options/expiry) y las capacidades de un par con el catálogo symbol_capabilities (REST: /v1/capabilities?symbol=…); y un histórico indica el paso que la herramienta eligió en timeframe_applied, ya que puede elegirlo. El detalle de cada campo — su herramienta, qué contiene, sus unidades, qué cuenta N, su máximo, su histórico — lo da describe_fields; la descripción de cada herramienta lleva una línea por campo, con sus etiquetas (timeframe, solo valor actual, live, limit máximo). Consulta también el catálogo de datos.
get_pair_data: veinticinco campos por par (symbol)
klinesprice_changetrades_spottrades_futurestrades_largetrades_kline_futures_secondsoifunding_nextfunding_ratefunding_cumulativebasisoi_changeliquidations_eventsliquidations_cumulativeliquidations_big_small_ratioorderbookcvdspread_interexchangebuy_sell_ratiotrades_avg_sizetrades_klinetrades_kline_spottrades_kline_futurestokenomics
get_options_data: once campos por activo (asset)
options_summaryoptions_oioptions_oi_changeoptions_oi_distributionoptions_volumeoptions_put_call_ratiooptions_ivoptions_iv_klinesoptions_max_painoptions_greeksetf_fundamentals
Los campos de opciones y etf_fundamentals. Los vencimientos activos, con las cifras de cada uno, llegan con expiries: true. options_max_pain lista todos los vencimientos activos, el más próximo primero, y limit: N conserva los N más próximos, sin ventana; una ventana da el histórico de un solo expiry, entonces obligatorio.
get_market_overview: seis campos de todo el mercado (sin objetivo)
global_marketfear_greedfear_greed_cmcaltcoin_seasoncmc20cmc100
get_macro_data: seis campos macro
macromacro_intradaymacro_net_liquiditymacro_correlationsmacro_momentummacro_risk
macro sin series devuelve el último valor de cada serie FRED; con ella, solo esa serie, y su histórico la exige. macro_intraday la exige siempre y rechaza 30m. Los dos no llevan los mismos instrumentos: no sustituyas uno por otro. Los cuatro campos calculados (macro_net_liquidity, macro_correlations, macro_momentum, macro_risk) no admiten series.
get_onchain_data: dieciséis campos on-chain (sin objetivo)
btc_networkbtc_mempoolbtc_feesbtc_miningbtc_mvrvbtc_nvtbtc_active_addressesbtc_revenue_per_difficultyeth_supplyeth_gaseth_stakingeth_deflationeth_defieth_gas_momentumeth_squeezeeth_price_btc
Solo btc_fees admite un timeframe; el histórico de btc_mining admite un dataset; las valoraciones (btc_mvrv, btc_nvt…) son diarias.
Solo valor actual
price_changetrades_spottrades_futurestrades_largetrades_kline_futures_secondsfunding_nextliquidations_eventsmacro_correlationsmacro_momentummacro_riskoptions_summaryoptions_oi_distributionoptions_greeks
Estos campos no tienen histórico fechado: sirven su valor actual (un punto, o con limit los N últimos cuando el campo cuenta filas — operaciones, eventos de liquidación). Una ventana since_ms o until_ms sobre ellos se rechaza en lugar de ignorarse — un agente de IA creería filtrar un periodo mientras recibe los últimos puntos.
#La respuesta: datos de mercado cripto que tu agente de IA puede leer
Los datos conservan los nombres, unidades y convenciones de la API, con una clave por campo, pero se presentan para un agente de IA en lugar de devolverse tal cual. Un campo con timeframe tiene la clave campo@tf; con varios pares, cada clave lleva su par delante (ETHUSDT/funding_next, BTCUSDT/cvd@1h). Una respuesta lleva mode, data, api_requests, server_time (la hora del servidor, ISO 8601 UTC), mcp_version (la versión de la superficie MCP) y response_tokens (su propio tamaño, en tokens estimados), más, cuando aplican, scopes, summary, ranges, freshness, warnings, errors, partial, unavailable, omitted_columns, missing, truncation, export, timeframe_applied y window; get_market_indicators y rank_pairs responden con el mismo sobre. Una serie vacía o que no aplica vale null, y unavailable indica por qué. unavailable y out_of_plan_fields son las del snapshot. Ninguna herramienta declara un outputSchema: las claves se describen aquí, y structuredContent lleva el mismo JSON que el texto.
{
"mode": "latest",
"data": {
"klines@1h": {
"first_time": "2026-10-21T13:00:00.000Z",
"step_s": -3600,
"columns": ["open", "high", "low", "close", "volume"],
"rows": [[…], …]
},
"oi@1h": { "first_time": …, "step_s": -3600, "columns": ["oi", "oi_usd", … ], "rows": [ … ] },
"funding_next": { … },
"price_change": { … }
},
"scopes": {
"symbol:BTCUSDT": ["klines@1h", "oi@1h", "funding_next", "price_change"]
},
"summary": {
"klines@1h": { "column": "close", "latest": …, "min": …, "max": …, "mean": …,
"change_pct": …, "high_max": …, "low_min": …, … }
},
"freshness": { "age_s": { "klines@1h": 4, "funding_next": 2, … }, "stale": [] },
"omitted_columns": { "klines@1h": ["is_closed"] },
"timeframe_applied": "1h",
"unavailable": { … },
"api_requests": 1,
"server_time": "2026-10-21T14:02:31.512Z",
"response_tokens": 1840
}data: una lista de filas llega como{columns, rows}, filas de la más reciente a la más antigua; un punto único, como objeto; una serie vacía o que no aplica, comonull. Una serie de paso regular no tiene columnatimesinofirst_timeystep_s, sea cual sea su número de filas, una incluida: la fila i tiene la fechafirst_time + i × step_s, siendostep_snegativo, desde la fila más reciente hacia atrás; ante el menor hueco, la columnatimese mantiene. Los eventos (operaciones y liquidaciones individuales) y las tablas conservan sutime, y lo que comparten todas las filas se indica una vez en el bloque:date(cadatimees entonces la hora UTC de ese día,12:54:30.494Z) o un solotime(todas las filas en ese instante, como una tabla de vencimientos);.000desaparece cuando ninguna fila tiene milisegundos. Los flotantes conservan 6 cifras significativas, salvo las ofertas y los acumulados, que conservan sus unidades enteras. Condetail: "compact"(por defecto), las filas pesadas conservan sus columnas principales,is_closedse omite cuando todas las filas están cerradas y los identificadores de operaciones se omiten;omitted_columnsnombra lo que se dejó fuera, ydetail: "full"lo devuelve.scopes: el alcance real de cada clave —symbol:X,asset:X,series:X, omarketpara un campo sin objetivo.macropedido sinseriesse etiquetamarket, nunca con una serie. Con varios pares, el prefijo de la clave ya nombra su par: solo quedan los alcances de los demás objetivos (market…).mode:latestohistory; en histórico,windowrepite los límites yrangesindica, por serie, lo que realmente se cubre:timeframe,row_count,fromyto(el inicio del primer y del último bucket, como eltimede cada fila),noteytruncated; cuando una serie se recorta,missingindica cómo obtener el resto — unlimitmenor, una ventana anterior que termina ennext_until_ms, oread_exportdesde el offset que da.summary: por serie, sobre su columna principal, el último y el más antiguo valor, el mínimo y el máximo con su instante, y la media; la suma para un flujo (liquidaciones, volumen neto…), con ensumsla de sus componentes (long_usdyshort_usd,buy_volumeysell_volume), la variación (ychange_pctcuando tiene sentido) para un estado; las velas añadenhigh_maxylow_mincon su instante. Los trades y liquidaciones individuales añadenby_side(número, cantidad y USD por lado).freshness(valor actual):age_s, los segundos transcurridos desde la última entrega del flujo de origen de cada clave (la fecha de una fila es sutime), ystale, las claves cuyo flujo va con retraso, según el monitor de flujos;warningsnombra cada campo retrasado — su valor no es actual — y cada columna de proyección que un campo ignoró.- Tamaño: una respuesta se limita a 6000 tokens estimados por defecto; el parámetro
max_tokensde las herramientas de datos, deget_market_indicators, derank_pairsy deread_exportlo ajusta de 1500 a 16 000, yresponse_tokensda el tamaño de cada respuesta. Más allá del presupuesto, las series más pesadas conservan sus filas más recientes, el recorte se indica una vez, en elrangesde cada serie (row_countfilas devueltas detotal_row_count, ymissing: cómo obtener el resto, a menudo elmax_tokensque basta para la respuesta entera; el mismo campo recortado para varios pares lleva una sola indicación, en elmissingdel nivel superior;truncationsolo para lo que no tieneranges), los metadatos idénticos para varios pares (ranges,omitted_columns,freshness) se escriben una vez por campo, con el nombre del campo, yexportguarda los datos completos durante una hora, para la misma clave:read_exportlos lee página a página conexport.export_id, en el formato de las respuestas, sin petición a la API ni cuota. También es el recurso MCPbytnode://exports/{id}, para los clientes que leen recursos, en un solo bloque, con 8 cifras significativas y eltimede cada fila. timeframe_applied: el paso realmente aplicado, en cuanto un campo lo ha usado;live: presente cuando se pidió la vela en formación.errorsypartial: un campo con error no bloquea los demás, ni un par rechazado los otros pares. Se indica enerrors(un par, con su nombre) y la respuesta llevapartial: true.api_requests: las peticiones que esta llamada contó en tu cuota — por cada par, una para los valores actuales de los campos del snapshot juntos; una para cada otro campo, cada histórico yexpiries.oi_usd: cada fila deoilleva el open interest en USD,oi× el cierre de la vela spot de referencia del mismo bucket (nullsin ella), también en valor actual, sin petición adicional;get_pair_brieftambién lo lleva. Del mismo modo, cada fila decvdllevacumulative_net_volume, el acumulado denet_volumedesde la fila más antigua de la serie servida: la curva de CVD sobre el periodo. El valor actual deliquidations_cumulativees su último bucket cerrado (1h por defecto), fechado en su inicio como cualquier fila.
#Errores en las llamadas de datos de mercado cripto
Todo error empieza por Error (HTTP NNN): message. Cuando la API ha respondido, termina con [code: …], el error.code estable de la API. Una llamada de herramienta fallida se marca como error MCP (isError), nunca se devuelve como dato, y lleva el mismo error en campos en structuredContent.error: {status, code, message, param?, hint?, retry_after_s?}. code es el de la API cuando lo dio (invalid_symbol, plan_family, history_depth, rate_limited, quota_exceeded…); si no, sigue el estado (invalid_request para un 422, unauthorized para un 401…); un campo pedido a la herramienta equivocada da wrong_tool, con la herramienta correcta en hint (call get_market_overview), un campo o una columna desconocidos unknown_field, un parámetro desconocido unknown_parameter, con did you mean … en hint; retry_after_s es la espera indicada cuando el mensaje da una.
| Situación | Comportamiento |
|---|---|
| Petición sin clave válida | 401, X-Deny-Reason: missing_api_key (o invalid_api_key), antes de anunciar una sola herramienta. |
| Petición no válida | Error (HTTP 422) que enumera cada problema, antes de cualquier llamada de red. |
| Familia fuera del plan | Error (HTTP 403): The 'options' data family is not included in your plan. GET /v1/limits lists the families of your key; https://bytnode.com/pricing lists the plans that open it. [code: plan_family] — el dato existe, solo que no en tu plan. |
| Snapshot fuera del plan (Free) | Un Error (HTTP 403) explícito en los valores actuales (los campos del snapshot, get_pair_brief), que nombra el plan que los incluye; los demás campos se siguen sirviendo, y un histórico corto (last: '1h') da los últimos puntos. |
| Un periodo más allá de la profundidad del plan | Rechazado antes de la llamada, con la profundidad del plan en ese paso y el paso que serviría el periodo; en el límite, el Error (HTTP 403) de la API [code: history_depth]. |
| Límite o cuota | Error (HTTP 429) con el detail de la API: límite por minuto o cuota mensual. |
| Un campo con error | Indicado en errors, los demás servidos, partial: true; un error idéntico en varios campos se escribe una sola vez (same error as '…'). La llamada solo falla si ningún campo tiene éxito. |
| Un par rechazado entre varios | Indicado en errors con su nombre (un symbol inválido, por ejemplo), los demás pares servidos, partial: true. La llamada solo falla si ningún par tiene éxito. |
| Un symbol no válido | El Error (HTTP 422) de la API, terminado en [code: invalid_symbol], que enumera los valores aceptados; la lista viva se obtiene con get_system_info. |
| Un export caducado o desconocido | Error (HTTP 404) de read_export, terminado en [code: not_found]: un export dura una hora y se lee con la clave que lo produjo; vuelve a llamar a la herramienta. |
| Origen que no responde | Un reintento ante 502, 503, 504 o fallo de red. Un 500 no se repite: cada petición cuenta en tu cuota. |
| Tiempo de espera agotado | Error (HTTP 504) tras treinta segundos sin respuesta. |
| Error interno del servidor | Error (HTTP 500) con solo el tipo del error; el detalle queda en el registro del servidor. |