UNPKG

@trendmoon/mcp-server

Version:

TrendMoon MCP Server - Library and Standalone Server for Cryptocurrency and Social Data

110 lines 4.92 kB
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