Inspect the MCP contract before testing.

Explore 11 MCP tools: input fields, required scopes, read operations and write confirmations.

Request evaluation access

Connection 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 kit

Authorization 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 guide

Start 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

  • querystringrequired
  • locationstring | null
  • excludelist[string] | null
  • bookable_onlyboolean
  • open_atstring | null
  • limitinteger
  • offsetinteger
{
  "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
    }
  }
}
Synthetic read-only input. Not an observed result or an executed request.

Tool catalog

11 of 11 tools shown. Expand a tool to inspect its input contract.

bookSubmit a bookingWrite operation

Open the book reference

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

FieldTypeRequirementDescription
item_namestringRequiredName of the selected place or service.
date_timestringRequiredISO 8601 timestamp; make the intended time zone clear.
sourceBookingRail (square | opentable | mindbody | yelp_ai | website | manual)RequiredRequired provider rail. Pass the selected result’s booking_source unchanged; website is a valid rail.
item_idstring | nullOptional
Default (Python): None
Place identifier returned by an actual search response.
party_sizeintegerOptional
Default (Python): 1
Number of guests for the agreed booking request.
special_requestsstring | nullOptional
Default (Python): None
Optional notes agreed with the user.
phonestring | nullOptional
Default (Python): None
The signed-in user’s own contact number if required.
partner_idstring | nullOptional
Default (Python): None
Provider partner handle returned for the selected place.
location_idstring | nullOptional
Default (Python): None
Provider location handle returned for the selected place.
service_variation_idstring | nullOptional
Default (Python): None
Provider service variation selected from actual booking requirements.
team_member_idstring | nullOptional
Default (Python): None
Provider staff identifier where the selected appointment supports it.
duration_minutesinteger | nullOptional
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

FieldTypeRequirementDescription
limitintegerOptional
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

FieldTypeRequirementDescription
item_idstringRequiredPlace 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

FieldTypeRequirementDescription
locationstringRequiredExplicit 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

FieldTypeRequirementDescription
item_idstringRequiredPlace 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

FieldTypeRequirementDescription
reservation_idstringRequiredIdentifier 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

FieldTypeRequirementDescription
dietarylist[string] | nullOptional
Default (Python): None
Positive dietary preferences the user explicitly asks to retain.
cuisineslist[string] | nullOptional
Default (Python): None
Positive cuisine preferences the user explicitly asks to retain.
vibeslist[string] | nullOptional
Default (Python): None
Positive atmosphere preferences the user explicitly asks to retain.
interestslist[string] | nullOptional
Default (Python): None
Other positive preferences the user explicitly asks to retain.
price_rangestring | nullOptional
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

FieldTypeRequirementDescription
datestringRequiredCalendar 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

FieldTypeRequirementDescription
date_timestringRequiredISO 8601 timestamp; make the intended time zone clear.
duration_minsintegerOptional
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

FieldTypeRequirementDescription
booking_idstringRequiredHandle returned by the current booking conversation.
messagestringRequiredThe user’s approved answer to the provider’s follow-up.
latitudenumber | nullOptional
Default (Python): None
Optional location context for the existing booking conversation.
longitudenumber | nullOptional
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.

Define the evaluation criteria

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