Skip to main content
Glama

Review a booking change

prepare_booking_change
Read-onlyIdempotent

Use this when reviewing an explicitly requested change to the booking selected by the current OAuth READ grant. Do not use for cancellation (use prepare_booking_cancellation instead) or current state (use get_booking_status).

For "pickup at 15:30 instead", send changes={"ride":{"time":"15:30"}} in the booking's service-location time zone; omit unrequested facts. Use amendment for a complete replacement itinerary supplied by the customer. Keep onceKey for identical retries; changing the time to 16:00 needs a new key and review.

Authority is checked before and after retrieving the private consentUrl. Open it in the original signed-in session for current facts, pricing, terms, separate visible action consent and confirmation. Changed revision, missing facts or unavailable pricing require fresh review.

Retrieval stores no proposal, grants no execution authority and performs no booking change, refund, payment or message.

Input Schema

NameRequiredDescriptionDefault
changesNoOnly the fields the customer explicitly wants to change. Omitted fields are loaded from the current booking after sign-in; null clears an optional field. Use either changes or a complete amendment, never both. The merged proposal must satisfy all ride rules and is reviewed with current pricing and separate consent before any booking action.
onceKeyYesCaller-chosen retry key: 16–128 characters from A–Z, a–z, 0–9, underscore or hyphen. Reuse it for the same booking, action and unchanged request facts; use a fresh key for changed facts. The caller creates it; this handoff assigns it no independent expiry or execution authority. Later review still requires a current original session, object, offer and separate action consent.
amendmentNoComplete proposed ride facts, as an alternative to changes. Do not combine both inputs. All fields are reviewed in the original signed-in booking session before separate action consent and confirmation.
bookingKeyYesInternal booking ID or visible bookingReference of the one booking already selected by this OAuth connection. Copy the same booking's bookingKey or bookingReference from an available get_offer_status/prepare_offer or authorized booking-read result; prepared returns links, not IDs. Never substitute the supplier offerKey. It grants no access to another booking.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • changedInput schema / properties / amendment / description
      Previous value: -"Full proposed ride request in the existing quote-input shape, including all required ride fields. Review these exact facts in the linked original signed-in session before separate action consent and confirmation."New value: +"Complete proposed ride facts, as an alternative to changes. Do not combine both inputs. All fields are reviewed in the original signed-in booking session before separate action consent and confirmation."
    • addedInput schema / properties / changes
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Only the fields the customer explicitly wants to change. Omitted fields are loaded from the current booking after sign-in; null clears an optional field. Use either changes or a complete amendment, never both. The merged proposal must satisfy all ride rules and is reviewed with current pricing and separate consent before any booking action.",
      +  "properties": {
      +    "locale": {
      +      "enum": [
      +        "de",
      +        "en"
      +      ],
      +      "type": "string"
      +    },
      +    "offerKey": {
      +      "anyOf": [
      +        {
      +          "description": "Optional published supplier offer key, for example service_airport. Pass only a key supplied by the provider’s published context; otherwise omit to use the configured default. Preserve it across related calls and retries. It selects a service location and terms, not a booking ID or access grant.",
      +          "pattern": "^[a-z0-9][a-z0-9_-]{0,79}$",
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "ride": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "date": {
      +          "description": "Service date as YYYY-MM-DD, for example 2026-12-24, in the selected location’s time zone; do not convert it to a UTC date.",
      +          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +          "type": "string"
      +        },
      +        "destination": {
      +          "description": "Destination with city or postcode, distinct from pickup.",
      +          "maxLength": 240,
      +          "minLength": 2,
      +          "type": "string"
      +        },
      +        "flightNumber": {
      +          "anyOf": [
      +            {
      +              "description": "Flight number for an airport pickup, if known.",
      +              "maxLength": 240,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "hours": {
      +          "anyOf": [
      +            {
      +              "description": "Whole service hours from 1 to 24, for example 3. Required only for serviceType=hourly; omit for transfers. Billable hours may differ after price calculation.",
      +              "maximum": 24,
      +              "minimum": 1,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "luggage": {
      +          "anyOf": [
      +            {
      +              "description": "Luggage notes. Unusual items may need review.",
      +              "maxLength": 240,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "passengers": {
      +          "description": "Number of people travelling, from 1 to 60.",
      +          "maximum": 60,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "pickup": {
      +          "description": "Pickup place with city or postcode, inside a served area.",
      +          "maxLength": 240,
      +          "minLength": 2,
      +          "type": "string"
      +        },
      +        "returnDate": {
      +          "anyOf": [
      +            {
      +              "description": "Return date YYYY-MM-DD, only for a return trip.",
      +              "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "returnTime": {
      +          "anyOf": [
      +            {
      +              "description": "Return time HH:mm, only for a return trip.",
      +              "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "serviceType": {
      +          "anyOf": [
      +            {
      +              "description": "Set hourly for duration service; omit for transfers.",
      +              "enum": [
      +                "hourly"
      +              ],
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "time": {
      +          "description": "Local pickup time in 24-hour HH:mm format, for example 14:30, in the selected location’s time zone.",
      +          "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +          "type": "string"
      +        },
      +        "tripType": {
      +          "description": "one_way, or return with a later pickup.",
      +          "enum": [
      +            "one_way",
      +            "return"
      +          ],
      +          "type": "string"
      +        },
      +        "vehiclePreference": {
      +          "anyOf": [
      +            {
      +              "description": "Optional vehicle wish, without a price guarantee.",
      +              "maxLength": 240,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "specialRequests": {
      +      "anyOf": [
      +        {
      +          "description": "Optional requirements, at most 500 characters.",
      +          "maxLength": 500,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "bookingKey",
      -  "onceKey",
      -  "amendment"
      -]New value: +[
      +  "bookingKey",
      +  "onceKey"
      +]
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "consentUrl": {
      -        "description": "Open this exact private proposal link in the original signed-in session. Its fragment contains the selected object, action, onceKey and proposed facts. Current authority is rechecked, then the existing flow requires separate visible action consent and confirmation; the link itself grants no authority.",
      -        "pattern": "^https:\\/\\/platform-api\\.samuelz\\.com\\/app\\/customer-booking\\/manage#request=",
      -        "type": "string"
      -      },
      -      "status": {
      -        "const": "consent_required",
      -        "description": "A private proposal link is ready for review; no action consent or execution grant has been issued.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "status",
      -      "consentUrl"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "status": {
      -        "description": "invalid_request rejects malformed selection/action facts; not_found denies access to the currently selected booking; unavailable means the handoff could not be supplied safely. No booking action has occurred.",
      -        "enum": [
      -          "invalid_request",
      -          "not_found",
      -          "unavailable"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "status"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "consentUrl": {
      +        "description": "Open this exact private proposal link in the original signed-in session. Its fragment contains the selected object, action, onceKey and either a complete proposal or explicitly requested changes. Current authority is rechecked and unchanged facts are loaded privately. The existing flow then requires a complete proposal, current price and terms, separate visible action consent and confirmation; the link grants no execution authority.",
      +        "pattern": "^https:\\/\\/platform-api\\.samuelz\\.com\\/app\\/customer-booking\\/manage#request=",
      +        "type": "string"
      +      },
      +      "status": {
      +        "const": "consent_required",
      +        "description": "A private proposal link is ready for review; no action consent or execution grant has been issued.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "status",
      +      "consentUrl"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "status": {
      +        "description": "invalid_request rejects malformed selection or change facts; not_found denies access to the currently selected booking; unavailable means the handoff could not be supplied safely. No booking action has occurred.",
      +        "enum": [
      +          "invalid_request",
      +          "not_found",
      +          "unavailable"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "status"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed5 schema fields changed
    • changedInput schema / properties / amendment / properties / locale / description
      Previous value: -"Language for text and links: en, or de."New value: +"Customer-requested language for text and links: en (default) or de. Preserve it on retries and related calls; it changes presentation, never price or eligibility."
    • changedInput schema / properties / amendment / properties / offerKey / description
      Previous value: -"Published supplier offer key, not a booking id."New value: +"Optional published supplier offer key, for example service_airport. Pass only a key supplied by the provider’s published context; otherwise omit to use the configured default. Preserve it across related calls and retries. It selects a service location and terms, not a booking ID or access grant."
    • changedInput schema / properties / amendment / properties / ride / properties / date / description
      Previous value: -"Service date as YYYY-MM-DD in the provider time zone."New value: +"Service date as YYYY-MM-DD, for example 2026-12-24, in the selected location’s time zone; do not convert it to a UTC date."
    • changedInput schema / properties / amendment / properties / ride / properties / hours / description
      Previous value: -"Booked hours for hourly service; omit for transfers."New value: +"Whole service hours from 1 to 24, for example 3. Required only for serviceType=hourly; omit for transfers. Billable hours may differ after price calculation."
    • changedInput schema / properties / amendment / properties / ride / properties / time / description
      Previous value: -"Local pickup time as HH:mm in the provider time zone."New value: +"Local pickup time in 24-hour HH:mm format, for example 14:30, in the selected location’s time zone."
  3. Changed17 schema fields changed
    • changedInput schema / properties / amendment / properties / locale / description
      Previous value: -"Use the customer's requested language for text and booking links: en by default, de for German. Preserve it on retries; pickup times stay in the provider time zone."New value: +"Language for text and links: en, or de."
    • changedInput schema / properties / amendment / properties / offerKey / description
      Previous value: -"Optional existing published provider/supplier offer key. Selects its configured service location; it is not a customer bookingKey or bookingReference and grants no booking access."New value: +"Published supplier offer key, not a booking id."
    • changedInput schema / properties / amendment / properties / ride / description
      Previous value: -"Ride facts with distinct pickup/destination and valid local dates/times. Return requires returnDate/returnTime after pickup; one_way omits both. Hourly requires one_way and hours; transfers omit hours."New value: +"Pickup, destination, local date, time and passengers."
    • changedInput schema / properties / amendment / properties / ride / properties / date / description
      Previous value: -"Service date as YYYY-MM-DD in the provider timeZone returned by get_service_options; resolve relative dates first."New value: +"Service date as YYYY-MM-DD in the provider time zone."
    • changedInput schema / properties / amendment / properties / ride / properties / destination / description
      Previous value: -"Destination distinct from pickup, with city/municipality or postcode; e.g. München Hauptbahnhof, 80335 München. For hourly service describe the planned route or As directed."New value: +"Destination with city or postcode, distinct from pickup."
    • changedInput schema / properties / amendment / properties / ride / properties / flightNumber / description
      Previous value: -"Flight number for an airport pickup, such as LH123; omit when not applicable."New value: +"Flight number for an airport pickup, if known."
    • changedInput schema / properties / amendment / properties / ride / properties / hours / description
      Previous value: -"Booked duration for hourly service; omit for transfers."New value: +"Booked hours for hourly service; omit for transfers."
    • changedInput schema / properties / amendment / properties / ride / properties / luggage / description
      Previous value: -"Luggage count/type or fit requirements; unusual luggage may require review."New value: +"Luggage notes. Unusual items may need review."
    • changedInput schema / properties / amendment / properties / ride / properties / passengers / description
      Previous value: -"Total people travelling; determines vehicle requirements, not availability or acceptance."New value: +"Number of people travelling, from 1 to 60."
    • changedInput schema / properties / amendment / properties / ride / properties / pickup / description
      Previous value: -"Pickup address or named place with city/municipality or postcode; e.g. Flughafen München (MUC), 85356 München-Flughafen."New value: +"Pickup place with city or postcode, inside a served area."
    • changedInput schema / properties / amendment / properties / ride / properties / returnDate / description
      Previous value: -"Return pickup date in the same local format as date, in the provider timeZone; provide only for return trips, after the outbound pickup."New value: +"Return date YYYY-MM-DD, only for a return trip."
    • changedInput schema / properties / amendment / properties / ride / properties / returnTime / description
      Previous value: -"Return pickup time in the same local format as time and the same provider timeZone; provide only for return trips."New value: +"Return time HH:mm, only for a return trip."
    • changedInput schema / properties / amendment / properties / ride / properties / serviceType / description
      Previous value: -"Set hourly for service booked by duration; omit for transfers."New value: +"Set hourly for duration service; omit for transfers."
    • changedInput schema / properties / amendment / properties / ride / properties / time / description
      Previous value: -"Local pickup time in 24-hour HH:mm format, in the configured timeZone returned by get_service_options for the same offerKey; not UTC or an offset timestamp."New value: +"Local pickup time as HH:mm in the provider time zone."
    • changedInput schema / properties / amendment / properties / ride / properties / tripType / description
      Previous value: -"one_way for a single transfer or hourly service; return for outbound plus a separate later return transfer."New value: +"one_way, or return with a later pickup."
    • changedInput schema / properties / amendment / properties / ride / properties / vehiclePreference / description
      Previous value: -"Volunteered vehicle preference only; no class, price or availability guarantee. Additional requirements may require review."New value: +"Optional vehicle wish, without a price guarantee."
    • changedInput schema / properties / amendment / properties / specialRequests / description
      Previous value: -"Optional ride requirements, at most 500 characters. Additional stops or unusual requirements may require review; do not include contact details in a quote."New value: +"Optional requirements, at most 500 characters."
  4. Changed1 schema field changed
    • changedInput schema / properties / amendment / properties / ride / properties / time / description
      Previous value: -"Local pickup time in 24-hour HH:mm format, in the provider timeZone (Samuelz: Europe/Berlin); not UTC or an offset timestamp."New value: +"Local pickup time in 24-hour HH:mm format, in the configured timeZone returned by get_service_options for the same offerKey; not UTC or an offset timestamp."
  5. Changed4 schema fields changed
    • changedInput schema / properties / amendment / properties / offerKey / description
      Previous value: -"Optional existing published provider offer key. Selects its configured service location; not booking authority."New value: +"Optional existing published provider/supplier offer key. Selects its configured service location; it is not a customer bookingKey or bookingReference and grants no booking access."
    • changedInput schema / properties / bookingKey / description
      Previous value: -"Internal booking ID or visible bookingReference of the one booking already selected by this OAuth connection. Copy a returned ID or reference for that same booking; it grants no access to another booking."New value: +"Internal booking ID or visible bookingReference of the one booking already selected by this OAuth connection. Copy the same booking's bookingKey or bookingReference from an available get_offer_status/prepare_offer or authorized booking-read result; prepared returns links, not IDs. Never substitute the supplier offerKey. It grants no access to another booking."
    • changedInput schema / properties / onceKey / description
      Previous value: -"Caller-chosen retry key: 16–128 characters from A–Z, a–z, 0–9, underscore or hyphen. Reuse it for the same booking, action and unchanged request facts; use a fresh key for changed facts. It grants no execution authority."New value: +"Caller-chosen retry key: 16–128 characters from A–Z, a–z, 0–9, underscore or hyphen. Reuse it for the same booking, action and unchanged request facts; use a fresh key for changed facts. The caller creates it; this handoff assigns it no independent expiry or execution authority. Later review still requires a current original session, object, offer and separate action consent."
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "consentUrl": {
      -        "pattern": "^https:\\/\\/platform-api\\.samuelz\\.com\\/app\\/customer-booking\\/manage#request=",
      -        "type": "string"
      -      },
      -      "status": {
      -        "const": "consent_required",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "status",
      -      "consentUrl"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "status": {
      -        "enum": [
      -          "invalid_request",
      -          "not_found",
      -          "unavailable"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "status"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "consentUrl": {
      +        "description": "Open this exact private proposal link in the original signed-in session. Its fragment contains the selected object, action, onceKey and proposed facts. Current authority is rechecked, then the existing flow requires separate visible action consent and confirmation; the link itself grants no authority.",
      +        "pattern": "^https:\\/\\/platform-api\\.samuelz\\.com\\/app\\/customer-booking\\/manage#request=",
      +        "type": "string"
      +      },
      +      "status": {
      +        "const": "consent_required",
      +        "description": "A private proposal link is ready for review; no action consent or execution grant has been issued.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "status",
      +      "consentUrl"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "status": {
      +        "description": "invalid_request rejects malformed selection/action facts; not_found denies access to the currently selected booking; unavailable means the handoff could not be supplied safely. No booking action has occurred.",
      +        "enum": [
      +          "invalid_request",
      +          "not_found",
      +          "unavailable"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "status"
      +    ],
      +    "type": "object"
      +  }
      +]
  6. Changed3 schema fields changed
    • addedInput schema / properties / amendment / description
      Added value: +"Full proposed ride request in the existing quote-input shape, including all required ride fields. Review these exact facts in the linked original signed-in session before separate action consent and confirmation."
    • addedInput schema / properties / bookingKey / description
      Added value: +"Internal booking ID or visible bookingReference of the one booking already selected by this OAuth connection. Copy a returned ID or reference for that same booking; it grants no access to another booking."
    • addedInput schema / properties / onceKey / description
      Added value: +"Caller-chosen retry key: 16–128 characters from A–Z, a–z, 0–9, underscore or hyphen. Reuse it for the same booking, action and unchanged request facts; use a fresh key for changed facts. It grants no execution authority."
  7. Added

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial context beyond them: authority is checked before and after retrieving a private consentUrl, the link must be opened in the original signed-in session, changed revisions or unavailable pricing force a fresh review, and retrieval stores no proposal and grants no execution authority. None of that is inferable from the hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the selection rule before the alternatives, and each paragraph has a distinct job (routing, parameter usage, authority/consent flow, side-effect disclaimer). It is dense and long for a tool description, but almost no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the decision surface an agent needs for a complex nested schema with an output schema present: which sibling to use, how to shape changes vs amendment, retry semantics, the consent handoff, and the guarantee that nothing is executed. Return values are covered by the output schema, so no gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already carries field-level detail and the baseline is 3. The description earns above baseline by explaining the mutually exclusive changes/amendment choice and by giving a concrete onceKey retry rule ('changing the time to 16:00 needs a new key and review') that the schema alone does not make obvious.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action (reviewing an explicitly requested change to a booking) scoped to the booking selected by the current OAuth READ grant, and explicitly names the siblings it is not (prepare_booking_cancellation, get_booking_status). An agent can distinguish this from all nine siblings without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use plus two explicit when-not-to-use cases with the correct alternatives named. It also routes within the tool itself: 'changes' for a targeted edit versus 'amendment' for a complete replacement itinerary, with the example 'pickup at 15:30 instead' showing the minimal-fact convention.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources