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.

ParameterTypeDescription
restaurant_idstringrequired
thread_idstringrequired
bodystringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
starts_onstringrequired
ends_onstring | nulloptional
closedbooleanoptional
opens_atstring | nulloptional
closes_atstring | nulloptional
notestring | nulloptional

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.

ParameterTypeDescription
restaurant_idstringrequired
order_idstringrequired
statusstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
booking_idstringrequired

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`.

ParameterTypeDescription
restaurant_idstringrequired
booking_idstringrequired
datestring | nulloptional
timestring | nulloptional
party_sizeinteger | nulloptional
duration_mininteger | nulloptional
notesstring | nulloptional

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.

ParameterTypeDescription
restaurant_idstringrequired
datestringrequired
timestringrequired
party_sizeintegerrequired

close_henvendelse changes data

Close a henvendelse for good, ending the conversation. Sends nothing.

ParameterTypeDescription
restaurant_idstringrequired
thread_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
guest_namestringrequired
datestringrequired
timestringrequired
party_sizeintegerrequired
guest_phonestring | nulloptional
guest_emailstring | nulloptional
notesstring | nulloptional
duration_mininteger | nulloptional
send_confirmation_emailbooleanoptional

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.

ParameterTypeDescription
restaurant_idstringrequired
category_idstringrequired
namestringrequired
price_centsintegerrequired
descriptionstring | nulloptional
online_price_centsinteger | nulloptional
online_availablebooleanoptional
sort_orderintegeroptional

create_menu_category changes data

Add a category to the menu. Calling this twice makes two. Goes live on the website and in takeaway.

ParameterTypeDescription
restaurant_idstringrequired
namestringrequired
sort_orderintegeroptional

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.

ParameterTypeDescription
restaurant_idstringrequired
review_idstringrequired

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`.

ParameterTypeDescription
restaurant_idstringrequired
dish_idstringrequired
namestring | nulloptional
descriptionstring | nulloptional
sort_orderinteger | nulloptional

edit_menu_category changes data

Rename a category or move it in the order. Only what you pass changes.

ParameterTypeDescription
restaurant_idstringrequired
category_idstringrequired
namestring | nulloptional
sort_orderinteger | nulloptional

get_booking read-only

One booking, with the tables it sits on.

ParameterTypeDescription
restaurant_idstringrequired
booking_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
guest_idstringrequired

get_henvendelse read-only

One henvendelse with all its messages (including internal notes) and its history. Contact details are masked as in `list_henvendelser`.

ParameterTypeDescription
restaurant_idstringrequired
thread_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
startstring | nulloptional
endstring | nulloptional

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.

ParameterTypeDescription
restaurant_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
startstring | nulloptional
endstring | nulloptional

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.

ParameterTypeDescription
restaurant_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
startstring | nulloptional
endstring | nulloptional

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.

ParameterTypeDescription
restaurant_idstringrequired

get_review_settings read-only

Whether the restaurant accepts new reviews, and whether guests are invited to review automatically after an order.

ParameterTypeDescription
restaurant_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
datestringrequired

get_takeaway_order read-only

One takeaway order with what is in it.

ParameterTypeDescription
restaurant_idstringrequired
order_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
job_idstring | nulloptional

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.

ParameterTypeDescription
restaurant_idstringrequired
thread_idstringrequired
confirm_forwards_to_blitzbooleanoptional

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.

ParameterTypeDescription
restaurant_idstringrequired
sourcestringoptional

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.

ParameterTypeDescription
restaurant_idstringrequired
viewstringoptional

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.

ParameterTypeDescription
restaurant_idstringrequired
ratinginteger | nulloptional
verifiedboolean | nulloptional
repliedboolean | nulloptional
limitintegeroptional
offsetintegeroptional

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.

ParameterTypeDescription
restaurant_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
statusesarray | nulloptional
limitintegeroptional

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.

ParameterTypeDescription
restaurant_idstringrequired

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`.

ParameterTypeDescription
restaurant_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
categorystringrequired
bodystringrequired
subjectstring | nulloptional
confirm_sends_emailbooleanoptional

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.

ParameterTypeDescription
restaurant_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
draft_revisioninteger | nulloptional

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.

ParameterTypeDescription
restaurant_idstringrequired
thread_idstringrequired
categorystringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
datestringrequired
gross_oreintegerrequired
coversinteger | nulloptional

remove_special_hours changes data

Withdraw one Special Hours entry (id from `list_special_hours`), so those dates follow the weekly hours again.

ParameterTypeDescription
restaurant_idstringrequired
special_hours_idstringrequired

reopen_henvendelse changes data

Reopen a resolved henvendelse. Sends nothing.

ParameterTypeDescription
restaurant_idstringrequired
thread_idstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
thread_idstringrequired
bodystringrequired
confirm_sends_emailbooleanoptional

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.)

ParameterTypeDescription
restaurant_idstringrequired
review_idstringrequired
bodystringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
review_idstringrequired
reasonstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
thread_idstringrequired

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`.

ParameterTypeDescription
restaurant_idstringrequired
version_idstringrequired

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`.

ParameterTypeDescription
restaurant_idstringrequired
booking_idstringrequired
table_idsarrayrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
dish_idstringrequired
is_availableboolean | nulloptional
online_availableboolean | nulloptional

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.

ParameterTypeDescription
restaurant_idstringrequired
dish_idstringrequired
price_centsinteger | nulloptional
online_price_centsinteger | nulloptional
clear_online_pricebooleanoptional

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.

ParameterTypeDescription
restaurant_idstringrequired
notify_emailstring | nulloptional

set_opening_hours changes data

Set the opening hours for particular weekdays, and return the whole week as it now stands.

ParameterTypeDescription
restaurant_idstringrequired
daysarrayrequired
intervalsarray | nulloptional
closedbooleanoptional

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.

ParameterTypeDescription
restaurant_idstringrequired
urlstringrequired

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.

ParameterTypeDescription
restaurant_idstringrequired
guest_idstringrequired
namestring | nulloptional
phonestring | nulloptional
emailstring | nulloptional

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.

ParameterTypeDescription
restaurant_idstringrequired
namestring | nulloptional
descriptionstring | nulloptional
street_addressstring | nulloptional
postal_codestring | nulloptional
citystring | nulloptional
phonestring | nulloptional
contact_emailstring | nulloptional
avg_spend_per_cover_oreinteger | nulloptional
localestring | nulloptional

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.

ParameterTypeDescription
restaurant_idstringrequired
accept_reviewsboolean | nulloptional
auto_invite_on_orderboolean | nulloptional

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`.

ParameterTypeDescription
restaurant_idstringrequired
contentobjectrequired

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`.

ParameterTypeDescription
restaurant_idstringrequired
draft_revisionintegerrequired
sectionsarrayrequired
site_contentobject | nulloptional
template_originstring | nulloptional