{"name":"Extralingo","title":"Extralingo language travel","description":"Search language schools, build a trip, and submit unpaid bookings that the school still confirms.","version":"3.0.0","protocolVersion":"2025-03-26","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, reviews. Prices are not a booking quote.","inputSchema":{"type":"object","properties":{"query":{"type":"string"},"language":{"type":"string","description":"Language slug, e.g. spanish"},"country":{"type":"string"},"city":{"type":"string"},"cities":{"type":"array","items":{"type":"string"}},"course_type":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":20,"default":5},"locale":{"type":"string","enum":["en","nl","da","sv"]}},"additionalProperties":true}},{"name":"search_destinations","description":"Search cities, countries and school names. Use to resolve a place before searching schools.","inputSchema":{"type":"object","properties":{"query":{"type":"string"},"language":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":20,"default":8},"locale":{"type":"string","enum":["en","nl","da","sv"]}},"additionalProperties":true}},{"name":"get_school_filters","description":"Valid filter values for search_language_schools (languages, cities, course types, etc.).","inputSchema":{"type":"object","properties":{"locale":{"type":"string","enum":["en","nl","da","sv"]}},"additionalProperties":true}},{"name":"get_school","description":"School briefing: profile, cancellation, reviews, image URLs, and a hero image. Pass school_id from search.","inputSchema":{"type":"object","properties":{"school_id":{"type":"integer"},"locale":{"type":"string","enum":["en","nl","da","sv"]},"include_hero_image":{"type":"boolean","default":true,"description":"Include a compressed JPEG for display in chat. Default true."}},"additionalProperties":true,"required":["school_id"]}},{"name":"list_courses","description":"Live course catalogue for a bookings_live school (ids, weeks, prices). Use these ids in save_trip.","inputSchema":{"type":"object","properties":{"school_id":{"type":"integer"},"startDate":{"type":"string","description":"YYYY-MM-DD Monday"},"currency":{"type":"string","default":"EUR"},"locale":{"type":"string","enum":["en","nl","da","sv"]},"country_code":{"type":"string"}},"additionalProperties":true,"required":["school_id"]}},{"name":"list_starting_dates","description":"Allowed course start dates (typically Mondays) for a school.","inputSchema":{"type":"object","properties":{"school_id":{"type":"integer"},"locale":{"type":"string","enum":["en","nl","da","sv"]}},"additionalProperties":true,"required":["school_id"]}},{"name":"list_accommodations","description":"Accommodation groups for a school. Use group ids in save_trip.","inputSchema":{"type":"object","properties":{"school_id":{"type":"integer"},"startDate":{"type":"string"},"currency":{"type":"string","default":"EUR"},"locale":{"type":"string","enum":["en","nl","da","sv"]},"country_code":{"type":"string"}},"additionalProperties":true,"required":["school_id"]}},{"name":"get_course_details","description":"Details for one course id from list_courses.","inputSchema":{"type":"object","properties":{"course_id":{"type":"string"},"school_id":{"type":"integer"},"startDate":{"type":"string"},"currency":{"type":"string","default":"EUR"},"locale":{"type":"string","enum":["en","nl","da","sv"]}},"additionalProperties":true,"required":["course_id","school_id"]}},{"name":"get_accommodation_details","description":"Details for one accommodation group id from list_accommodations.","inputSchema":{"type":"object","properties":{"group_id":{"type":"string"},"startDate":{"type":"string"},"currency":{"type":"string","default":"EUR"},"locale":{"type":"string","enum":["en","nl","da","sv"]}},"additionalProperties":true,"required":["group_id"]}},{"name":"calculate_trip_price","description":"Live checkout quote for a configuration. Not a booking. Call this before create_booking.","inputSchema":{"type":"object","properties":{"school_id":{"type":"integer"},"trip_id":{"type":"string"},"configuration":{"type":"object","description":"Same shape as the V2 school-page configurator: startDate, students[].courseId, weeks, accommodationGroupId, mealType, extras."},"currency":{"type":"string","default":"EUR"},"locale":{"type":"string","enum":["en","nl","da","sv"]},"discountCode":{"type":"string"},"country_code":{"type":"string"}},"additionalProperties":true}},{"name":"save_trip","description":"Create or update a server-side trip draft. Returns trip_id, url (legacy), trip_url, and continue_url (/s/{id}) so the student can continue on Extralingo.com with selections restored. Not a booking. No login code needed.","inputSchema":{"type":"object","properties":{"school_id":{"type":"integer"},"trip_id":{"type":"string","description":"Omit to create. Pass to update the same URL."},"configuration":{"type":"object"},"email":{"type":"string"},"locale":{"type":"string","enum":["en","nl","da","sv"]}},"additionalProperties":true}},{"name":"get_trip","description":"Load a saved trip by trip_id. Returns continue_url for website handoff with the configuration restored.","inputSchema":{"type":"object","properties":{"trip_id":{"type":"string"}},"additionalProperties":true,"required":["trip_id"]}},{"name":"email_trip","description":"Email continue_url (/s/{id}) to the student. No OTP. Rate-limited. This is not a booking.","inputSchema":{"type":"object","properties":{"trip_id":{"type":"string"},"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"locale":{"type":"string","enum":["en","nl","da","sv"]}},"additionalProperties":true,"required":["trip_id","email"]}},{"name":"send_login_code","description":"Email a 6-digit code. Required before create_booking, request_quote, request_discussion, or ask_school_question. Not needed for save_trip or email_trip.","inputSchema":{"type":"object","properties":{"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"locale":{"type":"string","enum":["en","nl","da","sv"]},"source":{"type":"string","enum":["booking","quote","discussion","question"],"default":"booking"}},"additionalProperties":true,"required":["email","firstName","lastName"]}},{"name":"verify_login_code","description":"Verify the email code. Returns auth_token (30 minutes). Pass it as auth_token on later tools, or Authorization: Bearer.","inputSchema":{"type":"object","properties":{"userId":{"type":"integer"},"code":{"type":"string"}},"additionalProperties":true,"required":["userId","code"]}},{"name":"create_booking","description":"Submit an unpaid booking for a bookings_live school. Same path as the V2 school-page Book now flow: school confirms, Extralingo emails, pay within 5 days via Extralingo only. Requires auth_token, termsAccepted, privacyAccepted, phone. Never tell the user they are confirmed or paid.","inputSchema":{"type":"object","properties":{"auth_token":{"type":"string"},"trip_id":{"type":"string"},"school_id":{"type":"integer"},"configuration":{"type":"object"},"phone":{"type":"string"},"phoneCountry":{"type":"string","description":"ISO2, e.g. NL"},"termsAccepted":{"type":"boolean"},"privacyAccepted":{"type":"boolean"},"contact":{"type":"object"},"studentDetails":{"type":"array"},"currency":{"type":"string","default":"EUR"},"idempotencyKey":{"type":"string"},"specialRequests":{"type":"string"}},"additionalProperties":true,"required":["termsAccepted","privacyAccepted"]}},{"name":"request_quote","description":"Ask the school for a personal quote. Use when bookings_live is false, or the student is not ready to book. Requires auth_token.","inputSchema":{"type":"object","properties":{"auth_token":{"type":"string"},"trip_id":{"type":"string"},"school_id":{"type":"integer"},"configuration":{"type":"object"},"comments":{"type":"string"},"currency":{"type":"string","default":"EUR"}},"additionalProperties":true}},{"name":"request_discussion","description":"Open a trip discussion with the school. Requires auth_token.","inputSchema":{"type":"object","properties":{"auth_token":{"type":"string"},"trip_id":{"type":"string"},"school_id":{"type":"integer"},"configuration":{"type":"object"},"message":{"type":"string"},"currency":{"type":"string","default":"EUR"}},"additionalProperties":true}},{"name":"ask_school_question","description":"Send a question to the school without a full trip config. Requires auth_token.","inputSchema":{"type":"object","properties":{"auth_token":{"type":"string"},"school_id":{"type":"integer"},"message":{"type":"string"},"currency":{"type":"string","default":"EUR"}},"additionalProperties":true,"required":["school_id","message"]}}]}