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ètre | Type | Défaut | Description |
|---|---|---|---|
include_status | boolean | true | À 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ètre | Type | Défaut | Description |
|---|---|---|---|
symbol | string | requis | Aucun défaut. La liste vivante s’obtient via get_system_info. |
timeframe | string | 1h | S’applique uniquement aux champs multi-timeframe. |
61 champs de données | int | 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ètre | Type | Défaut | Description |
|---|---|---|---|
metric | string | requis | Une des 46. Inconnue : erreur listant les 46. |
symbol | string | — | Pour les métriques par paire — BTCUSDT. |
asset | string | — | Pour les métriques par actif — BTC. L’actif seul, jamais la paire. |
series | string | — | Pour les métriques par série — DGS10, EURUSD. |
timeframe | string | 1h | Appliqué aux quinze métriques multi-timeframe, ignoré sinon. |
since_ms / until_ms | integer | — | Fenêtre en millisecondes Unix. |
limit | integer | 100 | Appliqué après le filtre temporel. Ramené à 500 sur ls_ratio et spread. |
fields | string | — | Projection 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ètre | Type | Défaut | Description |
|---|---|---|---|
source | string | fear_greed | Seule valeur supportée. |
limit | integer | 50 | Nombre de points, en mode historique. |
since_ms / until_ms | integer | — | Bascule 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.
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.
| Cas | Réponse |
|---|---|
| Deux cibles ou plus | Erreur : un seul paramètre de ciblage à la fois. |
| Cible attendue, aucune fournie | Erreur nommant le paramètre attendu, avec un exemple. |
| Mauvaise cible | Erreur : la métrique attend asset, pas symbol — et réciproquement. |
| Métrique marché entier avec une cible | Erreur : aucun paramètre de ciblage n’est accepté. |
| asset renseigné avec une paire | Erreur : 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 :
{
"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.
| Situation | Comportement |
|---|---|
| Requête sans clé valide | 401, avant que le moindre outil ne soit annoncé. |
| Clé refusée par l’API | Erreur (HTTP 403) : Cle API absente, invalide ou revoquee. |
| Famille hors offre | Erreur (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ête | Erreur (HTTP NNN) suivie du détail renvoyé par l’API. |
| Erreur serveur | Un réessai automatique, puis le message d’indisponibilité. |
| Délai dépassé | Erreur (HTTP 504) après trente secondes sans réponse. |
| Métrique inconnue | La liste des 46 métriques valides dans le message. |
| Ciblage invalide | Erreur explicite nommant le paramètre attendu, avant tout appel réseau. |