UNPKG

fred-mcp-server

Version:

Federal Reserve Economic Data (FRED) MCP Server - Access all 800,000+ economic time series with search, browse, and data retrieval capabilities

63 lines (62 loc) 3.91 kB
import { z } from "zod"; import { searchSeries } from "./search.js"; import { getSeriesData } from "./series.js"; /** * Schema for FRED search tool */ const SEARCH_SCHEMA = { search_text: z.string().optional().describe("Text to search for in series titles and descriptions"), search_type: z.enum(["full_text", "series_id"]).optional().describe("Type of search to perform"), tag_names: z.string().optional().describe("Comma-separated list of tag names to filter by"), exclude_tag_names: z.string().optional().describe("Comma-separated list of tag names to exclude"), limit: z.number().min(1).max(1000).optional().default(25).describe("Maximum number of results to return"), offset: z.number().min(0).optional().default(0).describe("Number of results to skip for pagination"), order_by: z.enum([ "search_rank", "series_id", "title", "units", "frequency", "seasonal_adjustment", "realtime_start", "realtime_end", "last_updated", "observation_start", "observation_end", "popularity" ]).optional().describe("Field to order results by"), sort_order: z.enum(["asc", "desc"]).optional().describe("Sort order for results"), filter_variable: z.enum(["frequency", "units", "seasonal_adjustment"]).optional().describe("Variable to filter by"), filter_value: z.string().optional().describe("Value to filter the variable by") }; /** * Schema for FRED series data tool */ const SERIES_DATA_SCHEMA = { series_id: z.string().describe("The FRED series ID to retrieve data for (e.g., 'GDP', 'UNRATE', 'CPIAUCSL')"), observation_start: z.string().optional().describe("Start date for observations in YYYY-MM-DD format"), observation_end: z.string().optional().describe("End date for observations in YYYY-MM-DD format"), limit: z.number().min(1).max(100000).optional().describe("Maximum number of observations to return"), offset: z.number().min(0).optional().describe("Number of observations to skip"), sort_order: z.enum(["asc", "desc"]).optional().describe("Sort order of observations by date"), units: z.enum([ "lin", "chg", "ch1", "pch", "pc1", "pca", "cch", "cca", "log" ]).optional().describe("Data transformation: lin=levels, chg=change, pch=percent change, log=natural log"), frequency: z.enum([ "d", "w", "bw", "m", "q", "sa", "a", "wef", "weth", "wew", "wetu", "wem", "wesu", "wesa", "bwew", "bwem" ]).optional().describe("Frequency aggregation: d=daily, w=weekly, m=monthly, q=quarterly, a=annual"), aggregation_method: z.enum(["avg", "sum", "eop"]).optional().describe("Aggregation method: avg=average, sum=sum, eop=end of period"), output_type: z.number().min(1).max(4).optional().describe("Output format: 1=observations, 2=observations by vintage, 3=observations by release, 4=initial release only"), vintage_dates: z.string().optional().describe("Vintage date or dates in YYYY-MM-DD format") }; /** * Registers the simplified FRED tools with the MCP server */ export function registerFREDToolsV2(server) { // Register search tool server.tool("fred_search", "Search for FRED economic data series by keywords, tags, or filters. Use this to discover available series IDs.", SEARCH_SCHEMA, async (input) => { console.error(`fred_search called with params: ${JSON.stringify(input)}`); const result = await searchSeries(input); console.error("fred_search complete"); return result; }); // Register series data tool server.tool("fred_get_series", "Retrieve data for any FRED series by its ID. Supports data transformations, frequency changes, and date ranges.", SERIES_DATA_SCHEMA, async (input) => { console.error(`fred_get_series called with params: ${JSON.stringify(input)}`); const result = await getSeriesData(input); console.error("fred_get_series complete"); return result; }); }