Agents

Serveur MCP

Un agent se connecte, découvre cinq outils, lit leurs descriptions pour comprendre quelles données existent, et compose ses propres requêtes. Aucune URL à construire, aucun schéma REST à analyser.

Le serveur parle le protocole MCP en transport HTTP. Il relaie vers l’API et normalise légèrement les réponses.

#Se connecter

Une URL et un en-tête. Le serveur est fermé par défaut : sans X-API-KEY valide, aucun outil n’est annoncé et toute requête reçoit 401.

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

La forme exacte du fichier de configuration dépend de l’agent — le principe ne change pas.

#Les cinq outils

Tous sont en lecture seule, sans effet de bord et idempotents. Un agent peut donc les rejouer sans risque.

get_system_info

Le diagnostic. Il ramène en un appel la santé du service, la liste des symboles et la fraîcheur de chaque source. C’est l’appel à passer en premier : savoir qu’une source est en retard change la confiance à accorder aux analyses qui suivent.

ParamètreTypeDéfautDescription
include_statusbooleantrueÀ false, n’appelle que la santé et les symboles — plus léger.

get_market_data

L’instantané à la carte, adossé au snapshot REST. L’agent nomme les champs dont il a besoin, le serveur interroge en parallèle et assemble.

ParamètreTypeDéfautDescription
symbolstringrequisAucun défaut. La liste vivante s’obtient via get_system_info.
timeframestring1hS’applique uniquement aux champs multi-timeframe.
61 champs de donnéesint | boolLa valeur est une profondeur, ou true pour les champs qui n’ont qu’une valeur courante.

get_history

L’historique d’une métrique, sur une fenêtre datée, paginé. Quarante-six métriques sont routées ; chacune déclare sa cible, et la validation a lieu avant tout appel réseau.

ParamètreTypeDéfautDescription
metricstringrequisUne des 46. Inconnue : erreur listant les 46.
symbolstringPour les métriques par paire — BTCUSDT.
assetstringPour les métriques par actif — BTC. L’actif seul, jamais la paire.
seriesstringPour les métriques par série — DGS10, EURUSD.
timeframestring1hAppliqué aux quinze métriques multi-timeframe, ignoré sinon.
since_ms / until_msintegerFenêtre en millisecondes Unix.
limitinteger100Appliqué après le filtre temporel. Ramené à 500 sur ls_ratio et spread.
fieldsstringProjection CSV sur chaque ligne, notation pointée pour l’imbriqué.

get_market_emotions

L’indice de peur et d’avidité, marché entier. Sans borne temporelle, il rend le dernier point ; avec since_ms ou until_ms, il bascule sur l’historique. Aucun symbole n’est accepté : l’indice est global.

ParamètreTypeDéfautDescription
sourcestringfear_greedSeule valeur supportée.
limitinteger50Nombre de points, en mode historique.
since_ms / until_msintegerBascule en mode historique.

get_market_indicators

Les vingt indicateurs techniques, calculés à la demande. symbol, timeframe et indicators sont obligatoires ; seul results a un défaut, à 1.

Appel
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},
    ],
})

Les mêmes règles s’appliquent qu’en REST : identifiants _fast / _mid / _slow pour les quatorze types multi-instance, identifiant nu pour les six autres, et plafond results + amorçage ≤ 1000.

#Le ciblage des métriques

Chaque métrique déclare comment elle veut être ciblée. Une erreur de ciblage est refusée explicitement, jamais absorbée.

CasRéponse
Deux cibles ou plusErreur : un seul paramètre de ciblage à la fois.
Cible attendue, aucune fournieErreur nommant le paramètre attendu, avec un exemple.
Mauvaise cibleErreur : la métrique attend asset, pas symbol — et réciproquement.
Métrique marché entier avec une cibleErreur : aucun paramètre de ciblage n’est accepté.
asset renseigné avec une paireErreur : asset attend l’actif seul. Il n’y a pas de dérivation automatique.

#Les 46 métriques

Dix-neuf métriques par paire — paramètre symbol

