Connect your AI

An AI assistant can manage your shop for you. It can read your orders and products. It can also change your prices, stock, and opening hours. The assistant connects through the Model Context Protocol (MCP). This page shows how to connect it and what it can do.

The connection is for the owner of a shop. It works with the data of that one shop only. It is separate from the public API for web shops.

What an AI assistant can do

Connect

The owner switches on the connection in the Be-Bookable app. Go to Settings, Integrations, and open the card AI assistant (MCP). Select Switch on.

The shared address: no token

Every shop can use one address: https://mcp.be-bookable.com/mcp. The address has no shop id and you do not need a token. The assistant sends you to the Be-Bookable app. You log in as the owner and select Approve. The connection is for your own shop.

The quickest way is the installer package. Run this in a terminal, then restart your client:

npx @be-bookable/mcp install                      # Claude Code
npx @be-bookable/mcp install --client cursor
npx @be-bookable/mcp install --client claude-desktop

The first time the client connects, you log in as the owner and approve. Add --sandbox to use the test environment.

Or add the address by hand. Claude Code: run this command, then run /mcp in Claude Code and select Authenticate:

claude mcp add --transport http be-bookable https://mcp.be-bookable.com/mcp

Cursor. Add the server to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "be-bookable": { "url": "https://mcp.be-bookable.com/mcp" }
  }
}

claude.ai and ChatGPT work in the same way. See claude.ai and ChatGPT.

The shared address takes connections made without a token only. A token does not work on it. If the MCP of your shop is switched off, the app tells you to switch it on first.

The address of your shop, with a token

Use this method when the assistant cannot log in by itself, for example in a script.

The app shows two things:

Choose the method that fits your assistant.

Claude Code

Run this command. Replace <address> and <token>.

claude mcp add --transport http be-bookable <address> --header "Authorization: Bearer <token>"

The app shows a ready command with your values, while the token is on screen.

Cursor

Add the server to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "be-bookable": {
      "url": "<address>",
      "headers": { "Authorization": "Bearer <token>" }
    }
  }
}

Claude Desktop

Claude Desktop starts local programs. Use the mcp-remote program to reach the address. Add this to claude_desktop_config.json:

{
  "mcpServers": {
    "be-bookable": {
      "command": "npx",
      "args": ["mcp-remote", "<address>", "--header", "Authorization:${AUTH_HEADER}"],
      "env": { "AUTH_HEADER": "Bearer <token>" }
    }
  }
}

Restart Claude Desktop after you save the file.

claude.ai and ChatGPT: connect without a token

You do not need a token for claude.ai and ChatGPT. You only paste the address and select Allow.

  1. Open the connector settings of the assistant. Add a custom connector. Paste the address of your shop.
  2. The assistant sends you to the Be-Bookable app. Log in as the owner of the shop.
  3. Check the name of the assistant and the shop. Select Approve.
  4. The assistant returns and shows the tools.

Notes:

Manage the connection

In the card AI assistant (MCP) you can:

Safety and limits

Errors

A tool that cannot do its work returns an error result. The result has a short text, such as Product not found. The text says what is wrong. The assistant can correct the input and try again.

HTTP status Meaning
401 The token is missing, wrong, or ended. The address does not match the token. The connection is switched off. A token was sent to the shared address /mcp, which takes connections made without a token only.
405 Only POST works.
429 Too many requests. Wait for the time in the Retry-After header.

Tool reference

The tools below are generated from the server. They cannot differ from what the server does. We add tools and optional parameters over time. We never remove or rename a tool or a parameter.

list_products

Reads only. Lists the products of the shop with status, price, price interval in minutes and stock. Use get_product for the details of one product.

Parameter Type Required Description
limit integer no How many products to return. (minimum 1, maximum 100, default 25)
offset integer no How many products to skip. (minimum 0, default 0)

get_product

Reads only. Returns one product with its category, rental prices (duration options with their promo prices), discount tiers, variants and stock.

Parameter Type Required Description
product_id string (UUID) yes The id of the product.

list_orders

Reads only. Lists the orders of the shop, newest first. Each order has the number, status, payment status, dates, products, totals and the customer number. The customer name, email and phone number are masked for privacy reasons. It has no address or notes.

Parameter Type Required Description
status one of: created, request, pending, onHold, reserved, prepareShipment, awaitingDelivery, atCustomer, awaitingreturn, returned, completed, cancelled no Only orders with this status.
payment_status one of: open, pending, authorized, paid, cancelled, expired, failed, refund_queued, refund_pending, refund_processing, refunded, refund_failed, refund_cancelled, partially_refunded no Only orders with this payment status.
created_from string no Only orders placed on or after this day (YYYY-MM-DD, Amsterdam time).
created_to string no Only orders placed on or before this day (YYYY-MM-DD, Amsterdam time).
limit integer no How many orders to return. (minimum 1, maximum 50, default 25)
offset integer no How many orders to skip. (minimum 0, default 0)

get_order

Reads only. Returns one order of the shop by id or by order number. Has the customer number. The customer name, email and phone number are masked for privacy reasons. It has no address or notes.

Parameter Type Required Description
order_id string (UUID) no The id of the order.
ordernumber string no The order number that the customer sees. (at least 1 characters, at most 50 characters)

check_availability

Reads only. Checks whether a product can be booked for a period of at most one year and a quantity. Day and week products take dates (YYYY-MM-DD). Hourly products take instants (ISO 8601 with Z or an offset). Opening hours, closures, buffers and stock all count.

Parameter Type Required Description
product_id string (UUID) yes The id of the product.
date_start string yes Start: YYYY-MM-DD for day and week products, an ISO 8601 instant for hourly products.
date_end string yes End, in the same format as date_start.
quantity integer no How many units. (minimum 1, maximum 1000, default 1)
variant_id string (UUID) no A variant of the product, if it has variants.
duration_option_id string (UUID) no A duration option of the product with a fixed length.

get_opening_hours

Reads only. Returns the opening hours of the shop for each weekday. A day with null times is closed. It also returns the categories with their own hours, and the upcoming closure days. Times are local shop time.

No parameters.

get_sales_summary

Reads only. Returns the number of orders and the revenue of the shop for a period of at most one year, by order creation day (Amsterdam time). Cancelled orders are counted apart and bring no revenue.

Parameter Type Required Description
date_from string yes First day of the period (YYYY-MM-DD).
date_to string yes Last day of the period (YYYY-MM-DD), included.

update_product

Changes data. Changes the visibility of a product (visible or hidden) and/or its name and description per language. Language keys are the languages of the shop. A text that is not given stays as it is; an empty description clears it. Returns the values before and after.

Parameter Type Required Description
product_id string (UUID) yes The id of the product.
status one of: visible, hidden no Whether customers see the product. A product needs a rental price before it can be visible.
translations object no Texts per language code, for example { "nl": { "name": "Boormachine" } }.
translations.<language>.name string no The name of the product in this language. (at least 1 characters, at most 255 characters)
translations.<language>.description string no The description of the product in this language. An empty text clears it. (at most 20000 characters)

set_stock

Changes data. Sets the stock (number of units) of a product, or of one variant of a product that has variants. A product with variants takes its stock from its variants, so give variant_id for it. Returns the stock before and after.

Parameter Type Required Description
product_id string (UUID) yes The id of the product.
variant_id string (UUID) no The variant, when the product has variants.
quantity integer yes The new stock. (minimum 0, maximum 100000)

set_opening_hours

Changes data. Sets the opening hours of the shop for the weekdays given. A day with open and close null is closed. A weekday that is not given stays as it is. One range per day, times in local shop time (00:00 to 24:00). Returns the hours of those days before and after.

Parameter Type Required Description
days array yes The weekdays to set. (at least 1 items, at most 7 items)
days[].day one of: sunday, monday, tuesday, wednesday, thursday, friday, saturday yes The weekday, in English.
days[].open string or null yes The opening time as HH:MM, or null when the shop is closed.
days[].close string or null yes The closing time as HH:MM, or null when the shop is closed. 24:00 is allowed.

set_price_intervals

Changes data. Sets the rental prices of a product. Give one price for each duration in minutes: 60 is one hour, 1440 is one day, 10080 is one week. A duration that exists gets the new price. A new duration is added. A duration that you do not give stays as it is. Prices include VAT, with at most 2 decimals. A duration of one day or more is a whole number of days. Returns the prices before and after.

Parameter Type Required Description
product_id string (UUID) yes The id of the product.
price_intervals array yes The prices to set, at most 25. (at least 1 items, at most 25 items)
price_intervals[].duration_minutes integer yes The rental duration in minutes. (minimum 1, maximum 525600)
price_intervals[].price number yes The price for this duration, including VAT. (minimum 0, maximum 1000000)

set_promo_price

Changes data. Creates, changes or removes a promo price of one rental price (duration option) of a product, for a period. Without promo_id it creates one. With promo_id it changes that promo, or removes it when remove is true. Periods of the same duration option must not overlap. Returns the promo before and after.

Parameter Type Required Description
product_id string (UUID) yes The id of the product.
duration_option_id string (UUID) yes The rental price (duration option) of the product, from get_product.
promo_id string (UUID) no An existing promo, to change or remove it.
price number no The promo price including VAT. Required unless remove is true. (minimum 0, maximum 1000000)
date_start string no First day of the promo (YYYY-MM-DD). Required unless remove is true.
date_end string no Last day of the promo (YYYY-MM-DD), included. Required unless remove is true.
remove boolean no Remove the promo given by promo_id.

Tested with

We record each verified run of a client here, with the date.

Client Method Environment Date
Claude Code, Cursor, Claude Desktop Token Sandbox Not yet verified
claude.ai Connect without a token, shared address (/mcp) Sandbox 2026-10-24
Claude Code Connect without a token, shared address (/mcp) Sandbox 2026-10-24
Cursor Connect without a token, shared address (/mcp) Sandbox 2026-10-24
ChatGPT Connect without a token Sandbox Not yet verified

The sandbox address starts with https://test.mcp.be-bookable.com.