mcpField
R
Restaurant Health Inspections

Restaurant Health Inspections

Remote
food.ian.shLegal & Government0Updated 4d ago

About Restaurant Health Inspections

Restaurant Health Inspections is an MCP server for finding restaurant inspection grades, scores, and violations across 20 locations in the US, UK, Canada, and France. It uses public government data and requires no API keys.

Key features

  1. 01Search restaurants by city and name
  2. 02View grades, scores, or results
  3. 03Retrieve inspection history and violations
  4. 04Explain local rating systems
  5. 05Use public data without API keys

Use cases

  1. 01Check a restaurant's current inspection status
  2. 02Review a restaurant's past violations
  3. 03Compare grading systems across locations

MCP support

The server exposes restaurant search, inspection history, and rating-system tools to MCP clients. Its hosted endpoint uses Streamable HTTP without authentication; a local stdio Python version is also available.

Configuration

Remote servers need no local install. Pick your client, then copy the config or install in one click.

Endpointhttps://food.ian.sh/mcp
Copy install command
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.

Tools

Details

From the project README

restaurant-health MCP server

Look up restaurant health inspection results in 20 places:

  • US: New York City, New York State (outside NYC), San Francisco, LA County, Santa Clara County, Marin County, Sacramento County, Las Vegas, Chicago, Boston, Austin, Raleigh / Wake County, Louisville, Detroit, Cincinnati, Omaha / Douglas County, Fairfax County
  • Elsewhere: London & the UK, Toronto, Paris & France

It uses public government data and needs no API keys.

Hosted at https://food.ian.sh. The MCP endpoint is https://food.ian.sh/mcp (Streamable HTTP, no auth).

claude mcp add --transport http restaurant-health https://food.ian.sh/mcp

Tools

ToolWhat it does
search_restaurants(city, name, address?, zip_code?, limit?)Find restaurants and show their current grade, score or result
get_inspection_history(city, restaurant_id, max_inspections?)Past inspections with scores and violations, where the city publishes them
rating_systems()Lists the cities and explains how each one grades

Every city's id, grading system, and data source lives in its module under src/cities/. rating_systems returns the same information.

How data is fetched

  • Live APIs, cached for 1 day (Cloudflare Cache API, per location). This covers everything except LA and Las Vegas:
    • Socrata: NYC, SF, Chicago, Austin, Santa Clara, Marin, Cincinnati, NY State
    • ArcGIS: Raleigh, Louisville, Detroit, Sacramento, Omaha, Fairfax
    • CKAN: Boston, Toronto
    • Opendatasoft: France
    • The FSA ratings API: UK
  • Bulk imports into D1: LA County and Las Vegas only publish large CSV and zip files (about 75 MB). A daily cron re-imports a file when it changes.

Known limits:

  • The UK publishes only the current rating, with no inspection history.
  • France publishes only a summary level, and only for the last 12 months.
  • Omaha only has inspections since Dec 2025, with violations in linked PDFs.
  • Fairfax publishes no violation details.
  • LA County excludes Pasadena, Long Beach and Vernon.

The landing page picks a default city from Cloudflare's request geolocation (src/geo.ts). ?city=<id> overrides it.

Hosted deployment (Cloudflare Workers)

PathWhat it is
src/index.tsRouting, MCP tools (stateless Streamable HTTP via @modelcontextprotocol/sdk), cron handler
src/cities/One module per city: search, history, rating text, and landing page badge (index.ts is the registry)
src/lib/http.tsCached fetch, plus Socrata/ArcGIS query helpers
src/geo.tsPicks the default city from the visitor's location
src/bulk.tsLA + Las Vegas import into D1 and the queries against it
src/landing.tsLanding page at /. Its search box calls /api/search, and expanding a result calls /api/history
migrations/D1 schema
npm install
npm run dev                  # local; apply schema first: npx wrangler d1 migrations apply restaurant-health --local
npm run deploy

Each import writes a new generation of rows, switches meta.gen:<city> to it, and then deletes the old rows. A failed import never leaves partial data. To force a re-import, run:

curl -X POST -H "Authorization: Bearer $ADMIN_TOKEN" "https://food.ian.sh/admin/refresh?force=1"

Pushes to main deploy automatically via .github/workflows/deploy.yml. It applies D1 migrations, then runs wrangler deploy. It needs the repo secrets CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID.

ADMIN_TOKEN is a Worker secret (wrangler secret put ADMIN_TOKEN). SOCRATA_APP_TOKEN is an optional secret that raises the NYC and SF rate limits. /api/status shows when each bulk city was last imported.

Local stdio version (Python)

server.py is the original standalone version. It downloads and caches the bulk files in ~/.cache/restaurant-health-mcp itself.

Requires uv. Dependencies are declared inline in server.py.

Claude Code:

claude mcp add restaurant-health --scope user -- uv run --script /path/to/server.py

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "restaurant-health": {
      "command": "uv",
      "args": ["run", "--script", "/path/to/server.py"]
    }
  }
}

Optional: set SOCRATA_APP_TOKEN to get higher rate limits on NYC and SF. You can also set RESTAURANT_HEALTH_CACHE to change where the cache is stored.

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.