TL;DR: Structured dietary verdicts, not hallucinated text. We built an MCP server that gives AI agents structured dietary-fit verdicts across ~370K US restaurants, with confidence levels, reason codes, and an honest "unknown" option when evidence is thin. Try it out for free.
The problem with asking AI about dietary needs
Ask AI to recommend a strict-vegan restaurant in city X serving Y. Most likely, it will give you some hallucinated menu items, a simple gmaps link or just a guess based on what category tags it finds in Google for that specific place. The link between the actual evidence and the AI's verdict is, to put it mildly, blurry.
LLMs are very good at sounding confident, even if there is little basis for their claims. They will very rarely say "I don't know" — they always give you something. So if you want to use their output, take it with a huge grain of salt — it might be a miss as easily as it can be a win. And when we are talking about people's dietary needs, that can be outright dangerous.
What we built: Compass MCP
This is exactly the pain point we are trying to solve with our Compass MCP server. We have 3 tools: compass_search, compass_enrich_restaurant, and compass_decide_fit. Behind those sits a dataset of ~370K US restaurants concentrated in the top 20 cities. For each restaurant we have menu data, dish-level structured fields, and review-derived signals.
We use semantic retrieval based on Voyage embeddings in a Qdrant database. Our VeganScore is computed deterministically from six weighted dimensions, not generated by an LLM (we use AI only to parse raw input). We did this specifically to reduce variability and eliminate hallucination in the cases when evidence simply does not exist.
The three tools
compass_search — ask for recommendations for a specific type of restaurant, e.g. "vegan sushi in Austin," and get results matching your specific needs.
compass_enrich_restaurant — if you are looking for a specific restaurant, this tool adds Compass data to what you already have.
compass_decide_fit — check if a specific restaurant is a good fit for a user's dietary profile. Returns a structured verdict: fit, not_fit, or unknown.
Trying it out
Installation is one command:
npx -y @compass-food/mcp
The server starts and lists its tools without a key. To use it from Claude Desktop, Cursor, or any MCP-compatible client, add Compass to your client config:
{
"mcpServers": {
"compass": {
"command": "npx",
"args": ["-y", "@compass-food/mcp"],
"env": {
"COMPASS_API_KEY": "cmp_test_your_key_here"
}
}
}
}
For the COMPASS_API_KEY, grab a free Sandbox key from compassfoodtechnologies.com/signup — no credit card, 1,000 Compass credits per month.
Here's what a compass_search tool call looks like — a natural-language query plus optional location and user profile:
{
"query": "strict vegan bowls near Brooklyn Heights",
"location": {
"lat": 40.6958,
"lng": -73.9936,
"radius_m": 2500
},
"user_profile": {
"diet": "strict_vegan"
},
"limit": 5,
"include_evidence": true,
"mode": "rich"
}
And here's a trimmed example of what it returns:
{
"compass_request_id": "req_example_brooklyn_bowls",
"query_interpretation": {
"diet_inferred": "strict_vegan",
"dish_inferred": "bowls"
},
"results": [
{
"compass_id": "restaurant_123",
"name": "Example Vegan Bowls",
"address": { "city": "Brooklyn" },
"vegan_score": {
"overall": 86,
"dimensions": {
"D1_vegan_coverage": { "score": 95, "confidence": "high" }
}
},
"source_freshness": { "oldest_signal_age_days": 42 },
"evidence": [{
"type": "menu_item",
"source": "compass://deterministic-evidence/menu_dishes",
"excerpt": "8 vegan bowls identified from the parsed menu."
}],
"match_for_profile": {
"decision": "fit",
"confidence": "high",
"reason_codes": ["VEGAN_MENU_CONFIRMED", "DEDICATED_VEGAN_PREP_CONFIRMED", "HIGH_CONFIDENCE_DECISION"],
"recommended_user_text": "Strong vegan menu evidence; confirm special handling for allergies."
}
}
]
}
The whole shape is the wedge here. Look at match_for_profile: decision is one of fit, not_fit, or unknown; confidence is high, medium, or low; reason_codes is a structured array of evidence codes your agent can branch on; and evidence is the actual trail of menu items and signals the verdict was built from. The unknown option is intentional — when evidence is stale or conflicting, the verdict comes back as unknown instead of a forced guess.
What Compass doesn't do (yet)
Of course, Compass has its limitations. Currently we do not handle allergen safety and we are not a certification service. The allergen system is currently under development and launching it now in a semi-finished state would be against our principles. We want to provide reliable information, not sound confident when we are actually not.
The most expensive lesson on the way here came from an early allergen system. We had restaurant-level flags for the EU-14 allergens, generated by an AI pipeline. One example in the system prompt cascaded through the model's outputs and flagged 99.93% of around 370K restaurants as containing gluten. Oops. We pulled allergen claims out of the product entirely and we're rebuilding them at the dish-level with deterministic post-processing and explicit nulls when we can't be confident.
How to get started
Install: npx -y @compass-food/mcp
Free Sandbox key: compassfoodtechnologies.com/signup
Repo: github.com/compass-food/compass-mcp
Docs: compassfoodtechnologies.com/docs/mcp
We'd love feedback from anyone building food, travel, or local-discovery agents. Especially curious where the Decision tool's unknown verdict feels too conservative, or not conservative enough — drop a comment below or open an issue on the repo.
Top comments (0)