FastMCP server for querying FRED financial and macroeconomic data plus AKShare A-share stock basics.
Design doc:
uv sync
$env:FRED_API_KEY = ""
uv run python main.pyAlternatively, create a local .env file from .env.example:
Copy-Item .env.example .envThen set FRED_API_KEY in .env. The server loads it from environment variables via python-dotenv; the key is never exposed as a tool parameter.
This repo also includes a small local MCP loader demo. The config is in
deployments/mcp.local.yaml and follows the same simple stdio shape used by
Codex/OpenCode-style MCP configs: server name plus command, args, env,
and optional env_files.
The demo loads:
fred: this local FRED MCP server via.venv/Scripts/python.exe main.pygithub: the local Docker imagedocker.xuanyuan.run/mcp/github:latest
Prepare local secrets:
Copy-Item .env.example .env
Copy-Item deployments/github-mcp/.env.example deployments/github-mcp/.envSet FRED_API_KEY in .env and GITHUB_PERSONAL_ACCESS_TOKEN in
deployments/github-mcp/.env.
Run the demo:
.venv\Scripts\python.exe scripts\demo_load_mcp_servers.pyIt initializes both MCP servers, lists their tools, and calls one sample tool on each server.
For HTTP mode, these can also live in .env:
MCP_TRANSPORT=http
MCP_HOST=127.0.0.1
MCP_PORT=8765
MCP_PATH=/mcp
MCP_STATELESS_HTTP=true
MCP_JSON_RESPONSE=true
HTTP mode for curl-based E2E checks:
$env:MCP_TRANSPORT = "http"
$env:MCP_HOST = "127.0.0.1"
$env:MCP_PORT = "8765"
$env:MCP_PATH = "/mcp"
uv run python main.pyfred_search_seriesfred_get_seriesfred_get_observationsfred_get_latest_observationfred_get_vintage_datesfred_get_canonical_indicatorsfred_get_macro_snapshotakshare_stock_zh_a_code_nameakshare_stock_profile_cninfoakshare_stock_valuation_emakshare_stock_financial_abstractakshare_stock_basic_metrics
All tools return a common envelope:
{
"ok": true,
"data": {},
"meta": {
"source": "FRED",
"endpoint": "series/observations",
"cached": false,
"fetched_at": "2026-05-13T12:00:00Z"
},
"request": {},
"warnings": []
}