basisbuysell_ratiocvd_seriesfunding_cumulativefunding_rate_8hheatmap_clustersliq_cumulativeliq_ratiols_ratioob_aggregatedoi_deltaspreadtokenomicstradetrade_futuretrade_sizetrade_spotvwapvwap_window

Six métriques par actif — paramètre asset

options_oioptions_oi_deltaoptions_ivoptions_iv_klinesoptions_pc_ratiooptions_volume

Toutes multi-timeframe et fenêtrables.

Deux métriques par série — paramètre series

macromacro_intraday

macro n’est volontairement pas multi-timeframe : découper une série mensuelle en pas horaire produirait une régression silencieuse. macro_intraday l’est, mais refuse 30m. Les deux ne portent pas les mêmes instruments — ne les substituez pas l’un à l’autre.

Dix-neuf métriques marché entier — aucune cible

btc_feesbtc_mempoolbtc_miningbtc_networketh_defieth_deflationeth_gaseth_gas_momentumeth_ratioeth_squeezeeth_stakingeth_supplyfear_greedglobal_marketnet_liquidityonchain_active_addressesonchain_miner_stressonchain_mvrvonchain_nvt

Sans historique dédié

price_change, macro_correlations, macro_momentum et macro_risk sont des photos d’état : elles s’obtiennent par get_market_data, pas par get_history.

Sept métriques sans fenêtre temporelle

funding_rate_8h, funding_cumulative, ls_ratio, spread, trade, trade_spot et trade_future n’acceptent pas since_ms ni until_ms. Les passer est refusé plutôt qu’ignoré : un agent croirait filtrer une fenêtre alors qu’il reçoit les derniers points bruts. Utilisez limit seul.

#Les clés de réponse

Quatre clés s’ajoutent aux données sans en changer la forme. unavailable et coverage sont celles du snapshot. Deux autres sont propres au MCP :

Réponse
{
  "timeframe_applied": "1h",
  "scopes": {
    "klines_1h": "symbol:BTCUSDT",
    "options": "asset:BTC",
    "fear_greed": "market"
  }
}
  • timeframe_applied — le pas de temps effectivement appliqué, dès qu’un champ multi-timeframe est demandé.
  • scopes — la portée réelle de chaque champ, indexée par la clé telle qu’elle apparaît dans les données. Trois valeurs : symbol:X, asset:X, market. Sans elle, un indice marché entier se retrouvait dans une réponse étiquetée d’un actif, sans moyen de le savoir.

Normalisation

Le serveur nettoie sa propre surface, sans rien changer aux valeurs : les clés multi-timeframe portent le nom du paramètre plutôt que celui de l’API — cvd_series@1h, spread@1h, ob_aggregated@4h —, les horodatages sont uniformisés en YYYY-MM-DDTHH:MM:SSZ, et les volumes taker des lignes CVD prennent le nom qu’ils ont dans les bougies.

#Erreurs

Toutes les erreurs suivent un motif unique — Erreur (HTTP NNN) : message — pour qu’un agent n’ait qu’un seul cas à reconnaître.

SituationComportement
Requête sans clé valide401, avant que le moindre outil ne soit annoncé.
Clé refusée par l’APIErreur (HTTP 403) : Cle API absente, invalide ou revoquee.
Famille hors offreErreur (HTTP 403) : Cette famille de donnees n est pas incluse dans votre offre. La métrique existe, pas dans votre offre.
Débit dépasséErreur (HTTP 429) : Debit depasse. Réduire la fréquence d’appels ; Retry-After vaut une seconde.
Quota mensuel épuiséErreur (HTTP 429) : Quota mensuel epuise. Il repart le premier jour du mois, ou dès un changement d’offre.
Autre erreur de requêteErreur (HTTP NNN) suivie du détail renvoyé par l’API.
Erreur serveurUn réessai automatique, puis le message d’indisponibilité.
Délai dépasséErreur (HTTP 504) après trente secondes sans réponse.
Métrique inconnueLa liste des 46 métriques valides dans le message.
Ciblage invalideErreur explicite nommant le paramètre attendu, avant tout appel réseau.