Operate a nisebookings account: catalogue, staff schedules, free slots, customers, appointments
Connect Remote server
claude mcp add --transport http booking https://app.nisebookings.com/api/mcp --header "Authorization: Bearer <YOUR_API_KEY>"
{
"mcpServers": {
"booking": {
"url": "https://app.nisebookings.com/api/mcp",
"headers": {
"Authorization": "Bearer <YOUR_API_KEY>"
}
}
}
}
{
"servers": {
"booking": {
"type": "http",
"url": "https://app.nisebookings.com/api/mcp",
"headers": {
"Authorization": "Bearer <YOUR_API_KEY>"
}
}
}
}
Settings > Connectors > Add custom connector
URL: https://app.nisebookings.com/api/mcp
Replace the values in angle brackets with your own. Keys stay on your machine; we never see them.
Tools 47 found in our last check
whoamiThe tenant (id, name, timeZone, currency), the scopes of the API key in use and the plan (id, label, bookingsPerMonth, usedThisMonth, level ok|warn|full). Works with any valid key. Call first to learn which tools your key may use and, when writing fails with 402 plan_limit, what…
create_projectCreate a new account (project) for a client, owned by this account's first owner — the agency case: one login or key configures several client sites. The new account starts on Free; the allowance is the highest `projects` among the plans of the accounts that owner owns (Free/Pro…
list_servicesAll services of the tenant (simple, compound, collaborative, package), ordered by position. Scope catalog:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}.
get_serviceOne service by id. Scope catalog:read.
create_serviceCreate a service; missing fields get admin defaults (type simple, duration 60, deposit 100%, taxRate 21). `type` cannot change later. A service is bookable once visibility is public and a public staff member with a schedule offers it (assign_staff_service). Scope catalog:write.
update_servicePartial update: send only the fields that change (merged over current values). `type` is fixed. Scope catalog:write.
list_categoriesService categories, ordered by position. Scope catalog:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}.
list_staffAll staff members, including archived ones (visibility = archive). Scope catalog:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}.
get_staffOne staff member by id. Scope catalog:read.
create_staffCreate a staff member; the weekly schedule starts as a copy of the business hours. Link services with assign_staff_service afterwards. Scope catalog:write.
update_staffPartial update of a staff member. visibility "archive" hides them (staff are never deleted). Scope catalog:write.
get_staff_scheduleWeekly working hours of a staff member: {days: [{weekday 1=Mon…7=Sun, start, end, breaks}]}. A missing weekday is a day off. Scope catalog:read.
set_staff_scheduleReplace the WHOLE week of a staff member (not a merge): send every working day; a missing weekday becomes a day off. end > start, breaks inside the day and not overlapping. Read it first with get_staff_schedule. Scope catalog:write.
list_staff_servicesServices this staff member offers, with per-link price, capacityMin/Max and deposit. Scope catalog:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}.
assign_staff_serviceLet a staff member offer a service (create or update the link). Missing fields keep current link values, or for a new link the service price/capacity and deposit null (= service deposit). Required before a staff member can be booked for the service. Scope catalog:write.
unassign_staff_serviceStop a staff member offering a service. Existing appointments stay. Scope catalog:write.
get_business_hoursCompany opening hours {days: [{weekday 1=Mon…7=Sun, start, end}]}; a missing weekday = closed. New staff copy these. Scope settings:read.
set_business_hoursReplace ALL business hours (not a merge): one entry per open weekday, no breaks; a missing weekday = closed. Does not change existing staff schedules. Scope settings:write.
list_holidaysDays off. staffId filters: a staff id, or "company" for company-wide days; omit for all. Scope catalog:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}.
add_holidayAdd a day off. kind: once | yearly (same date every year) | exception (a working day despite company days off). staffId null/omitted = company-wide. Scope catalog:write.
delete_holidayRemove a day off by id (from list_holidays). Scope catalog:write.
get_settingsAll admin-editable tenant settings, plus read-only id, publicKey (for the widget / public API) and currency. Scope settings:read.
update_settingsPartial update: only fields present are validated and written; returns all settings. id, publicKey and currency are read-only. The Mollie key is set via api_request PUT /settings/mollie-key {key} (scope payments:write) before payMollieEnabled: true. Scope settings:write.
list_customersCustomers, optionally searched with q (name, e-mail or phone). Scope customers:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}.
get_customerOne customer by id. Scope customers:read.
create_customerCreate a customer. email is unique per tenant: 409 when it exists, so search with list_customers first. Scope customers:write.
update_customerPartial update of a customer. Scope customers:write.
list_appointmentsThe calendar: appointments with their bookings and customers. Filter by from/to (ISO date-times; start ≥ from, < to), staffId, serviceId, status (appointments having a booking in that status). Scope bookings:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total…
get_appointmentOne appointment with bookings (bookingId, status, persons), customers, extras, series/group ids and meetingUrl. Scope bookings:read.
create_appointmentBook like the admin: one appointment with one booking. Give customerId or customer {name, email, phone}. Without end the service duration is used; without status the tenant default. A day service (rental, durationDays > 0) starts at the local midnight (00:00) and without end spa…
update_appointmentMove or change an appointment: send only what changes (start, end, staffId, serviceId, internalNote). start without end keeps the service duration (for a day service: its number of days); besides, a day service starts at the local midnight (00:00). scope following|series shifts…
delete_appointmentDelete an appointment and its bookings. notify: true first sets approved bookings to cancelled and pending ones to rejected and mails the customers. To cancel but keep the record, use update_booking status cancelled instead. scope this|following|series for recurring series. Scop…
add_customer_to_appointmentAdd another booking (customer) to an existing group appointment. Give customerId or customer {name, email, phone}. 409 capacity_exceeded when it does not fit. Response includes the new bookingId. Scope bookings:write.
update_bookingChange a booking's status (approve, cancel, reject, done…) and/or persons. id is the bookingId (from create_appointment or get_appointment), not the appointment id. The status also applies to other parts of the same compound/collaborative group; scope following|series applies it…
find_slotsBookable times for a service, day by day, exactly as the booking widget sees them (respects schedules, days off, existing bookings, capacity, minimum notice and booking horizon). Returns {days: [{date, slots: [{start, time, staffId, state?}]}], hasMore}; days without free times…
list_paymentsPayments, newest first. Filters: status (pending|completed|rejected|refunded), type (local|free|mollie), customerId. Scope payments:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}.
get_paymentOne payment with its items and bookings. Mark a local payment paid / refund it via api_request POST /payments/{id}/complete or /refund (payments:write). Scope payments:read.
list_outboxThe e-mail log, newest first: what was sent or queued (id, status, toEmail, toName, subject, text, html, createdAt, sentAt, lastError). On a sandbox nothing is delivered: rows end as status "suppressed", read them here to verify confirmations. Filters: status (pending|sending|se…
list_eventsTicketed events ordered by startAt. Ticket types, attendees and event staff are under /events/{id}/… via api_request. Scope catalog:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}.
list_couponsCoupons (discount codes) ordered by code. Scope catalog:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}.
generate_couponsCreate up to 100 unique coupon codes from a mask: every * becomes one of 0-9A-Z (e.g. "SUMMER-****"). The other fields are the template for each coupon; discount (percent) or deduction must be > 0. 422 on mask when it is used up. Returns {data: coupons}. Single coupons: api_requ…
list_webhooksWebhook endpoints (id, url, events, active, description, createdAt, updatedAt); the secret is never returned. Event types with descriptions: api_request GET /webhooks/events. Scope settings:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}.
create_webhookRegister a URL that receives signed POSTs (Standard Webhooks: webhook-id, webhook-timestamp, webhook-signature "v1,<base64 HMAC-SHA256>" over "id.timestamp.body" keyed with the base64 part of the secret after whsec_). Payloads are thin ({id, type, createdAt, tenantId, data: ids…
delete_webhookDelete an endpoint and its delivery log. To pause instead: api_request PATCH /webhooks/{id} {active: false}. New secret: POST /webhooks/{id}/rotate-secret. Scope settings:write.
test_webhookQueue a `ping` event ({type: "ping", data: {endpointId}}) to the endpoint and send it right away. Returns the delivery (202); check the outcome (status delivered/pending, lastStatus, lastError) with list_webhook_deliveries a second later. Scope settings:write.
list_webhook_deliveriesDelivery log of one endpoint, newest first: id, eventId, type, status (pending|sending|delivered|failed), attempts, nextAttemptAt, lastStatus (HTTP), lastError, createdAt, deliveredAt, payload. Resend one: api_request POST /webhooks/{id}/deliveries/{deliveryId}/retry. Scope sett…
api_requestAny /api/v1 management API call not covered by a dedicated tool. path is relative to /api/v1 (e.g. "/services/<uuid>/extras"), ids in place of {…}; put query parameters in query, the JSON body in body (camelCase). Same scopes and errors as the API: {error: {code, message, fields…
Headers
| Name | Description |
|---|---|
AuthorizationRequired, secret | Management API key from Settings → API in the nisebookings admin, sent as a bearer token |
Details
| Endpoint | https://app.nisebookings.com/api/mcp (Streamable HTTP) |
| First published | 13 Oct 2026 |
| Last updated | 13 Oct 2026 |
| Registry name | com.nisebookings/booking |
More finance and crypto servers See all
Listing data from the official MCP registry. Status and tools from NestDaddy's daily check. Browse all MCP servers.
