#!/usr/bin/env node
/**
* CryptoDataAPI MCP Server
*
* Provides AI agents with real-time crypto market data through the
* Model Context Protocol. 13 tools covering market health, derivatives,
* sentiment, macro, ETF flows, cycle indicators, and coin profiles.
*/
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
// Tools
import * as daily from "./tools/daily.js";
import * as marketHealth from "./tools/market-health.js";
import * as fearGreed from "./tools/fear-greed.js";
import * as fundingRates from "./tools/funding-rates.js";
import * as liquidations from "./tools/liquidations.js";
import * as openInterest from "./tools/open-interest.js";
import * as btcCycle from "./tools/btc-cycle.js";
import * as coinProfile from "./tools/coin-profile.js";
import * as searchCoins from "./tools/search-coins.js";
import * as macro from "./tools/macro.js";
import * as stablecoinFlows from "./tools/stablecoin-flows.js";
import * as etfFlows from "./tools/etf-flows.js";
import * as options from "./tools/options.js";
// Prompts
import * as marketBriefing from "./prompts/market-briefing.js";
const tools = [
daily,
marketHealth,
fearGreed,
fundingRates,
liquidations,
openInterest,
btcCycle,
coinProfile,
searchCoins,
macro,
stablecoinFlows,
etfFlows,
options,
];
const server = new McpServer({
name: "cryptodataapi",
version: "1.0.0",
});
// Register all tools
for (const tool of tools) {
server.tool(tool.name, tool.description, tool.schema.shape, async (args: Record<string, unknown>) => {
const result = await tool.handler(args as any);
if (result.ok) {
return {
content: [
{
type: "text" as const,
text: JSON.stringify(result.data, null, 2),
},
],
};
} else {
return {
content: [
{
type: "text" as const,
text: `API Error (${result.status}): ${result.error}`,
},
],
isError: true,
};
}
});
}
// Register prompts
server.prompt(
marketBriefing.name,
marketBriefing.description,
{ focus: z.string().optional().describe("Focus area: general, derivatives, sentiment, or btc-cycle") },
(args) => {
const messages = marketBriefing.getPromptMessages(args as Record<string, string>);
return { messages };
}
);
// Start server with stdio transport
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch((err) => {
console.error("Fatal error:", err);
process.exit(1);
});