Skip to main content
Glama

CoinStats MCP Server

Official

get-exchange-sync-status

Check the synchronization status of your cryptocurrency exchange portfolio to monitor data updates and ensure accurate tracking of your holdings.

Instructions

Get the syncing status of the exchange portfolio.

Input Schema

NameRequiredDescriptionDefault
portfolioIdYesThe identifier of portfolio, which you received from /exchange/balance call response.

Input Schema (JSON Schema)

{ "properties": { "portfolioId": { "description": "The identifier of portfolio, which you received from /exchange/balance call response.", "type": "string" } }, "required": [ "portfolioId" ], "type": "object" }

Implementation Reference

  • Tool configuration object that registers the 'get-exchange-sync-status' tool, including its name, description, input schema (parameters), endpoint, and HTTP method.
    { name: 'get-exchange-sync-status', description: 'Get the syncing status of the exchange portfolio.', endpoint: '/exchange/status', method: 'GET', parameters: { portfolioId: z.string().describe('The identifier of portfolio, which you received from /exchange/balance call response.'), }, },
  • Zod schema definition for the tool's input parameter 'portfolioId'.
    parameters: {
  • src/index.ts:17-18 (registration)
    Main registration point where registerTools is called to add all tools (including get-exchange-sync-status) to the MCP server.
    // Register all tools from configurations registerTools(server, allToolConfigs);
  • Handler function registered for each tool, including get-exchange-sync-status. For API tools, it invokes universalApiHandler with the configured endpoint and parameters.
    toolConfigs.forEach((config) => { 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); } });
  • Core handler that executes the HTTP request to the CoinStats API endpoint '/exchange/status' with portfolioId query param, handles path substitution, error handling, and formats response for MCP.
    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 }], }; } }

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