Agentes

Servidor MCP

Un agente se conecta, descubre cinco 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. Hace de relé hacia la API y normaliza ligeramente las respuestas.

#Conectarse

Una URL y una cabecera. El servidor está cerrado por defecto: sin una X-API-KEY válida, no se anuncia ninguna herramienta y cada petición recibe 401.

{
  "mcpServers": {
    "bytnode": {
      "type": "http",
      "url": "https://mcp.bytnode.com",
      "headers": { "X-API-KEY": "your_key" }
    }
  }
}

La forma exacta del archivo de configuración depende del agente, pero el principio no cambia.

#Las cinco herramientas

Todas son de solo lectura, sin efectos secundarios e idempotentes. Un agente puede por tanto repetirlas sin riesgo.

get_system_info

El diagnóstico. En una llamada devuelve la salud del servicio, la lista de símbolos y la frescura de cada fuente. Es la llamada que hay que hacer primero: saber que una fuente va con retraso cambia la confianza que merecen los análisis siguientes.

ParámetroTipoPor defectoDescripción
include_statusbooleantrueA false, solo consulta la salud y los símbolos, lo que es más ligero.

get_market_data

El snapshot a la carta, apoyado en el snapshot REST. El agente nombra los campos que necesita, el servidor consulta en paralelo y lo ensambla.

ParámetroTipoPor defectoDescripción
symbolstringobligatorioSin valor por defecto. La lista viva se obtiene con get_system_info.
timeframestring1hSolo se aplica a los campos multitemporalidad.
61 data fieldsint | bool—El valor es una profundidad, o true para los campos que solo tienen un valor actual.

get_history

El historial de una métrica, en una ventana fechada, paginado. Se enrutan cuarenta y seis métricas; cada una declara su objetivo, y la validación ocurre antes de cualquier llamada de red.

ParámetroTipoPor defectoDescripción
metricstringobligatorioUna de las 46. Desconocida: un error que enumera las 46.
symbolstring—Para las métricas por par, p. ej. BTCUSDT.
assetstring—Para las métricas por activo, p. ej. BTC. El activo solo, nunca el par.
seriesstring—Para las métricas por serie, p. ej. DGS10, EURUSD.
timeframestring1hSe aplica a las quince métricas multitemporalidad; se ignora en las demás.
since_ms / until_msinteger—Ventana en milisegundos Unix.
limitinteger100Se aplica después del filtro temporal. Se reduce a 500 en ls_ratio y spread.
fieldsstring—Proyección CSV en cada fila, notación con puntos para los campos anidados.

get_market_emotions

El índice de miedo y codicia, de todo el mercado. Sin límite temporal devuelve el último punto; con since_ms o until_ms pasa al historial. No se acepta ningún símbolo: el índice es global.

ParámetroTipoPor defectoDescripción
sourcestringfear_greedEl único valor admitido.
limitinteger50Número de puntos, en modo historial.
since_ms / until_msinteger—Pasa al modo historial.

get_market_indicators

Los veinte indicadores técnicos, calculados bajo demanda. symbol, timeframe e indicators son obligatorios; solo results tiene valor por defecto, 1.

Llamada
await c.call_tool("get_market_indicators", {
    "symbol": "BTCUSDT",
    "timeframe": "1h",
    "results": 60,
    "indicators": [
        {"id": "rsi_fast", "type": "rsi", "period": 7},
        {"id": "rsi_slow", "type": "rsi", "period": 21},
        {"id": "macd", "type": "macd", "fast": 12, "slow": 26, "signal": 9},
        {"id": "adx_mid", "type": "adx", "period": 14},
    ],
})

Se aplican las mismas reglas que en REST: identificadores _fast / _mid / _slow para los catorce tipos multiinstancia, un identificador simple para los otros seis y un límite de results + warm-up ≤ 1000.

#Selección de métricas

Cada métrica declara cómo quiere ser seleccionada. Un error de selección se rechaza explícitamente, nunca se absorbe.

CasoRespuesta
Dos objetivos o másError: un solo parámetro de selección a la vez.
Se esperaba un objetivo y no se dio ningunoUn error que nombra el parámetro esperado, con un ejemplo.
Objetivo equivocadoError: la métrica espera asset, no symbol, y a la inversa.
Métrica de todo el mercado con un objetivoError: no se acepta ningún parámetro de selección.
asset relleno con un parError: asset espera el activo solo. No hay derivación automática.

