Skip to main content
Glama

create_booking

Submit an unpaid booking for a bookings_live school (same path as the website Book now flow). The school still confirms availability; Extralingo emails the student; down payment is due within 5 days of school confirmation via Extralingo only. Never tell the user they are confirmed or paid. Requires OAuth bookings scope (Bearer token). Optional idempotency_key replays the same payload within 24 hours.

Input Schema

NameRequiredDescriptionDefault
phoneNoStudent phone number (required).
contactNoOptional first_name, last_name, phone. Email always comes from the verified account; contact.email must match or be omitted.
trip_idNoOptional trip_id from save_trip linking this booking to a draft.
currencyNoISO 4217 currency for prices in this call. Usually EUR.EUR
school_idNoCraft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.
phoneCountryNoISO 3166-1 alpha-2 country for the phone (e.g. NL).
configurationNoSame shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.
termsAcceptedNoMust be true when not using OAuth (OAuth grants record acceptance).
idempotencyKeyNoOptional alias of idempotency_key.
studentDetailsNoPer-student details aligned with configuration.students (names, dates of birth, etc.).
idempotency_keyNoOptional. Same key + same payload within 24 hours replays the original response; conflicting payload returns validation_failed.
privacyAcceptedNoMust be true when not using OAuth.
specialRequestsNoFree-text notes for the school.

Output Schema

NameRequiredDescriptionDefault
statusNoe.g. awaiting_school_confirmation.
successYes
bookingIdNoCraft booking id when returned by the booking engine.
redirectUrlNo
studentMessageNo
bookingReferenceNo
agent_must_tell_the_userNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • removedOutput schema / properties / booking
      Removed value: -{
      -  "additionalProperties": true,
      -  "type": "object"
      -}
    • addedOutput schema / properties / bookingId
      Added value: +{
      +  "description": "Craft booking id when returned by the booking engine.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bookingReference
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / redirectUrl
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / status
      Added value: +{
      +  "description": "e.g. awaiting_school_confirmation.",
      +  "type": "string"
      +}
  2. Changed21 schema fields changed
    • removedInput schema / properties / auth_token
      Removed value: -{
      -  "type": "string"
      -}
    • addedInput schema / properties / configuration / additionalProperties
      Added value: +true
    • addedInput schema / properties / configuration / description
      Added value: +"Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras."
    • addedInput schema / properties / configuration / properties
      Added value: +{
      +  "accommodationGroupId": {
      +    "description": "Accommodation group id from list_accommodations (optional).",
      +    "type": "string"
      +  },
      +  "mealType": {
      +    "description": "Meal plan key when accommodation is selected.",
      +    "type": "string"
      +  },
      +  "startDate": {
      +    "description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.",
      +    "examples": [
      +      "2026-09-07"
      +    ],
      +    "type": "string"
      +  },
      +  "students": {
      +    "description": "One object per traveller. courseId comes from list_courses.",
      +    "items": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "courseId": {
      +          "description": "Course product id from list_courses for this school.",
      +          "type": "string"
      +        },
      +        "weeks": {
      +          "description": "Course duration in weeks.",
      +          "minimum": 1,
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "type": "array"
      +  }
      +}
    • addedInput schema / properties / contact / additionalProperties
      Added value: +true
    • changedInput schema / properties / contact / description
      Previous value: -"Optional first_name, last_name, phone. Email always comes from the verified account. A different contact.email is rejected."New value: +"Optional first_name, last_name, phone. Email always comes from the verified account; contact.email must match or be omitted."
    • addedInput schema / properties / currency / description
      Added value: +"ISO 4217 currency for prices in this call. Usually EUR."
    • addedInput schema / properties / currency / examples
      Added value: +[
      +  "EUR"
      +]
    • changedInput schema / properties / idempotencyKey / description
      Previous value: -"Optional. Alias of idempotency_key."New value: +"Optional alias of idempotency_key."
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Optional. Same key + same payload within 24 hours replays the original response. A different payload with the same key fails."New value: +"Optional. Same key + same payload within 24 hours replays the original response; conflicting payload returns validation_failed."
    • addedInput schema / properties / phone / description
      Added value: +"Student phone number (required)."
    • changedInput schema / properties / phoneCountry / description
      Previous value: -"ISO2, e.g. NL"New value: +"ISO 3166-1 alpha-2 country for the phone (e.g. NL)."
    • changedInput schema / properties / privacyAccepted / description
      Previous value: -"Only needed for legacy auth_token sessions. OAuth grants already include privacy acceptance."New value: +"Must be true when not using OAuth."
    • addedInput schema / properties / school_id / description
      Added value: +"Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID."
    • addedInput schema / properties / school_id / examples
      Added value: +[
      +  12345
      +]
    • addedInput schema / properties / specialRequests / description
      Added value: +"Free-text notes for the school."
    • addedInput schema / properties / studentDetails / description
      Added value: +"Per-student details aligned with configuration.students (names, dates of birth, etc.)."
    • addedInput schema / properties / studentDetails / items
      Added value: +{
      +  "additionalProperties": true,
      +  "type": "object"
      +}
    • changedInput schema / properties / termsAccepted / description
      Previous value: -"Only needed for legacy auth_token sessions. OAuth grants already include terms acceptance."New value: +"Must be true when not using OAuth (OAuth grants record acceptance)."
    • addedInput schema / properties / trip_id / description
      Added value: +"Optional trip_id from save_trip linking this booking to a draft."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "agent_must_tell_the_user": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "booking": {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    "studentMessage": {
      +      "type": "string"
      +    },
      +    "success": {
      +      "const": true
      +    }
      +  },
      +  "required": [
      +    "success"
      +  ],
      +  "type": "object"
      +}
  3. Changed3 schema fields changed
    • changedInput schema / properties / idempotencyKey / description
      Previous value: -"Required. Reuse only to retry the same payload."New value: +"Optional. Alias of idempotency_key."
    • addedInput schema / properties / idempotency_key
      Added value: +{
      +  "description": "Optional. Same key + same payload within 24 hours replays the original response. A different payload with the same key fails.",
      +  "type": "string"
      +}
    • removedInput schema / required
      Removed value: -[
      -  "idempotencyKey"
      -]
  4. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses OAuth bookings scope/Bearer token requirement, the school-confirmation email and 5-day down-payment flow, an explicit instruction never to tell the user they are confirmed or paid, and 24-hour idempotency replay semantics. This is exactly the operational context annotations cannot convey.

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

Conciseness5/5

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

Front-loads the core action in the first clause, then layers workflow, warning, auth, and idempotency in tight sentences with no filler. Every sentence carries distinct, actionable information.

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?

With an output schema present and 100% schema coverage, the description's job is to supply the non-structural context, and it does: auth requirements, downstream timeline, user-facing messaging constraint, and idempotency behavior. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents every parameter thoroughly, including the nested configuration object. The description only restates idempotency behavior that the schema's idempotency_key description already covers, adding no new parameter-level meaning.

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 verb and resource ('Submit an unpaid booking for a bookings_live school') and anchors it to a known workflow ('same path as the website Book now flow'). This is clearly distinguishable from sibling tools like request_quote or save_trip.

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

Usage Guidelines4/5

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

Gives clear context for when this tool applies (live school booking, school still must confirm availability, trip_id can link a saved draft), but never names an alternative or a when-not condition, e.g. request_quote vs create_booking or what to do if the school is not bookings_live.

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