UNPKG

fred-mcp-server

Version:

Federal Reserve Economic Data (FRED) MCP Server for fetching economic timeseries data with comprehensive test coverage

54 lines (53 loc) 1.87 kB
import { z } from "zod"; import fetch from "node-fetch"; const BASE_URL = "https://api.stlouisfed.org/fred"; /** * Utility for making requests to the FRED API */ export const makeRequest = async (endpoint, queryParams = {}) => { // For development, use a demo API key if none is provided in environment const apiKey = process.env.FRED_API_KEY || "abcdefghijklmnopqrstuvwxyz123456"; const url = new URL(`${BASE_URL}/${endpoint}`); // Add all query parameters Object.entries(queryParams).forEach(([key, value]) => { url.searchParams.append(key, String(value)); }); // Add the API key url.searchParams.append("api_key", apiKey); // Add common parameters url.searchParams.append("file_type", "json"); console.error(`Fetching FRED API: ${url.toString().replace(/api_key=[^&]+/, "api_key=***")}`); const response = await fetch(url.toString(), { headers: { "Accept": "application/json", }, }); if (!response.ok) { const errorText = await response.text(); throw new Error(`FRED API error (${response.status}): ${errorText}`); } return response.json(); }; // Observation schema for the series/observations endpoint export const ObservationSchema = z.object({ realtime_start: z.string(), realtime_end: z.string(), date: z.string(), value: z.string() }); // Schema for the series/observations API response export const SeriesObservationsResponseSchema = z.object({ realtime_start: z.string(), realtime_end: z.string(), observation_start: z.string(), observation_end: z.string(), units: z.string(), output_type: z.number(), file_type: z.string(), order_by: z.string(), sort_order: z.string(), count: z.number(), offset: z.number(), limit: z.number(), observations: z.array(ObservationSchema) });