{"name":"Extralingo","title":"Extralingo","description":"Search language schools abroad, compare courses, dates and prices, and request bookings.","version":"3.0.1","protocolVersion":"2025-06-18","transport":"streamable-http","url":"https://www.extralingo.com/mcp","endpoint":"https://www.extralingo.com/mcp","serverUrl":"https://www.extralingo.com/mcp","icon":"https://www.extralingo.com/img/favicon/web-app-manifest-512x512.png","documentation":"https://www.extralingo.com/llms.txt","openapi":"https://www.extralingo.com/openapi.json","auth":"https://www.extralingo.com/auth.md","tools":[{"name":"search_language_schools","description":"Search and rank language schools. Returns school_id, url, indicative from-price, and reviews. Prices are not a booking quote; call calculate_trip_price before quoting a total.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Free-text search (school name, city, or keyword). Empty returns popular matches for the other filters.","examples":["Barcelona intensive Spanish"]},"language":{"type":"string","description":"Language slug filter from get_school_filters (e.g. spanish, english).","examples":["spanish"]},"country":{"type":"string","description":"Country slug or name filter from get_school_filters."},"city":{"type":"string","description":"Single city slug filter. Prefer cities[] for multiple."},"cities":{"type":"array","description":"City slug filters from get_school_filters.","items":{"type":"string","description":"City slug."}},"course_type":{"type":"string","description":"Course type slug from get_school_filters (e.g. intensive, private)."},"limit":{"type":"integer","minimum":1,"maximum":20,"default":5,"description":"Maximum schools to return (1–20)."},"locale":{"type":"string","enum":["en","nl","da","sv"],"description":"Response language and site context. One of en, nl, da, sv.","examples":["en","nl","da","sv"]}},"additionalProperties":true},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"data":{"type":"object","description":"Meilisearch-style payload with hits[] (school_id, title, url, city, country, pricing hints).","additionalProperties":true}},"additionalProperties":true},"annotations":{"title":"Search language schools","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]}},{"name":"search_destinations","description":"Search cities, countries, and school names. Use before search_language_schools to resolve place names to slugs.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Destination or school name prefix. Empty returns popular destinations."},"language":{"type":"string","description":"Optional language slug to restrict destinations (e.g. spanish)."},"limit":{"type":"integer","minimum":1,"maximum":20,"default":8,"description":"Maximum results (1–20)."},"locale":{"type":"string","enum":["en","nl","da","sv"],"description":"Response language and site context. One of en, nl, da, sv.","examples":["en","nl","da","sv"]}},"additionalProperties":true},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"query":{"type":"string"},"locale":{"type":"string","enum":["en","nl","da","sv"]},"hits":{"type":"array","description":"Destination matches.","items":{"type":"object","additionalProperties":true}},"schools":{"type":"array","description":"Optional school name fallback hits.","items":{"type":"object","additionalProperties":true}}},"additionalProperties":true},"annotations":{"title":"Search destinations","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]}},{"name":"get_school_filters","description":"Valid filter values for search_language_schools (languages, countries, cities, course types, and other facets).","inputSchema":{"type":"object","properties":{"locale":{"type":"string","enum":["en","nl","da","sv"],"description":"Response language and site context. One of en, nl, da, sv.","examples":["en","nl","da","sv"]}},"additionalProperties":true},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"data":{"type":"object","description":"Facet lists keyed by filter name.","additionalProperties":true}},"additionalProperties":true},"annotations":{"title":"Get school search filters","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]}},{"name":"get_school","description":"School briefing: profile, cancellation policy, reviews, image URLs, bookings_live flag, and optional hero image for chat UI. Requires school_id from search_language_schools.","inputSchema":{"type":"object","properties":{"school_id":{"type":"integer","description":"Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.","examples":[12345]},"locale":{"type":"string","enum":["en","nl","da","sv"],"description":"Response language and site context. One of en, nl, da, sv.","examples":["en","nl","da","sv"]},"include_hero_image":{"type":"boolean","default":true,"description":"When true, structuredContent may include a compressed JPEG in MCP image content; hero_image is stripped from structuredContent after attach."}},"additionalProperties":true,"required":["school_id"]},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"data":{"type":"object","description":"School profile (title, url, city, country, bookings_live, reviews, images[]).","additionalProperties":true}},"additionalProperties":true},"annotations":{"title":"Get school briefing","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]}},{"name":"list_courses","description":"Live course catalogue for a bookings_live school (course ids, weeks, prices). Use returned course ids inside save_trip configuration.","inputSchema":{"type":"object","properties":{"school_id":{"type":"integer","description":"Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.","examples":[12345]},"startDate":{"type":"string","description":"Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.","examples":["2026-09-07"]},"currency":{"type":"string","default":"EUR","description":"ISO 4217 currency for prices in this call. Usually EUR.","examples":["EUR"]},"locale":{"type":"string","enum":["en","nl","da","sv"],"description":"Response language and site context. One of en, nl, da, sv.","examples":["en","nl","da","sv"]},"country_code":{"type":"string","description":"Visitor country ISO 3166-1 alpha-2 (e.g. NL). Affects fee display where applicable.","examples":["NL","DE"]}},"additionalProperties":true,"required":["school_id"]},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"course_types":{"type":"array","description":"Course types with nested courses[] (course ids, weeks, week prices).","items":{"type":"object","additionalProperties":true}},"school":{"type":["object","null"],"additionalProperties":true,"description":"School metadata from the booking API."},"currency":{"type":"string"},"start_date":{"type":"string","description":"Effective start date used for pricing (YYYY-MM-DD)."},"busy_school_months":{"type":["object","null"],"additionalProperties":true},"pricing_rule":{"type":["object","null"],"additionalProperties":true},"has_location_discounts":{"type":"boolean"},"location_discount":{"type":["object","null"],"additionalProperties":true}},"additionalProperties":true},"annotations":{"title":"List courses","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]}},{"name":"list_starting_dates","description":"Allowed course start dates (typically Mondays) for a school. Use startDate values in list_courses and configuration.startDate.","inputSchema":{"type":"object","properties":{"school_id":{"type":"integer","description":"Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.","examples":[12345]},"locale":{"type":"string","enum":["en","nl","da","sv"],"description":"Response language and site context. One of en, nl, da, sv.","examples":["en","nl","da","sv"]}},"additionalProperties":true,"required":["school_id"]},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"dates":{"type":"array","description":"Bookable course start dates (typically Mondays, YYYY-MM-DD strings).","items":{"type":"string"}}},"additionalProperties":true},"annotations":{"title":"List starting dates","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]}},{"name":"list_accommodations","description":"Accommodation groups for a school. Use group ids in save_trip configuration (accommodationGroupId).","inputSchema":{"type":"object","properties":{"school_id":{"type":"integer","description":"Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.","examples":[12345]},"startDate":{"type":"string","description":"Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.","examples":["2026-09-07"]},"currency":{"type":"string","default":"EUR","description":"ISO 4217 currency for prices in this call. Usually EUR.","examples":["EUR"]},"locale":{"type":"string","enum":["en","nl","da","sv"],"description":"Response language and site context. One of en, nl, da, sv.","examples":["en","nl","da","sv"]},"country_code":{"type":"string","description":"Visitor country ISO 3166-1 alpha-2 (e.g. NL). Affects fee display where applicable.","examples":["NL","DE"]}},"additionalProperties":true,"required":["school_id"]},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"accommodation_groups":{"type":"array","description":"Flat list of accommodation groups (id for get_accommodation_details / configuration).","items":{"type":"object","additionalProperties":true}},"accommodation_categories":{"type":"array","description":"Same groups nested by category for display.","items":{"type":"object","additionalProperties":true}},"allows_double_room_individual_bookings":{"type":"boolean"},"school":{"type":["object","null"],"additionalProperties":true},"currency":{"type":"string"},"start_date":{"type":"string"},"busy_school_months":{"type":["object","null"],"additionalProperties":true},"has_location_discounts":{"type":"boolean"},"location_discount":{"type":["object","null"],"additionalProperties":true}},"additionalProperties":true},"annotations":{"title":"List accommodations","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]}},{"name":"get_course_details","description":"Details for one course id from list_courses (pricing rows, supplements, metadata).","inputSchema":{"type":"object","properties":{"course_id":{"type":"string","description":"Course product id from list_courses."},"school_id":{"type":"integer","description":"Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.","examples":[12345]},"startDate":{"type":"string","description":"Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.","examples":["2026-09-07"]},"currency":{"type":"string","default":"EUR","description":"ISO 4217 currency for prices in this call. Usually EUR.","examples":["EUR"]},"locale":{"type":"string","enum":["en","nl","da","sv"],"description":"Response language and site context. One of en, nl, da, sv.","examples":["en","nl","da","sv"]}},"additionalProperties":true,"required":["course_id","school_id"]},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"course":{"type":["object","null"],"description":"Single course product with pricing rows and supplements for the requested start date.","additionalProperties":true}},"additionalProperties":true},"annotations":{"title":"Get course details","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]}},{"name":"get_accommodation_details","description":"One group from list_accommodations (group_id): type, room_types, meal/board options, distance, amenities, age and min-stay rules, and week prices for startDate and currency. Use after list_accommodations, before save_trip or calculate_trip_price, or to answer questions about one option. Week prices are indicative; call calculate_trip_price for a checkout total.","inputSchema":{"type":"object","properties":{"group_id":{"type":"string","description":"Accommodation group id from list_accommodations."},"startDate":{"type":"string","description":"Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.","examples":["2026-09-07"]},"currency":{"type":"string","default":"EUR","description":"ISO 4217 currency for prices in this call. Usually EUR.","examples":["EUR"]},"locale":{"type":"string","enum":["en","nl","da","sv"],"description":"Response language and site context. One of en, nl, da, sv.","examples":["en","nl","da","sv"]}},"additionalProperties":true,"required":["group_id"]},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"group":{"type":"object","description":"Accommodation group from GET /v3/accommodations/{id} (v2 grouping): labels, classification, room and meal options, facilities, rules, and pricing hints for the requested start date.","additionalProperties":true,"properties":{"id":{"type":"string","description":"Group id (matches group_id)."},"name":{"type":"string","description":"Display name of the accommodation group."},"group_name":{"type":"string","description":"Grouped title when room-type grouping is enabled."},"classification":{"type":"object","description":"Accommodation type, class, and room metadata.","additionalProperties":true},"distance":{"type":["string","object","null"],"description":"Distance-to-school summary (string or structured object from the API).","additionalProperties":true},"location":{"type":"object","description":"Address, distance_to_school, and travel-time hints.","additionalProperties":true},"room_types":{"type":"array","description":"Room variants, each with meal_options, stay_length, and week pricing.","items":{"type":"object","additionalProperties":true}},"meal_options":{"type":"array","description":"Board/meal plans with pricing_for_requested_weeks when not split by room_types.","items":{"type":"object","additionalProperties":true}},"amenities":{"type":"array","description":"Facilities and highlighted amenities.","items":{"type":"object","additionalProperties":true}},"occupancy":{"type":"object","description":"Minimum/maximum age and occupancy limits.","additionalProperties":true},"stay_length":{"type":"object","description":"Minimum and maximum stay in weeks.","additionalProperties":true}}}},"additionalProperties":true},"annotations":{"title":"Get accommodation details","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]}},{"name":"calculate_trip_price","description":"Live checkout quote for a configuration. Not a booking. Call before create_booking and before telling the student a final price.","inputSchema":{"type":"object","properties":{"school_id":{"type":"integer","description":"Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.","examples":[12345]},"trip_id":{"type":"string","description":"Optional saved trip id; when set, the quote may be stored on that trip."},"configuration":{"type":"object","description":"Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.","additionalProperties":true,"properties":{"startDate":{"type":"string","description":"Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.","examples":["2026-09-07"]},"students":{"type":"array","description":"One object per traveller. courseId comes from list_courses.","items":{"type":"object","additionalProperties":true,"properties":{"courseId":{"type":"string","description":"Course product id from list_courses for this school."},"weeks":{"type":"integer","minimum":1,"description":"Course duration in weeks."}}}},"accommodationGroupId":{"type":"string","description":"Accommodation group id from list_accommodations (optional)."},"mealType":{"type":"string","description":"Meal plan key when accommodation is selected."}}},"currency":{"type":"string","default":"EUR","description":"ISO 4217 currency for prices in this call. Usually EUR.","examples":["EUR"]},"locale":{"type":"string","enum":["en","nl","da","sv"],"description":"Response language and site context. One of en, nl, da, sv.","examples":["en","nl","da","sv"]},"discountCode":{"type":"string","description":"Optional promotion or discount code."},"country_code":{"type":"string","description":"Visitor country ISO 3166-1 alpha-2 (e.g. NL). Affects fee display where applicable.","examples":["NL","DE"]}},"additionalProperties":true},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"quote":{"type":"object","description":"Human-oriented price summary.","additionalProperties":true},"data":{"type":"object","description":"Full pricing breakdown from the booking engine.","additionalProperties":true}},"additionalProperties":true},"annotations":{"title":"Calculate trip price","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]}},{"name":"save_trip","description":"Create or update a server-side trip draft. Returns trip_id, url, trip_url, and continue_url (/s/{id}) so the student can restore selections on Extralingo.com. Not a booking. Requires OAuth trips scope (Bearer token).","inputSchema":{"type":"object","properties":{"school_id":{"type":"integer","description":"Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.","examples":[12345]},"trip_id":{"type":"string","description":"Omit to create a new trip. Pass an existing trip_id from save_trip to update the same continue_url."},"configuration":{"type":"object","description":"Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.","additionalProperties":true,"properties":{"startDate":{"type":"string","description":"Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.","examples":["2026-09-07"]},"students":{"type":"array","description":"One object per traveller. courseId comes from list_courses.","items":{"type":"object","additionalProperties":true,"properties":{"courseId":{"type":"string","description":"Course product id from list_courses for this school."},"weeks":{"type":"integer","minimum":1,"description":"Course duration in weeks."}}}},"accommodationGroupId":{"type":"string","description":"Accommodation group id from list_accommodations (optional)."},"mealType":{"type":"string","description":"Meal plan key when accommodation is selected."}}},"email":{"type":"string","description":"Optional student email for anonymous drafts. With OAuth, the verified account email is used."},"locale":{"type":"string","enum":["en","nl","da","sv"],"description":"Response language and site context. One of en, nl, da, sv.","examples":["en","nl","da","sv"]}},"additionalProperties":true},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"trip_id":{"type":"string","description":"Shareable trip id (/s/{id})."},"school_id":{"type":"integer","description":"Craft school entry id."},"school_name":{"type":"string"},"school_url":{"type":"string"},"url":{"type":"string","description":"Legacy alias of continue_url."},"trip_url":{"type":"string"},"continue_url":{"type":"string","description":"Shareable Extralingo URL that restores configuration."},"configuration":{"type":"object","additionalProperties":true},"summary":{"type":"string","description":"Human-readable configuration summary for agents."},"note":{"type":"string"}},"additionalProperties":true},"annotations":{"title":"Save trip draft","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["trips"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["trips"]}]}},{"name":"get_trip","description":"Load a saved trip by trip_id from save_trip. Returns continue_url for website handoff with configuration restored.","inputSchema":{"type":"object","properties":{"trip_id":{"type":"string","description":"trip_id returned by save_trip."}},"additionalProperties":true,"required":["trip_id"]},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"trip_id":{"type":"string","description":"Shareable trip id (/s/{id})."},"school_id":{"type":"integer","description":"Craft school entry id."},"school_name":{"type":"string"},"school_url":{"type":"string"},"url":{"type":"string","description":"Legacy alias of continue_url."},"trip_url":{"type":"string"},"continue_url":{"type":"string","description":"Shareable Extralingo URL that restores configuration."},"configuration":{"type":"object","additionalProperties":true},"summary":{"type":"string","description":"Human-readable configuration summary for agents."},"note":{"type":"string"}},"additionalProperties":true},"annotations":{"title":"Get saved trip","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]}},{"name":"email_trip","description":"Email continue_url (/s/{id}) to the verified account inbox. Requires OAuth trips scope. Rate-limited. Not a booking; you can share continue_url without emailing.","inputSchema":{"type":"object","properties":{"trip_id":{"type":"string","description":"trip_id from save_trip."},"email":{"type":"string","description":"Optional. Must match the verified OAuth account email if sent. The link is always sent to that account."},"firstName":{"type":"string","description":"Optional salutation for the email body."},"lastName":{"type":"string","description":"Optional salutation for the email body."},"locale":{"type":"string","enum":["en","nl","da","sv"],"description":"Response language and site context. One of en, nl, da, sv.","examples":["en","nl","da","sv"]}},"additionalProperties":true,"required":["trip_id"]},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"trip_id":{"type":"string"},"emailed_to":{"type":"string","description":"Verified account inbox that received the email."},"message":{"type":"string"},"url":{"type":"string","description":"Legacy alias of continue_url."},"trip_url":{"type":"string"},"continue_url":{"type":"string"}},"additionalProperties":true},"annotations":{"title":"Email trip link","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["trips"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["trips"]}]}},{"name":"create_booking","description":"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.","inputSchema":{"type":"object","properties":{"trip_id":{"type":"string","description":"Optional trip_id from save_trip linking this booking to a draft."},"school_id":{"type":"integer","description":"Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.","examples":[12345]},"configuration":{"type":"object","description":"Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.","additionalProperties":true,"properties":{"startDate":{"type":"string","description":"Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.","examples":["2026-09-07"]},"students":{"type":"array","description":"One object per traveller. courseId comes from list_courses.","items":{"type":"object","additionalProperties":true,"properties":{"courseId":{"type":"string","description":"Course product id from list_courses for this school."},"weeks":{"type":"integer","minimum":1,"description":"Course duration in weeks."}}}},"accommodationGroupId":{"type":"string","description":"Accommodation group id from list_accommodations (optional)."},"mealType":{"type":"string","description":"Meal plan key when accommodation is selected."}}},"phone":{"type":"string","description":"Student phone number (required)."},"phoneCountry":{"type":"string","description":"ISO 3166-1 alpha-2 country for the phone (e.g. NL)."},"termsAccepted":{"type":"boolean","description":"Must be true when not using OAuth (OAuth grants record acceptance)."},"privacyAccepted":{"type":"boolean","description":"Must be true when not using OAuth."},"contact":{"type":"object","description":"Optional first_name, last_name, phone. Email always comes from the verified account; contact.email must match or be omitted.","additionalProperties":true},"studentDetails":{"type":"array","description":"Per-student details aligned with configuration.students (names, dates of birth, etc.).","items":{"type":"object","additionalProperties":true}},"currency":{"type":"string","default":"EUR","description":"ISO 4217 currency for prices in this call. Usually EUR.","examples":["EUR"]},"idempotencyKey":{"type":"string","description":"Optional alias of idempotency_key."},"idempotency_key":{"type":"string","description":"Optional. Same key + same payload within 24 hours replays the original response; conflicting payload returns validation_failed."},"specialRequests":{"type":"string","description":"Free-text notes for the school."}},"additionalProperties":true},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"bookingId":{"type":["integer","null"],"description":"Craft booking id when returned by the booking engine."},"bookingReference":{"type":["string","null"]},"status":{"type":"string","description":"e.g. awaiting_school_confirmation."},"redirectUrl":{"type":["string","null"]},"studentMessage":{"type":"string"},"agent_must_tell_the_user":{"type":"array","items":{"type":"string"}}},"additionalProperties":true},"annotations":{"title":"Create unpaid booking","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["bookings"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["bookings"]}]}},{"name":"request_quote","description":"Ask the school for a personal quote when bookings_live is false or the student is not ready to book. Requires OAuth requests scope. Optional idempotency_key.","inputSchema":{"type":"object","properties":{"idempotency_key":{"type":"string","description":"Optional. Same semantics as create_booking (24 hour replay window)."},"idempotencyKey":{"type":"string","description":"Optional alias of idempotency_key."},"trip_id":{"type":"string","description":"Optional trip_id from save_trip."},"school_id":{"type":"integer","description":"Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.","examples":[12345]},"configuration":{"type":"object","description":"Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.","additionalProperties":true,"properties":{"startDate":{"type":"string","description":"Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.","examples":["2026-09-07"]},"students":{"type":"array","description":"One object per traveller. courseId comes from list_courses.","items":{"type":"object","additionalProperties":true,"properties":{"courseId":{"type":"string","description":"Course product id from list_courses for this school."},"weeks":{"type":"integer","minimum":1,"description":"Course duration in weeks."}}}},"accommodationGroupId":{"type":"string","description":"Accommodation group id from list_accommodations (optional)."},"mealType":{"type":"string","description":"Meal plan key when accommodation is selected."}}},"comments":{"type":"string","description":"Student message to the school."},"currency":{"type":"string","default":"EUR","description":"ISO 4217 currency for prices in this call. Usually EUR.","examples":["EUR"]},"contact":{"type":"object","description":"Optional first_name, last_name. Email always comes from the verified account.","additionalProperties":true}},"additionalProperties":true},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"kind":{"type":"string","description":"Lead type on success.","enum":["quote"]},"newBookingId":{"type":["integer","null"],"description":"Craft newBookings entry id when created."},"redirectUrl":{"type":["string","null"],"description":"Extralingo /my URL for the student to follow the request, when available."},"message":{"type":"string","description":"Human-readable confirmation (not a booking confirmation)."}},"additionalProperties":true},"annotations":{"title":"Request quote","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["requests"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["requests"]}]}},{"name":"request_discussion","description":"Trip discussion: trip_id or school_id+configuration plus message. ask_school_question: question without a trip. request_quote: personal quote (comments) when not booking. School gets the config; Extralingo emails the verified account and coordinates replies. Returns kind, newBookingId, redirectUrl, message (not a booking). OAuth scope requests. Optional idempotency_key.","inputSchema":{"type":"object","properties":{"idempotency_key":{"type":"string","description":"Optional. Same semantics as create_booking (24 hour replay window)."},"idempotencyKey":{"type":"string","description":"Optional alias of idempotency_key."},"trip_id":{"type":"string","description":"Optional trip_id from save_trip."},"school_id":{"type":"integer","description":"Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.","examples":[12345]},"configuration":{"type":"object","description":"Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.","additionalProperties":true,"properties":{"startDate":{"type":"string","description":"Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.","examples":["2026-09-07"]},"students":{"type":"array","description":"One object per traveller. courseId comes from list_courses.","items":{"type":"object","additionalProperties":true,"properties":{"courseId":{"type":"string","description":"Course product id from list_courses for this school."},"weeks":{"type":"integer","minimum":1,"description":"Course duration in weeks."}}}},"accommodationGroupId":{"type":"string","description":"Accommodation group id from list_accommodations (optional)."},"mealType":{"type":"string","description":"Meal plan key when accommodation is selected."}}},"message":{"type":"string","description":"Student message to the school."},"currency":{"type":"string","default":"EUR","description":"ISO 4217 currency for prices in this call. Usually EUR.","examples":["EUR"]},"contact":{"type":"object","description":"Optional first_name, last_name. Email always comes from the verified account.","additionalProperties":true}},"additionalProperties":true},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"kind":{"type":"string","description":"Lead type on success.","enum":["discussion"]},"newBookingId":{"type":["integer","null"],"description":"Craft newBookings entry id when created."},"redirectUrl":{"type":["string","null"],"description":"Extralingo /my URL for the student to follow the request, when available."},"message":{"type":"string","description":"Human-readable confirmation (not a booking confirmation)."}},"additionalProperties":true},"annotations":{"title":"Request discussion","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["requests"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["requests"]}]}},{"name":"ask_school_question","description":"Send a question to the school without a full trip configuration. Requires OAuth requests scope. Optional idempotency_key.","inputSchema":{"type":"object","properties":{"idempotency_key":{"type":"string","description":"Optional. Same semantics as create_booking (24 hour replay window)."},"idempotencyKey":{"type":"string","description":"Optional alias of idempotency_key."},"trip_id":{"type":"string","description":"Optional trip_id from save_trip."},"school_id":{"type":"integer","description":"Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.","examples":[12345]},"configuration":{"type":"object","description":"Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.","additionalProperties":true,"properties":{"startDate":{"type":"string","description":"Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.","examples":["2026-09-07"]},"students":{"type":"array","description":"One object per traveller. courseId comes from list_courses.","items":{"type":"object","additionalProperties":true,"properties":{"courseId":{"type":"string","description":"Course product id from list_courses for this school."},"weeks":{"type":"integer","minimum":1,"description":"Course duration in weeks."}}}},"accommodationGroupId":{"type":"string","description":"Accommodation group id from list_accommodations (optional)."},"mealType":{"type":"string","description":"Meal plan key when accommodation is selected."}}},"message":{"type":"string","description":"Student message to the school."},"currency":{"type":"string","default":"EUR","description":"ISO 4217 currency for prices in this call. Usually EUR.","examples":["EUR"]},"contact":{"type":"object","description":"Optional first_name, last_name. Email always comes from the verified account.","additionalProperties":true}},"additionalProperties":true,"required":["school_id","message"]},"outputSchema":{"type":"object","required":["success"],"properties":{"success":{"const":true},"kind":{"type":"string","description":"Lead type on success.","enum":["question"]},"newBookingId":{"type":["integer","null"],"description":"Craft newBookings entry id when created."},"redirectUrl":{"type":["string","null"],"description":"Extralingo /my URL for the student to follow the request, when available."},"message":{"type":"string","description":"Human-readable confirmation (not a booking confirmation)."}},"additionalProperties":true},"annotations":{"title":"Ask school a question","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["requests"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["requests"]}]}}]}