nisebookings
com.nisebookings/bookingVersion 1.0.0Operate a nisebookings account: catalogue, staff schedules, free slots, customers, appointments
Status
Responds78 msAnswered our handshake without sign-in.- Last checked
- Nov 14, 2026, 14:07 UTC
- Latency
- 78 ms
- Remotes responding
- 1 of 1
- Sign-in
- API key
- Hosting
- EU hosting detected (detected, not a legal statement)
- Registry data as of
- Nov 14, 2026, 22:14 UTC
Data from the official MCP Registry, checked by run.zero. How we check
Connect
Streamable HTTP
https://app.nisebookings.com/api/mcpResponds78 msNo sign-in
Claude Code
claude mcp add --transport http booking https://app.nisebookings.com/api/mcp --header 'Authorization: Bearer <YOUR_TOKEN>'Replace <YOUR_TOKEN> before running.
Claude Desktop and claude.ai
Settings > Connectors > Add custom connector
Name: booking
Remote MCP server URL: https://app.nisebookings.com/api/mcp
This server expects the header Authorization.Cursor
{
"mcpServers": {
"booking": {
"url": "https://app.nisebookings.com/api/mcp",
"headers": {
"Authorization": "Bearer <YOUR_TOKEN>"
}
}
}
}Replace <YOUR_TOKEN> before running.
VS Code
code --add-mcp '{"name":"booking","type":"http","url":"https://app.nisebookings.com/api/mcp","headers":{"Authorization":"Bearer <YOUR_TOKEN>"}}'Replace <YOUR_TOKEN> before running.
Built your own server? run.zero hosts MCP servers on European infrastructure.
Tools
47 tools
Read-only | Idempotent | Open world | ||
|---|---|---|---|---|
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. | No | No | No | No |
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. | No | No | No | No |
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}}. Lists take limit ≤ 100 / offset and return {data, total}. Not for /public/ (use find_slots). Routes:
GET /me
GET POST /categories
GET PATCH DELETE /categories/{id}
GET POST /services
GET PATCH DELETE /services/{id}
GET POST /services/{id}/extras
GET PATCH DELETE /services/{id}/extras/{extraId}
GET PUT /services/{id}/fields
GET PUT /services/{id}/parts
GET POST /staff
GET PATCH DELETE /staff/{id}
GET PUT /staff/{id}/schedule
GET /staff/{id}/services
PUT DELETE /staff/{id}/services/{serviceId}
GET POST /holidays
DELETE /holidays/{id}
GET PUT /business-hours
GET PATCH /settings
DELETE /sandbox
PUT DELETE /settings/mollie-key
GET POST /notifications
GET /notifications/codes
GET PATCH DELETE /notifications/{id}
GET /outbox
GET POST /coupons
POST /coupons/generate
GET PATCH DELETE /coupons/{id}
GET POST /events
GET PATCH DELETE /events/{id}
GET /events/{id}/attendees
GET PUT /events/{id}/staff
GET POST /events/{id}/ticket-types
GET PATCH DELETE /events/{id}/ticket-types/{ticketTypeId}
POST /attendees/{id}/cancel
GET POST /packages
GET /packages/{id}
GET POST /customers
GET PATCH DELETE /customers/{id}
GET POST /appointments
GET PATCH DELETE /appointments/{id}
POST /appointments/{id}/bookings
GET /bookings
GET PATCH DELETE /bookings/{id}
POST /bookings/{id}/give-seat
GET /payments
GET /payments/{id}
POST /payments/{id}/complete
POST /payments/{id}/refund
POST /projects
GET POST /webhooks
GET /webhooks/events
GET PATCH DELETE /webhooks/{id}
POST /webhooks/{id}/rotate-secret
POST /webhooks/{id}/test
GET /webhooks/{id}/deliveries
POST /webhooks/{id}/deliveries/{deliveryId}/retry | Yes | No | No | No |
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. | No | No | Yes | No |
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 spans its number of days. The staff member must offer the service. Admin checks (overlap, duration, schedule, holiday) return 422 code "warnings" with fields: explain them to the user and retry with force: true only if they agree. Hard limits are 409 capacity_exceeded / slot_unavailable. Response includes bookingId (use it for update_booking). With recurrence the call books the whole recurring series at once instead. To find free times use find_slots. Scope bookings:write. | No | No | No | No |
create_customerCreate a customer. email is unique per tenant: 409 when it exists, so search with list_customers first. Scope customers:write. | No | No | No | No |
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 1, Agency 5, € 9 per extra project), so 402 plan_limit when it is full and 409 when the slug is taken. Give the client access afterwards from the admin (Settings → Team) or let them sign up. Scope projects:write. | No | No | No | No |
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. | No | No | No | No |
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. | No | No | No | No |
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 + status, previousStatus, start}): fetch details via the API. url must be public https (private/loopback addresses are refused, 422 on url). events: booking.created, booking.updated, booking.cancelled, ticket.created, ticket.approved, ticket.cancelled, payment.completed, payment.failed, payment.refunded. Returns the endpoint plus `secret` (whsec_…) ONCE: store it now. Max 10 endpoints. Retries: 1m, 5m, 30m, 2h, 12h, 24h. Then call test_webhook. Scope settings:write. | No | No | No | No |
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. Scope bookings:write. | Yes | No | Yes | No |
delete_holidayRemove a day off by id (from list_holidays). Scope catalog:write. | Yes | No | Yes | No |
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. | Yes | No | Yes | No |
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 are omitted. Pass a slot's start and staffId to create_appointment. state "waitlist" = full, waiting list open. Works with any key (public data). | Not declared | Yes | Not declared | No |
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_request POST /coupons. Scope catalog:write. | No | No | No | No |
get_appointmentOne appointment with bookings (bookingId, status, persons), customers, extras, series/group ids and meetingUrl. Scope bookings:read. | Not declared | Yes | Not declared | No |
get_business_hoursCompany opening hours {days: [{weekday 1=Mon…7=Sun, start, end}]}; a missing weekday = closed. New staff copy these. Scope settings:read. | Not declared | Yes | Not declared | No |
get_customerOne customer by id. Scope customers:read. | Not declared | Yes | Not declared | No |
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. | Not declared | Yes | Not declared | No |
get_serviceOne service by id. Scope catalog:read. | Not declared | Yes | Not declared | No |
get_settingsAll admin-editable tenant settings, plus read-only id, publicKey (for the widget / public API) and currency. Scope settings:read. | Not declared | Yes | Not declared | No |
get_staffOne staff member by id. Scope catalog:read. | Not declared | Yes | Not declared | No |
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. | Not declared | Yes | Not declared | No |
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}. | Not declared | Yes | Not declared | No |
list_categoriesService categories, ordered by position. Scope catalog:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}. | Not declared | Yes | Not declared | No |
list_couponsCoupons (discount codes) ordered by code. Scope catalog:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}. | Not declared | Yes | Not declared | No |
list_customersCustomers, optionally searched with q (name, e-mail or phone). Scope customers:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}. | Not declared | Yes | Not declared | No |
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}. | Not declared | Yes | Not declared | No |
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}. | Not declared | Yes | Not declared | No |
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|sent|failed|suppressed), to (exact address, case-insensitive). Scope settings:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}. | Not declared | Yes | Not declared | No |
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}. | Not declared | Yes | Not declared | No |
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}. | Not declared | Yes | Not declared | No |
list_staffAll staff members, including archived ones (visibility = archive). Scope catalog:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}. | Not declared | Yes | Not declared | No |
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}. | Not declared | Yes | Not declared | No |
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 settings:read. Paginated: limit ≤ 100 (default 50), offset; returns {data, total}. | Not declared | Yes | Not declared | No |
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}. | Not declared | Yes | Not declared | No |
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. | Yes | No | Yes | No |
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. | Yes | No | Yes | No |
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. | No | No | No | No |
unassign_staff_serviceStop a staff member offering a service. Existing appointments stay. Scope catalog:write. | Yes | No | Yes | No |
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 later/all appointments of a recurring series (response seriesMoved). Warnings → 422 code "warnings" unless force: true. Does not mail; status changes go through update_booking. Scope bookings:write. | No | No | Yes | No |
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 to a recurring series. Response {id, changed, failed, reason}: id is the booking you patched — a 200 without an error means its status changed. changed lists the other bookings that followed (group parts, series) and is empty when there were none; failed counts bookings that no longer fit. notify: true mails the customer about the status change. Scope bookings:write. | Yes | No | Yes | No |
update_customerPartial update of a customer. Scope customers:write. | No | No | Yes | No |
update_servicePartial update: send only the fields that change (merged over current values). `type` is fixed. Scope catalog:write. | No | No | Yes | No |
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. | No | No | Yes | No |
update_staffPartial update of a staff member. visibility "archive" hides them (staff are never deleted). Scope catalog:write. | No | No | Yes | No |
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 the account's plan allows. | Not declared | Yes | Not declared | No |
Details
- Registry status
- Active
- Published
- Oct 13, 2026
- Updated
- Oct 13, 2026
- Repository
- Not given
- Categories (suggested)
- Developer toolsSuggested categories are assigned automatically from the registry text and may be wrong. Verified operators can correct them.
- GDPR
- Not declared