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
JavaScript
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,
};
}
},
};