Agentes de IA

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ámetroTipoPor defectoDescripción
includestring[]—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_fieldsstring[]—Nombres de campos, de cualquier herramienta de datos, cuya frescura quieres: por campo, age_s e is_stale. Implica freshness.
catalogsstring[]—Entre macro_series y macro_intraday_series (las series de get_macro_data, las segundas con sus timeframes), symbol_capabilities. Varios a la vez.
symbolstring—Requerido por symbol_capabilities: qué flujos están activos y qué métricas están disponibles o bloqueadas, antes de pedirlas.
categorystring—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ámetroTipoPor defectoDescripción
symbolstring[]—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ámetroTipoPor defectoDescripción
symbolstring[]—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.
fieldsstring[]—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.
limitinteger—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.
timeframestring1hPaso 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.
livebooleanfalseSolo valor actual: añade la vela en formación, marcada is_closed: false.
since_ms / until_msstring—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.
laststring—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_usdnumber—Umbral en USD de trades_large (100 000 por defecto, mínimo 1 000) y de liquidations_events.
marketstringallMercado 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.
columnsstring—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.
detailstringcompactcompact: 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_tokensinteger6000Presupuesto 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ámetroTipoPor defectoDescripción
assetstring—Obligatorio: el activo solo, p. ej. BTC, nunca un par.
fieldsstring[]—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.
limitinteger—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.
expiriesbooleanfalseAñ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.
timeframestring—Paso del histórico de opciones (campos marcados timeframe). Si se omite, un paso que da unos 200 puntos.
expirystring—Un vencimiento, AAAA-MM-DD: options_oi_distribution, y options_max_pain en histórico, donde es obligatorio.
tickerstring—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ámetroTipoPor defectoDescripción
fieldsstring[]—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.
limitinteger—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.
timeframestring—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ámetroTipoPor defectoDescripción
fieldsstring[]—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.
limitinteger—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.
seriesstring—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).
timeframestring—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ámetroTipoPor defectoDescripción
fieldsstring[]—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.
limitinteger—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.
timeframestring—Paso de btc_fees solamente (1h, 4h, 1d); las demás series conservan la cadencia de su fuente.
datasetstring—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.

