{
    "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 and a /s/{id} URL that loads the V2 school-page configurator. 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.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "trip_id": {
                        "type": "string"
                    }
                },
                "additionalProperties": true,
                "required": [
                    "trip_id"
                ]
            }
        },
        {
            "name": "email_trip",
            "description": "Email the /s/{id} link 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"
                ]
            }
        }
    ]
}