Safe Bite serves official restaurant health inspection records for six U.S. cities. The public website is safebiter.com. This page documents the Model Context Protocol (MCP) server only.
Endpoint: https://www.safebiter.com/mcp
Transport: Streamable HTTP (POST JSON-RPC 2.0)
Authentication: None required
Privacy: /privacy
https://www.safebiter.com/mcp.POST with Accept: application/json, text/event-stream (hosts that render MCP Apps need the event stream).tools/list, then tools/call with the tool names below.Hosts that support MCP Apps render an inline restaurant card or map. The card lists violation types only; do not quote inspector narratives, temperatures, or long comment text from raw records.
Tool arguments use lowercase slugs: chicago, nyc, minneapolis,
milwaukee, austin, denver, or all where noted.
| Slug | City | Official source | Website vs MCP |
|---|---|---|---|
chicago | Chicago | City of Chicago Open Data (CDPH Food Inspections) | Last 4 weeks only on the website map; MCP tools search the full stored dataset. |
nyc | New York | NYC Department of Health (DOHMH) | Last 4 weeks only on the website map; MCP tools search the full stored dataset. |
minneapolis | Minneapolis | City of Minneapolis Health Department | Last 90 days only on the website map; MCP tools search the full stored dataset. |
milwaukee | Milwaukee | City of Milwaukee Health Department | Last 6 months only on the website map; MCP tools search the full stored dataset. |
austin | Austin | City of Austin Public Health | Last 4 months only on the website map; MCP tools search the full stored dataset. |
denver | Denver | Denver Dept. of Public Health & Environment (Accela ePermits) | Last 6 months only on the website map; MCP tools search the full stored dataset. |
Production data is stored in PostgreSQL and refreshed from the city sources above.
refresh-safe-bite.yml), updating each city with up to 10,000 new rows per run, then redeploying the app.Every tool below returns an MCP App result (restaurant card or map) when the host supports UI resources.
Tool metadata lives in tools/list; this section is the human-readable reference.
show_inspectionPrimary tool for natural-language questions. Pass a restaurant name for a card, or a violation keyword plus
city for a map (for example pest inspections in Milwaukee). Parameters: query,
violation, city (required for violation maps), view (auto,
card, map), limit (1–12).
search_restaurantsFuzzy name search. Parameters: query (required), optional city (all or a slug),
limit (1–50), threshold (0–1 match strictness), history_n recent inspections per match (1–20).
find_nearby_restaurantsRestaurants within a radius of a point or address. Provide latitude and longitude, or
address (geocoded when coordinates are omitted). Optional radius_miles (default 0.25),
city, limit (1–100), history_n.
get_city_inspectionsWorst recent inspections in one city, ranked for the MCP App card. Parameters: city (required),
limit (1–500, use 500 for a wide window), offset for paging (see Pagination).
get_milwaukee_inspectionsSame as get_city_inspections but fixed to Milwaukee. Parameters: limit, offset.
Besides tools, the server exposes read-only resources such as
safe-bite://chicago/inspections (and the same pattern for each city slug),
plus safe-bite://all/violations for cross-city violation summaries.
Use resources/read with optional query parameters on the URI:
safe-bite://{city}/inspections?offset=0&limit=500The JSON body includes a pagination object:
total_count — rows available for that city in the databaseoffset / limit — echo of the requesthas_more — whether another page existsnext_offset — pass as offset on the next URI (or null when done)When has_more is true, the response may include a second content item whose URI is the next page.
Default limit is 500; maximum is 500.
next_offset metadata — best for agents that paginate programmatically.get_city_inspections / get_milwaukee_inspections accept offset and limit, but responses are severity-ranked MCP App cards, not paginated JSON. For “worst places in Chicago,” one call with limit=500 is usually enough; use resources if you need every row.limit or narrow city / radius instead.| Symptom | What to check |
|---|---|
405 Use POST for MCP | Call /mcp with POST, not GET. |
| Empty card or “no data” | Confirm city slug spelling; try search_restaurants with a partial name; database may still be loading after deploy. |
| No inline UI, only text | Host may not support MCP Apps; use a client that implements io.modelcontextprotocol/ui. |
| Geocode errors on nearby search | Supply explicit latitude / longitude instead of address. |
| Stale dates | Compare with the official city portal in the table above; daily refresh cannot exceed city publication. |
| CORS errors in Inspector | Inspector should call the public URL directly; preflight OPTIONS is supported. |
Results are official public records repackaged for reading. They are not a health inspection Safe Biter performed, and they are not advice about whether to eat somewhere.
Questions: vangilder.andrew@gmail.com.