Llamada
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ámetroTipoPor defectoDescripción
fieldsstring[]—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ámetroTipoPor defectoDescripción
metricstring—Obligatorio: oi_usd, volume_usd_24h, funding_next, price_change_pct o rsi.
orderstringdescdesc (el mayor primero, por defecto) o asc — el funding más negativo, por ejemplo.
limitinteger10El número de pares devueltos, de 1 a 100.
windowstring1dSolo price_change_pct: 1h, 4h, 1d (por defecto) o 1w.
timeframestring4hSolo rsi: las velas del RSI, 1h, 4h (por defecto) o 1d.
max_tokensinteger6000Presupuesto 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ámetroTipoPor defectoDescripción
export_idstring—Obligatorio: el export.export_id de la respuesta recortada (también se acepta su URI bytnode://).
keystring—La serie que leer, con su clave en el data de la respuesta (klines@1h, por ejemplo); por defecto la primera. keys las lista.
offsetinteger0La primera fila que devolver, siendo 0 la más reciente; el row_count del ranges de la respuesta recortada la da.
max_tokensinteger6000Presupuesto 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ónQué devuelve cada campo
fields: [...]El último punto de cada campo; para una serie por buckets, el último bucket cerrado.
limit: NLos 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 lastSu 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: trueLos 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.

CasoRespuesta
Un objetivo ausenteUn 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 equivocadaError: '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 esperaError: solo macro y macro_intraday leen series; los campos macro calculados no tienen objetivo.
asset con un parError: asset espera el activo solo. No hay ninguna derivación automática.
Un parámetro que la ruta elegida no aceptaError: por ejemplo expiry en el valor actual de options_max_pain, que solo acepta su histórico.
Un timeframe que ningún campo usaError: 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 admiteError: 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_msError: 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 symbolError: 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.

Respuesta
{
  "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, como null. Una serie de paso regular no tiene columna time sino first_time y step_s, sea cual sea su número de filas, una incluida: la fila i tiene la fecha first_time + i × step_s, siendo step_s negativo, desde la fila más reciente hacia atrás; ante el menor hueco, la columna time se mantiene. Los eventos (operaciones y liquidaciones individuales) y las tablas conservan su time, y lo que comparten todas las filas se indica una vez en el bloque: date (cada time es entonces la hora UTC de ese día, 12:54:30.494Z) o un solo time (todas las filas en ese instante, como una tabla de vencimientos); .000 desaparece cuando ninguna fila tiene milisegundos. Los flotantes conservan 6 cifras significativas, salvo las ofertas y los acumulados, que conservan sus unidades enteras. Con detail: "compact" (por defecto), las filas pesadas conservan sus columnas principales, is_closed se omite cuando todas las filas están cerradas y los identificadores de operaciones se omiten; omitted_columns nombra lo que se dejó fuera, y detail: "full" lo devuelve.
  • scopes: el alcance real de cada clave — symbol:X, asset:X, series:X, o market para un campo sin objetivo. macro pedido sin series se etiqueta market, 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: latest o history; en histórico, window repite los límites y ranges indica, por serie, lo que realmente se cubre: timeframe, row_count, from y to (el inicio del primer y del último bucket, como el time de cada fila), note y truncated; cuando una serie se recorta, missing indica cómo obtener el resto — un limit menor, una ventana anterior que termina en next_until_ms, o read_export desde 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 en sums la de sus componentes (long_usd y short_usd, buy_volume y sell_volume), la variación (y change_pct cuando tiene sentido) para un estado; las velas añaden high_max y low_min con su instante. Los trades y liquidaciones individuales añaden by_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 su time), y stale, las claves cuyo flujo va con retraso, según el monitor de flujos; warnings nombra 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_tokens de las herramientas de datos, de get_market_indicators, de rank_pairs y de read_export lo ajusta de 1500 a 16 000, y response_tokens da 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 el ranges de cada serie (row_count filas devueltas de total_row_count, y missing: cómo obtener el resto, a menudo el max_tokens que basta para la respuesta entera; el mismo campo recortado para varios pares lleva una sola indicación, en el missing del nivel superior; truncation solo para lo que no tiene ranges), los metadatos idénticos para varios pares (ranges, omitted_columns, freshness) se escriben una vez por campo, con el nombre del campo, y export guarda los datos completos durante una hora, para la misma clave: read_export los lee página a página con export.export_id, en el formato de las respuestas, sin petición a la API ni cuota. También es el recurso MCP bytnode://exports/{id}, para los clientes que leen recursos, en un solo bloque, con 8 cifras significativas y el time de 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.
  • errors y partial: un campo con error no bloquea los demás, ni un par rechazado los otros pares. Se indica en errors (un par, con su nombre) y la respuesta lleva partial: 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 y expiries.
  • oi_usd: cada fila de oi lleva el open interest en USD, oi × el cierre de la vela spot de referencia del mismo bucket (null sin ella), también en valor actual, sin petición adicional; get_pair_brief también lo lleva. Del mismo modo, cada fila de cvd lleva cumulative_net_volume, el acumulado de net_volume desde la fila más antigua de la serie servida: la curva de CVD sobre el periodo. El valor actual de liquidations_cumulative es 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ónComportamiento
Petición sin clave válida401, X-Deny-Reason: missing_api_key (o invalid_api_key), antes de anunciar una sola herramienta.
Petición no válidaError (HTTP 422) que enumera cada problema, antes de cualquier llamada de red.
Familia fuera del planError (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 planRechazado 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 cuotaError (HTTP 429) con el detail de la API: límite por minuto o cuota mensual.
Un campo con errorIndicado 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 variosIndicado 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álidoEl 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 desconocidoError (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 respondeUn reintento ante 502, 503, 504 o fallo de red. Un 500 no se repite: cada petición cuenta en tu cuota.
Tiempo de espera agotadoError (HTTP 504) tras treinta segundos sin respuesta.
Error interno del servidorError (HTTP 500) con solo el tipo del error; el detalle queda en el registro del servidor.