Extralingo
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Search language schools abroad, compare courses, dates and prices, and request bookings.
| Author | com.extralingo |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 2242 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"Extralingo": {
"url": "https://www.extralingo.com/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (17)
search_language_schoolsread-onlySearch 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.
Parameters:
city— string — Single city slug filter. Prefer cities[] for multiple.limit— integer — Maximum schools to return (1–20).query— string — Free-text search (school name, city, or keyword). Empty returns popular matches for the other filters.cities— array — City slug filters from get_school_filters.locale— string — Response language and site context. One of en, nl, da, sv.country— string — Country slug or name filter from get_school_filters.language— string — Language slug filter from get_school_filters (e.g. spanish, english).course_type— string — Course type slug from get_school_filters (e.g. intensive, private).
Hints: read-only yes · destructive no · idempotent yes · open-world no
search_destinationsread-onlySearch cities, countries, and school names. Use before search_language_schools to resolve place names to slugs.
Parameters:
limit— integer — Maximum results (1–20).query— string — Destination or school name prefix. Empty returns popular destinations.locale— string — Response language and site context. One of en, nl, da, sv.language— string — Optional language slug to restrict destinations (e.g. spanish).
Hints: read-only yes · destructive no · idempotent yes · open-world no
get_school_filtersread-onlyValid filter values for search_language_schools (languages, countries, cities, course types, and other facets).
Parameters:
locale— string — Response language and site context. One of en, nl, da, sv.
Hints: read-only yes · destructive no · idempotent yes · open-world no
get_schoolread-onlySchool briefing: profile, cancellation policy, reviews, image URLs, bookings_live flag, and optional hero image for chat UI. Requires school_id from search_language_schools.
Parameters:
school_id(required) — integer — Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.locale— string — Response language and site context. One of en, nl, da, sv.include_hero_image— boolean — When true, structuredContent may include a compressed JPEG in MCP image content; hero_image is stripped from structuredContent after attach.
Hints: read-only yes · destructive no · idempotent yes · open-world no
list_coursesread-onlyLive course catalogue for a bookings_live school (course ids, weeks, prices). Use returned course ids inside save_trip configuration.
Parameters:
school_id(required) — integer — Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.locale— string — Response language and site context. One of en, nl, da, sv.currency— string — ISO 4217 currency for prices in this call. Usually EUR.startDate— string — Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.country_code— string — Visitor country ISO 3166-1 alpha-2 (e.g. NL). Affects fee display where applicable.
Hints: read-only yes · destructive no · idempotent yes · open-world no
list_starting_datesread-onlyAllowed course start dates (typically Mondays) for a school. Use startDate values in list_courses and configuration.startDate.
Parameters:
school_id(required) — integer — Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.locale— string — Response language and site context. One of en, nl, da, sv.
Hints: read-only yes · destructive no · idempotent yes · open-world no
list_accommodationsread-onlyAccommodation groups for a school. Use group ids in save_trip configuration (accommodationGroupId).
Parameters:
school_id(required) — integer — Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.locale— string — Response language and site context. One of en, nl, da, sv.currency— string — ISO 4217 currency for prices in this call. Usually EUR.startDate— string — Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.country_code— string — Visitor country ISO 3166-1 alpha-2 (e.g. NL). Affects fee display where applicable.
Hints: read-only yes · destructive no · idempotent yes · open-world no
get_course_detailsread-onlyDetails for one course id from list_courses (pricing rows, supplements, metadata).
Parameters:
course_id(required) — string — Course product id from list_courses.school_id(required) — integer — Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.locale— string — Response language and site context. One of en, nl, da, sv.currency— string — ISO 4217 currency for prices in this call. Usually EUR.startDate— string — Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.
Hints: read-only yes · destructive no · idempotent yes · open-world no
get_accommodation_detailsread-onlyOne 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.
Parameters:
group_id(required) — string — Accommodation group id from list_accommodations.locale— string — Response language and site context. One of en, nl, da, sv.currency— string — ISO 4217 currency for prices in this call. Usually EUR.startDate— string — Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.
Hints: read-only yes · destructive no · idempotent yes · open-world no
calculate_trip_priceread-onlyLive checkout quote for a configuration. Not a booking. Call before create_booking and before telling the student a final price.
Parameters:
locale— string — Response language and site context. One of en, nl, da, sv.trip_id— string — Optional saved trip id; when set, the quote may be stored on that trip.currency— string — ISO 4217 currency for prices in this call. Usually EUR.school_id— integer — Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.country_code— string — Visitor country ISO 3166-1 alpha-2 (e.g. NL). Affects fee display where applicable.discountCode— string — Optional promotion or discount code.configuration— object — Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.
Hints: read-only yes · destructive no · idempotent yes · open-world no
save_tripCreate 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).
Parameters:
email— string — Optional student email for anonymous drafts. With OAuth, the verified account email is used.locale— string — Response language and site context. One of en, nl, da, sv.trip_id— string — Omit to create a new trip. Pass an existing trip_id from save_trip to update the same continue_url.school_id— integer — Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.configuration— object — Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.
Hints: read-only no · destructive no · idempotent no · open-world no
get_tripread-onlyLoad a saved trip by trip_id from save_trip. Returns continue_url for website handoff with configuration restored.
Parameters:
trip_id(required) — string — trip_id returned by save_trip.
Hints: read-only yes · destructive no · idempotent yes · open-world no
email_tripEmail 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.
Parameters:
trip_id(required) — string — trip_id from save_trip.email— string — Optional. Must match the verified OAuth account email if sent. The link is always sent to that account.locale— string — Response language and site context. One of en, nl, da, sv.lastName— string — Optional salutation for the email body.firstName— string — Optional salutation for the email body.
Hints: read-only no · destructive no · idempotent no · open-world yes
create_bookingSubmit 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.
Parameters:
phone— string — Student phone number (required).contact— object — Optional first_name, last_name, phone. Email always comes from the verified account; contact.email must match or be omitted.trip_id— string — Optional trip_id from save_trip linking this booking to a draft.currency— string — ISO 4217 currency for prices in this call. Usually EUR.school_id— integer — Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.phoneCountry— string — ISO 3166-1 alpha-2 country for the phone (e.g. NL).configuration— object — Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.termsAccepted— boolean — Must be true when not using OAuth (OAuth grants record acceptance).idempotencyKey— string — Optional alias of idempotency_key.studentDetails— array — Per-student details aligned with configuration.students (names, dates of birth, etc.).idempotency_key— string — Optional. Same key + same payload within 24 hours replays the original response; conflicting payload returns validation_failed.privacyAccepted— boolean — Must be true when not using OAuth.specialRequests— string — Free-text notes for the school.
Hints: read-only no · destructive no · idempotent no · open-world yes
request_quoteAsk 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.
Parameters:
contact— object — Optional first_name, last_name. Email always comes from the verified account.trip_id— string — Optional trip_id from save_trip.comments— string — Student message to the school.currency— string — ISO 4217 currency for prices in this call. Usually EUR.school_id— integer — Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.configuration— object — Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.idempotencyKey— string — Optional alias of idempotency_key.idempotency_key— string — Optional. Same semantics as create_booking (24 hour replay window).
Hints: read-only no · destructive no · idempotent no · open-world yes
request_discussionTrip 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.
Parameters:
contact— object — Optional first_name, last_name. Email always comes from the verified account.message— string — Student message to the school.trip_id— string — Optional trip_id from save_trip.currency— string — ISO 4217 currency for prices in this call. Usually EUR.school_id— integer — Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.configuration— object — Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.idempotencyKey— string — Optional alias of idempotency_key.idempotency_key— string — Optional. Same semantics as create_booking (24 hour replay window).
Hints: read-only no · destructive no · idempotent no · open-world yes
ask_school_questionSend a question to the school without a full trip configuration. Requires OAuth requests scope. Optional idempotency_key.
Parameters:
school_id(required) — integer — Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.message(required) — string — Student message to the school.contact— object — Optional first_name, last_name. Email always comes from the verified account.trip_id— string — Optional trip_id from save_trip.currency— string — ISO 4217 currency for prices in this call. Usually EUR.configuration— object — Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.idempotencyKey— string — Optional alias of idempotency_key.idempotency_key— string — Optional. Same semantics as create_booking (24 hour replay window).
Hints: read-only no · destructive no · idempotent no · open-world yes
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.