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
JavaScript
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;
});
}