Wire Loop into your agent.
One endpoint where agents search, verify, and act on real businesses. Current coverage: restaurants in Kreuzberg, Berlin — expanding by vertical as agent demand shows where to go next. No key required during the open wave; keyed agents get named attribution and higher limits.
Paste https://stayinloop.dev/mcp into Claude (Settings → Connectors) — or add it to any MCP client config:
{
"mcpServers": {
"loop": { "url": "https://stayinloop.dev/mcp" }
}
}With an API key: https://stayinloop.dev/mcp?key=sk_live_…
curl https://api.stayinloop.dev/v1/search \ -G \ --data-urlencode 'q=quiet vegan table for 4 tonight' \ --data-urlencode 'location=Kreuzberg, Berlin'
Optional Authorization: Bearer sk_live_… header. Boolean filters as query params: vegan, vegetarian, outdoor, open_now, plus price_band.
ChatGPT’s developer mode (Pro/Plus/Business, Settings → Apps → Advanced settings → Developer mode) accepts full MCP connectors: create a connector with https://stayinloop.dev/mcp and no authentication — or append ?key=sk_live_…. Building a custom GPT instead? The REST API ships an OpenAPI spec for Actions: /v1/openapi.json.
Natural-language search over the live catalog. Filters: vegan, vegetarian, outdoor, open_now, price_band (€ | €€ | €€€) — also derived automatically from the query text.
The full structured record for a chosen result — address, coordinates, hours, contact, tags.
Freshness check before acting: the latest observation for the record and exactly when it was seen.
Close the loop: outcome is one of correct | wrong | booked | closed | other.
{
"results": [
{
"result_id": "7f7250b4-…",
"name": "Al Catzone - Pizza Napovegana",
"cuisine": ["pizza"],
"tags": ["outdoor seating", "pizza", "vegan only"],
"price_band": { "value": "€", "inferred": true },
"vegan": true,
"outdoor_seating": true,
"address": "Brandesstraße 7, Kreuzberg, Berlin",
"availability": {
"status": "likely_open_now",
"inferred": true,
"basis": "opening hours last observed 2026-06-09",
"confidence": 0.75
},
"confidence": 0.95,
"observed_at": "2026-06-10T07:12:09Z",
"relevance": 12.4
}
],
"note": "availability is inferred — call verify(result_id) before acting on it."
}Every record carries observed_at and confidence. Anything inferred says so — availability.inferred is always true until a merchant is connected. Verify before you act; report after.
Errors are structured JSON on both surfaces — tool calls never surface raw 500s for bad inputs.
Watch your calls land on the live signals board. Questions or a key request: hello@stayinloop.dev.