import Decimal from 'decimal.js';
import { createSuccessResponse } from '../utils/helpers.js';
import {
GetTickerSchema,
GetMultipleTickersSchema,
GetOrderbookSchema,
GetOHLCVSchema,
GetSpreadSchema,
GetAllPairsSchema
} from '../schemas/index.js';
export function createMarketTools(exchange, mode) {
return {
get_ticker: {
description: 'Get current price for a trading pair (e.g., BTC/USDT or BTC/USDT:USDT for perpetual)',
inputSchema: GetTickerSchema,
handler: async (input) => {
const ticker = await exchange.getTicker(input.symbol);
return createSuccessResponse(ticker, mode);
}
},
get_multiple_tickers: {
description: 'Get ticker data for multiple symbols at once (max 50 symbols)',
inputSchema: GetMultipleTickersSchema,
handler: async (input) => {
const tickers = await Promise.all(
input.symbols.map(async (symbol) => {
try {
return await exchange.getTicker(symbol);
} catch (error) {
return { symbol, error: error.message };
}
})
);
return createSuccessResponse({ tickers }, mode);
}
},
get_orderbook: {
description: 'Get order book depth for a trading pair',
inputSchema: GetOrderbookSchema,
handler: async (input) => {
const orderbook = await exchange.getOrderbook(input.symbol, input.limit || 20);
return createSuccessResponse(orderbook, mode);
}
},
get_ohlcv: {
description: 'Get historical candlestick data (OHLCV). Timeframes: 1m, 5m, 15m, 30m, 1h, 4h, 1d, 1w',
inputSchema: GetOHLCVSchema,
handler: async (input) => {
const ohlcv = await exchange.getOHLCV(
input.symbol,
input.timeframe || '1h',
input.limit || 100,
input.since
);
return createSuccessResponse(
{ symbol: input.symbol, timeframe: input.timeframe || '1h', candles: ohlcv },
mode
);
}
},
get_spread: {
description: 'Get bid-ask spread for a trading pair',
inputSchema: GetSpreadSchema,
handler: async (input) => {
const ticker = await exchange.getTicker(input.symbol);
const bid = new Decimal(ticker.bid);
const ask = new Decimal(ticker.ask);
const spread = ask.minus(bid);
const spreadPercent = spread.div(bid).times(100);
return createSuccessResponse({
symbol: input.symbol,
bid: ticker.bid,
ask: ticker.ask,
spread: spread.toString(),
spreadPercent: spreadPercent.toFixed(4)
}, mode);
}
},
get_all_pairs: {
description: 'Get all trading pairs with volume and spread data',
inputSchema: GetAllPairsSchema,
handler: async (input) => {
const quoteAsset = input.quoteAsset || 'USDT';
const tickers = await exchange.getAllTickers(quoteAsset);
let filtered = tickers;
if (input.minVolume) {
filtered = tickers.filter(t =>
new Decimal(t.volume24h).gte(input.minVolume)
);
}
return createSuccessResponse({
pairs: filtered,
total: tickers.length,
filtered: filtered.length
}, mode);
}
}
};
}