Waitwhile MCP by usefulapi

Read Waitwhile visits, bookings, customers, services and analytics; add, update and cancel visits.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
93%
Naming quality
99%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • LOWTool 'waitwhile_first_available_slots' name length outside 3-30 rangein waitwhile_first_available_slots
  • LOWTool 'waitwhile_resources_availability' name length outside 3-30 rangein waitwhile_resources_availability

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~7,804Tokens (tool definitions)
~2.0 KBTypical response size
Significant attention impact (6.10% 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": {
    "waitwhile": {
      "url": "https://waitwhile.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://waitwhile.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (29)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢waitwhile_list_locations(external_id, country_code, desc, limit, start_after)

List the account's locations (businesses/sites): id, name, short name, address, time zone, opening hours and waitlist/booking settings. Use the ids to filter visits, services and resources. GET /locations.

Input Schema

{
  "type": "object",
  "properties": {
    "external_id": {
      "description": "Only the location with this external id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "country_code": {
      "description": "Two-letter country code.",
      "type": "string",
      "minLength": 2,
      "maxLength": 2
    },
    "desc": {
      "description": "Newest first.",
      "type": "boolean"
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "start_after": {
      "description": "Cursor: pass the previous reply's next_start_after to get the next page.",
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_get_location(location)

One location by id or short name (the part of its public Waitwhile URL). GET /locations/{shortNameOrId}.

Input Schema

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Location id or short name."
    }
  },
  "required": [
    "location"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_list_location_status(limit, start_after)

Live status of every location: open/closed, number of people waiting and being served, current estimated wait time, and booking counters. GET /location-status.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "start_after": {
      "description": "Cursor: pass the previous reply's next_start_after to get the next page.",
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_get_location_status(location_id)

Live status of one location: open/closed, waiting and serving counts, estimated wait. GET /location-status/{locationId}.

Input Schema

{
  "type": "object",
  "properties": {
    "location_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Location id."
    }
  },
  "required": [
    "location_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_list_visits(location_id, state, tag, customer_id, external_customer_id, ...)

List visits: waitlist entries (people in line) and bookings (appointments), with customer, state (PENDING, DRAFT, BOOKED, WAITING, SERVING, COMPLETE), tags (e.g. NO-SHOW, CANCELLED, ARRIVED), services, resources, party size, position and timestamps. Filter by location, state, tag, customer, service, resource, booking date (local time) or created/updated date. Cursor-paged. Contains customer contact details. GET /visits.

Input Schema

{
  "type": "object",
  "properties": {
    "location_id": {
      "description": "Only visits at this location.",
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "state": {
      "type": "string",
      "enum": [
        "PENDING",
        "DRAFT",
        "BOOKED",
        "WAITING",
        "SERVING",
        "COMPLETE"
      ]
    },
    "tag": {
      "type": "string",
      "enum": [
        "NO-SHOW",
        "CANCELLED",
        "REMOVED",
        "ALERTED",
        "ARRIVED",
        "DELAYED",
        "CONFIRMED",
        "EXPIRED",
        "FLAGGED",
        "IMPORTED",
        "PRIORITIZED",
        "CAPACITY",
        "REJECTED",
        "QUICK"
      ]
    },
    "customer_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "external_customer_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "service_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "resource_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "from_booking_date": {
      "description": "Bookings starting at or after this local date-time, YYYY-MM-DDThh:mm.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$"
    },
    "to_booking_date": {
      "description": "Bookings starting at or before this local date-time, YYYY-MM-DDThh:mm.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$"
    },
    "from_date": {
      "description": "Visits created from this date-time (ISO 8601 or epoch ms).",
      "type": "string"
    },
    "to_date": {
      "description": "Visits created up to this date-time (ISO 8601 or epoch ms).",
      "type": "string"
    },
    "desc": {
      "description": "Newest first.",
      "type": "boolean"
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "start_after": {
      "description": "Cursor: pass the previous reply's next_start_after to get the next page.",
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_search_visits(q, location_id, state, tag, exclude_tags, ...)

Search visits by a prefix match on customer name, phone, e-mail or customer id, optionally filtered by location, state, tag and excluded tags. Page-numbered. Contains customer contact details. GET /visits/search.

Input Schema

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Prefix match on name, phone, e-mail or customer id."
    },
    "location_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "state": {
      "type": "string",
      "enum": [
        "PENDING",
        "DRAFT",
        "BOOKED",
        "WAITING",
        "SERVING",
        "COMPLETE"
      ]
    },
    "tag": {
      "type": "string",
      "enum": [
        "NO-SHOW",
        "CANCELLED",
        "REMOVED",
        "ALERTED",
        "ARRIVED",
        "DELAYED",
        "CONFIRMED",
        "EXPIRED",
        "FLAGGED",
        "IMPORTED",
        "PRIORITIZED",
        "CAPACITY",
        "REJECTED",
        "QUICK"
      ]
    },
    "exclude_tags": {
      "description": "Leave out visits carrying any of these tags.",
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "NO-SHOW",
          "CANCELLED",
          "REMOVED",
          "ALERTED",
          "ARRIVED",
          "DELAYED",
          "CONFIRMED",
          "EXPIRED",
          "FLAGGED",
          "IMPORTED",
          "PRIORITIZED",
          "CAPACITY",
          "REJECTED",
          "QUICK"
        ]
      }
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "page": {
      "description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
      "type": "integer",
      "minimum": 1,
      "maximum": 1000000
    }
  },
  "required": [
    "q"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_get_visit(visit_id)

One visit (waitlist entry or booking) by id: customer, state, tags, services, resources, party size, position, estimated wait and all timestamps. GET /visits/{visitId}.

Input Schema

{
  "type": "object",
  "properties": {
    "visit_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Visit id."
    }
  },
  "required": [
    "visit_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_list_booking_slots(location_id, from_date, to_date, service_ids, resource_ids, ...)

Booking slots of a location for a date range with the free spots per resource and service, so you can see when an appointment can be booked. Dates are local to the location, YYYY-MM-DDThh:mm. GET /visits/availability.

Input Schema

{
  "type": "object",
  "properties": {
    "location_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Location id."
    },
    "from_date": {
      "description": "Local start, YYYY-MM-DDThh:mm.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$"
    },
    "to_date": {
      "description": "Local end, YYYY-MM-DDThh:mm.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$"
    },
    "service_ids": {
      "description": "Only slots for these services.",
      "minItems": 1,
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      }
    },
    "resource_ids": {
      "description": "Only slots for these resources.",
      "minItems": 1,
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      }
    },
    "service_duration": {
      "description": "Service duration in seconds, to size the slots.",
      "type": "integer",
      "minimum": 60,
      "maximum": 86400
    },
    "show_min_spots": {
      "description": "Only slots with at least this many free spots.",
      "type": "integer",
      "minimum": 1,
      "maximum": 1000
    }
  },
  "required": [
    "location_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_first_available_slots(location_id, from_date, to_date, max_num_slots, party_size, ...)

The first available booking slots of a location (optionally for a party size, services and resources) from a date. Use it to propose appointment times. GET /visits/first-available-slots.

Input Schema

{
  "type": "object",
  "properties": {
    "location_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Location id."
    },
    "from_date": {
      "description": "Local start, YYYY-MM-DDThh:mm.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$"
    },
    "to_date": {
      "description": "Local end, YYYY-MM-DDThh:mm.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$"
    },
    "max_num_slots": {
      "description": "Max number of slots to return.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "party_size": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "service_ids": {
      "minItems": 1,
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      }
    },
    "resource_ids": {
      "minItems": 1,
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      }
    },
    "service_duration": {
      "description": "Service duration in seconds.",
      "type": "integer",
      "minimum": 60,
      "maximum": 86400
    }
  },
  "required": [
    "location_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_list_customers(location_id, external_id, from_date, to_date, desc, ...)

List customers (name, phone, e-mail, tags, last visit per location, created/updated). Cursor-paged, 20 per page by default; filter by location, external id or created/updated date. Contains personal data. GET /customers.

Input Schema

{
  "type": "object",
  "properties": {
    "location_id": {
      "description": "Only customers with visits at this location.",
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "external_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "from_date": {
      "type": "string",
      "description": "ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds."
    },
    "to_date": {
      "type": "string",
      "description": "ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds."
    },
    "desc": {
      "description": "Newest first.",
      "type": "boolean"
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "start_after": {
      "description": "Cursor: pass the previous reply's next_start_after to get the next page.",
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_search_customers(q, location_id, state, tag, limit, ...)

Search customers by a prefix match on name, phone, e-mail or customer id; optionally narrowed by location, visit state or tag. Page-numbered. Contains personal data. GET /customers/search.

Input Schema

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Prefix match on name, phone, e-mail or customer id."
    },
    "location_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "state": {
      "type": "string",
      "enum": [
        "PENDING",
        "DRAFT",
        "BOOKED",
        "WAITING",
        "SERVING",
        "COMPLETE"
      ]
    },
    "tag": {
      "type": "string",
      "enum": [
        "NO-SHOW",
        "CANCELLED",
        "REMOVED",
        "ALERTED",
        "ARRIVED",
        "DELAYED",
        "CONFIRMED",
        "EXPIRED",
        "FLAGGED",
        "IMPORTED",
        "PRIORITIZED",
        "CAPACITY",
        "REJECTED",
        "QUICK"
      ]
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "page": {
      "description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
      "type": "integer",
      "minimum": 1,
      "maximum": 1000000
    }
  },
  "required": [
    "q"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_get_customer(customer_id)

One customer by id: contact details, tags, per-location state and last visit. Contains personal data. GET /customers/{customerId}.

Input Schema

{
  "type": "object",
  "properties": {
    "customer_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Customer id."
    }
  },
  "required": [
    "customer_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_list_customer_notes(customer_id)

The staff notes recorded on a customer (content, author, visit and location, timestamps). GET /customers/{customerId}/notes.

Input Schema

{
  "type": "object",
  "properties": {
    "customer_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Customer id."
    }
  },
  "required": [
    "customer_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_list_services(location_id, q, external_id, limit, start_after, ...)

List services (what customers book or queue for): name, duration, price, locations, resources and category structure. GET /services.

Input Schema

{
  "type": "object",
  "properties": {
    "location_id": {
      "description": "Only items offered at these locations.",
      "minItems": 1,
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      }
    },
    "q": {
      "description": "Prefix match on name or display name.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "external_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "start_after": {
      "description": "Cursor: pass the previous reply's next_start_after to get the next page.",
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    },
    "is_category": {
      "description": "Only service categories (true) or only services (false).",
      "type": "boolean"
    },
    "parent_id": {
      "description": "Only children of this category.",
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_get_service(service_id)

One service by id. GET /services/{serviceId}.

Input Schema

{
  "type": "object",
  "properties": {
    "service_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Service id."
    }
  },
  "required": [
    "service_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_list_resources(location_id, q, external_id, limit, start_after, ...)

List resources — the people, rooms, tables or equipment that serve customers: name, locations, services, availability flag and category structure. GET /resources.

Input Schema

{
  "type": "object",
  "properties": {
    "location_id": {
      "description": "Only items offered at these locations.",
      "minItems": 1,
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      }
    },
    "q": {
      "description": "Prefix match on name or display name.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "external_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "start_after": {
      "description": "Cursor: pass the previous reply's next_start_after to get the next page.",
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    },
    "is_category": {
      "description": "Only resource categories (true) or only resources (false).",
      "type": "boolean"
    },
    "parent_id": {
      "description": "Only children of this category.",
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "email": {
      "description": "Only the resource with this e-mail.",
      "type": "string",
      "minLength": 3,
      "maxLength": 200
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_get_resource(resource_id)

One resource by id. GET /resources/{resourceId}.

Input Schema

{
  "type": "object",
  "properties": {
    "resource_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Resource id."
    }
  },
  "required": [
    "resource_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_resources_availability(location_id, date, resource_ids)

Working hours/availability of a location's resources on a date (e.g. who is working today). GET /resources/availability.

Input Schema

{
  "type": "object",
  "properties": {
    "location_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Location id."
    },
    "date": {
      "description": "Date (yyyy-mm-dd) or ISO 8601 date-time; default today.",
      "type": "string"
    },
    "resource_ids": {
      "description": "Only these resources.",
      "minItems": 1,
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      }
    }
  },
  "required": [
    "location_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_list_data_fields(location_id, q, external_id, limit, start_after)

List the custom data fields (intake/booking form questions) with type, options and where they apply. Use the ids to read answers on visits. GET /data-fields.

Input Schema

{
  "type": "object",
  "properties": {
    "location_id": {
      "description": "Only items offered at these locations.",
      "minItems": 1,
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      }
    },
    "q": {
      "description": "Prefix match on name or display name.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "external_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "start_after": {
      "description": "Cursor: pass the previous reply's next_start_after to get the next page.",
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_get_data_field(data_field_id)

One data field by id. GET /data-fields/{dataFieldId}.

Input Schema

{
  "type": "object",
  "properties": {
    "data_field_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Data field id."
    }
  },
  "required": [
    "data_field_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_list_users(location_id, role, q, external_id, limit, ...)

List the staff users of the account: name, e-mail, roles, locations. Password data and tokens are never returned. GET /users.

Input Schema

{
  "type": "object",
  "properties": {
    "location_id": {
      "description": "Only users with access to these locations.",
      "minItems": 1,
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      }
    },
    "role": {
      "description": "Only users with these roles.",
      "minItems": 1,
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 50
      }
    },
    "q": {
      "description": "Prefix match on name or e-mail.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "external_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "start_after": {
      "description": "Cursor: pass the previous reply's next_start_after to get the next page.",
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_list_messages(location_id, visit_id, customer_id, external_customer_id, state, ...)

List the SMS/e-mail messages Waitwhile sent to and received from customers: channel, recipient, body, delivery state (PENDING, BLOCKED, FAILED, DELIVERED, UNCONFIRMED, RECEIVED) and error. Filter by location, visit, customer, state or date. Contains personal data. This only reads; it cannot send. GET /messages.

Input Schema

{
  "type": "object",
  "properties": {
    "location_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "visit_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "customer_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "external_customer_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "state": {
      "type": "string",
      "enum": [
        "PENDING",
        "BLOCKED",
        "FAILED",
        "DELIVERED",
        "UNCONFIRMED",
        "RECEIVED"
      ]
    },
    "from_date": {
      "type": "string",
      "description": "ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds."
    },
    "to_date": {
      "type": "string",
      "description": "ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds."
    },
    "desc": {
      "description": "Newest first.",
      "type": "boolean"
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "start_after": {
      "description": "Cursor: pass the previous reply's next_start_after to get the next page.",
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_get_message(message_id)

One message by id. Contains personal data. GET /messages/{messageId}.

Input Schema

{
  "type": "object",
  "properties": {
    "message_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Message id."
    }
  },
  "required": [
    "message_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_visit_analytics(location_id, from_date, to_date)

Aggregated visit statistics for a period: visits, waitlisted, bookings, served, no-shows, cancellations, wait and serve duration quantiles, and breakdowns by location, resource, service, party size, user, day of week and hour of day. GET /analytics/visits (JSON).

Input Schema

{
  "type": "object",
  "properties": {
    "location_id": {
      "description": "Only this location (default: all).",
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "from_date": {
      "description": "Period start (ISO 8601 or epoch ms).",
      "type": "string"
    },
    "to_date": {
      "description": "Period end (ISO 8601 or epoch ms).",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢waitwhile_list_audit_entries(type, event, entity_id, location_id, from_date, ...)

The account's audit log: who changed what and when (visits, customers, locations, services, resources, users, messages). Filter by type, event, entity, location or date. GET /audit-entries.

Input Schema

{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "enum": [
        "ACCOUNT",
        "CUSTOMER",
        "DATA-FIELD",
        "MESSAGE",
        "LOCATION",
        "RESOURCE",
        "SERVICE",
        "USER",
        "VISIT"
      ]
    },
    "event": {
      "description": "Audit event type.",
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "entity_id": {
      "description": "Id of the changed object.",
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "location_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "from_date": {
      "type": "string",
      "description": "ISO 8601 date or date-time (e.g. 2026-10-01 or 2026-10-01T00:00:00Z)."
    },
    "to_date": {
      "type": "string",
      "description": "ISO 8601 date or date-time (e.g. 2026-10-01 or 2026-10-01T00:00:00Z)."
    },
    "desc": {
      "description": "Newest first.",
      "type": "boolean"
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "start_after": {
      "description": "Cursor: pass the previous reply's next_start_after to get the next page.",
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴waitwhile_create_visit(location_id, name, first_name, last_name, phone, ...)

WRITE: create ONE visit at a location. Without a date it adds the customer to the waitlist; with a local date-time (YYYY-MM-DDThh:mm) it creates a booking. Needs a location and at least a name, phone or e-mail. Not idempotent: calling it twice creates two visits. Visit notes are not supported here (the field is deprecated): use waitwhile_add_customer_note. By default the request asks Waitwhile to suppress the customer message; this may only stop the immediate confirmation, and scheduled reminders/follow-ups can still go out per the location's settings. With send_notifications=true Waitwhile may text/e-mail this ONE customer. POST /visits.

Input Schema

{
  "type": "object",
  "properties": {
    "location_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Location id (see waitwhile_list_locations)."
    },
    "name": {
      "description": "Customer name.",
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "first_name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "last_name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "phone": {
      "description": "Customer phone, E.164 (+16005551234).",
      "type": "string",
      "pattern": "^\\+[1-9]\\d{6,14}$"
    },
    "email": {
      "description": "Customer e-mail.",
      "type": "string",
      "maxLength": 100,
      "format": "email",
      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    },
    "party_size": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "date": {
      "description": "Booking start in the location's local time, YYYY-MM-DDThh:mm. Omit to join the waitlist.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$"
    },
    "duration": {
      "description": "Booking duration in seconds.",
      "type": "integer",
      "minimum": 0,
      "maximum": 86400
    },
    "service_ids": {
      "description": "Services the customer wants.",
      "minItems": 1,
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      }
    },
    "resource_ids": {
      "description": "Preferred resources (staff, rooms).",
      "minItems": 1,
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      }
    },
    "send_notifications": {
      "description": "Default false: the request asks Waitwhile not to send the immediate confirmation/status message. This may not stop everything: scheduled reminders and follow-ups can still go out according to the location's own settings. Set true to let Waitwhile send its normal messages to the customer.",
      "type": "boolean"
    }
  },
  "required": [
    "location_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴waitwhile_update_visit(visit_id, state, add_tags, remove_tags, date, ...)

WRITE: change ONE visit — its state (e.g. WAITING to SERVING to COMPLETE, or BOOKED), add/remove tags (e.g. ARRIVED, CONFIRMED, NO-SHOW), booking date/duration or party size. Only the fields you pass change. By default the request asks Waitwhile to suppress the customer message; this may only stop the immediate status message, and scheduled reminders/follow-ups can still go out per the location's settings. With send_notifications=true Waitwhile may text/e-mail this ONE customer. Use waitwhile_cancel_visit to cancel. POST /visits/{visitId}.

Input Schema

{
  "type": "object",
  "properties": {
    "visit_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Visit id."
    },
    "state": {
      "description": "New state.",
      "type": "string",
      "enum": [
        "PENDING",
        "DRAFT",
        "BOOKED",
        "WAITING",
        "SERVING",
        "COMPLETE"
      ]
    },
    "add_tags": {
      "description": "Tags to add.",
      "minItems": 1,
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "NO-SHOW",
          "CANCELLED",
          "REMOVED",
          "ALERTED",
          "ARRIVED",
          "DELAYED",
          "CONFIRMED",
          "EXPIRED",
          "FLAGGED",
          "IMPORTED",
          "PRIORITIZED",
          "CAPACITY",
          "REJECTED",
          "QUICK"
        ]
      }
    },
    "remove_tags": {
      "description": "Tags to remove.",
      "minItems": 1,
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "NO-SHOW",
          "CANCELLED",
          "REMOVED",
          "ALERTED",
          "ARRIVED",
          "DELAYED",
          "CONFIRMED",
          "EXPIRED",
          "FLAGGED",
          "IMPORTED",
          "PRIORITIZED",
          "CAPACITY",
          "REJECTED",
          "QUICK"
        ]
      }
    },
    "date": {
      "description": "New booking start, local time YYYY-MM-DDThh:mm.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$"
    },
    "duration": {
      "description": "New booking duration in seconds.",
      "type": "integer",
      "minimum": 0,
      "maximum": 86400
    },
    "party_size": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "send_notifications": {
      "description": "Default false: the request asks Waitwhile not to send the immediate confirmation/status message. This may not stop everything: scheduled reminders and follow-ups can still go out according to the location's own settings. Set true to let Waitwhile send its normal messages to the customer.",
      "type": "boolean"
    }
  },
  "required": [
    "visit_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴waitwhile_cancel_visit(visit_id, send_notifications)

WRITE: cancel ONE visit (a waitlist entry or booking). Waitwhile sets its state to COMPLETE and adds the CANCELLED tag; the visit is kept, not deleted. By default the request asks Waitwhile to suppress the customer message; this may only stop the immediate cancellation notice, and scheduled reminders/follow-ups can still go out per the location's settings. With send_notifications=true Waitwhile may text/e-mail this ONE customer. POST /visits/{visitId}/cancel.

Input Schema

{
  "type": "object",
  "properties": {
    "visit_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Visit id."
    },
    "send_notifications": {
      "description": "Default false: the request asks Waitwhile not to send the immediate confirmation/status message. This may not stop everything: scheduled reminders and follow-ups can still go out according to the location's own settings. Set true to let Waitwhile send its normal messages to the customer.",
      "type": "boolean"
    }
  },
  "required": [
    "visit_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡waitwhile_add_customer_note(customer_id, content, location_id, visit_id)

WRITE: add one staff note to a customer's record (optionally tied to a visit and location). Adds only; nothing is edited or sent to the customer. POST /customers/{customerId}/notes.

Input Schema

{
  "type": "object",
  "properties": {
    "customer_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Customer id."
    },
    "content": {
      "type": "string",
      "minLength": 1,
      "maxLength": 1000,
      "description": "The note text."
    },
    "location_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "visit_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    }
  },
  "required": [
    "customer_id",
    "content"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded29 tools