Server definition
- Hash
- sha256:90b835394398d48f6bc47ae0cafcc41ec4c9230b5a7f4d39834baf478e629af5
- What it is
- What a remote MCP server returned when asked what it offers: 14 tools
The blob, as servednamed by its sha256
{
"instructions": "# Salon operations with HairDora\n\nThis skill drives the HairDora MCP connector. The user must connect HairDora\nand authorize an account with live access to the intended organization. If\nauthorization fails, ask the user to connect HairDora. Never request, embed,\nor repeat an API key, password, OAuth token, payment credential, or webhook\nsecret.\n\n## Read-only boundary\n\nEvery available tool is read-only, idempotent, tenant-scoped, and\nclosed-world. The connector cannot create, edit, book, reschedule, cancel,\ndelete, charge, refund, transfer, send a reminder, or otherwise move funds.\nDo not imply that a successful read changed HairDora. When the user asks for a\nchange, offer the relevant safe inspection and direct the authorized operator\nto HairDora's first-party controls.\n\n## Resource identifiers\n\nKeep these identifiers distinct:\n\n- `salonId` selects an owned salon and scopes schedule, availability, client,\n service, appointment, quote, or payment reads.\n- `clientId` is a pseudonymous link for one client and allows appointment,\n quote, and payment filtering.\n- `appointmentId` opens one appointment and its attached service summaries.\n- Service, calendar-event, quote, and payment ids identify only their own\n record type.\n\nResolve a name with a list tool, then reuse the exact returned id. Never guess\nan id, treat an opaque id as authority, or reuse an id from another\norganization. Cross-tenant salon, client, and appointment ids return not found\nor an authorization error. For availability and providers, the connector must\nfinish its owned-salon check before using the product's public booking route.\n\n## Available tools\n\n| Tool | Use it when someone asks… |\n| ------------------------ | ----------------------------------------------------------------------------------------------------------------------- |\n| `list_salons` | which salons they run, with the ids that narrow other reads to one salon |\n| `get_salon` | for a salon's opening hours, address, phone, timezone or appointment length |\n| `get_salon_availability` | when there are free slots (the salon's booking window, up to 14 days with openings) |\n| `list_providers` | which stylists or hairdressers can be booked (organization-wide names) |\n| `list_clients` | who the clients are, or for a client id (up to 100, no name search) |\n| `get_client` | about one client's language or salon |\n| `list_appointments` | how many appointments there are on a day or in a period, how many were canceled or no-shows, or when a client is booked |\n| `get_appointment` | what services one booking includes and their prices |\n| `list_calendar_events` | when the salon is closed or has extra opening hours, or a stylist or chair is blocked |\n| `list_services` | what a cut, colour or other service costs |\n| `list_payments` | which payments were taken or whether a client paid; never moves funds |\n| `list_quotes` | which client quotes are pending, approved or rejected (no amounts) |\n| `show_salon_overview` | for a one-card overview of one salon |\n\n`list_clients`, `list_appointments`, `list_calendar_events`, `list_services`,\n`list_payments`, and `list_quotes` accept a maximum result limit of 100 and\nreturn `hasMore`. Defaults are 20 except services, which defaults to 50.\n`list_salons` and `list_providers` are capped at 100. Report `hasMore` rather\nthan claiming completeness. The overview caps counted clients at 100,\nappointment previews at 8, and service previews at 12; a `+` count is a lower\nbound.\n\n`get_salon_availability` accepts no custom date window. It follows the salon's\nown online-booking window (by default from two hours ahead to six months\nahead) and returns the first 14 days that have openings. Do not extrapolate\nbeyond the days it returns. It summarizes each day with slot count\nand first/last slot; it does not identify who occupies unavailable time.\n\nProvider roles are organization-wide, not proof that a provider works at the\nselected salon. `list_providers` returns names only, with no staff id, contact,\nrole record, avatar, or personal schedule.\n\n## Personal-data boundary\n\nClient display names and pseudonymous client/appointment/quote/payment\nlinkages are personal data. Use them only when the requested workflow needs to\nresolve a client or connect that client's records. Do not repeat more names or\nidentifiers than needed in the answer.\n\nSafe results may include:\n\n- salon ids, display names, public business contact/location, locale,\n currency, timezone, opening hours, and scheduling settings;\n- client display name and pseudonymous id, salon link, language, and edit\n time;\n- appointment ids, client/salon links, times, status, and bounded service\n summaries;\n- calendar type, scope, blocking/opening effect, all-day flag, and times;\n- service ids, names, prices, and salon links; and\n- quote/payment ids, client/salon links, status, time, amount, and currency.\n\nThe connector intentionally cannot expose:\n\n- client email, phone, address, or other contact/profile fields;\n- client, appointment, quote, payment, or calendar free-text notes;\n- service/color history or private calendar titles and reasons;\n- staff, chair, role, or organization ids;\n- cardholder data, processor/customer ids, credentials, payment errors,\n discounts, or staff commission splits; or\n- arbitrary metadata, internal integrations, or unbounded raw documents.\n\nDo not infer or reconstruct excluded fields. Do not ask the user to paste\ncontact details, notes, card data, processor ids, or credentials into chat.\nOffer safe schedule, status, aggregate, or first-party-dashboard alternatives.\n\n## Salon capacity audit\n\n1. Use `list_salons` unless the exact owned salon id is already available.\n2. Call `get_salon` for timezone, opening hours, appointment duration, and\n business configuration.\n3. Call `list_calendar_events` with that salon and a bounded time window.\n Interpret `BLOCK` versus `OPEN`; titles, notes, staff/chair ids, and private\n reasons are unavailable.\n4. Call `get_salon_availability`; it returns the salon's own booking window.\n5. Optionally use `list_appointments` with the same window to describe booked\n workload without exposing notes or contacts.\n6. Distinguish configured hours, explicit blocks, booked appointments, and\n remaining summarized availability. Do not invent the cause of a block.\n\nUse `list_providers` only for an organization-wide name inventory. Do not\nclaim that its names represent per-salon staffing or availability.\n\n## Client schedule workflow\n\n1. Use `list_clients` with an exact salon when known. It has no name search\n and returns at most 100 clients in no particular order, so a client may be\n missing when `hasMore` is true; say so rather than concluding they do not\n exist. If multiple display names match, show only the minimum safe\n identifiers needed for the user to choose.\n2. Use the chosen `clientId` with `list_appointments` and a bounded time\n window.\n3. Call `get_appointment` only for a selected appointment when service detail\n matters.\n4. Report times in the salon timezone when known, status, and service summary.\n State when service rows are truncated.\n\n`get_client` adds language and edit time but never supplies contact details,\nnotes, address, or service/color history. Do not promise those fields.\n\n## Service, quote, and payment-status workflow\n\nUse `list_services` for the catalog and prices. A price is operational\nmetadata, not proof of the final charged amount.\n\nFor one resolved client, `list_quotes` can show pseudonymous quote ids, status,\nand time. It does not return line items, discounts, contact details, or notes.\nThe status filter is applied within a bounded upstream window; when `hasMore`\nis true, do not claim that the filtered set is globally complete.\n\n`list_payments` can show pseudonymous payment/client/salon ids, time, amount,\ncurrency, and status. It cannot charge, refund, transfer, retry, settle, or\notherwise move funds. It omits cardholder data, processor/customer ids,\ncredentials, errors, discounts, notes, and commission splits. Treat a status\nas HairDora's recorded operational state, not independent proof of bank\nsettlement.\n\n## Interactive views\n\n`show_salon_overview` renders a bounded salon card. Its model-visible and\nrendered result omits client names and client/appointment ids. Explain lower\nbounds, schedule patterns, or next safe checks instead of restating every\nvisible value.\n\n`get_appointment` renders the appointment-detail card. The card omits the\nappointment note and all contact/payment fields. Use its client or salon\nreference for another safe read only when the user's request requires it.\n",
"tools": [
{
"description": "Use this when someone asks what services a specific appointment includes, their prices, or the appointment's status. Returns one appointment's client and salon ids, times, status and up to 50 booked services with prices. Not for finding bookings by date.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"appointmentId": {
"description": "Id of one appointment, as the appointment list returns it (24 lowercase hex characters)",
"pattern": "^[0-9a-f]{24}$",
"type": "string"
}
},
"required": [
"appointmentId"
],
"type": "object"
},
"name": "get_appointment",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"appointment": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"clientId": {
"anyOf": [
{
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
{
"type": "null"
}
]
},
"endTime": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"salonId": {
"anyOf": [
{
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
{
"type": "null"
}
]
},
"serviceCount": {
"maximum": 10000,
"minimum": 0,
"type": "integer"
},
"services": {
"items": {
"additionalProperties": false,
"properties": {
"id": {
"anyOf": [
{
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"maxLength": 200,
"type": "string"
},
"price": {
"type": [
"number",
"null"
]
}
},
"required": [
"id",
"name",
"price"
],
"type": "object"
},
"maxItems": 50,
"type": "array"
},
"servicesTruncated": {
"type": "boolean"
},
"startTime": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"status": {
"anyOf": [
{
"enum": [
"SCHEDULED",
"CLIENT_ARRIVED",
"NO_SHOW",
"CANCELED"
],
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"clientId",
"salonId",
"startTime",
"endTime",
"status",
"serviceCount",
"servicesTruncated",
"services"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "One booking with up to 50 booked services and their prices; null when not found. Free-text notes, reminders, contact details, organization data and payment data are excluded."
},
"status": {
"enum": [
"found",
"not-found"
],
"type": "string"
}
},
"required": [
"status",
"appointment"
],
"type": "object"
}
},
{
"description": "Use this when someone asks about one salon client, such as their preferred language or which salon they belong to. Returns the client's name, salon, language and last edit time. Not for the client's email, phone or booking history.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"clientId": {
"description": "Id of one client, as the client list returns it (24 lowercase hex characters)",
"pattern": "^[0-9a-f]{24}$",
"type": "string"
}
},
"required": [
"clientId"
],
"type": "object"
},
"name": "get_client",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"client": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"id": {
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"language": {
"anyOf": [
{
"maxLength": 16,
"type": "string"
},
{
"type": "null"
}
]
},
"lastEditTime": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"maxLength": 200,
"type": "string"
},
"salonId": {
"anyOf": [
{
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"name",
"salonId",
"language",
"lastEditTime"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "Name, salon, language and edit time only; null when not found. Email, phone, address, operator notes, service and colour history, organization data and other profile fields are excluded."
},
"status": {
"enum": [
"found",
"not-found"
],
"type": "string"
}
},
"required": [
"status",
"client"
],
"type": "object"
}
},
{
"description": "Use this when someone asks for one salon's opening hours, address, phone, website, timezone or default appointment length. Returns that salon's business settings with up to 14 opening-hour rows, Monday first. Not for free booking slots.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"salonId": {
"description": "Id of one of the user's salons, as the salon list returns it (24 lowercase hex characters)",
"pattern": "^[0-9a-f]{24}$",
"type": "string"
}
},
"required": [
"salonId"
],
"type": "object"
},
"name": "get_salon",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"salon": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"appointmentDuration": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 1440,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Default appointment length in minutes"
},
"city": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"countryCode": {
"anyOf": [
{
"pattern": "^[A-Z]{2}$",
"type": "string"
},
{
"type": "null"
}
]
},
"currency": {
"anyOf": [
{
"pattern": "^[A-Z]{3}$",
"type": "string"
},
{
"type": "null"
}
]
},
"defaultLocale": {
"anyOf": [
{
"maxLength": 16,
"type": "string"
},
{
"type": "null"
}
]
},
"firstDayOfTheWeek": {
"anyOf": [
{
"enum": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
],
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"name": {
"maxLength": 200,
"type": "string"
},
"openingHours": {
"items": {
"additionalProperties": false,
"properties": {
"close": {
"anyOf": [
{
"pattern": "^\\d{1,2}:\\d{2}$",
"type": "string"
},
{
"type": "null"
}
]
},
"day": {
"anyOf": [
{
"enum": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
],
"type": "string"
},
{
"type": "null"
}
]
},
"open": {
"anyOf": [
{
"pattern": "^\\d{1,2}:\\d{2}$",
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"day",
"open",
"close"
],
"type": "object"
},
"maxItems": 14,
"type": "array"
},
"openingHoursTruncated": {
"description": "True when the salon has more than 14 opening-hour rows",
"type": "boolean"
},
"phone": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"postalCode": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"state": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"street": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"timezone": {
"anyOf": [
{
"maxLength": 64,
"type": "string"
},
{
"type": "null"
}
]
},
"website": {
"anyOf": [
{
"maxLength": 2048,
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"name",
"currency",
"defaultLocale",
"timezone",
"countryCode",
"firstDayOfTheWeek",
"appointmentDuration",
"phone",
"street",
"city",
"state",
"postalCode",
"website",
"openingHours",
"openingHoursTruncated"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "Business settings of the salon; null when not found. Organization ids, payment configuration, credentials, integrations, reminders, staff data and internal metadata are excluded."
},
"status": {
"enum": [
"found",
"not-found"
],
"type": "string"
}
},
"required": [
"status",
"salon"
],
"type": "object"
}
},
{
"description": "Use this when someone asks when their hair salon has free appointment slots or the next opening. Returns, per day, how many online-booking slots are open plus the first start and last end time, for the next 14 days that have openings (no client or stylist names). Not for making a booking.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"salonId": {
"description": "Id of one of the user's salons, as the salon list returns it (24 lowercase hex characters)",
"pattern": "^[0-9a-f]{24}$",
"type": "string"
}
},
"required": [
"salonId"
],
"type": "object"
},
"name": "get_salon_availability",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"days": {
"description": "One row per day with open online-booking slots inside the salon's booking window, in date order. Slot counts and times only; who holds a booked time is never exposed.",
"items": {
"additionalProperties": false,
"properties": {
"day": {
"anyOf": [
{
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
{
"type": "null"
}
]
},
"firstSlot": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
],
"description": "Start time of the first open slot that day"
},
"lastSlot": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
],
"description": "End time of the last open slot that day"
},
"slotCount": {
"maximum": 1440,
"minimum": 0,
"type": "integer"
}
},
"required": [
"day",
"slotCount",
"firstSlot",
"lastSlot"
],
"type": "object"
},
"maxItems": 14,
"type": "array"
},
"status": {
"enum": [
"found",
"salon-not-found",
"no-availability"
],
"type": "string"
}
},
"required": [
"status",
"days"
],
"type": "object"
}
},
{
"description": "Use this when someone asks how many appointments are booked on a day or in a period, how many were canceled or no-shows, or when a client is booked. Returns appointments across all the user's salons, or just one, with id, client and salon ids, times and status for any date window, latest first, up to 100. Not for the services inside an appointment.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"clientId": {
"description": "Only appointments of this client, by an id from the client list",
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"endTime": {
"description": "Only appointments ending before this ISO 8601 time",
"maxLength": 32,
"type": "string"
},
"limit": {
"description": "Maximum number of appointments to return (default 20, maximum 100)",
"exclusiveMinimum": 0,
"maximum": 100,
"type": "integer"
},
"salonId": {
"description": "Only appointments at this salon, by an id from the user's salon list; every salon when absent",
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"startTime": {
"description": "Only appointments starting at or after this ISO 8601 time",
"maxLength": 32,
"type": "string"
}
},
"type": "object"
},
"name": "list_appointments",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"appointments": {
"description": "Bookings, latest start first. Free-text notes, reminders, contact details, organization data and payment details are excluded.",
"items": {
"additionalProperties": false,
"properties": {
"clientId": {
"anyOf": [
{
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
{
"type": "null"
}
]
},
"endTime": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"salonId": {
"anyOf": [
{
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
{
"type": "null"
}
]
},
"startTime": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"status": {
"anyOf": [
{
"enum": [
"SCHEDULED",
"CLIENT_ARRIVED",
"NO_SHOW",
"CANCELED"
],
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"clientId",
"salonId",
"startTime",
"endTime",
"status"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"count": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"hasMore": {
"type": "boolean"
}
},
"required": [
"appointments",
"count",
"hasMore"
],
"type": "object"
}
},
{
"description": "Use this when someone asks when their salon is closed or has extra opening hours, or when a stylist or chair is blocked for holidays, vacations, sick days, training or meetings. Returns blocks and extra openings with salon, type, scope, effect, all-day flag and times for all salons unless one is given, earliest first (no titles or notes). Not for client appointments.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"endTime": {
"description": "Only events ending before this ISO 8601 time",
"maxLength": 32,
"type": "string"
},
"limit": {
"description": "Maximum number of calendar events to return (default 20, maximum 100)",
"exclusiveMinimum": 0,
"maximum": 100,
"type": "integer"
},
"salonId": {
"description": "Only blocks for this salon, by an id from the user's salon list; every salon when absent",
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"startTime": {
"description": "Only events starting at or after this ISO 8601 time",
"maxLength": 32,
"type": "string"
}
},
"type": "object"
},
"name": "list_calendar_events",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"count": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"events": {
"description": "Closures, days off and extra openings, earliest first. Free-text titles and notes, chair ids, staff ids, organization data and private reasons are excluded.",
"items": {
"additionalProperties": false,
"properties": {
"allDay": {
"type": "boolean"
},
"effect": {
"anyOf": [
{
"enum": [
"BLOCK",
"OPEN"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "BLOCK removes bookable time; OPEN adds hours on a normally closed time"
},
"endTime": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"salonId": {
"anyOf": [
{
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
{
"type": "null"
}
]
},
"scope": {
"anyOf": [
{
"enum": [
"CHAIR",
"PROVIDER",
"SALON"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "SALON: the whole salon; PROVIDER: one or more stylists; CHAIR: one chair"
},
"startTime": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"type": {
"anyOf": [
{
"enum": [
"COURSE",
"MEETING",
"VACATION",
"SICK",
"HOLIDAY",
"MAINTENANCE",
"OTHER"
],
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"salonId",
"type",
"scope",
"effect",
"allDay",
"startTime",
"endTime"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"hasMore": {
"type": "boolean"
}
},
"required": [
"events",
"count",
"hasMore"
],
"type": "object"
}
},
{
"description": "Use this when someone asks who their clients are, or needs a client id to look up that person's appointments, payments or quotes. Returns up to 100 clients (20 by default) across all the user's salons, or just one, with id, name, salon and last edit time, in no particular order and without a name search. Not for a client's email, phone or notes.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"limit": {
"description": "Maximum number of clients to return (default 20, maximum 100)",
"exclusiveMinimum": 0,
"maximum": 100,
"type": "integer"
},
"salonId": {
"description": "Only clients of this salon, by an id from the user's salon list; every salon when absent",
"pattern": "^[0-9a-f]{24}$",
"type": "string"
}
},
"type": "object"
},
"name": "list_clients",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"clients": {
"description": "Clients with the ids needed to look up their bookings, payments and quotes. Email, phone, address, operator notes, service and colour history, organization data and other profile fields are excluded.",
"items": {
"additionalProperties": false,
"properties": {
"id": {
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"lastEditTime": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"maxLength": 200,
"type": "string"
},
"salonId": {
"anyOf": [
{
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"name",
"salonId",
"lastEditTime"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"count": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"hasMore": {
"type": "boolean"
}
},
"required": [
"clients",
"count",
"hasMore"
],
"type": "object"
}
},
{
"description": "Use this when someone asks what payments their salon took, whether a client paid, or how much came in over a period. Returns payment records with id, client and salon ids, date, amount, currency and status for any date window and all salons unless one is given, newest first, up to 100 (no card details). Not for charging or refunding a client.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"clientId": {
"description": "Only payments from this client, by an id from the client list",
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"endTime": {
"description": "Only payments ending before this ISO 8601 time",
"maxLength": 32,
"type": "string"
},
"limit": {
"description": "Maximum number of payments to return (default 20, maximum 100)",
"exclusiveMinimum": 0,
"maximum": 100,
"type": "integer"
},
"salonId": {
"description": "Only payments at this salon, by an id from the user's salon list; every salon when absent",
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"startTime": {
"description": "Only payments starting at or after this ISO 8601 time",
"maxLength": 32,
"type": "string"
}
},
"type": "object"
},
"name": "list_payments",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"count": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"hasMore": {
"type": "boolean"
},
"payments": {
"description": "Payment records, newest first; this tool cannot charge, refund or move funds. Cardholder data, processor and customer ids, credentials, errors, discounts, staff commission splits, operator notes and organization data are excluded.",
"items": {
"additionalProperties": false,
"properties": {
"amount": {
"type": [
"number",
"null"
]
},
"clientId": {
"anyOf": [
{
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
{
"type": "null"
}
]
},
"currency": {
"anyOf": [
{
"pattern": "^[A-Z]{3}$",
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"salonId": {
"anyOf": [
{
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
{
"type": "null"
}
]
},
"startTime": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"status": {
"anyOf": [
{
"enum": [
"CANCELED",
"FAILED",
"SUCCEEDED"
],
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"clientId",
"salonId",
"startTime",
"amount",
"currency",
"status"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
}
},
"required": [
"payments",
"count",
"hasMore"
],
"type": "object"
}
},
{
"description": "Use this when someone asks which stylists or hairdressers work at their salon or can be booked. Returns up to 100 hairdresser display names from the organization that owns the salon (no contact details or schedules). Not for stylists' days off.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"salonId": {
"description": "Id of one of the user's salons, as the salon list returns it (24 lowercase hex characters)",
"pattern": "^[0-9a-f]{24}$",
"type": "string"
}
},
"required": [
"salonId"
],
"type": "object"
},
"name": "list_providers",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"count": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"hasMore": {
"type": "boolean"
},
"providers": {
"description": "Display names of organization members with the hairdresser role; roles are organization-wide, not per salon. Staff ids, contact details, avatar URLs, role records, schedules and organization data are excluded.",
"items": {
"additionalProperties": false,
"properties": {
"displayName": {
"maxLength": 200,
"type": "string"
}
},
"required": [
"displayName"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"status": {
"enum": [
"found",
"salon-not-found"
],
"type": "string"
}
},
"required": [
"status",
"providers",
"count",
"hasMore"
],
"type": "object"
}
},
{
"description": "Use this when someone asks about price quotes given to salon clients, such as which are pending, approved or rejected. Returns quotes with id, client and salon ids, status and date for all salons unless one is given, newest first, up to 100; the status filter applies within that page. Not for quote amounts or line items.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"clientId": {
"description": "Only quotes for this client, by an id from the client list",
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"endTime": {
"description": "Only quotes ending before this ISO 8601 time",
"maxLength": 32,
"type": "string"
},
"limit": {
"description": "Maximum number of quotes to return (default 20, maximum 100)",
"exclusiveMinimum": 0,
"maximum": 100,
"type": "integer"
},
"salonId": {
"description": "Only quotes from this salon, by an id from the user's salon list; every salon when absent",
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"startTime": {
"description": "Only quotes starting at or after this ISO 8601 time",
"maxLength": 32,
"type": "string"
},
"status": {
"description": "Only quotes with this status: DRAFT, PENDING, REJECTED or APPROVED. Applied within the fetched page of newest quotes",
"enum": [
"DRAFT",
"PENDING",
"REJECTED",
"APPROVED"
],
"type": "string"
}
},
"type": "object"
},
"name": "list_quotes",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"count": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"hasMore": {
"type": "boolean"
},
"quotes": {
"description": "Quotes, newest first. Free-text notes, quoted line details and amounts, discounts, contact details and organization data are excluded.",
"items": {
"additionalProperties": false,
"properties": {
"clientId": {
"anyOf": [
{
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"salonId": {
"anyOf": [
{
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
{
"type": "null"
}
]
},
"startTime": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"status": {
"anyOf": [
{
"enum": [
"DRAFT",
"PENDING",
"REJECTED",
"APPROVED"
],
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"clientId",
"salonId",
"status",
"startTime"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
}
},
"required": [
"quotes",
"count",
"hasMore"
],
"type": "object"
}
},
{
"description": "Use this when someone asks which hair salons they run in HairDora, or a salon's id is needed. Returns up to 100 salons with id, name, currency, default language and last edit time. Not for a salon's address, phone or opening hours.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "list_salons",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"count": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"hasMore": {
"description": "True when the organization has more than 100 salons",
"type": "boolean"
},
"salons": {
"description": "Salons in the signed-in organization. Contact, address, payment, organization and configuration fields are excluded.",
"items": {
"additionalProperties": false,
"properties": {
"currency": {
"anyOf": [
{
"pattern": "^[A-Z]{3}$",
"type": "string"
},
{
"type": "null"
}
]
},
"defaultLocale": {
"anyOf": [
{
"maxLength": 16,
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"lastEditTime": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"maxLength": 200,
"type": "string"
}
},
"required": [
"id",
"name",
"currency",
"defaultLocale",
"lastEditTime"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
}
},
"required": [
"salons",
"count",
"hasMore"
],
"type": "object"
}
},
{
"description": "Use this when someone asks what their salon charges for a cut, colour, blow-dry or other service, or what services it offers. Returns services with id, name, price and salon for all their salons unless one is given, 50 by default and up to 100. Not for what a particular client had done.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"limit": {
"description": "Maximum number of services to return (default 50, maximum 100)",
"exclusiveMinimum": 0,
"maximum": 100,
"type": "integer"
},
"salonId": {
"description": "Only services of this salon, by an id from the user's salon list; every salon when absent",
"pattern": "^[0-9a-f]{24}$",
"type": "string"
}
},
"type": "object"
},
"name": "list_services",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"count": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"hasMore": {
"type": "boolean"
},
"services": {
"description": "Services the salon offers, with prices. Internal metadata and organization data are excluded.",
"items": {
"additionalProperties": false,
"properties": {
"id": {
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"name": {
"maxLength": 200,
"type": "string"
},
"price": {
"description": "Price in the salon's currency",
"type": [
"number",
"null"
]
},
"salonId": {
"anyOf": [
{
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"name",
"price",
"salonId"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
}
},
"required": [
"services",
"count",
"hasMore"
],
"type": "object"
}
},
{
"description": "Open HairDora Salon Scheduling to browse your salons, upcoming appointment previews, service prices and booking availability interactively. Read-only; cannot book, cancel or charge. The sidebar excludes client names, contact details and private notes.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"type": "object"
},
"name": "open_hairdora",
"outputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"items": {
"items": {
"additionalProperties": false,
"properties": {
"defaultLocale": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"locales": {
"items": {
"maxLength": 32,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"logoUrl": {
"anyOf": [
{
"maxLength": 2048,
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"maxLength": 200,
"type": "string"
},
"subtitle": {
"maxLength": 300,
"type": "string"
}
},
"required": [
"id",
"name",
"subtitle",
"logoUrl",
"defaultLocale",
"locales"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"truncated": {
"type": "boolean"
}
},
"required": [
"items",
"truncated"
],
"type": "object"
}
},
{
"description": "Use this when someone wants a quick overview or dashboard of one hair salon. Returns an overview card with the salon's details, a client count, the next 8 upcoming appointments with time, status and number of services, and up to 12 services with prices (no client names or contact details). Not for one specific booking.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"salonId": {
"description": "Id of one of the user's salons, as the salon list returns it (24 lowercase hex characters)",
"pattern": "^[0-9a-f]{24}$",
"type": "string"
}
},
"required": [
"salonId"
],
"type": "object"
},
"name": "show_salon_overview",
"outputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"appointmentCount": {
"maximum": 8,
"minimum": 0,
"type": "integer"
},
"appointmentCountIsLowerBound": {
"type": "boolean"
},
"appointments": {
"description": "The next upcoming appointments, earliest first",
"items": {
"additionalProperties": false,
"properties": {
"serviceCount": {
"maximum": 10000,
"minimum": 0,
"type": "integer"
},
"startTime": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"status": {
"anyOf": [
{
"enum": [
"SCHEDULED",
"CLIENT_ARRIVED",
"NO_SHOW",
"CANCELED"
],
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"startTime",
"status",
"serviceCount"
],
"type": "object"
},
"maxItems": 8,
"type": "array"
},
"clientCount": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"clientCountIsLowerBound": {
"type": "boolean"
},
"salon": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"currency": {
"anyOf": [
{
"pattern": "^[A-Z]{3}$",
"type": "string"
},
{
"type": "null"
}
]
},
"defaultLocale": {
"anyOf": [
{
"maxLength": 16,
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"pattern": "^[0-9a-f]{24}$",
"type": "string"
},
"name": {
"maxLength": 200,
"type": "string"
},
"timezone": {
"anyOf": [
{
"maxLength": 64,
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"name",
"currency",
"defaultLocale",
"timezone"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "Salon metadata; null when not found. The overview excludes client names, contact details, client and appointment ids, notes, organization data, staff ids, payment data and service history."
},
"serviceCount": {
"maximum": 12,
"minimum": 0,
"type": "integer"
},
"serviceCountIsLowerBound": {
"type": "boolean"
},
"services": {
"items": {
"additionalProperties": false,
"properties": {
"name": {
"maxLength": 200,
"type": "string"
},
"price": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"name",
"price"
],
"type": "object"
},
"maxItems": 12,
"type": "array"
}
},
"required": [
"salon",
"clientCount",
"clientCountIsLowerBound",
"appointmentCount",
"appointmentCountIsLowerBound",
"serviceCount",
"serviceCountIsLowerBound",
"services",
"appointments"
],
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:90b835394398d48f6bc47ae0cafcc41ec4c9230b5a7f4d39834baf478e629af5 | sha256sum