A Model Context Protocol (MCP) server for interacting with Microsoft 365 and Office services through the Graph API
Waitwhile MCP by usefulapi is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Read Waitwhile visits, bookings, customers, services and analytics; add, update and cancel visits.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http waitwhile-mcp-by-usefulapi https://waitwhile.usefulapi.io/mcp
# 2 — ask your agent for something these tools do
# waitwhile_list_locations, waitwhile_get_location, waitwhile_list_location_status and 26 more
Waitwhile MCP by usefulapi costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http waitwhile-mcp-by-usefulapi https://waitwhile.usefulapi.io/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
29 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| external_id | string | no | Only the location with this external id. |
| country_code | string | no | Two-letter country code. |
| desc | boolean | no | Newest first. |
| limit | integer | no | Results per page, 1-100 (default 20). |
| start_after | string | no | Cursor: pass the previous reply's next_start_after to get the next page. |
One location by id or short name (the part of its public Waitwhile URL). GET /locations/{shortNameOrId}.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| location | string | yes | Location id or short name. |
Live status of every location: open/closed, number of people waiting and being served, current estimated wait time, and booking counters. GET /location-status.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Results per page, 1-100 (default 20). |
| start_after | string | no | Cursor: pass the previous reply's next_start_after to get the next page. |
Live status of one location: open/closed, waiting and serving counts, estimated wait. GET /location-status/{locationId}.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| location_id | string | yes | Location 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 contac
| Parameter | Type | Required | Notes |
|---|---|---|---|
| location_id | string | no | Only visits at this location. |
| state | string | no | — |
| tag | string | no | — |
| customer_id | string | no | — |
| external_customer_id | string | no | — |
| service_id | string | no | — |
| resource_id | string | no | — |
| from_booking_date | string | no | Bookings starting at or after this local date-time, YYYY-MM-DDThh:mm. |
| to_booking_date | string | no | Bookings starting at or before this local date-time, YYYY-MM-DDThh:mm. |
| from_date | string | no | Visits created from this date-time (ISO 8601 or epoch ms). |
| to_date | string | no | Visits created up to this date-time (ISO 8601 or epoch ms). |
| desc | boolean | no | Newest first. |
| limit | integer | no | Results per page, 1-100 (default 20). |
| start_after | string | no | Cursor: pass the previous reply's next_start_after to get the next page. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| q | string | yes | Prefix match on name, phone, e-mail or customer id. |
| location_id | string | no | — |
| state | string | no | — |
| tag | string | no | — |
| exclude_tags | array | no | Leave out visits carrying any of these tags. |
| limit | integer | no | Results per page, 1-100 (default 20). |
| page | integer | no | Page number, from 1 (default 1). Pass the previous reply's next_page. |
One visit (waitlist entry or booking) by id: customer, state, tags, services, resources, party size, position, estimated wait and all timestamps. GET /visits/{visitId}.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| visit_id | string | yes | Visit id. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| location_id | string | yes | Location id. |
| from_date | string | no | Local start, YYYY-MM-DDThh:mm. |
| to_date | string | no | Local end, YYYY-MM-DDThh:mm. |
| service_ids | array | no | Only slots for these services. |
| resource_ids | array | no | Only slots for these resources. |
| service_duration | integer | no | Service duration in seconds, to size the slots. |
| show_min_spots | integer | no | Only slots with at least this many free spots. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| location_id | string | yes | Location id. |
| from_date | string | no | Local start, YYYY-MM-DDThh:mm. |
| to_date | string | no | Local end, YYYY-MM-DDThh:mm. |
| max_num_slots | integer | no | Max number of slots to return. |
| party_size | integer | no | — |
| service_ids | array | no | — |
| resource_ids | array | no | — |
| service_duration | integer | no | Service duration in seconds. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| location_id | string | no | Only customers with visits at this location. |
| external_id | string | no | — |
| from_date | string | no | ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds. |
| to_date | string | no | ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds. |
| desc | boolean | no | Newest first. |
| limit | integer | no | Results per page, 1-100 (default 20). |
| start_after | string | no | Cursor: pass the previous reply's next_start_after to get the next page. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| q | string | yes | Prefix match on name, phone, e-mail or customer id. |
| location_id | string | no | — |
| state | string | no | — |
| tag | string | no | — |
| limit | integer | no | Results per page, 1-100 (default 20). |
| page | integer | no | Page number, from 1 (default 1). Pass the previous reply's next_page. |
One customer by id: contact details, tags, per-location state and last visit. Contains personal data. GET /customers/{customerId}.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| customer_id | string | yes | Customer id. |
The staff notes recorded on a customer (content, author, visit and location, timestamps). GET /customers/{customerId}/notes.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| customer_id | string | yes | Customer id. |
List services (what customers book or queue for): name, duration, price, locations, resources and category structure. GET /services.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| location_id | array | no | Only items offered at these locations. |
| q | string | no | Prefix match on name or display name. |
| external_id | string | no | — |
| limit | integer | no | Results per page, 1-100 (default 20). |
| start_after | string | no | Cursor: pass the previous reply's next_start_after to get the next page. |
| is_category | boolean | no | Only service categories (true) or only services (false). |
| parent_id | string | no | Only children of this category. |
One service by id. GET /services/{serviceId}.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| service_id | string | yes | Service id. |
List resources — the people, rooms, tables or equipment that serve customers: name, locations, services, availability flag and category structure. GET /resources.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| location_id | array | no | Only items offered at these locations. |
| q | string | no | Prefix match on name or display name. |
| external_id | string | no | — |
| limit | integer | no | Results per page, 1-100 (default 20). |
| start_after | string | no | Cursor: pass the previous reply's next_start_after to get the next page. |
| is_category | boolean | no | Only resource categories (true) or only resources (false). |
| parent_id | string | no | Only children of this category. |
| string | no | Only the resource with this e-mail. |
One resource by id. GET /resources/{resourceId}.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| resource_id | string | yes | Resource id. |
Working hours/availability of a location's resources on a date (e.g. who is working today). GET /resources/availability.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| location_id | string | yes | Location id. |
| date | string | no | Date (yyyy-mm-dd) or ISO 8601 date-time; default today. |
| resource_ids | array | no | Only these resources. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| location_id | array | no | Only items offered at these locations. |
| q | string | no | Prefix match on name or display name. |
| external_id | string | no | — |
| limit | integer | no | Results per page, 1-100 (default 20). |
| start_after | string | no | Cursor: pass the previous reply's next_start_after to get the next page. |
One data field by id. GET /data-fields/{dataFieldId}.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| data_field_id | string | yes | Data field id. |
List the staff users of the account: name, e-mail, roles, locations. Password data and tokens are never returned. GET /users.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| location_id | array | no | Only users with access to these locations. |
| role | array | no | Only users with these roles. |
| q | string | no | Prefix match on name or e-mail. |
| external_id | string | no | — |
| limit | integer | no | Results per page, 1-100 (default 20). |
| start_after | string | no | Cursor: pass the previous reply's next_start_after to get the next page. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| location_id | string | no | — |
| visit_id | string | no | — |
| customer_id | string | no | — |
| external_customer_id | string | no | — |
| state | string | no | — |
| from_date | string | no | ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds. |
| to_date | string | no | ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds. |
| desc | boolean | no | Newest first. |
| limit | integer | no | Results per page, 1-100 (default 20). |
| start_after | string | no | Cursor: pass the previous reply's next_start_after to get the next page. |
One message by id. Contains personal data. GET /messages/{messageId}.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| message_id | string | yes | Message id. |
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).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| location_id | string | no | Only this location (default: all). |
| from_date | string | no | Period start (ISO 8601 or epoch ms). |
| to_date | string | no | Period end (ISO 8601 or epoch ms). |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| type | string | no | — |
| event | string | no | Audit event type. |
| entity_id | string | no | Id of the changed object. |
| location_id | string | no | — |
| from_date | string | no | ISO 8601 date or date-time (e.g. 2026-10-01 or 2026-10-01T00:00:00Z). |
| to_date | string | no | ISO 8601 date or date-time (e.g. 2026-10-01 or 2026-10-01T00:00:00Z). |
| desc | boolean | no | Newest first. |
| limit | integer | no | Results per page, 1-100 (default 20). |
| start_after | string | no | Cursor: pass the previous reply's next_start_after to get the next page. |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| location_id | string | yes | Location id (see waitwhile_list_locations). |
| name | string | no | Customer name. |
| first_name | string | no | — |
| last_name | string | no | — |
| phone | string | no | Customer phone, E.164 (+16005551234). |
| string | no | Customer e-mail. | |
| party_size | integer | no | — |
| date | string | no | Booking start in the location's local time, YYYY-MM-DDThh:mm. Omit to join the waitlist. |
| duration | integer | no | Booking duration in seconds. |
| service_ids | array | no | Services the customer wants. |
| resource_ids | array | no | Preferred resources (staff, rooms). |
| send_notifications | boolean | no | 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 loca |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| visit_id | string | yes | Visit id. |
| state | string | no | New state. |
| add_tags | array | no | Tags to add. |
| remove_tags | array | no | Tags to remove. |
| date | string | no | New booking start, local time YYYY-MM-DDThh:mm. |
| duration | integer | no | New booking duration in seconds. |
| party_size | integer | no | — |
| send_notifications | boolean | no | 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 loca |
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 ma
| Parameter | Type | Required | Notes |
|---|---|---|---|
| visit_id | string | yes | Visit id. |
| send_notifications | boolean | no | 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 loca |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| customer_id | string | yes | Customer id. |
| content | string | yes | The note text. |
| location_id | string | no | — |
| visit_id | string | no | — |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Waitwhile MCP by usefulapi or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing is an address its publisher runs, and you connect to it directly — this marketplace is not in the path. The scanner reads packages and public source, and an address is neither: the repository linked on this page is where this record was collected from, not a copy of what the address serves, so it is not graded in its place. So there is no grade — not a withheld one, an unmeasured one.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 1.0.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Waitwhile MCP by usefulapi can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.