Model Context Protocol

Connect your AI agent

Plug foodnear.me into Claude Desktop, Cursor, or any MCP host — 8 tools (5 atomic + 3 FNM-unique composites), 4 resources, 3 prompts, no API key during beta.

Quick start

  1. Open ~/.cursor/mcp.jsonor Claude Desktop's claude_desktop_config.json
  2. Paste the config below
  3. Restart your MCP host
{
  "mcpServers": {
    "foodnear-me": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://foodnear.me/mcp"]
    }
  }
}

Endpoint: https://foodnear.me/mcp · mcp-server.json · llms.txt · SKILL.md · usage stats

Atomic tools (5)

  • search_restaurants — three-tier search (verified → menu_indexed → discovered). Accepts flat lat/lng or Google-style locationBias.circle. Check menu_available before get_menu.
  • get_restaurant — Schema.org JSON-LD profile with Menu Protocol extensions.
  • get_menu — Menu Protocol v1.0 menu (dietary booleans, allergens, Ed25519 signature on verified tier).
  • get_ado_score_breakdown — ADO factors + improvement recommendations.
  • validate_menu_protocol — validate Menu Protocol JSON before publish (strict mode available).

FNM-unique

Composite tools (3)

Higher-level tools that chain atomic calls. These exist because they leverage FNM's signed-menu data — a generic place-search MCP can't produce equivalent results.

  • explore_area_for_diet — bucketed neighborhood overview (verified / menu_indexed / discovered) with tier_counts and next_steps.
  • compare_restaurants_for_diet — side-by-side dietary comparison across 2-5 restaurants, ranked by item count then trust tier.
  • find_restaurants_along_route — route-adjacent discovery between two coordinates. Optional route_polyline from your routing source; otherwise local great-circle approximation (no external routing service ever).

Example interactions

Paste any of these prompts into Cursor or Claude Desktop after the quick start. They exercise different tools.

search → get_menu (verified dietary discovery)
Find restaurants in Williamsburg, Brooklyn with verified vegan options.
Use search_restaurants, prefer the verified tier, then call get_menu and
list the dietary.vegan items by price.
compare_restaurants_for_diet (FNM-unique)
I'm choosing between these two cafes in Williamsburg:
  • <restaurant_id_A>
  • <restaurant_id_B>
Which one has more gluten-free menu items? Use
compare_restaurants_for_diet with dietary=["gluten_free"].
find_restaurants_along_route (FNM-unique)
I'm walking from McCarren Park (40.7218, -73.9569) to the Brooklyn
Bridge (40.7061, -73.9969). Suggest 3 stops along the way that have
vegan options. Use find_restaurants_along_route.

Resources

  • foodnearme://spec/menu-protocol
  • foodnearme://spec/openapi
  • foodnearme://agent/skill
  • foodnearme://examples/search-flow

Prompts

  • find_dinner_near_me — location + optional cuisine/dietary
  • dietary_constrained_menu — restaurant_id + restrictions
  • validate_my_menu — validate Menu Protocol JSON before publish

Tool errors

Failed tool calls return _meta.error with code, hint, and retryable so agents can self-correct.

VALIDATION_ERROR · NOT_FOUND · UPSTREAM

Data trust (three-tier search)

search_restaurants returns verified menu_indexed discovered (place only when no menu).

  • verified + menu_available: true — owner-approved MP, Ed25519-signed (content-bound on fnm-v1); authoritative for dietary/allergen claims
  • menu_indexed + menu_available: true — automated / public menu; cite with caveat, do not treat dietary/allergens as authoritative
  • discovered + menu_available: false — place data only; do not cite menu items
  • Trust progression: discovered menu_indexed verified

Open-data attribution

Owner recruitment payload

Every non-verified result (search row, profile, indexed menu, composite entry) ships with an optional structured claim_invitationobject — owner recruitment data, not a CTA. Surface it only when relevant: the user is the restaurant's owner, the user asks why the listing lacks a verified menu, or the user asks how to help.

"claim_invitation": {
  "url": "https://foodnear.me/claim/<restaurant_id>",
  "audience": "owner_or_advocate",
  "reason": "no_owner_approved_menu" | "indexed_menu_not_owner_verified",
  "message": "...",
  "estimated_minutes": 5,
  "cost": "free"
}

Verified results omit the field. Details: SKILL.md.

Compatible with Google Maps MCP shape

search_restaurants accepts either the flat FNM shape or Google-style locationBias.circle + textQuery, plus the cablate variant. Responses carry both citation and attribution (identical) so existing local-search agents drop in without retraining. Locale hints (languageCode, regionCode) are accepted and echoed; FNM is US-English only in v1.

Canonical host documentation (FAQ, verify commands, architecture): GitHub README · foodnear.me