UNPKG

realtime-crypto-mcp-server

Version:

A real-time cryptocurrency data provider for Model Context Protocol (MCP) servers. This package integrates with the CoinCap API to provide cryptocurrency exchange details and current rates.

79 lines (78 loc) 2.83 kB
import { z } from "zod"; const COINCAP_API_BASE = "https://api.coincap.io/v2"; // Make API request to CoinCap async function makeCoinCapRequest(url) { const headers = { Accept: "application/json", }; try { const response = await fetch(url, { headers }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return (await response.json()); } catch (error) { console.error("Error making CoinCap request:", error); return null; } } // Format exchange details function formatExchangeDetails(data) { return [ `Name: ${data.name || "Unknown"}`, `Rank: ${data.rank || "Unknown"}`, `Volume (USD): $${parseFloat(data.volumeUsd).toLocaleString() || "Unknown"}`, `% of Total Volume: ${parseFloat(data.percentTotalVolume).toFixed(2)}%`, `Trading Pairs: ${data.tradingPairs || "Unknown"}`, `Website: ${data.exchangeUrl || "Unknown"}`, `Last Updated: ${new Date(data.updated).toLocaleString()}`, ].join("\n"); } // Tool definition for "get-exchange-details" export const getExchangeDetailsTool = { name: "get-exchange-details", description: "Get details about a cryptocurrency exchange", inputSchema: z.object({ exchange: z.string().describe("Exchange ID (e.g., binance, coinbase, kraken)"), }).shape, execute: async (args, extra) => { try { const exchangeId = args.exchange.toLowerCase(); const exchangeUrl = `${COINCAP_API_BASE}/exchanges/${exchangeId}`; const exchangeData = await makeCoinCapRequest(exchangeUrl); if (!exchangeData || !exchangeData.data) { return { content: [ { type: "text", text: `Failed to retrieve details for exchange: ${exchangeId}`, }, ], }; } const formattedDetails = formatExchangeDetails(exchangeData.data); const detailsText = `Exchange details for ${exchangeData.data.name}:\n\n${formattedDetails}`; return { content: [ { type: "text", text: detailsText, }, ], }; } catch (error) { console.error("Error in getExchangeDetailsTool.execute:", error); return { content: [ { type: "text", text: `Error: ${error instanceof Error ? error.message : String(error)}`, }, ], isError: true, }; } }, };