The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Usda MCP Server listing page.
Search foods, compare nutrients, and look up the full USDA FoodData Central database via MCP. STDIO or Streamable HTTP.
Public Hosted Server: https://usda.caseyjhand.com/mcp
Five tools covering the USDA FoodData Central workflow — from discovery to detailed nutrient analysis:
| Tool | Description |
|---|---|
usda_search_foods | Search foods by keyword across SR Legacy, Foundation, Survey FNDDS, and Branded data sources, with nutrient preview and pagination |
usda_get_food | Full nutrient profile for one food by FDC ID, with optional per-portion scaling (g, oz, lb, kg, or serving) |
usda_get_foods | Batch nutrient fetch for 2–20 FDC IDs in a single request; failed IDs reported in failed[] instead of aborting |
usda_compare_foods | Side-by-side nutrient comparison for 2–5 foods, formatted as a markdown table scaled to a common gram basis |
usda_list_nutrients | Static FDC nutrient reference table (~150 nutrients) with IDs, names, units, and categories — no API call required |
usda_search_foodsSearch USDA FoodData Central foods by keyword, UPC/GTIN code, or ingredient.
"Branded" in dataType for packaged products or UPC lookup"General Mills") — setting brandOwner without dataType searches Branded, since only Branded records carry a brand owner"Poultry Products", "Vegetables and Vegetable Products")pageSize (up to 50) and pageNumberusda_get_food for the full profileusda_get_foodFull nutrient profile for one food by FDC ID.
nutrients[]) with amounts per 100gquantity + unit to scale values (e.g. quantity=200, unit="g" → per-200g values)unit="serving" scales to the food's first defined portion weightallPortions[]) alongside the serving infonutrients[] to specific IDs strongly reduces context size for common queries (use usda_list_nutrients to look up IDs)usda_get_foodsBatch nutrient fetch for 2–20 FDC IDs.
nutrients[] filter strongly recommended — full profiles for 20 foods are largefailed[] carries IDs that returned no data, so one missing food doesn't abort the batchusda_get_food calls when you already have FDC IDsusda_compare_foodsSide-by-side nutrient comparison for 2–5 foods.
nutrients[] for specific comparisons (e.g. just iron and vitamin C)quantity + unit)usda_list_nutrientsFDC nutrient reference table — all ~150 tracked nutrients.
category filter: macronutrients, vitamins, minerals, lipids, amino_acids, other"vitamin C") to FDC IDs (1162) for use in nutrients[] params| Type | Name | Description |
|---|---|---|
| Resource | usda://food/{fdcId} | Full nutrient profile for a specific food by FDC ID — same data as usda_get_food without portion scaling |
| Resource | usda://nutrients | Complete FDC nutrient reference list — all ~150 tracked nutrients with IDs, names, units, and categories |
All resource data is also reachable via tools. Use usda_search_foods to discover FDC IDs before reading food resources.
Built on @cyanheads/mcp-ts-core:
none, jwt, oauthin-memory, filesystem, Supabase, Cloudflare KV/R2/D1USDA FDC-specific:
api.nal.usda.gov/fdc/v1)/foods) with per-food partial failure reportingAgent-friendly output:
dataType) on every food result so callers know whether they're reading curated research data or label-derived branded valuesusda_get_foods, usda_compare_foods) return successes alongside structured failed[] / missingData[] entries rather than failing the whole requestA public instance is available at https://usda.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
Add the following to your MCP client configuration file. See data.gov API key signup to generate a free API key.
Or with npx (no Bun required):
Or with Docker:
For Streamable HTTP, set the transport and start the server:
usda_list_nutrients and the static nutrient reference work without it.| Variable | Description | Default |
|---|---|---|
USDA_FDC_API_KEY | Required for FoodData Central-backed tools (search, get, batch, compare) — not for startup or usda_list_nutrients. Get a free key at api.data.gov. | — |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | Port for HTTP server. | 3010 |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (RFC 5424). | info |
LOGS_DIR | Directory for log files (Node.js only). | <project-root>/logs |
STORAGE_PROVIDER_TYPE | Storage backend. | in-memory |
OTEL_ENABLED | Enable OpenTelemetry instrumentation (spans, metrics, completion logs). | false |
See .env.example for the full list of optional overrides.
Build and run:
Run checks and tests:
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/usda-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers tools, resources, and inits FdcService. |
src/config | Server-specific environment variable parsing and validation with Zod (USDA_FDC_API_KEY). |
src/mcp-server/tools | Tool definitions (*.tool.ts) — search, get, batch, compare, list-nutrients. |
src/mcp-server/resources | Resource definitions (*.resource.ts) — food profile and nutrient reference. |
src/services/fdc | FdcService — USDA FDC API client, normalization, and static nutrient reference data. |
tests/ | Unit tests mirroring src/ — 50 tests across all tools and resources. |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for request-scoped logging, ctx.state for tenant-scoped storagesrc/mcp-server/*/definitions/index.tsIssues and pull requests are welcome. Run checks and tests before submitting:
Apache-2.0 — see LICENSE for details.