Quickstart
Every session follows the same three steps.
1. Authenticate
Section titled “1. Authenticate”Pick the mode that fits your client:
| Client | Mode |
|---|---|
| claude.ai, Cursor, Claude Desktop | OAuth 2.1 connector |
| Claude Code, a server, a script | gfk_ API key (Authorization: Bearer gfk_live_…) |
| Our own dashboard / FOH | dashboard JWT |
See Authentication for the details of each.
2. Discover the brand
Section titled “2. Discover the brand”Call list_brands first. It returns the brands your credential can access, each with a slug.
// list_brands →{ "brands": [ { "slug": "medusa", "name": "Medusa Italian Osteria Romana" } ]}Pass that slug as the brand argument on every other tool.
3. Act
Section titled “3. Act”Now call any tool your scopes allow. Reads are safe to explore; writes change live data.
// list_menu → { brand: "medusa" }{ "brand": { "slug": "medusa", "name": "Medusa Italian Osteria Romana" }, "itemCount": 42, "categories": [ /* … */ ]}// set_item_availability → { brand: "medusa", item: "Margherita", available: false }{ "ok": true, "item": "Margherita", "available": false }Conventions
Section titled “Conventions”- Name-addressed writes. Menu, table and shift tools take a name (a dish, a table, a shift) — not an internal id. An ambiguous name returns
{ needsDisambiguation, matches }without writing, so you can pick and retry. - Cascades are surfaced, never forced. A destructive edit that would affect existing bookings returns a
409 cascade_requiredyou must acknowledge — it never silently cancels reservations. - Scope errors are explicit. A call outside your granted scopes is rejected before the tool runs.