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ètre | Type | Défaut | Description |
|---|---|---|---|
include_status | boolean | true | À 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ètre | Type | Défaut | Description |
|---|---|---|---|
symbol | string | obligatoire | Pas de valeur par défaut. La liste vivante s’obtient via get_system_info. |
timeframe | string | 1h | S’applique uniquement aux champs multi-unités de temps. |
61 data fields | 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 | obligatoire | L’une des 46. Inconnue : une erreur qui liste les 46. |
symbol | string | — | Pour les métriques par paire, p. ex. BTCUSDT. |
asset | string | — | Pour les métriques par actif, p. ex. BTC. L’actif seul, jamais la paire. |
series | string | — | Pour les métriques par série, p. ex. DGS10, EURUSD. |
timeframe | string | 1h | Appliqué aux quinze métriques multi-unités de temps, 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 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ètre | Type | Défaut | Description |
|---|---|---|---|
source | string | fear_greed | La seule valeur prise en charge. |
limit | integer | 50 | Nombre de points, en mode historique. |
since_ms / until_ms | integer | — | 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.
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.
| Cas | Réponse |
|---|---|
| Deux cibles ou plus | Erreur : un seul paramètre de ciblage à la fois. |
| Cible attendue, aucune fournie | Une erreur qui nomme le paramètre attendu, avec un exemple. |
| Mauvaise cible | Erreur : la métrique attend asset, pas symbol, et inversement. |
| Métrique de tout le marché 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-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 :
{
"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.
| Situation | Comportement |
|---|---|
| Requête sans clé valide | 401, avant qu’un seul 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, simplement pas dans votre offre. |
| Limite de débit dépassée | Erreur (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ête | Erreur (HTTP NNN) suivie du détail renvoyé par l’API. |
| Erreur serveur | Une nouvelle tentative 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 | Une erreur explicite qui nomme le paramètre attendu, avant tout appel réseau. |