Setora MCP by usefulapi
Read locations, slots and bookings; create clients, book, move and cancel in Setora.
Should I use this
Quality & Safety
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": {
"setora": {
"url": "https://setora.usefulapi.io/mcp"
}
}
}Remote endpoints
https://setora.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (10)
🟢setora_list_locations(cursor)
List the active locations (shops) of the Setora organisation: slug, name, timezone, address, phone and the Booking Protection policy. Start here: the slug is needed by most other tools.
Input Schema
{
"type": "object",
"properties": {
"cursor": {
"description": "Pagination cursor: pass next_cursor from the previous page. Cursors expire, use them at once.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢setora_list_services(location_slug, cursor)
List the services bookable at a location with price and deposit (in minor units, for example pence), duration, category and the staff who can deliver each service.
Input Schema
{
"type": "object",
"properties": {
"location_slug": {
"type": "string",
"minLength": 1,
"description": "Location slug from setora_list_locations (for example 'soho')."
},
"cursor": {
"description": "Pagination cursor: pass next_cursor from the previous page. Cursors expire, use them at once.",
"type": "string"
}
},
"required": [
"location_slug"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢setora_list_staff(location_slug, cursor)
List the active staff at a location. Each staff member shows the ids of the services they deliver.
Input Schema
{
"type": "object",
"properties": {
"location_slug": {
"type": "string",
"minLength": 1,
"description": "Location slug from setora_list_locations (for example 'soho')."
},
"cursor": {
"description": "Pagination cursor: pass next_cursor from the previous page. Cursors expire, use them at once.",
"type": "string"
}
},
"required": [
"location_slug"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢setora_get_availability(location_slug, service_ids, date, days, staff_id)
Get bookable time slots for one or more services at a location, from a local date forward. Slots use the location's local time with a UTC offset. Use a slot's starts_at as-is in setora_create_booking.
Input Schema
{
"type": "object",
"properties": {
"location_slug": {
"type": "string",
"minLength": 1,
"description": "Location slug from setora_list_locations (for example 'soho')."
},
"service_ids": {
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"description": "One or more service ids from setora_list_services."
},
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Local start date, yyyy-mm-dd."
},
"days": {
"description": "Days to search forward, 1 to 14 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 14
},
"staff_id": {
"description": "Only slots of this staff member.",
"type": "string",
"minLength": 1
}
},
"required": [
"location_slug",
"service_ids",
"date"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢setora_lookup_client(phone, email)
Find a client by phone (E.164, for example +447700900123) or by email. Give at least one. Returns 404 when no client matches.
Input Schema
{
"type": "object",
"properties": {
"phone": {
"description": "Phone number in E.164 format.",
"type": "string"
},
"email": {
"description": "Email address.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢setora_get_booking(reference)
Get one booking by reference: status, services, staff, client, times and Booking Protection state.
Input Schema
{
"type": "object",
"properties": {
"reference": {
"type": "string",
"minLength": 1,
"description": "Booking reference such as SET-A1B2C3."
}
},
"required": [
"reference"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡setora_create_client(first_name, last_name, phone, email, marketing_consent)
WRITE: create a client (first and last name, and a phone or an email). If the phone or email already exists, Setora returns the existing client and creates no duplicate. Needs a read_write key.
Input Schema
{
"type": "object",
"properties": {
"first_name": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"last_name": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"phone": {
"description": "Phone number in E.164 format.",
"type": "string"
},
"email": {
"type": "string"
},
"marketing_consent": {
"description": "Set true only if the client agreed to marketing messages (default false).",
"type": "boolean"
}
},
"required": [
"first_name",
"last_name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴setora_create_booking(location_slug, service_ids, client_id, starts_at, staff_id, ...)
WRITE: create a booking for a client. starts_at must be a slot from setora_get_availability. If the service needs a deposit, the booking stays in pending_payment and the result has a payment_url. Locations with Booking Protection return 409 booking_protection_required: use the Setora booking page there. Needs a read_write key. To retry after a network error, pass the same idempotency_key.
Input Schema
{
"type": "object",
"properties": {
"location_slug": {
"type": "string",
"minLength": 1,
"description": "Location slug from setora_list_locations (for example 'soho')."
},
"service_ids": {
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
"client_id": {
"type": "string",
"minLength": 1,
"description": "Client id from setora_lookup_client or setora_create_client."
},
"starts_at": {
"type": "string",
"minLength": 1,
"description": "Slot start with UTC offset, for example 2026-05-12T09:30:00+01:00."
},
"staff_id": {
"description": "Omit for any available staff member.",
"type": "string",
"minLength": 1
},
"notes": {
"description": "Free text shown to staff in the Hub.",
"type": "string",
"maxLength": 1000
},
"idempotency_key": {
"description": "UUID v4. Reuse the same value to retry safely (Setora keeps it 24 hours). Generated when omitted.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"location_slug",
"service_ids",
"client_id",
"starts_at"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴setora_reschedule_booking(reference, starts_at, staff_id)
WRITE: move a booking to a new slot of the same service and location, and optionally to another eligible staff member. The shop's cancellation policy window applies (409 if it blocks the change). Needs a read_write key.
Input Schema
{
"type": "object",
"properties": {
"reference": {
"type": "string",
"minLength": 1,
"description": "Booking reference such as SET-A1B2C3."
},
"starts_at": {
"type": "string",
"minLength": 1,
"description": "New slot start from setora_get_availability, with UTC offset."
},
"staff_id": {
"description": "Move to this eligible staff member.",
"type": "string",
"minLength": 1
}
},
"required": [
"reference",
"starts_at"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴setora_cancel_booking(reference, reason)
WRITE: cancel a booking. The shop's cancellation policy decides if a deposit is refunded (see deposit_refunded in the result). This cannot be undone. Needs a read_write key.
Input Schema
{
"type": "object",
"properties": {
"reference": {
"type": "string",
"minLength": 1,
"description": "Booking reference such as SET-A1B2C3."
},
"reason": {
"description": "Free text shown to staff.",
"type": "string",
"maxLength": 1000
}
},
"required": [
"reference"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence