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. Pas d’URL à construire, pas de schéma REST à analyser.

Le serveur parle le protocole MCP sur un 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 chaque requête reçoit 401.

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

La forme exacte du fichier de configuration dépend de l’agent, mais 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. En un appel, il ramène la santé du service, la liste des symboles et la fraîcheur de chaque source. C’est l’appel à faire 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, ce qui est plus léger.

get_market_data

Le snapshot à 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
symbolstringobligatoirePas de valeur par défaut. La liste vivante s’obtient via get_system_info.
timeframestring1hS’applique uniquement aux champs multi-unités de temps.
61 data fieldsint | bool—La 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
metricstringobligatoireL’une des 46. Inconnue : une erreur qui liste les 46.
symbolstring—Pour les métriques par paire, p. ex. BTCUSDT.
assetstring—Pour les métriques par actif, p. ex. BTC. L’actif seul, jamais la paire.
seriesstring—Pour les métriques par série, p. ex. DGS10, EURUSD.
timeframestring1hAppliqué aux quinze métriques multi-unités de temps, ignoré sinon.
since_ms / until_msinteger—Fenêtre en millisecondes Unix.
limitinteger100Appliqué après le filtre temporel. Ramené à 500 sur ls_ratio et spread.
fieldsstring—Projection CSV sur chaque ligne, notation pointée pour les champs imbriqués.

get_market_emotions

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

ParamètreTypeDéfautDescription
sourcestringfear_greedLa seule valeur prise en charge.
limitinteger50Nombre de points, en mode historique.
since_ms / until_msinteger—Passe en mode historique.

get_market_indicators

Les vingt indicateurs techniques, calculés à la demande. symbol, timeframe et indicators sont obligatoires ; seul results a une valeur par 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-instances, un identifiant nu pour les six autres, et un plafond de results + warm-up ≤ 1000.

#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 fournieUne erreur qui nomme le paramètre attendu, avec un exemple.
Mauvaise cibleErreur : la métrique attend asset, pas symbol, et inversement.
Métrique de tout le marché 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-unités de temps et fenêtrables.

Deux métriques par série (paramètre series)

macromacro_intraday

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

Dix-neuf métriques de tout le marché (sans 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 instantanés d’état : on les obtient par get_market_data, pas par get_history.

Sept métriques sans fenêtre de temps

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 : l’unité de temps réellement appliquée, dès qu’un champ multi-unités de temps 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 de tout le marché se retrouvait dans une réponse étiquetée avec un actif, sans moyen de le savoir.

Normalisation

Le serveur range sa propre surface, sans changer aucune valeur : les clés multi-unités de temps 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 de CVD prennent le nom qu’ils ont dans les bougies.

#Erreurs

Chaque erreur suit un seul modèle, Erreur (HTTP NNN) : message, pour qu’un agent n’ait qu’un cas à reconnaître.

SituationComportement
Requête sans clé valide401, avant qu’un seul 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, simplement pas dans votre offre.
Limite de débit dépasséeErreur (HTTP 429) : Debit depasse. Réduisez la fréquence des 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 que l’offre change.
Autre erreur de requêteErreur (HTTP NNN) suivie du détail renvoyé par l’API.
Erreur serveurUne nouvelle tentative 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 invalideUne erreur explicite qui nomme le paramètre attendu, avant tout appel réseau.