Skip to main content
Glama

MCP Avantage

by MissionSquad

forex_daily

Fetch daily Forex time series data for specified currency pairs, including historical and real-time rates, in JSON or CSV formats using the MCP Avantage server.

Instructions

Fetches daily time series data for a Forex pair.

Input Schema

NameRequiredDescriptionDefault
datatypeNoData format for the response.json
from_symbolYesThe currency symbol to convert from (e.g., "EUR").
outputsizeNoOutput size. Compact returns latest 100 data points, Full returns complete history.compact
to_symbolYesThe currency symbol to convert to (e.g., "USD").

Input Schema (JSON Schema)

{ "additionalProperties": false, "description": "Parameters for fetching daily Forex time series data.", "properties": { "datatype": { "default": "json", "description": "Data format for the response.", "enum": [ "json", "csv" ], "type": "string" }, "from_symbol": { "description": "The currency symbol to convert from (e.g., \"EUR\").", "type": "string" }, "outputsize": { "default": "compact", "description": "Output size. Compact returns latest 100 data points, Full returns complete history.", "enum": [ "compact", "full" ], "type": "string" }, "to_symbol": { "description": "The currency symbol to convert to (e.g., \"USD\").", "type": "string" } }, "required": [ "from_symbol", "to_symbol" ], "type": "object" }

Implementation Reference

  • Defines the input validation schema (Zod) for the 'forex_daily' tool parameters: from_symbol, to_symbol, outputsize, and datatype.
    export const ForexDailyParamsSchema = z.object({ from_symbol: z.string().describe('The currency symbol to convert from (e.g., "EUR").'), to_symbol: z.string().describe('The currency symbol to convert to (e.g., "USD").'), outputsize: OutputSizeSchema.default('compact').optional(), datatype: DatatypeSchema.default('json').optional(), }).describe('Parameters for fetching daily Forex time series data.')
  • src/index.ts:736-747 (registration)
    Registers the 'forex_daily' MCP tool with the server, including its description, input schema, and handler that invokes the Alpha Vantage forex.daily method via the generic executeAvantageTool.
    server.addTool({ name: "forex_daily", description: "Fetches daily time series data for a Forex pair.", parameters: schemas.ForexDailyParamsSchema, execute: ( args, context // Let type be inferred ) => executeAvantageTool("forex_daily", args, context, (av, params) => av.forex.daily(params) ), });
  • Generic handler function used by 'forex_daily' (and all tools) to execute Alpha Vantage API calls: manages authentication, caching of AVantage instances, invokes the specific library method, and formats the response.
    async function executeAvantageTool<TArgs, TResult>( toolName: string, args: TArgs, context: Context<Record<string, unknown> | undefined>, // Use the imported Context type directly avantageMethod: ( av: AVantage, args: TArgs ) => Promise<{ error?: boolean; reason?: string; data?: TResult }> ): Promise<string> { logger.info(`Executing '${toolName}' tool for request ID: ${context}`); logger.debug(`Args for ${toolName}: ${JSON.stringify(args)}`); // --- Authentication & Resource Management --- // Access extraArgs safely - it might be null or undefined const extraArgsApiKey = context.extraArgs?.apiKey as string | undefined; const apiKey = extraArgsApiKey || config.apiKey; if (!apiKey) { logger.error(`'${toolName}' failed: Alpha Vantage API key missing.`); throw new UserError(apiKeyErrorMessage); } logger.debug( `Using AV API key (source: ${extraArgsApiKey ? "extraArgs" : "environment"}) for ${toolName}` ); try { // Get or create AVantage instance managed by ResourceManager const av = await resourceManager.getResource<AVantage>( apiKey, // Cache key is the resolved API key "avantage_client", // Type identifier for logging async (key) => { // Factory Function logger.info( `Creating new AVantage instance for key ending ...${key.slice(-4)}` ); // AVantage library reads AV_PREMIUM from process.env internally return new AVantage(key); }, async (avInstance) => { // Cleanup Function (no-op needed for AVantage) logger.debug(`Destroying AVantage instance (no-op)`); } ); // --- Library Call --- const result = await avantageMethod(av, args); // --- Response Handling --- if (result.error) { logger.warn( `'${toolName}' failed. Reason from avantage: ${result.reason}` ); throw new UserError(result.reason || `Tool '${toolName}' failed.`); } if (result.data === undefined || result.data === null) { logger.warn(`'${toolName}' completed successfully but returned no data.`); return "null"; // Return string "null" for empty data } logger.info(`'${toolName}' completed successfully.`); // Stringify the data part of the response return JSON.stringify(result.data); } catch (error: any) { logger.error( `Error during execution of '${toolName}': ${error.message}`, error ); // If it's already a UserError, rethrow it if (error instanceof UserError) { throw error; } // Otherwise, wrap it in a UserError throw new UserError( `An unexpected error occurred while executing tool '${toolName}': ${error.message}` ); } }
  • Specific invocation of the Alpha Vantage library's forex.daily method, passing validated parameters; this is the core tool logic delegated within the generic handler.
    executeAvantageTool("forex_daily", args, context, (av, params) => av.forex.daily(params) ),

Other Tools

Related Tools

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/MissionSquad/mcp-avantage'

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