Inspect the MCP contract before testing.
Explore 11 MCP tools: input fields, required scopes, read operations and write confirmations.
Request evaluation accessConnection and access
- Endpoint
https://app.whatsdo.com/mcp/- Transport
- Streamable HTTP
- Scopes
- search, bookings:read, bookings:write, profile:write
Implementation reference. Authenticated tool execution has not been verified.
Inspect the separate REST evaluation kitAuthorization and scopes
MCP uses Streamable HTTP JSON-RPC at the endpoint above. Follow the approved OAuth authorization-code flow with PKCE S256, then check the scopes actually granted to your token before calling tools/list.
The REST evaluation kit uses POST /actions/search and a session JWT. A scoped MCP OAuth token is not accepted as a REST kit credential. MCP search takes location; the REST kit uses location_text.
search- Place search and details for a first read evaluation.
bookings:read- Read booking or connected calendar information.
bookings:write- Operations that create or change bookings.
profile:write- Changes to saved location or preferences.
Confirm access with the team before testing. This page does not issue credentials.
Read the MCP access guideStart with one read request
After authorized tool discovery, use the published input schema for your account. This synthetic example explains the MCP message shape; it does not run a request.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search",
"arguments": {
"query": "quiet vegetarian dinner",
"location": "San Francisco, CA",
"exclude": [
"loud"
],
"bookable_only": false,
"limit": 3,
"offset": 0
}
}
}Inspect the returned structuredContent for the result. Widget-specific _meta is separate. Check the actual fields and source information before treating a place as suitable.
Distinguish access from results
- 401 or not authenticated
- Confirm the credential, endpoint and approved authorization flow.
- Missing required scope
- Inspect the granted scopes. Request only the access needed for the selected tool.
- No Google Calendar connected
- Calendar access needs a connected calendar. This is not a response about free booking inventory.
- Rate limit or temporarily unavailable
- Respect the returned condition and retry guidance. Do not interpret it as an empty search.
- Empty or incomplete result
- Record the query, location and missing fields. A successful response does not prove coverage or task fit.
A typical booking flow
Five of the tools cover the usual path from a request to a booking. Select a stop to read its contract.
Search places
Search local places using free text, explicit or saved location and user preferences; returns ranked places and booking capability fields.
- Scope
search- Action
- Reads data
- Returns
- Ranked results, location_missing and optional next_offset/preferences/timezone. Inspect each result’s booking fields.
Keep ranked response order when presenting the shortlist.
Inputs
querystringrequiredlocationstring | nullexcludelist[string] | nullbookable_onlybooleanopen_atstring | nulllimitintegeroffsetinteger
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search",
"arguments": {
"query": "quiet vegetarian dinner",
"location": "San Francisco, CA",
"exclude": ["loud"],
"bookable_only": false,
"limit": 3,
"offset": 0
}
}
}Tool catalog
11 of 11 tools shown. Expand a tool to inspect its input contract.
searchSearch placesRead operation
Search local places using free text, explicit or saved location and user preferences; returns ranked places and booking capability fields.
Scope: search
Input fields
| Field | Type | Requirement | Description |
|---|---|---|---|
query | string | Required | Free-text category, cuisine, mood or place request. Put geographic names in location. |
location | string | null | Optional Default (Python): None | Explicit city, neighborhood or street for search; a default location for set_location. |
exclude | list[string] | null | Optional Default (Python): None | Rejected tags for this search, such as loud or sushi. Not venue IDs and not a pagination cursor. |
bookable_only | boolean | Optional Default (Python): False | Restrict results to reported online provider paths; manual-only places are excluded. This is not a slot guarantee. |
open_at | string | null | Optional Default (Python): None | ISO 8601 time used as an opening-hours filter, not reservation inventory. |
limit | integer | Optional Default (Python): 5 | Maximum results requested: search clamps this to 1-20; my_bookings defaults to 10. |
offset | integer | Optional Default (Python): 0 | Search pagination offset. Prefer next_offset from the preceding response. |
Return contract
Ranked results, location_missing and optional next_offset/preferences/timezone. Inspect each result’s booking fields.
- Keep ranked response order when presenting the shortlist.
- A bookable flag is not proof that the desired date or time is available.
- is_bookable can also be true when bookability is unknown. Inspect booking_source and the reported provider paths before interpreting it.
Synthetic read-only input. Not an observed result or an executed request.
{
"query": "quiet vegetarian dinner",
"location": "San Francisco, CA",
"exclude": [
"loud"
],
"bookable_only": false,
"limit": 3,
"offset": 0
}Example input only. No API request is made by this page and no result is simulated.
bookSubmit a bookingWrite operation
Submit a real reservation or appointment; requires explicit user agreement. A request may remain pending or require a follow-up.
Scope: bookings:write · Explicit confirmation required.
Input fields
| Field | Type | Requirement | Description |
|---|---|---|---|
item_name | string | Required | Name of the selected place or service. |
date_time | string | Required | ISO 8601 timestamp; make the intended time zone clear. |
source | BookingRail (square | opentable | mindbody | yelp_ai | website | manual) | Required | Required provider rail. Pass the selected result’s booking_source unchanged; website is a valid rail. |
item_id | string | null | Optional Default (Python): None | Place identifier returned by an actual search response. |
party_size | integer | Optional Default (Python): 1 | Number of guests for the agreed booking request. |
special_requests | string | null | Optional Default (Python): None | Optional notes agreed with the user. |
phone | string | null | Optional Default (Python): None | The signed-in user’s own contact number if required. |
partner_id | string | null | Optional Default (Python): None | Provider partner handle returned for the selected place. |
location_id | string | null | Optional Default (Python): None | Provider location handle returned for the selected place. |
service_variation_id | string | null | Optional Default (Python): None | Provider service variation selected from actual booking requirements. |
team_member_id | string | null | Optional Default (Python): None | Provider staff identifier where the selected appointment supports it. |
duration_minutes | integer | null | Optional Default (Python): None | Appointment duration required by the selected provider flow. |
Return contract
Booking identifiers and a state such as confirmed, pending, requires_payment, failed, slot_unavailable or conflict.
- Read get_booking_requirements for the selected place before collecting the fields for a real request.
- Get explicit user confirmation of the place, date, time and party or appointment details before calling.
- The implementation can write a real reservation immediately; do not use it to probe whether a booking would work.
- General provider availability and completed transactions were not verified in this review.
my_bookingsRead my bookingsRead operation
Open the my_bookings reference
Read the signed-in user’s bookings and their current status.
Scope: bookings:read
Input fields
| Field | Type | Requirement | Description |
|---|---|---|---|
limit | integer | Optional Default (Python): 10 | Maximum results requested: search clamps this to 1-20; my_bookings defaults to 10. |
Return contract
Recent bookings, newest first: id, reservation_id, place_name, source, status, date_time, party_size and optional confirmation_number/message.
- A pending record is not a confirmed reservation.
Synthetic read-only input. Not an observed result or an executed request.
{
"limit": 10
}Example input only. No API request is made by this page and no result is simulated.
place_detailsRead place detailsRead operation
Open the place_details reference
Read a place by a returned item_id; address, coordinates and description are placed in widget-only metadata.
Scope: search
Input fields
| Field | Type | Requirement | Description |
|---|---|---|---|
item_id | string | Required | Place identifier returned by an actual search response. |
Return contract
Place details or found:false. Address, coordinates and description are held in widget metadata rather than model-visible structuredContent.
- Do not advertise all location fields as model-visible output.
Synthetic read-only input. Not an observed result or an executed request.
{
"item_id": "REPLACE_WITH_ID_FROM_SEARCH"
}Example input only. No API request is made by this page and no result is simulated.
set_locationSave a default locationWrite operation
Open the set_location reference
Write the user’s default location only when explicitly requested.
Scope: profile:write · Explicit confirmation required.
Input fields
| Field | Type | Requirement | Description |
|---|---|---|---|
location | string | Required | Explicit city, neighborhood or street for search; a default location for set_location. |
Return contract
A saved acknowledgment after updating the user’s default location.
- Get an explicit request to save a default; a destination mentioned in a search is not consent to update the profile.
get_booking_requirementsRead booking requirementsRead operation
Open the get_booking_requirements reference
Read venue-specific booking requirements; available:false can mean unbookable or unavailable upstream rules.
Scope: search
Input fields
| Field | Type | Requirement | Description |
|---|---|---|---|
item_id | string | Required | Place identifier returned by an actual search response. |
Return contract
available, provider, booking_kind, required and optional fields with kind/label/description/options, and policies. available:false can include a reason.
- Read the reason when available:false; do not treat every such response as the same failure.
Synthetic read-only input. Not an observed result or an executed request.
{
"item_id": "REPLACE_WITH_ID_FROM_SEARCH"
}Example input only. No API request is made by this page and no result is simulated.
cancel_bookingRequest a cancellationWrite operation
Open the cancel_booking reference
Request cancellation of an owned reservation; cancellation_requested is not completed cancellation.
Scope: bookings:write · Explicit confirmation required.
Input fields
| Field | Type | Requirement | Description |
|---|---|---|---|
reservation_id | string | Required | Identifier from the signed-in user’s actual booking history. |
Return contract
Cancellation result and state, which may be cancellation_requested rather than cancelled.
- Get explicit user confirmation before cancelling an owned reservation.
- Report cancellation_requested as waiting for confirmation, not completed cancellation.
remember_preferenceSave positive preferencesWrite operation
Open the remember_preference reference
Write positive user preferences. Current-turn exclusions belong in search.exclude.
Scope: profile:write · Explicit confirmation required.
Input fields
| Field | Type | Requirement | Description |
|---|---|---|---|
dietary | list[string] | null | Optional Default (Python): None | Positive dietary preferences the user explicitly asks to retain. |
cuisines | list[string] | null | Optional Default (Python): None | Positive cuisine preferences the user explicitly asks to retain. |
vibes | list[string] | null | Optional Default (Python): None | Positive atmosphere preferences the user explicitly asks to retain. |
interests | list[string] | null | Optional Default (Python): None | Other positive preferences the user explicitly asks to retain. |
price_range | string | null | Optional Default (Python): None | A stated price preference, not a quoted price or price guarantee. |
Return contract
Saved preferences, remembered values and current preference context.
- Get an explicit request to retain preferences.
- Use search.exclude for current-turn rejected tags rather than saving them as positive preferences.
calendar_free_slotsRead calendar free slotsRead operation
Open the calendar_free_slots reference
Read available time slots from the user’s connected Google Calendar.
Scope: bookings:read
Input fields
| Field | Type | Requirement | Description |
|---|---|---|---|
date | string | Required | Calendar day in YYYY-MM-DD format. |
Return contract
Calendar free_slots for a connected Google Calendar; connection errors are not empty availability.
- Requires the signed-in user’s Google Calendar connection.
- Free time on a calendar does not establish venue availability.
Synthetic read-only input. Not an observed result or an executed request.
{
"date": "2026-10-01"
}Example input only. No API request is made by this page and no result is simulated.
calendar_check_conflictCheck a calendar conflictRead operation
Open the calendar_check_conflict reference
Read calendar conflicts for a proposed time and duration.
Scope: bookings:read
Input fields
| Field | Type | Requirement | Description |
|---|---|---|---|
date_time | string | Required | ISO 8601 timestamp; make the intended time zone clear. |
duration_mins | integer | Optional Default (Python): 90 | Duration of the proposed calendar interval; default 90 minutes. |
Return contract
has_conflict and busy_intervals for a connected Google Calendar.
- Requires the signed-in user’s Google Calendar connection.
- No calendar conflict does not mean a provider can accept a booking.
Synthetic read-only input. Not an observed result or an executed request.
{
"date_time": "2026-10-01T19:00:00-07:00",
"duration_mins": 90
}Example input only. No API request is made by this page and no result is simulated.
continue_bookingAnswer a booking follow-upWrite operation
Open the continue_booking reference
Post an answer into an existing provider booking conversation; each call sends another message and is not idempotent.
Scope: bookings:write · Explicit confirmation required.
Input fields
| Field | Type | Requirement | Description |
|---|---|---|---|
booking_id | string | Required | Handle returned by the current booking conversation. |
message | string | Required | The user’s approved answer to the provider’s follow-up. |
latitude | number | null | Optional Default (Python): None | Optional location context for the existing booking conversation. |
longitude | number | null | Optional Default (Python): None | Optional location context paired with latitude. |
Return contract
Provider conversation response and a booking_id when further conversation is needed.
- Get the user’s approval for the answer before sending it.
- Not idempotent: each call posts another message. Do not retry automatically.
Before a write operation
Review the required scope and confirmation notes for the exact tool. Operations that change bookings or user information require their own evaluation. Do not replay continue_booking as an idempotent request; inspect its confirmation and retry behavior in its tool contract.
Source interfaces
Native gateway registrations, function signatures and OAuth scopes checked against the October 2 implementation.
Public discovery links establish the connection surface. Use authorized tools/list to inspect the tools available to your account.
Reviewed 2026-10-02