Language models hallucinate opening hours. They serve stale data without labeling it. They can’t report back what happened. Loop fixes all three: structured JSON output, explicit freshness signals, and a report() action that closes the loop.
When a user asks an agent to find a restaurant, the agent typically searches the web or calls a map API. The data it gets back was crawled weeks ago, has no confidence score, and can’t be verified. The agent presents it as fact. The user shows up to a closed restaurant. They don’t trust the agent again.
Loop was built to solve exactly this: every record has an observed_at timestamp and a confidence score. Availability is labeled inferred: true until verified. Agents can tell users honestly when data may be stale — and earn trust instead of losing it.
// MCP tool call { "name": "search", "arguments": { "query": "vegan pizza with outdoor seating", "location": "Kreuzberg, Berlin", "filters": { "vegan": true, "outdoor_seating": true } } }
{ "results": [ { "id": "osm_node_12345678", "name": "Casa Nostra", "vertical": "restaurants", "restaurant": { "cuisine": ["italian", "pizza"], "price_band": "$$", "outdoor_seating": true, "vegan": true }, "attrs": { "opening_hours": "Mo-Su 12:00-22:00", "street": "Skalitzer Str.", "housenumber": "42", "cross_source_confirmed": true }, "confidence": 0.87, "observed_at": "2026-06-10T14:32:00Z", "availability": { "inferred": true } } ], "total": 3 }
Every result includes confidence, observed_at, and an explicit availability.inferredflag. Agents know what they know and what they’re inferring.
Restaurant data in a typed sub-object: cuisine[], price_band, outdoor_seating, vegan, vegetarian. No parsing strings.
observed_at timestamp and confidence score (0–1) let agents tell users honestly when data may be stale — a feature, not a bug.
Before booking, routing, or telling a user something definitive, call verify(result_id, claim) to re-check a specific record in real time.
report(result_token, outcome) feeds back what actually happened — open, closed, wrong. Each call mutates confidence and freshness for every future agent.
Add https://stayinloop.dev/mcp to any MCP client (Claude, Cursor, ChatGPT dev mode). Four tools available instantly, no code.
312 of 424 Kreuzberg restaurants are confirmed across both OpenStreetMap and Foursquare OS Places — flagged in every response.
search()Full-text + filter search. Returns ranked candidates with confidence and freshness.
get_details()Full record with all vertical-specific fields. Returns a result_token valid 30 min.
verify()Re-checks a specific claim live: is it open? Does it have outdoor seating? Call this before booking, routing, or stating something as fact.
report()Feeds back what actually happened. Mutates the record's confidence and freshness. Closes the loop. Reporting is expected, not optional.
Add https://stayinloop.dev/mcp as a remote MCP server. Four tools, instant access, free tier.