#Las 46 métricas

Diecinueve métricas por par (parámetro symbol)

basisbuysell_ratiocvd_seriesfunding_cumulativefunding_rate_8hheatmap_clustersliq_cumulativeliq_ratiols_ratioob_aggregatedoi_deltaspreadtokenomicstradetrade_futuretrade_sizetrade_spotvwapvwap_window

Seis métricas por activo (parámetro asset)

options_oioptions_oi_deltaoptions_ivoptions_iv_klinesoptions_pc_ratiooptions_volume

Todas multitemporalidad y con ventana.

Dos métricas por serie (parámetro series)

macromacro_intraday

macro no es multitemporalidad a propósito: cortar una serie mensual en pasos horarios produciría una regresión silenciosa. macro_intraday sí lo es, pero rechaza 30m. Las dos no llevan los mismos instrumentos: no sustituyas una por la otra.

Diecinueve métricas de todo el mercado (sin objetivo)

btc_feesbtc_mempoolbtc_miningbtc_networketh_defieth_deflationeth_gaseth_gas_momentumeth_ratioeth_squeezeeth_stakingeth_supplyfear_greedglobal_marketnet_liquidityonchain_active_addressesonchain_miner_stressonchain_mvrvonchain_nvt

Sin historial propio

price_change, macro_correlations, macro_momentum y macro_risk son instantáneas de estado: se obtienen con get_market_data, no con get_history.

Siete métricas sin ventana de tiempo

funding_rate_8h, funding_cumulative, ls_ratio, spread, trade, trade_spot y trade_future no aceptan since_ms ni until_ms. Pasarlos se rechaza en lugar de ignorarse: un agente creería filtrar una ventana cuando recibe los últimos puntos en bruto. Usa limit solo.

#Las claves de respuesta

Se añaden cuatro claves a los datos sin cambiar su forma. unavailable y coverage son las del snapshot. Otras dos son propias de MCP:

Respuesta
{
  "timeframe_applied": "1h",
  "scopes": {
    "klines_1h": "symbol:BTCUSDT",
    "options": "asset:BTC",
    "fear_greed": "market"
  }
}
  • timeframe_applied: la temporalidad realmente aplicada, en cuanto se pide un campo multitemporalidad.
  • scopes: el alcance real de cada campo, indexado por la clave tal como aparece en los datos. Tres valores: symbol:X, asset:X, market. Sin ella, un índice de todo el mercado acababa en una respuesta etiquetada con un activo, sin forma de saberlo.

Normalización

El servidor ordena su propia superficie sin cambiar ningún valor: las claves multitemporalidad llevan el nombre del parámetro en lugar del de la API (cvd_series@1h, spread@1h, ob_aggregated@4h), las marcas de tiempo se uniforman como YYYY-MM-DDTHH:MM:SSZ y los volúmenes taker de las filas de CVD toman el nombre que tienen en las velas.

#Errores

Cada error sigue un único patrón, Erreur (HTTP NNN) : message, para que un agente solo tenga un caso que reconocer.

SituaciónComportamiento
Petición sin clave válida401, antes de anunciar ninguna herramienta.
Clave rechazada por la APIErreur (HTTP 403) : Cle API absente, invalide ou revoquee.
Familia fuera del planErreur (HTTP 403) : Cette famille de donnees n est pas incluse dans votre offre. La métrica existe, simplemente no está en tu plan.
Límite de velocidad superadoErreur (HTTP 429) : Debit depasse. Reduce la frecuencia de las llamadas; Retry-After es de un segundo.
Cuota mensual agotadaErreur (HTTP 429) : Quota mensuel epuise. Se reinicia el primer día del mes, o en cuanto cambia el plan.
Otro error de peticiónErreur (HTTP NNN) seguido del detalle devuelto por la API.
Error del servidorUn reintento automático y después el mensaje de indisponibilidad.
Tiempo de espera agotadoErreur (HTTP 504) tras treinta segundos sin respuesta.
Métrica desconocidaLa lista de las 46 métricas válidas en el mensaje.
Selección no válidaUn error explícito que nombra el parámetro esperado, antes de cualquier llamada de red.