streamable-httpupdated 28d ago
Model Context Protocol server for AI-native restaurant discovery — three-tier search (verified → menuindexed → discovered), Menu Protocol menus, and structured menu validation. Plug into Claude Desktop, Cursor, ChatGPT, or any MCP host in about 30 seconds.
Food Near Me 能做什么?
Food Near Me — MCP Server
Model Context Protocol server for AI-native restaurant discovery — three-tier search (verified → menu_indexed → discovered), Menu Protocol menus, and structured menu validation. Plug into Claude Desktop, Cursor, ChatGPT, or any MCP host in about 30 seconds.
Production endpoint: https://foodnear.me/mcp · 8 tools · 4 resources · 3 prompts · No API key (beta)
Quick start {#quick-start}
1. Add this to your MCP host config
Cursor — ~/.cursor/mcp.json (macOS/Linux) or %USERPROFILE%\.cursor\mcp.json (Windows)
Claude Desktop — ~/Library/Application Support/Claude/claude_desktop_config.json (macOS), %APPDATA%\Claude\claude_desktop_config.json (Windows)
{
"mcpServers": {
"foodnear-me": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://foodnear.me/mcp"]
}
}
}
2. Restart your MCP host
3. Try a prompt
“Find vegan Thai restaurants near Brooklyn Bridge and show me a menu for the top result.”
Your agent should call search_restaurants → get_menu (or get_restaurant first).
What you get
Tools (8)
| Tool | Description |
|---|---|
search_restaurants |
Three-tier geo search by lat/lng — verified → menu_indexed → discovered; check menu_available before get_menu |
get_restaurant |
Restaurant profile with Schema.org JSON-LD + Menu Protocol extensions |
get_menu |
Full Menu Protocol v1.0 menu (dietary flags, allergens, signatures) |
get_ado_score_breakdown |
ADO score factors and improvement recommendations |
validate_menu_protocol |
Validate a Menu Protocol JSON payload before publish |
explore_area_for_diet |
Composite: bucketed neighborhood overview (verified / menu_indexed / discovered); optional dietary filter narrows the verified tier only |
compare_restaurants_for_diet |
Composite: compare 2–5 known restaurants by dietary-eligible menu items and trust tier ranking |
find_restaurants_along_route |
Composite: route-adjacent restaurant discovery between origin/destination with optional dietary ranking |
Resources (4)
| URI | Content |
|---|---|
foodnearme://spec/menu-protocol |
Menu Protocol v1.0 specification |
foodnearme://spec/openapi |
OpenAPI 3.1 spec pointer |
foodnearme://agent/skill |
Agent skill summary |
foodnearme://examples/search-flow |
Example search → menu flow |
Prompts (3)
| Prompt | Args | Guides agent to |
|---|---|---|
find_dinner_near_me |
location (required), cuisine?, dietary? |
search_restaurants → get_menu |
dietary_constrained_menu |
restaurant_id, restrictions |
get_menu with explicit MP flags/allergens |
validate_my_menu |
strict? (true for strict mode) |
validate_menu_protocol |
Configuration
| Setting | Value |
|---|---|
| MCP URL | https://foodnear.me/mcp |
| Transport | HTTP JSON-RPC (POST); discovery via GET /mcp |
| Auth | None during beta (rate limits apply) |
| Registry | me.foodnear/foodnear-me (official MCP Registry) |
Preview / local: Replace the URL with http://localhost:3000/mcp when running npm run dev in apps/web.
Operational tool filter: set FNM_MCP_ENABLED_TOOLS=search_restaurants,get_menu to expose only a comma-separated subset in tools/list and GET /mcp. Leave unset or * to expose all tools. This is for temporary degradation/context control, not privacy or auth.
Architecture
┌─────────────────────┐ POST /mcp (JSON-RPC) ┌─────────────────────────┐
│ MCP host │ ────────────────────────────▶│ apps/web/app/mcp │
│ (Cursor / Claude) │ GET /mcp (discovery) │ Next.js route handler │
└─────────────────────┘ └────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ Supabase + PostGIS │
│ Menu Protocol (MP) │
└─────────────────────────┘
Implementation: apps/web/app/mcp/route.ts · Flow runner: apps/web/lib/mcp/mcp-flow-runner.ts
Tool error contract
Failed tools/call responses include structured metadata in _meta.error:
| Field | Meaning |
|---|---|
code |
VALIDATION_ERROR · NOT_FOUND · UPSTREAM · RATE_LIMITED · UNKNOWN |
message |
What went wrong |
hint |
How to fix the request |
retryable |
Whether the agent should retry |
docs |
https://foodnear.me/docs#quick-start |
Human-readable text is still in content[0].text for hosts that ignore _meta.
Verify
From repo root (with apps/web dev server running for localhost):
# Automated agent flows (14 flows when Supabase + seed configured; 11 without DB)
npm run test:mcp-flows
# Against production
npm run test:mcp-flows:http
# Discovery GETs + MCP tools/list count
npm run smoke:mcp
# Three-tier trust model copy parity (local files)
npm run check:discovery-copy
# Full deploy gate (13 checks + discovery copy on production URL)
npm run preflight -w web
# or: ./apps/web/scripts/deploy-preflight.sh https://foodnear.me
Production monitoring: GitHub Actions workflow MCP Production Smoke runs smoke:mcp daily and on manual dispatch (.github/workflows/mcp-smoke.yml).
Agent discovery
| File | URL |
|---|---|
llms.txt |
https://foodnear.me/llms.txt |
llms-full.txt |
https://foodnear.me/llms-full.txt |
| MCP manifest | https://foodnear.me/.well-known/mcp-server.json |
| AgentRoot | https://foodnear.me/.well-known/agentroot.json |
| Skill file | https://foodnear.me/SKILL.md |
| OpenAPI | https://foodnear.me/openapi.json |
| Web quick reference | https://foodnear.me/docs |
Scripted flows: apps/web/docs/example-agent-flows.md
Data trust model (three-tier search)
search_restaurantsreturns verified → menu_indexed → discovered.- Every result includes
verification_statusandmenu_available. Callget_menuonly whenmenu_availableis true. - Verified — owner-approved MP; authoritative for dietary/allergen claims.
- menu_indexed — automated/public MP menu; cite with caveat — not owner-verified.
- discovered — place only; do not cite menu items.
- Trust progression:
discovered→menu_indexed→verified. See https://foodnear.me/attribution for data sources.
FAQ
Do I need an API key?
No for beta MCP access. Future paid tiers may use API keys or x402 (USDC on Base). See x402-prepaid-spec.md in your local docs/Food Near Me playbook.
Tools not showing after restart?
Confirm the config URL ends with /mcp. Restart the host completely. Run npm run smoke:mcp against your target base URL.
Empty search results?
Beta verified menus are seeded for specific metros (e.g. Williamsburg, NYC). 7 menu_indexed restaurants in Williamsburg have automated menus from website ingest. Discovered place listings cover many US metros — use coordinates in an imported region. Demo coords: 40.7128, -74.006. Run npm run db:seed -w web locally for verified test data.
Cursor vs Claude config path?
See Quick start above — each host uses a different JSON file; only the mcpServers block matters.
How is this different from DoorDash / Uber Eats APIs?
We expose owner-verified Menu Protocol data for agents — not scraped aggregator menus or ordering checkout.
Monorepo layout
This repository ships the MCP server inside the foodnear.me web app:
| Path | Purpose |
|---|---|
apps/web |
Next.js app — MCP at /mcp, landing, API routes |
packages/menu-protocol |
Menu Protocol schema + validators |
database |
Migrations, seeds, schema |
server.json |
Official MCP Registry metadata |
Business strategy and runbooks live in a separate local docs folder (not in this repo) — see your team's docs/Food Near Me playbook.
Development
npm install
cd apps/web && cp .env.example .env.local # Supabase keys
npm run dev # http://localhost:3000
npm run test:mcp-flows # POST localhost:3000/mcp
Operator: menu_indexed website ingest
Promote discovered → menu_indexed via free website/ordering-platform parsers (ChowNow API, order.online, Sauce, Squarespace, BentoBox, Toast, Playwright). Always dry-run first — headless is slow.
cd apps/web
npm run db:probe:menu-batch -- --headless --limit=10
npm run db:import:menu-indexed:website:headless:dry-run -- --limit=10
npm run db:import:menu-indexed:website:headless -- --limit=10 # live
No Uber Eats / DoorDash / Grubhub / RapidAPI scrapers. See apps/web/docs/example-agent-flows.md.
Links
- Website: https://foodnear.me
- GitHub: https://github.com/food-near-me/platform
- Menu Protocol spec: https://github.com/foodnearme/menu-protocol
- Support: https://foodnear.me/support · api@foodnear.me
安装
把 Food Near Me 添加到你的客户端。选择你正在使用的那个。
claude mcp add --transport http food-near-me https://foodnear.me/mcpcodex mcp add food-near-me --url https://foodnear.me/mcp{
"mcpServers": {
"food-near-me": {
"url": "https://foodnear.me/mcp"
}
}
}Add to `~/.cursor/mcp.json`, or `.cursor/mcp.json` for a single project.
{
"servers": {
"food-near-me": {
"type": "http",
"url": "https://foodnear.me/mcp"
}
}
}Add to `.vscode/mcp.json` in your workspace.
{
"mcpServers": {
"food-near-me": {
"url": "https://foodnear.me/mcp"
}
}
}Add to `claude_desktop_config.json`, then restart Claude Desktop.
{
"mcpServers": {
"food-near-me": {
"serverUrl": "https://foodnear.me/mcp"
}
}
}Add to `~/.codeium/windsurf/mcp_config.json`.
8 个工具
Food Near Me 向已连接的智能体提供 8 个工具。
- search_restaurants
- Three-tier geo search by `lat`/`lng` — verified → menu_indexed → discovered; check `menu_available` before `get_menu`
- get_restaurant
- Restaurant profile with Schema.org JSON-LD + Menu Protocol extensions
- get_menu
- Full Menu Protocol v1.0 menu (dietary flags, allergens, signatures)
- get_ado_score_breakdown
- ADO score factors and improvement recommendations
- validate_menu_protocol
- Validate a Menu Protocol JSON payload before publish
- explore_area_for_diet
- Composite: bucketed neighborhood overview (`verified` / `menu_indexed` / `discovered`); optional `dietary` filter narrows the verified tier only
- compare_restaurants_for_diet
- Composite: compare 2–5 known restaurants by dietary-eligible menu items and trust tier ranking
- find_restaurants_along_route
- Composite: route-adjacent restaurant discovery between origin/destination with optional dietary ranking
评分
78 / 100
良好
- 文档25/25
- 维护19/25
- 可信度9/20
- 能力13/15
- 安装体验12/15
- Documents what it does and how to connect
- Has a resolvable package or endpoint
- Exposes at least one tool, prompt or resource
- README has substantive content
- Includes a code example
- Documents its configuration
- Mentions credentials or security posture
- Last commit 20 days ago
- Has a release history
- Repository is not archived
- No licence detected
- Namespace verified in the official MCP registry
- Claimed by its owner
- Published under an organisation
- 8 tool(s) documented
- Provides prompt templates
- Provides resources
- 6 documented install method(s)
- Published to a package registry
- Offers a hosted endpoint — no local install
版本历史
| 版本 | 发布于 |
|---|---|
| 1.1.0最新 | 2026年7月18日 |
| 1.0.0 | 2026年5月19日 |