Skip to main content
Glama
CoinStatsHQ

CoinStats MCP Server

Official

get-coin-avg-price

Retrieve the historical average price of a cryptocurrency for a specific date using its unique identifier and Unix timestamp.

Instructions

Get the historical average price for a specific cryptocurrency based on its unique identifier and a specific date.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
coinIdYesThe identifier of coin
timestampYesUnix timestamp

Implementation Reference

  • Universal API handler that processes tool endpoints, path and query parameters, handles special cases, makes authenticated fetch requests to CoinStats API, and formats response for MCP. This executes the logic for get-coin-avg-price.
    export async function universalApiHandler<T>( basePath: string, endpoint: string, method: string = 'GET', params: Record<string, any> = {}, body?: any ): Promise<{ content: Array<{ type: 'text'; text: string; isError?: boolean }>; }> { try { // Handle path parameters - replace {paramName} in endpoint with actual values let processedEndpoint = endpoint; let processedParams = { ...params }; // Find all path parameters in the endpoint (e.g., {coinId}, {id}, {type}) const pathParamMatches = endpoint.match(/\{([^}]+)\}/g); if (pathParamMatches) { for (const match of pathParamMatches) { const paramName = match.slice(1, -1); // Remove { and } if (processedParams[paramName] !== undefined) { // Replace the placeholder with the actual value processedEndpoint = processedEndpoint.replace(match, processedParams[paramName]); // Remove the parameter from query params since it's now part of the path delete processedParams[paramName]; } else { throw new Error(`Required path parameter '${paramName}' is missing`); } } } // MCP clients might not support '~' in parameter names, so we replace '-' with '~' specifically for the /coins endpoint before making the request. if (endpoint === '/coins') { processedParams = Object.entries(processedParams).reduce((acc, [key, value]) => { acc[key.replace(/-/g, '~')] = value; return acc; }, {} as Record<string, any>); } const url = `${basePath}${processedEndpoint}`; const data = await makeRequestCsApi<T>(url, method, processedParams, body); if (!data) { return { content: [{ type: 'text', text: 'Something went wrong', isError: true }], }; } return { content: [ { type: 'text', text: JSON.stringify(data), }, ], }; } catch (error) { return { content: [{ type: 'text', text: `Error: ${error}`, isError: true }], }; } }
  • Tool configuration and input schema using Zod for validating coinId (string) and timestamp (number) parameters.
    { name: 'get-coin-avg-price', description: 'Get the historical average price for a specific cryptocurrency based on its unique identifier and a specific date.', endpoint: '/coins/price/avg', method: 'GET', parameters: { coinId: z.string().describe('The identifier of coin'), timestamp: z.number().describe('Unix timestamp'), }, },
  • Tool handler factory logic that sets up the execution callback for each tool config, dispatching API tools to universalApiHandler with appropriate basePath, endpoint, method, and params.
    server.tool(config.name, config.description, config.parameters, async (params: Record<string, any>) => { // Handle local operations if (config.isLocal) { // Handle specific local tools if (config.name === 'save-share-token') { await saveToCache('shareToken', params.shareToken); return { content: [ { type: 'text', text: 'Share token saved successfully', }, ], }; } if (config.name === 'get-share-token') { const shareToken = await getFromCache('shareToken'); return { content: [ { type: 'text', text: shareToken ? shareToken : 'No share token found in cache', isError: !shareToken, }, ], }; } // Future local tools can be added here // Default response for unhandled local tools return { content: [ { type: 'text', text: 'Operation completed', }, ], }; } // Handle API operations const basePath = config.basePath || COINSTATS_API_BASE; const method = config.method || 'GET'; // Methods that typically have a request body const bodyMethods = ['POST', 'PUT', 'PATCH', 'DELETE']; // For GET/DELETE requests, all params go in the URL // For POST/PUT/PATCH, send params as the body if (bodyMethods.includes(method.toUpperCase())) { return universalApiHandler(basePath, config.endpoint, method, {}, params); } else { return universalApiHandler(basePath, config.endpoint, method, params); } });
  • src/index.ts:4-18 (registration)
    Imports tool configurations and factory, then registers all tools on the MCP server instance, making get-coin-avg-price available.
    import { registerTools } from './tools/toolFactory.js'; import { allToolConfigs } from './tools/toolConfigs.js'; // Create server instance const server = new McpServer({ name: 'coinstats-mcp', version: '1.0.0', capabilities: { resources: {}, tools: {}, }, }); // Register all tools from configurations registerTools(server, allToolConfigs);

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/CoinStatsHQ/coinstats-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server