MCP server
Let an AI assistant such as Claude manage a restaurant on Blitz: look up bookings, change opening hours, answer reviews. 64 tools.
Server URL: https://api.blitz-app.dk/mcp/ (keep the trailing slash).
Connect
Claude (claude.ai or the apps): Settings → Connectors → Add custom connector, and paste the URL above. You are sent to Blitz to log in and choose which restaurants the assistant may see.
Claude Code:
claude mcp add --transport http blitz https://api.blitz-app.dk/mcp/
Then run /mcp in Claude Code to sign in.
Other clients: any client that speaks streamable HTTP MCP and OAuth works. Point it at the URL above.
Authorisation
The server is an OAuth 2.1 authorisation server with PKCE and dynamic client
registration, so there is nothing to register by hand and no API key to paste.
Clients discover it from https://api.blitz-app.dk/.well-known/oauth-authorization-server
and https://api.blitz-app.dk/.well-known/oauth-protected-resource. The person approving
logs in as themselves and ticks the restaurants the assistant may use; the
session can be revoked from the dashboard.
What the assistant may do
An assistant can do what its person can, never more: every tool passes through the same permission check as the dashboard. On top of that, each restaurant sets an AI cap in its settings that limits the assistant to a subset of the person's permissions. Team, roles, billing, password resets and guest erasure are never available to an assistant. A refused call returns a message the assistant can relay as it is.
Tools
Start with list_my_restaurants; the other tools take the
restaurant_id it returns.
add_henvendelse_note changes data
Write an internal note on a henvendelse. The guest never sees it and nobody is emailed. Calling it twice adds two notes.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
thread_id | string | required | |
body | string | required |
add_special_hours changes data
Say that a date, or a run of dates, is different from the weekly hours: closed (`closed: true`) or open at other times (`opens_at` and `closes_at`, 24-hour HH:MM). Dates are YYYY-MM-DD; omit `ends_on` for a single date. The whole restaurant is affected. The published Site and Google follow. Calling it twice adds two rows, so check `list_special_hours` before retrying.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
starts_on | string | required | |
ends_on | string | null | optional | |
closed | boolean | optional | |
opens_at | string | null | optional | |
closes_at | string | null | optional | |
note | string | null | optional |
advance_takeaway_order changes data
Move an order through the kitchen: accepted, preparing, ready, completed (picked up), or cancelled. Setting the status it already has changes nothing. Money is not touched — refunds are not done here.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
order_id | string | required | |
status | string | required |
cancel_booking changes data
Call a booking off and free its table. Sends the guest nothing, so tell them yourself. A booking that is only a request is answered with Bekræft/Afvis in the dashboard, not here.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
booking_id | string | required |
change_booking changes data
Move a booking to another time or day, or change its party size, length or note. Only what you pass changes; give `date` and `time` together to move it. Sends the guest nothing. To call a booking off use `cancel_booking`; to change its table use `seat_booking`.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
booking_id | string | required | |
date | string | null | optional | |
time | string | null | optional | |
party_size | integer | null | optional | |
duration_min | integer | null | optional | |
notes | string | null | optional |
check_availability read-only
Is there room at this time for this many? Advisory: a booking taken by staff goes through either way, so use it to tell the person, not to decide for them.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
date | string | required | |
time | string | required | |
party_size | integer | required |
close_henvendelse changes data
Close a henvendelse for good, ending the conversation. Sends nothing.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
thread_id | string | required |
create_booking changes data
Take a booking, as a host does over the phone. It is confirmed on the spot, whatever the size, and Blitz proposes a table.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
guest_name | string | required | |
date | string | required | |
time | string | required | |
party_size | integer | required | |
guest_phone | string | null | optional | |
guest_email | string | null | optional | |
notes | string | null | optional | |
duration_min | integer | null | optional | |
send_confirmation_email | boolean | optional |
create_dish changes data
Put a new dish in a category, with its price in øre (125 kr is 12500). It is on sale from the start. It is in takeaway only if `online_available` is true. Needs both the menu and the price permission. Calling this twice makes two dishes.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
category_id | string | required | |
name | string | required | |
price_cents | integer | required | |
description | string | null | optional | |
online_price_cents | integer | null | optional | |
online_available | boolean | optional | |
sort_order | integer | optional |
create_menu_category changes data
Add a category to the menu. Calling this twice makes two. Goes live on the website and in takeaway.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
name | string | required | |
sort_order | integer | optional |
delete_review_reply changes data
Withdraw the restaurant's public reply to a review. The reply disappears from the website and its text is gone; the review itself is untouched.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
review_id | string | required |
edit_dish changes data
Rename a dish, change its description or its place in the category. Only what you pass changes. Prices are `set_dish_price`; sold out is `set_dish_availability`.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
dish_id | string | required | |
name | string | null | optional | |
description | string | null | optional | |
sort_order | integer | null | optional |
edit_menu_category changes data
Rename a category or move it in the order. Only what you pass changes.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
category_id | string | required | |
name | string | null | optional | |
sort_order | integer | null | optional |
get_booking read-only
One booking, with the tables it sits on.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
booking_id | string | required |
get_floor_plan read-only
The restaurant's areas and tables, with how many each seats. Use a table's `id` in `seat_booking`. Positions and shapes are left out: they are for drawing the room, which this assistant cannot do.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required |
get_guest_card read-only
A guest and every visit on the books, newest first, with how many times they have been. Name, phone and email are masked unless the restaurant lets its assistant read contact details.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
guest_id | string | required |
get_henvendelse read-only
One henvendelse with all its messages (including internal notes) and its history. Contact details are masked as in `list_henvendelser`.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
thread_id | string | required |
get_henvendelse_notification_address read-only
Where the restaurant is mailed about new henvendelser. `effective_notify_email` is the address actually used: the owner's login email until one is set.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required |
get_menu read-only
The whole Menukort: categories in order, each with its dishes and what they cost (in øre). Use the ids in the menu-editing tools.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required |
get_no_show_report read-only
What the empty chairs cost: no-shows, late and early cancellations in covers, and in kroner once the restaurant has said what a guest is worth. Needs both the visit-figures and the revenue permission. Dates are YYYY-MM-DD; by default the last 30 days.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
start | string | null | optional | |
end | string | null | optional |
get_opening_hours read-only
The restaurant's weekly opening hours. `day_of_week` is 0 = Monday to 6 = Sunday; a day may have several rows, and a closed day has `is_closed` true. Special Hours for single dates are not included.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required |
get_operations_report read-only
What the room did over a period: seat utilisation by day and area, the evening's shape against the pacing limit, how long parties sat, party sizes and booking lead time. Covers and clocks, no money. Dates are YYYY-MM-DD; by default the last 30 days.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
start | string | null | optional | |
end | string | null | optional |
get_restaurant_info read-only
The restaurant's own facts: name, description, address, phone and contact email, currency, language, and which modules (booking, takeaway, website) are switched on.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required |
get_revenue_report read-only
Revenue for a period next to the equally long period before it: totals, trend, best-selling dishes and categories, payment split, and how complete the figures are (days nobody accounted for make a total an understatement). Amounts are in øre, VAT included. Dates are YYYY-MM-DD; by default the last 30 days.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
start | string | null | optional | |
end | string | null | optional |
get_review_insight read-only
A short written overview of what guests keep praising and complaining about, across Blitz and Google. `status` is `ready`, `too_few` or `unavailable`. May take a second if it has to be regenerated.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required |
get_review_settings read-only
Whether the restaurant accepts new reviews, and whether guests are invited to review automatically after an order.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required |
get_review_summary read-only
The combined rating and review count, with one row per source (Blitz, Google). Cached third-party numbers may be a little old.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required |
get_subscription_status read-only
What Blitz costs this restaurant: the plan (`start` or `drift`), its status, when the period ends, a scheduled downgrade and the Drift trial's end. Changing plan or card is done by the owner in the dashboard; there is no invoice list to read.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required |
get_table_book read-only
The bookings for one service day, in time order. `date` is YYYY-MM-DD. Includes requests nobody has answered yet (`status: requested`) and cancelled bookings.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
date | string | required |
get_takeaway_order read-only
One takeaway order with what is in it.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
order_id | string | required |
get_website_draft read-only
The website's draft (section order and approved content), which version is live, and any open impacts. `draft_revision` is what `update_website_draft` needs. The draft is NOT public until published.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required |
get_website_import_status read-only
How a website import is going: its steps so far, and whether it is `running`, `done` or `failed` (with a reason). Without `job_id`, the running one or else the latest; null when there never was one.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
job_id | string | null | optional |
hand_off_henvendelse_to_blitz changes data
OUTWARD-FACING: send a henvendelse on to Blitz. Blitz can then read the whole thread (including the guest's details, and internal notes) and answer in it, and Blitz's inbox is notified by email. The restaurant takes the thread back only when Blitz hands it back. You must pass `confirm_forwards_to_blitz: true` to do it.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
thread_id | string | required | |
confirm_forwards_to_blitz | boolean | optional |
list_external_reviews read-only
The cached reviews from one outside source (e.g. `google`). Empty when nothing is cached or the source is not set up.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
source | string | optional |
list_henvendelser read-only
The restaurant's henvendelser (messages from guests, and threads with Blitz). `view` is `waiting` (the restaurant owes a reply), `open` or `closed`. Guest name, phone and email are masked unless the restaurant lets its assistant read contact details. Reading the list also closes old resolved threads, as the dashboard does.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
view | string | optional |
list_my_restaurants read-only
List the restaurants this assistant may work in, with the person's role and what the assistant may do in each (permission keys). Use the `id` as `restaurant_id` in other tools.
No parameters.
list_reviews read-only
Blitz reviews, newest first, including hidden ones. Filter by `rating` (1-5), `verified` and `replied` (whether the restaurant has answered). Each has an `id` for `reply_to_review` and `report_review`. The reviewer's email is masked unless the restaurant allows contact details.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
rating | integer | null | optional | |
verified | boolean | null | optional | |
replied | boolean | null | optional | |
limit | integer | optional | |
offset | integer | optional |
list_special_hours read-only
The restaurant's Special Hours: single dates or runs of dates that differ from the weekly hours (holidays, closed days, summer hours). `ends_on` equals `starts_on` for a single date. An `area_id` means only that area is affected.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required |
list_takeaway_orders read-only
Takeaway orders, newest first. Filter with `statuses` (pending, accepted, preparing, ready, completed, cancelled); the kitchen board is everything except completed and cancelled. `limit` is 1 to 200.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
statuses | array | null | optional | |
limit | integer | optional |
list_team_members read-only
Everybody with access to the restaurant, paused access included, with their role name. Read only: inviting, pausing and changing roles is done by a person in the dashboard.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required |
list_website_versions read-only
Every published version of the site, newest first, with `is_current` on the one guests see. Use an `id` as `version_id` in `rollback_website`.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required |
open_henvendelse_with_blitz changes data
OUTWARD-FACING: write to Blitz (support) as the restaurant, starting a new thread that lands in Blitz's inbox and notifies Blitz by email. `category` is one of: betaling, refusion, bestilling, reservation, allergener_og_mad, hjemmeside, konto_og_abonnement, andet. Calling it twice opens two threads. You must pass `confirm_sends_email: true` to send.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
category | string | required | |
body | string | required | |
subject | string | null | optional | |
confirm_sends_email | boolean | optional |
preview_website_draft read-only
The draft as a guest would see it right now: the draft's sections and content over a fresh snapshot of the restaurant's hours, menu and details. Nothing is stored and nothing is published.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required |
publish_website changes data
PUBLISH THE DRAFT: the draft becomes the live website, publicly visible to every guest immediately. It creates a new version (it cannot be edited afterwards; `rollback_website` can put an older one back). Review the draft with `preview_website_draft` first. Give `draft_revision` to refuse if someone edited the draft since you read it. Calling it twice makes two versions.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
draft_revision | integer | null | optional |
recategorise_henvendelse changes data
Change a henvendelse's category. One of: betaling, refusion, bestilling, reservation, allergener_og_mad, hjemmeside, konto_og_abonnement, andet. Sends nothing, but the category decides who typically answers.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
thread_id | string | required | |
category | string | required |
record_daily_revenue changes data
Type in one day's takings, as printed on the till's end-of-day report: `gross_ore` is the total in øre including VAT (125000 = 1.250 kr). Calling it again for the same date corrects that day rather than adding a second figure. A day that has not happened yet is refused.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
date | string | required | |
gross_ore | integer | required | |
covers | integer | null | optional |
remove_special_hours changes data
Withdraw one Special Hours entry (id from `list_special_hours`), so those dates follow the weekly hours again.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
special_hours_id | string | required |
reopen_henvendelse changes data
Reopen a resolved henvendelse. Sends nothing.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
thread_id | string | required |
reply_to_henvendelse changes data
OUTWARD-FACING: answer a henvendelse in the restaurant's name. The reply is visible to the other side (the guest, or Blitz on a thread with Blitz) and a notification email goes to them: to the guest when they left an address, otherwise to Blitz's inbox. It cannot be unsent, and calling it twice sends two replies.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
thread_id | string | required | |
body | string | required | |
confirm_sends_email | boolean | optional |
reply_to_review changes data
PUBLICLY REPLY TO A REVIEW, IN THE RESTAURANT'S NAME. The text is shown on the restaurant's website under the review, signed as the restaurant, and the guest and everyone else can read it. Only send text the owner has approved or clearly asked for. Sending again edits the existing reply. (`body` is 1 to 2000 characters.)
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
review_id | string | required | |
body | string | required |
report_review changes data
Flag a review to Blitz as breaking the rules, with a `reason`. This only asks Blitz staff to look: the review stays published and counted until they decide.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
review_id | string | required | |
reason | string | required |
resolve_henvendelse changes data
Mark a henvendelse as løst (resolved). Sends nothing. It closes by itself after a while unless the guest writes again; `reopen_henvendelse` undoes it.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
thread_id | string | required |
rollback_website changes data
PUT AN EARLIER VERSION BACK: the live website is replaced with that version's sections and content, publicly visible immediately (the restaurant's current hours, menu and prices are used, not the old ones). It also OVERWRITES THE DRAFT with that version, so unpublished draft work is lost. Get `version_id` from `list_website_versions`.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
version_id | string | required |
seat_booking changes data
Put a booking on these tables, replacing where it sat. An empty list takes it off its tables. Never refused: a taken or too-small table comes back as `warnings`.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
booking_id | string | required | |
table_ids | array | required |
set_dish_availability changes data
Mark a dish sold out (`is_available` false) or back on sale (true). `online_available` false pulls it from takeaway alone while the room still serves it. Only what you pass changes.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
dish_id | string | required | |
is_available | boolean | null | optional | |
online_available | boolean | null | optional |
set_dish_price changes data
Change a dish's price, in øre (125 kr is 12500). `price_cents` is the menu and website price; `online_price_cents` is a separate takeaway price, and `clear_online_price` makes takeaway follow the menu price again. Shows on the public site and on every order after.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
dish_id | string | required | |
price_cents | integer | null | optional | |
online_price_cents | integer | null | optional | |
clear_online_price | boolean | optional |
set_henvendelse_notification_address changes data
Change the address the restaurant is mailed at about new henvendelser. Sends nothing now, but all future notifications go to the new address, so a wrong one means the restaurant stops hearing about guests. Pass nothing to clear it and fall back to the owner's login email.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
notify_email | string | null | optional |
set_opening_hours changes data
Set the opening hours for particular weekdays, and return the whole week as it now stands.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
days | array | required | |
intervals | array | null | optional | |
closed | boolean | optional |
start_website_import changes data
Start the setup's import from the restaurant's current website. It fetches that one public page address from the internet (private and internal addresses are refused), reads it with an AI model and writes what it finds — text, images, a staged menu — into the website *draft*; nothing becomes public. It runs in the background: poll `get_website_import_status`. Limited to one start a minute per site and 20 a day, and refused while an import is already running.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
url | string | required |
update_guest_details changes data
Correct a guest's name, phone number or email. It changes the person, so every booking of theirs follows. Only what you pass changes. Sends nothing. Needs contact-details access as well, since a masked value cannot be corrected.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
guest_id | string | required | |
name | string | null | optional | |
phone | string | null | optional | |
email | string | null | optional |
update_restaurant_info changes data
Change the restaurant's name, description, address, phone, contact email, what a guest is worth on an average evening (in øre) or the dashboard language (`da` or `en`). Only what you pass changes; a field cannot be cleared from here.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
name | string | null | optional | |
description | string | null | optional | |
street_address | string | null | optional | |
postal_code | string | null | optional | |
city | string | null | optional | |
phone | string | null | optional | |
contact_email | string | null | optional | |
avg_spend_per_cover_ore | integer | null | optional | |
locale | string | null | optional |
update_review_settings changes data
Change whether the website accepts new reviews (`accept_reviews`) and whether guests are invited to review after an order (`auto_invite_on_order`). Only the values you give change.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
accept_reviews | boolean | null | optional | |
auto_invite_on_order | boolean | null | optional |
update_website_content changes data
Change fields of the website's staged content: tagline, description, cuisine, logo_url, hero_image_url, about_image_url, gallery_urls, facebook_url, instagram_url and similar. Only the keys you send change; a key sent as null is deleted. This is the unpublished draft material: it does NOT go on the public site until `publish_website`.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
content | object | required |
update_website_draft changes data
Replace the website draft: the whole ordered list of `sections` (hero, order, menu, booking, about, gallery, info, footer; hero first, footer last, each once) and the whole `site_content`. This replaces the draft, so read it first with `get_website_draft` and send everything you want to keep, with the `draft_revision` you read; a stale revision is refused. Changes the draft only: it does NOT go public until `publish_website`.
| Parameter | Type | Description | |
|---|---|---|---|
restaurant_id | string | required | |
draft_revision | integer | required | |
sections | array | required | |
site_content | object | null | optional | |
template_origin | string | null | optional |