@trendmoon/mcp-server
Version:
TrendMoon MCP Server - Library and Standalone Server for Cryptocurrency and Social Data
110 lines • 4.92 kB
JavaScript
import axios from "axios";
import * as technicalindicators from "technicalindicators";
import { z } from "zod";
// Définition des schémas pour les outils
export const GetHistoricalPriceSchema = z.object({
symbol: z.string(),
});
export const CheckEMAPositionSchema = z.object({
symbol: z.string(),
});
/**
* Récupère les prix historiques quotidiens pour les 14 derniers jours d'un symbole donné de Binance.
* @param symbol Le symbole du jeton (ex: "BTC").
* @returns Un tableau d'objets contenant la date, le prix de clôture, le MACD, le signal et l'histogramme.
*/
async function getHistoricalPrice(symbol) {
const binanceApiUrl = `https://api.binance.com/api/v3/klines?symbol=${symbol.toUpperCase()}USDT&interval=1d&limit=14`;
const response = await axios.get(binanceApiUrl);
const klines = response.data;
const closePrices = klines.map((kline) => parseFloat(kline[4]));
const dates = klines.map((kline) => new Date(kline[0]).toISOString().split('T')[0]);
const macdInput = {
values: closePrices,
fastPeriod: 12,
slowPeriod: 26,
signalPeriod: 9,
SimpleMAOscillator: false,
SimpleMASignal: false,
};
const macdResult = technicalindicators.MACD.calculate(macdInput);
const priceDataWithMACD = closePrices.map((close, index) => {
const macd = macdResult[index];
return {
date: dates[index],
close: close,
macd: macd ? macd.MACD : null,
signal: macd ? macd.signal : null,
histogram: macd ? macd.histogram : null,
};
});
return priceDataWithMACD;
}
/**
* Vérifie si le prix d'une pièce est supérieur à ses moyennes mobiles exponentielles (EMA) de 20 et 50 jours.
* @param symbol Le symbole du jeton (ex: "ETH").
* @returns Un objet contenant le symbole, le dernier prix, l'EMA 20, l'EMA 50, et des drapeaux indiquant la position par rapport aux EMA.
*/
async function checkEMAPosition(symbol) {
const binanceApiUrl = `https://api.binance.com/api/v3/klines?symbol=${symbol.toUpperCase()}USDT&interval=1d&limit=50`;
const response = await axios.get(binanceApiUrl);
const klines = response.data;
const closePrices = klines.map((kline) => parseFloat(kline[4]));
if (closePrices.length < 50) {
console.warn(`Pas assez de données pour calculer les EMA pour ${symbol}. Besoin d'au moins 50 points de données, obtenu ${closePrices.length}.`);
return {
symbol,
latestPrice: closePrices.length > 0 ? closePrices[closePrices.length - 1] : null,
ema20: null,
ema50: null,
isAboveEma20: false,
isAboveEma50: false,
isBullish: false,
};
}
const ema20 = technicalindicators.EMA.calculate({ period: 20, values: closePrices });
const ema50 = technicalindicators.EMA.calculate({ period: 50, values: closePrices });
const latestPrice = closePrices[closePrices.length - 1];
const latestEma20 = ema20 && ema20.length > 0 ? ema20[ema20.length - 1] : undefined;
const latestEma50 = ema50 && ema50.length > 0 ? ema50[ema50.length - 1] : undefined;
const isAboveEma20 = latestEma20 !== undefined ? latestPrice > latestEma20 : false;
const isAboveEma50 = latestEma50 !== undefined ? latestPrice > latestEma50 : false;
return {
symbol,
latestPrice,
ema20: latestEma20,
ema50: latestEma50,
isAboveEma20,
isAboveEma50,
isBullish: isAboveEma20 && isAboveEma50,
};
}
export function registerBinanceTools(mcpServer) {
mcpServer.registerTool("getHistoricalPrice", {
description: "Get the daily closing prices for the last 14 days for a specific token symbol from Binance.",
inputSchema: GetHistoricalPriceSchema.shape,
}, async (params, _extra) => {
try {
const data = await getHistoricalPrice(params.symbol);
return { content: [{ type: "text", text: JSON.stringify(data) }] };
}
catch (error) {
console.error("Error in getHistoricalPrice tool:", error);
return { isError: true, content: [{ type: "text", text: `Error: ${error.message}` }] };
}
});
mcpServer.registerTool("checkEMAPosition", {
description: "Check if a coin's price is above its 20-day and 50-day EMA (Exponential Moving Average)",
inputSchema: CheckEMAPositionSchema.shape,
}, async (params, _extra) => {
try {
const data = await checkEMAPosition(params.symbol);
return { content: [{ type: "text", text: JSON.stringify(data) }] };
}
catch (error) {
console.error("Error in checkEMAPosition tool:", error);
return { isError: true, content: [{ type: "text", text: `Error: ${error.message}` }] };
}
});
}
//# sourceMappingURL=BinanceTools.js.map