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ámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
include_status | boolean | true | A 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ámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
symbol | string | obligatorio | Sin valor por defecto. La lista viva se obtiene con get_system_info. |
timeframe | string | 1h | Solo se aplica a los campos multitemporalidad. |
61 data fields | int | 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ámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
metric | string | obligatorio | Una de las 46. Desconocida: un error que enumera las 46. |
symbol | string | — | Para las métricas por par, p. ej. BTCUSDT. |
asset | string | — | Para las métricas por activo, p. ej. BTC. El activo solo, nunca el par. |
series | string | — | Para las métricas por serie, p. ej. DGS10, EURUSD. |
timeframe | string | 1h | Se aplica a las quince métricas multitemporalidad; se ignora en las demás. |
since_ms / until_ms | integer | — | Ventana en milisegundos Unix. |
limit | integer | 100 | Se aplica después del filtro temporal. Se reduce a 500 en ls_ratio y spread. |
fields | string | — | 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ámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
source | string | fear_greed | El único valor admitido. |
limit | integer | 50 | Número de puntos, en modo historial. |
since_ms / until_ms | integer | — | 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.
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.
| Caso | Respuesta |
|---|---|
| Dos objetivos o más | Error: un solo parámetro de selección a la vez. |
| Se esperaba un objetivo y no se dio ninguno | Un error que nombra el parámetro esperado, con un ejemplo. |
| Objetivo equivocado | Error: la métrica espera asset, no symbol, y a la inversa. |
| Métrica de todo el mercado con un objetivo | Error: no se acepta ningún parámetro de selección. |
| asset relleno con un par | Error: 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:
{
"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ón | Comportamiento |
|---|---|
| Petición sin clave válida | 401, antes de anunciar ninguna herramienta. |
| Clave rechazada por la API | Erreur (HTTP 403) : Cle API absente, invalide ou revoquee. |
| Familia fuera del plan | Erreur (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 superado | Erreur (HTTP 429) : Debit depasse. Reduce la frecuencia de las llamadas; Retry-After es de un segundo. |
| Cuota mensual agotada | Erreur (HTTP 429) : Quota mensuel epuise. Se reinicia el primer día del mes, o en cuanto cambia el plan. |
| Otro error de petición | Erreur (HTTP NNN) seguido del detalle devuelto por la API. |
| Error del servidor | Un reintento automático y después el mensaje de indisponibilidad. |
| Tiempo de espera agotado | Erreur (HTTP 504) tras treinta segundos sin respuesta. |
| Métrica desconocida | La lista de las 46 métricas válidas en el mensaje. |
| Selección no válida | Un error explícito que nombra el parámetro esperado, antes de cualquier llamada de red. |