FlightFix
EU261/UK261 flight compensation check, rights and claim letters. Free.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"flight-fix": {
"url": "https://flight-fix.magicteams.ai/mcp"
}
}
}Remote endpoints
https://flight-fix.magicteams.ai/mcpstreamable-httpWhat it can do
Tool inventory
Tools (5)
🟢check_compensation(departure, arrival, disrupted, arrival_delay_hours, notice_days, ...)
Assess one disrupted flight under EU261/UK261: works out which scheme applies (or none), route distance and band, whether fixed compensation is due and how much (EUR/GBP), care rights, the stated reason's effect, and next steps. Use for 'what am I owed for my flight?'. Do NOT use to write the claim; use generate_claim_letter.
Input Schema
{
"type": "object",
"properties": {
"departure": {
"type": "string",
"description": "Departure airport 3-letter IATA code, case-insensitive, e.g. LHR"
},
"arrival": {
"type": "string",
"description": "Final arrival airport 3-letter IATA code, case-insensitive, e.g. JFK"
},
"disrupted": {
"type": "string",
"enum": [
"delayed",
"cancelled"
],
"description": "What happened: delayed (arrived late) or cancelled."
},
"arrival_delay_hours": {
"type": "number",
"minimum": 0,
"description": "Hours late at the final destination, e.g. 4.5. Drives delay compensation (>= 3h) and care. Default 0."
},
"notice_days": {
"type": "number",
"minimum": 0,
"description": "For cancellations: days of notice the airline gave before departure, e.g. 3. 14+ days means no fixed compensation. Default 0."
},
"rerouted": {
"type": "boolean",
"description": "For cancellations: true if the airline re-routed you on another flight. Default false."
},
"reroute_arrival_delay_hours": {
"type": "number",
"minimum": 0,
"description": "For re-routed cancellations: hours the replacement arrived after the original schedule, e.g. 2. Default 0."
},
"reason_category": {
"type": "string",
"enum": [
"unknown",
"weather",
"atc",
"security",
"political",
"strike_atc",
"strike_airline",
"technical",
"crew",
"other"
],
"description": "Cause the airline gave: weather, atc, security, political, strike_atc (third-party strike) are exempt; technical, strike_airline, other are not; crew is case-by-case. Default unknown."
},
"carrier_country": {
"type": "string",
"description": "Operating airline's 2-letter country code, e.g. DE for Lufthansa, US for United. Needed for flights arriving into the EU/UK from outside."
},
"distance_km": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Override the computed great-circle distance in km, e.g. 5540. Both airports must still be known IATA codes."
}
},
"required": [
"departure",
"arrival",
"disrupted"
]
}Output Schema
{
"type": "object",
"properties": {
"scheme": {
"type": "string",
"enum": [
"EU261",
"UK261",
"none"
],
"description": "Passenger-rights scheme that applies to this route."
},
"jurisdiction_reason": {
"type": "string",
"description": "Why that scheme does or does not apply."
},
"route": {
"type": "object",
"description": "Resolved airports and countries.",
"properties": {
"departure": {
"type": "string",
"description": "Departure as 'IATA (City, Country)'."
},
"arrival": {
"type": "string",
"description": "Arrival as 'IATA (City, Country)'."
},
"departure_country": {
"type": "string",
"description": "Departure ISO country code."
},
"arrival_country": {
"type": "string",
"description": "Arrival ISO country code."
}
},
"required": [
"departure",
"arrival"
]
},
"distance_km": {
"type": "number",
"description": "Route distance in km used for the band."
},
"band": {
"type": "string",
"enum": [
"short",
"medium",
"long"
],
"description": "Distance band: short <=1500 km, medium <=3500 km, long beyond."
},
"compensation": {
"type": "object",
"description": "Fixed-compensation outcome.",
"properties": {
"eligible": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "string",
"enum": [
"possibly"
]
}
],
"description": "true, false, or 'possibly' when the reason is unknown or crew-related."
},
"amount": {
"type": [
"number",
"null"
],
"description": "Amount due, or null when none."
},
"currency": {
"type": [
"string",
"null"
],
"enum": [
"EUR",
"GBP",
null
],
"description": "EUR for EU261, GBP for UK261, null when no scheme."
},
"note": {
"type": "string",
"description": "Explanation of the outcome."
}
},
"required": [
"eligible",
"amount",
"currency",
"note"
]
},
"care_rights": {
"type": "object",
"description": "Duty-of-care entitlements (meals, hotel, calls).",
"properties": {
"due": {
"type": "boolean",
"description": "Whether EU261/UK261 care is owed for this disruption (always false when no scheme applies)."
},
"items": {
"type": "array",
"items": {
"type": "string"
},
"description": "Care items owed (empty when not due)."
},
"note": {
"type": "string",
"description": "When care starts for this band, or why no scheme care applies."
}
},
"required": [
"due",
"items",
"note"
]
},
"reason": {
"type": "object",
"description": "Assessment of the disruption cause.",
"properties": {
"category": {
"type": "string",
"description": "Reason category assessed."
},
"exempt": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "string",
"enum": [
"possibly",
"unknown"
]
}
],
"description": "Whether it exempts the airline: true, false, 'possibly' or 'unknown'."
},
"note": {
"type": "string",
"description": "Explanation with case-law pointers."
}
},
"required": [
"category",
"exempt",
"note"
]
},
"next_steps": {
"type": "array",
"items": {
"type": "string"
},
"description": "Recommended next actions in order."
},
"disclaimer": {
"type": "string",
"description": "Not-legal-advice disclaimer to show the user."
}
},
"required": [
"scheme",
"jurisdiction_reason",
"route",
"distance_km",
"band",
"compensation",
"care_rights",
"reason",
"next_steps",
"disclaimer"
]
}🟢compensation_table
Return the general EU261/UK261 reference: compensation amounts per distance band (EUR and GBP), when care starts, the main eligibility rules and claim time limits. Use when the user asks how the rules work or what the amounts are. Do NOT use to assess a specific flight; use check_compensation.
Input Schema
{
"type": "object",
"properties": {},
"required": []
}Output Schema
{
"type": "object",
"properties": {
"rules": {
"type": "array",
"description": "Compensation amounts per distance band.",
"items": {
"type": "object",
"properties": {
"band": {
"type": "string",
"description": "Band name: short, medium or long."
},
"distance": {
"type": "string",
"description": "Distance range in words."
},
"eu_eur": {
"type": "number",
"description": "EU261 amount in EUR."
},
"uk_gbp": {
"type": "number",
"description": "UK261 amount in GBP."
},
"care_from": {
"type": "string",
"description": "Delay at which care starts."
}
},
"required": [
"band",
"distance",
"eu_eur",
"uk_gbp",
"care_from"
]
}
},
"eligibility_summary": {
"type": "array",
"items": {
"type": "string"
},
"description": "Key eligibility rules, one per entry."
},
"claim_windows": {
"type": "string",
"description": "Time limits for filing claims (EU and UK)."
},
"disclaimer": {
"type": "string",
"description": "Not-legal-advice disclaimer to show the user."
}
},
"required": [
"rules",
"eligibility_summary",
"claim_windows",
"disclaimer"
]
}🟢disruption_rights(departure, arrival, disrupted, arrival_delay_hours, notice_days, ...)
List passenger rights for a disruption: first works out whether EU261/UK261 covers the route (as check_compensation does), then gives refund/re-routing, care by band, 5-hour refund, notice-based cancellation compensation rules, denied boarding and escalation. If no scheme applies, gives general guidance only. Does not compute money owed; use check_compensation.
Input Schema
{
"type": "object",
"properties": {
"departure": {
"type": "string",
"description": "Departure airport 3-letter IATA code, case-insensitive, e.g. CDG"
},
"arrival": {
"type": "string",
"description": "Arrival airport 3-letter IATA code, case-insensitive, e.g. FCO"
},
"disrupted": {
"type": "string",
"enum": [
"delayed",
"cancelled",
"denied_boarding"
],
"description": "What happened: delayed, cancelled, or denied_boarding (bumped/overbooked)."
},
"arrival_delay_hours": {
"type": "number",
"minimum": 0,
"description": "For delays: hours late, e.g. 5. At 5h+ the refund option is added. Default 0."
},
"notice_days": {
"type": "number",
"minimum": 0,
"description": "For cancellations: days of notice given, e.g. 3. 14+ days means no fixed compensation (refund/re-routing and care still apply); under 14 sets the re-routing conditions."
},
"carrier_country": {
"type": "string",
"description": "Operating airline's 2-letter country code, e.g. DE. Needed for flights arriving into the EU/UK from outside."
}
},
"required": [
"departure",
"arrival",
"disrupted"
]
}Output Schema
{
"type": "object",
"properties": {
"disrupted": {
"type": "string",
"description": "Disruption type that was assessed."
},
"scheme": {
"type": "string",
"enum": [
"EU261",
"UK261",
"none",
"unknown"
],
"description": "Scheme covering the route; none = EU261/UK261 do not apply (general guidance only); unknown = airport not recognised."
},
"jurisdiction_reason": {
"type": "string",
"description": "Why that scheme does or does not apply."
},
"distance_km": {
"type": [
"number",
"null"
],
"description": "Route distance in km, or null if an airport is unknown."
},
"band": {
"type": "string",
"enum": [
"short",
"medium",
"long",
"unknown"
],
"description": "Distance band, or 'unknown' if an airport is not recognised."
},
"entitled_rights": {
"type": "array",
"items": {
"type": "string"
},
"description": "Rights that apply under the scheme, or general guidance when no scheme applies, one per entry."
},
"complaint_path": {
"type": "array",
"items": {
"type": "string"
},
"description": "Escalation steps from airline to regulator to court."
},
"disclaimer": {
"type": "string",
"description": "Not-legal-advice disclaimer to show the user."
}
},
"required": [
"disrupted",
"distance_km",
"band",
"entitled_rights",
"complaint_path",
"disclaimer"
]
}🟢claim_timeline(flight_date, scheme)
Give claim-deadline guidance for a flight under EU261 or UK261: a recommended act-by date (flight date + 12 months), the legal time-limit guidance, and an evidence checklist. Use for 'how long do I have to claim?'. Do NOT use to check eligibility; use check_compensation.
Input Schema
{
"type": "object",
"properties": {
"flight_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Date of the disrupted flight, YYYY-MM-DD, e.g. 2026-09-01"
},
"scheme": {
"type": "string",
"enum": [
"EU261",
"UK261"
],
"description": "EU261 (EU/EEA departure or EU carrier) or UK261 (UK departure or UK carrier); check_compensation tells you which."
}
},
"required": [
"flight_date",
"scheme"
]
}Output Schema
{
"type": "object",
"properties": {
"flight_date": {
"type": "string",
"description": "Flight date as given, YYYY-MM-DD."
},
"scheme": {
"type": "string",
"description": "Scheme the guidance is for."
},
"recommended_action_by": {
"type": "string",
"description": "Suggested claim-by date (flight + 12 months), YYYY-MM-DD."
},
"window_guidance": {
"type": "string",
"description": "Legal time-limit guidance for the scheme."
},
"evidence_checklist": {
"type": "array",
"items": {
"type": "string"
},
"description": "Evidence to gather, one per entry."
},
"disclaimer": {
"type": "string",
"description": "Not-legal-advice disclaimer to show the user."
}
},
"required": [
"flight_date",
"scheme",
"recommended_action_by",
"window_guidance",
"evidence_checklist",
"disclaimer"
]
}🟢generate_claim_letter(passenger_name, airline_name, flight_number, flight_date, departure, ...)
Draft a formal EU261/UK261 compensation claim letter (subject, legal basis, amount, 14-day payment request, escalation notice) for the passenger to send themselves, plus sending tips. Nothing is sent. Use after check_compensation and pass its amount. Do NOT use to check eligibility; use check_compensation.
Input Schema
{
"type": "object",
"properties": {
"passenger_name": {
"type": "string",
"minLength": 1,
"description": "Passenger's full name as on the booking, e.g. \"Jane Smith\""
},
"airline_name": {
"type": "string",
"minLength": 1,
"description": "Operating airline, e.g. \"British Airways\""
},
"flight_number": {
"type": "string",
"minLength": 1,
"description": "Flight number, e.g. BA117"
},
"flight_date": {
"type": "string",
"minLength": 1,
"description": "Scheduled flight date, YYYY-MM-DD, e.g. 2026-09-01"
},
"departure": {
"type": "string",
"description": "Departure airport 3-letter IATA code, case-insensitive, e.g. LHR"
},
"arrival": {
"type": "string",
"description": "Arrival airport 3-letter IATA code, case-insensitive, e.g. JFK"
},
"incident_summary": {
"type": "string",
"description": "One sentence on what happened, e.g. \"the flight arrived 4 hours late due to a technical fault\". Default generic wording."
},
"claimed_amount": {
"type": "number",
"minimum": 0,
"description": "Amount claimed, e.g. 600. If omitted, computed from the route like check_compensation (EUR 250/400/600 or GBP 220/350/520 by distance); required if an airport is unknown."
},
"currency": {
"type": "string",
"enum": [
"EUR",
"GBP"
],
"description": "Currency of the claim. Default GBP for UK261, EUR for EU261."
},
"booking_reference": {
"type": "string",
"description": "Booking/PNR reference, e.g. ABC123. Optional."
},
"scheme": {
"type": "string",
"enum": [
"EU261",
"UK261"
],
"description": "Legal basis. Default: UK261 if departing the UK, else EU261 (without claimed_amount, worked out from the route; errors if neither applies)."
}
},
"required": [
"passenger_name",
"airline_name",
"flight_number",
"flight_date",
"departure",
"arrival"
]
}Output Schema
{
"type": "object",
"properties": {
"subject": {
"type": "string",
"description": "Suggested email or letter subject line."
},
"scheme": {
"type": "string",
"enum": [
"EU261",
"UK261"
],
"description": "Legal basis used in the letter."
},
"claimed_amount": {
"type": "object",
"description": "Amount and currency claimed.",
"properties": {
"value": {
"type": "number",
"description": "Amount claimed."
},
"currency": {
"type": "string",
"description": "EUR or GBP."
}
},
"required": [
"value",
"currency"
]
},
"letter": {
"type": "string",
"description": "Full letter text, ready to copy and send."
},
"sending_tips": {
"type": "array",
"items": {
"type": "string"
},
"description": "Practical tips for sending and follow-up."
},
"disclaimer": {
"type": "string",
"description": "Not-legal-advice disclaimer to show the user."
}
},
"required": [
"subject",
"scheme",
"claimed_amount",
"letter",
"sending_tips",
"disclaimer"
]
}Community
Evidence