Setora MCP by usefulapi

Read locations, slots and bookings; create clients, book, move and cancel in Setora.

Should I use this

Quality & Safety

A
Description quality
98%
Schema completeness
97%
Naming quality
100%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,872Tokens (tool definitions)
~1.3 KBTypical response size
Moderate attention impact (1.46% of 128k context)

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-http

What it can do

Tool inventory

Tools (10)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded10 tools