Booqable MCP by usefulapi
Browse rental orders, customers, products and availability, and create bookings in Booqable.
Should I use this
Quality & Safety
Findings (3)
- LOWin booqable_check_inventory_availability
- LOWin booqable_get_availability_calendar
- LOWin booqable_transition_order_status
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"booqable": {
"url": "https://booqable.usefulapi.io/mcp"
}
}
}Remote endpoints
https://booqable.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (21)
π’booqable_get_company
Fetch the Booqable account this token belongs to β name, currency, default timezone, address. A cheap way to confirm the slug and token work. Booqable: GET /api/4/companies/current.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’booqable_list_orders(q, status, payment_status, customer_id, starts_at_gte, ...)
List rental orders. Filter by free-text search (order number, customer name/email/address, tags, custom fields), status, payment status, customer, or rental-period range. Booqable: GET /api/4/orders.
Input Schema
{
"type": "object",
"properties": {
"q": {
"description": "Search: order number (exact), customer name, e-mail, address, tags, custom field values.",
"type": "string"
},
"status": {
"description": "Only orders with this simplified status.",
"type": "string",
"enum": [
"new",
"draft",
"reserved",
"started",
"stopped",
"archived",
"canceled"
]
},
"payment_status": {
"description": "Only orders with this payment status.",
"type": "string",
"enum": [
"paid",
"partially_paid",
"overpaid",
"payment_due",
"process_deposit"
]
},
"customer_id": {
"description": "Only orders for this customer id.",
"type": "string"
},
"starts_at_gte": {
"description": "Rental starts at or after this datetime (ISO 8601).",
"type": "string"
},
"starts_at_lte": {
"description": "Rental starts at or before this datetime (ISO 8601).",
"type": "string"
},
"stops_at_gte": {
"description": "Rental ends at or after this datetime (ISO 8601).",
"type": "string"
},
"stops_at_lte": {
"description": "Rental ends at or before this datetime (ISO 8601).",
"type": "string"
},
"tag": {
"description": "Only orders carrying this tag.",
"type": "string"
},
"include": {
"description": "Comma-separated relationships to sideload, e.g. customer,start_location,stop_location.",
"type": "string"
},
"sort": {
"description": "Sort, comma-separated attributes; prefix with - for descending, e.g. -created_at.",
"type": "string"
},
"page": {
"description": "Page number (1-based). Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Results per page, 1-100 (Booqable default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’booqable_get_order(order_id, include)
Fetch one order with its totals, deposit and payment state, sideloading the customer and order lines by default (override with include, e.g. customer,lines,payments,documents,notes). Booqable: GET /api/4/orders/{id}.
Input Schema
{
"type": "object",
"properties": {
"order_id": {
"type": "string",
"minLength": 1,
"description": "The order id (UUID)."
},
"include": {
"description": "Comma-separated relationships to sideload, e.g. customer,lines,payments,documents,notes,start_location.",
"type": "string"
}
},
"required": [
"order_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’booqable_list_customers(q, email, tag, archived, include, ...)
List customers, optionally searched by name/email or filtered by email, tag or archived state. Booqable: GET /api/4/customers.
Input Schema
{
"type": "object",
"properties": {
"q": {
"description": "Free-text search over customers.",
"type": "string"
},
"email": {
"description": "Only the customer with exactly this email.",
"type": "string"
},
"tag": {
"description": "Only customers carrying this tag.",
"type": "string"
},
"archived": {
"description": "true = only archived, false = only active.",
"type": "boolean"
},
"include": {
"description": "Comma-separated relationships to sideload, e.g. properties.",
"type": "string"
},
"sort": {
"description": "Sort, comma-separated attributes; prefix with - for descending, e.g. -created_at.",
"type": "string"
},
"page": {
"description": "Page number (1-based). Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Results per page, 1-100 (Booqable default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’booqable_get_customer(customer_id, include)
Fetch one customer with order count, revenue and balance due, sideloading their properties (addresses, phone, custom fields) by default. Booqable: GET /api/4/customers/{id}.
Input Schema
{
"type": "object",
"properties": {
"customer_id": {
"type": "string",
"minLength": 1,
"description": "The customer id (UUID)."
},
"include": {
"description": "Comma-separated relationships to sideload, e.g. properties,tax_region.",
"type": "string"
}
},
"required": [
"customer_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’booqable_list_product_groups(q, product_type, archived, tag, include, ...)
List product groups β the catalogue entries (name, SKU, product type, tracking type, pricing). A group holds one or more bookable products (variations). Booqable: GET /api/4/product_groups.
Input Schema
{
"type": "object",
"properties": {
"q": {
"description": "Free-text search over name/SKU.",
"type": "string"
},
"product_type": {
"description": "Only this product type.",
"type": "string",
"enum": [
"rental",
"sales_item",
"service"
]
},
"archived": {
"description": "true = only archived, false = only active.",
"type": "boolean"
},
"tag": {
"description": "Only groups carrying this tag.",
"type": "string"
},
"include": {
"description": "Comma-separated relationships to sideload, e.g. products,photo.",
"type": "string"
},
"sort": {
"description": "Sort, comma-separated attributes; prefix with - for descending, e.g. -created_at.",
"type": "string"
},
"page": {
"description": "Page number (1-based). Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Results per page, 1-100 (Booqable default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’booqable_list_products(q, product_group_id, product_type, archived, include, ...)
List bookable products (the variations inside product groups). Use a product id for availability checks and booking. Booqable: GET /api/4/products.
Input Schema
{
"type": "object",
"properties": {
"q": {
"description": "Free-text search over name/SKU.",
"type": "string"
},
"product_group_id": {
"description": "Only products in this product group.",
"type": "string"
},
"product_type": {
"description": "Only this product type.",
"type": "string",
"enum": [
"rental",
"sales_item",
"service"
]
},
"archived": {
"description": "true = only archived, false = only active.",
"type": "boolean"
},
"include": {
"description": "Comma-separated relationships to sideload, e.g. product_group,photo.",
"type": "string"
},
"sort": {
"description": "Sort, comma-separated attributes; prefix with - for descending, e.g. -created_at.",
"type": "string"
},
"page": {
"description": "Page number (1-based). Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Results per page, 1-100 (Booqable default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’booqable_check_inventory_availability(product_ids, from, till, location_id)
How many units of one or more products can be booked for an exact period at a location. Returns `available` and `plannable` (plannable can exceed available when shortage is allowed). Get location ids from booqable_list_locations. Booqable: GET /api/4/inventory_availabilities.
Input Schema
{
"type": "object",
"properties": {
"product_ids": {
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"description": "Product ids to check."
},
"from": {
"type": "string",
"description": "Period start, ISO 8601 at the company's local time written as UTC, e.g. 2026-07-01T10:00:00Z means 10:00 at the shop. Do not convert to real UTC."
},
"till": {
"type": "string",
"description": "Period end, ISO 8601 at the company's local time written as UTC, e.g. 2026-07-01T10:00:00Z means 10:00 at the shop. Do not convert to real UTC."
},
"location_id": {
"type": "string",
"minLength": 1,
"description": "The pickup location id."
}
},
"required": [
"product_ids",
"from",
"till",
"location_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’booqable_get_availability_calendar(product_id, year, month, location_id, quantity)
Day-by-day availability for one product over a month: status (available/partial/unavailable) and bookable quantity per day. Booqable: GET /api/4/availabilities with subject_type=item.
Input Schema
{
"type": "object",
"properties": {
"product_id": {
"type": "string",
"minLength": 1,
"description": "The product id (UUID)."
},
"year": {
"type": "integer",
"minimum": 2000,
"maximum": 2100,
"description": "Calendar year, e.g. 2026."
},
"month": {
"type": "integer",
"minimum": 1,
"maximum": 12,
"description": "Calendar month, 1-12."
},
"location_id": {
"description": "Location id to check at.",
"type": "string"
},
"quantity": {
"description": "Units needed; sets the threshold for available vs partial.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"required": [
"product_id",
"year",
"month"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’booqable_list_plannings(order_id, product_id, starts_at_gte, starts_at_lte, stops_at_gte, ...)
List plannings β which product is booked on which order, how many, when, and how many are started (out) or stopped (returned). Filter by order, product, or reservation window. Booqable: GET /api/4/plannings.
Input Schema
{
"type": "object",
"properties": {
"order_id": {
"description": "Only plannings on this order.",
"type": "string"
},
"product_id": {
"description": "Only plannings for this product or bundle (item_id).",
"type": "string"
},
"starts_at_gte": {
"description": "Planned start at or after this datetime (ISO 8601).",
"type": "string"
},
"starts_at_lte": {
"description": "Planned start at or before this datetime (ISO 8601).",
"type": "string"
},
"stops_at_gte": {
"description": "Planned end at or after this datetime (ISO 8601).",
"type": "string"
},
"stops_at_lte": {
"description": "Planned end at or before this datetime (ISO 8601).",
"type": "string"
},
"include": {
"description": "Comma-separated relationships to sideload, e.g. item,order,order.customer.",
"type": "string"
},
"sort": {
"description": "Sort, comma-separated attributes; prefix with - for descending, e.g. -created_at.",
"type": "string"
},
"page": {
"description": "Page number (1-based). Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Results per page, 1-100 (Booqable default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’booqable_list_documents(document_type, order_id, customer_id, status, q, ...)
List invoices, quotes and contracts, with totals and payment status. Filter by type, order, customer or status. Booqable: GET /api/4/documents.
Input Schema
{
"type": "object",
"properties": {
"document_type": {
"description": "Only this document type.",
"type": "string",
"enum": [
"invoice",
"quote",
"contract"
]
},
"order_id": {
"description": "Only documents for this order.",
"type": "string"
},
"customer_id": {
"description": "Only documents for this customer.",
"type": "string"
},
"status": {
"description": "Only documents in this status (values depend on document type).",
"type": "string",
"enum": [
"confirmed",
"unconfirmed",
"revised",
"partially_paid",
"payment_due",
"paid",
"process_deposit",
"overpaid"
]
},
"q": {
"description": "Free-text search.",
"type": "string"
},
"include": {
"description": "Comma-separated relationships to sideload, e.g. customer,order.",
"type": "string"
},
"sort": {
"description": "Sort, comma-separated attributes; prefix with - for descending, e.g. -created_at.",
"type": "string"
},
"page": {
"description": "Page number (1-based). Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Results per page, 1-100 (Booqable default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’booqable_list_payments(order_id, customer_id, type, include, sort, ...)
List payments (charges, authorizations and refunds) with amount, deposit, currency, provider and status. Filter by order, customer or payment type. Read only β this server never moves money. Booqable: GET /api/4/payments.
Input Schema
{
"type": "object",
"properties": {
"order_id": {
"description": "Only payments for this order.",
"type": "string"
},
"customer_id": {
"description": "Only payments for this customer.",
"type": "string"
},
"type": {
"description": "Only this payment type.",
"type": "string",
"enum": [
"payment_charges",
"payment_authorizations",
"payment_refunds"
]
},
"include": {
"description": "Comma-separated relationships to sideload, e.g. order,payment_method.",
"type": "string"
},
"sort": {
"description": "Sort, comma-separated attributes; prefix with - for descending, e.g. -created_at.",
"type": "string"
},
"page": {
"description": "Page number (1-based). Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Results per page, 1-100 (Booqable default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’booqable_list_locations(archived, page, page_size)
List pickup/return locations (warehouses, stores) with address and pickup/delivery capability. Location ids are needed for availability checks and orders. Booqable: GET /api/4/locations.
Input Schema
{
"type": "object",
"properties": {
"archived": {
"description": "true = only archived, false = only active.",
"type": "boolean"
},
"page": {
"description": "Page number (1-based). Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Results per page, 1-100 (Booqable default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’booqable_list_notes(owner_id, owner_type, page, page_size)
List internal notes attached to a customer, order, product or other record. Booqable: GET /api/4/notes.
Input Schema
{
"type": "object",
"properties": {
"owner_id": {
"type": "string",
"minLength": 1,
"description": "The id of the record the notes are about."
},
"owner_type": {
"description": "The owner's resource type.",
"type": "string",
"enum": [
"customers",
"orders",
"products",
"product_groups",
"stock_items",
"bundles",
"documents",
"users"
]
},
"page": {
"description": "Page number (1-based). Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"page_size": {
"description": "Results per page, 1-100 (Booqable default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"required": [
"owner_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄booqable_create_customer(name, email, legal_type, tag_list, discount_percentage, ...)
Create a new customer. Booqable: POST /api/4/customers.
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Person or company name."
},
"email": {
"description": "Email address used for communication.",
"type": "string"
},
"legal_type": {
"description": "person or commercial.",
"type": "string",
"enum": [
"person",
"commercial"
]
},
"tag_list": {
"description": "Tags (case-insensitive).",
"type": "array",
"items": {
"type": "string"
}
},
"discount_percentage": {
"description": "Default discount % applied to this customer's new orders.",
"type": "number",
"minimum": 0,
"maximum": 100
},
"email_marketing_consented": {
"description": "Whether the customer consented to email marketing.",
"type": "boolean"
}
},
"required": [
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄booqable_update_customer(customer_id, name, email, legal_type, tag_list, ...)
Update a customer's name, email, legal type, tags, default discount or marketing consent. Only the fields you pass change. Booqable: PUT /api/4/customers/{id}.
Input Schema
{
"type": "object",
"properties": {
"customer_id": {
"type": "string",
"minLength": 1,
"description": "The customer id (UUID)."
},
"name": {
"type": "string",
"minLength": 1,
"description": "Person or company name."
},
"email": {
"description": "Email address used for communication.",
"type": "string"
},
"legal_type": {
"description": "person or commercial.",
"type": "string",
"enum": [
"person",
"commercial"
]
},
"tag_list": {
"description": "Tags (case-insensitive).",
"type": "array",
"items": {
"type": "string"
}
},
"discount_percentage": {
"description": "Default discount % applied to this customer's new orders.",
"type": "number",
"minimum": 0,
"maximum": 100
},
"email_marketing_consented": {
"description": "Whether the customer consented to email marketing.",
"type": "boolean"
}
},
"required": [
"customer_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄booqable_create_order(starts_at, stops_at, customer_id, status, start_location_id, ...)
Create an EMPTY order for a rental period (status new or draft). Then add products with booqable_book_product and reserve it with booqable_transition_order_status. Locations default to the first active location. Booqable: POST /api/4/orders.
Input Schema
{
"type": "object",
"properties": {
"starts_at": {
"type": "string",
"description": "Rental start, ISO 8601 at the company's local time written as UTC, e.g. 2026-07-01T10:00:00Z means 10:00 at the shop. Do not convert to real UTC."
},
"stops_at": {
"type": "string",
"description": "Rental end, ISO 8601 at the company's local time written as UTC, e.g. 2026-07-01T10:00:00Z means 10:00 at the shop. Do not convert to real UTC."
},
"customer_id": {
"description": "The customer this order is for.",
"type": "string"
},
"status": {
"description": "Initial status. Default new (visible only to its creator); draft is visible but reserves nothing.",
"type": "string",
"enum": [
"new",
"draft"
]
},
"start_location_id": {
"description": "Pickup location id.",
"type": "string"
},
"stop_location_id": {
"description": "Return location id.",
"type": "string"
},
"tag_list": {
"description": "Tags (case-insensitive).",
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"starts_at",
"stops_at"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄booqable_update_order(order_id, starts_at, stops_at, customer_id, start_location_id, ...)
Change an order's rental period, customer, locations or tags. Moving dates can cause a shortage: the call then fails with the shortage details, and a shortage *warning* can be accepted by retrying with confirm_shortage: true. Booqable: PUT /api/4/orders/{id}.
Input Schema
{
"type": "object",
"properties": {
"order_id": {
"type": "string",
"minLength": 1,
"description": "The order id (UUID)."
},
"starts_at": {
"type": "string",
"description": "New rental start, ISO 8601 at the company's local time written as UTC, e.g. 2026-07-01T10:00:00Z means 10:00 at the shop. Do not convert to real UTC."
},
"stops_at": {
"type": "string",
"description": "New rental end, ISO 8601 at the company's local time written as UTC, e.g. 2026-07-01T10:00:00Z means 10:00 at the shop. Do not convert to real UTC."
},
"customer_id": {
"description": "Assign this customer (re-applies their discount, deposit and tax region).",
"type": "string"
},
"start_location_id": {
"description": "Pickup location id.",
"type": "string"
},
"stop_location_id": {
"description": "Return location id.",
"type": "string"
},
"tag_list": {
"description": "Replace the tag list.",
"type": "array",
"items": {
"type": "string"
}
},
"confirm_shortage": {
"description": "true to proceed despite a shortage warning.",
"type": "boolean"
}
},
"required": [
"order_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄booqable_book_product(order_id, product_id, quantity, mode, planning_id, ...)
Add a quantity of a product to an order, allocating inventory (creates a planning and a line). By default adds to an existing planning for the same product if there is one. Booqable: POST /api/4/order_fulfillments with a book_product action.
Input Schema
{
"type": "object",
"properties": {
"order_id": {
"type": "string",
"minLength": 1,
"description": "The order id (UUID)."
},
"product_id": {
"type": "string",
"minLength": 1,
"description": "The product id (UUID)."
},
"quantity": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "Units to book."
},
"mode": {
"description": "infer_planning (default): reuse the product's planning if any; create_new: always a new line; update_existing: add to planning_id.",
"type": "string",
"enum": [
"infer_planning",
"create_new",
"update_existing"
]
},
"planning_id": {
"description": "Required when mode is update_existing.",
"type": "string"
},
"confirm_shortage": {
"description": "true to accept a shortage warning when booking on a reserved or started order.",
"type": "boolean"
}
},
"required": [
"order_id",
"product_id",
"quantity"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄booqable_transition_order_status(order_id, transition_from, transition_to, revert, confirm_shortage)
Move an order between statuses: newβdraft, draftβreserved (reserves the items and assigns an order number), stoppedβarchived, or back to an earlier status with revert: true. Canceling is deliberately NOT offered (Booqable cannot un-cancel). started/stopped are reached by picking up/returning items, so they are only valid here with revert: true. Booqable: POST /api/4/order_status_transitions.
Input Schema
{
"type": "object",
"properties": {
"order_id": {
"type": "string",
"minLength": 1,
"description": "The order id (UUID)."
},
"transition_from": {
"type": "string",
"enum": [
"new",
"draft",
"reserved",
"started",
"stopped",
"archived"
],
"description": "The order's CURRENT status (Booqable checks it)."
},
"transition_to": {
"type": "string",
"enum": [
"draft",
"reserved",
"started",
"stopped",
"archived"
],
"description": "The new status."
},
"revert": {
"description": "true when going back to an earlier status (required for started/stopped).",
"type": "boolean"
},
"confirm_shortage": {
"description": "true to accept a shortage warning when reserving.",
"type": "boolean"
}
},
"required": [
"order_id",
"transition_from",
"transition_to"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄booqable_create_note(owner_id, owner_type, body)
Attach an internal note to a customer, order, product or other record. Booqable: POST /api/4/notes.
Input Schema
{
"type": "object",
"properties": {
"owner_id": {
"type": "string",
"minLength": 1,
"description": "The id of the record the note is about."
},
"owner_type": {
"type": "string",
"enum": [
"customers",
"orders",
"products",
"product_groups",
"stock_items",
"bundles",
"documents",
"users"
],
"description": "The owner's resource type."
},
"body": {
"type": "string",
"minLength": 1,
"description": "The note text."
}
},
"required": [
"owner_id",
"owner_type",
"body"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence