{
    "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"
                        ]
                    }
                ]
            }
        }
    ]
}