Koskamo

FlightFix MCP

FlightFix provides MCP tools for AI assistants to check EU261/UK261 flight compensation eligibility, calculate payouts based on distance, list passenger rights, determine claim deadlines, and draft formal claim letters for users to send to airlines themselves.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

FlightFix MCP logo, by MagicTeamsCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by MagicTeams
MCP endpoint (Streamable HTTP)
https://flight-fix.magicteams.ai/mcp
Vendor documentation

What its tools do

5 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

5 of 5 have a description · 5 of 5 declare behavior hints · 4 of 4 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Assess one disrupted flight under EU261/UK261 to determine compensation eligibility and amount
  • Draft a formal EU261/UK261 compensation claim letter with legal basis and amount
  • List passenger rights for a disruption including refund, re-routing, and care by band
  • Give claim-deadline guidance and evidence checklist for a flight under EU261 or UK261

Source and maintenance

Community listingRegistry 1.0.0
Maintenance checked

Protocol and capabilities

Server
flight-fix 1.0.0
MCP protocol negotiated in check
2025-11-25
Tools
5 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

FlightFix computes EU261/UK261 flight compensation: eligibility, amounts, care rights, deadlines and claim letters. Informational, not legal advice. Computed per request, nothing stored.

Tools

5 advertised

check_compensation — Check compensation
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

check_compensation input schema
{
  "type": "object",
  "required": [
    "departure",
    "arrival",
    "disrupted"
  ],
  "properties": {
    "arrival": {
      "type": "string",
      "description": "Final arrival airport 3-letter IATA code, case-insensitive, e.g. JFK"
    },
    "rerouted": {
      "type": "boolean",
      "description": "For cancellations: true if the airline re-routed you on another flight. Default false."
    },
    "departure": {
      "type": "string",
      "description": "Departure airport 3-letter IATA code, case-insensitive, e.g. LHR"
    },
    "disrupted": {
      "enum": [
        "delayed",
        "cancelled"
      ],
      "type": "string",
      "description": "What happened: delayed (arrived late) or cancelled."
    },
    "distance_km": {
      "type": "number",
      "description": "Override the computed great-circle distance in km, e.g. 5540. Both airports must still be known IATA codes.",
      "exclusiveMinimum": 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."
    },
    "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."
    },
    "reason_category": {
      "enum": [
        "unknown",
        "weather",
        "atc",
        "security",
        "political",
        "strike_atc",
        "strike_airline",
        "technical",
        "crew",
        "other"
      ],
      "type": "string",
      "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."
    },
    "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."
    },
    "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."
    }
  }
}
check_compensation output schema
{
  "type": "object",
  "required": [
    "scheme",
    "jurisdiction_reason",
    "route",
    "distance_km",
    "band",
    "compensation",
    "care_rights",
    "reason",
    "next_steps",
    "disclaimer"
  ],
  "properties": {
    "band": {
      "enum": [
        "short",
        "medium",
        "long"
      ],
      "type": "string",
      "description": "Distance band: short <=1500 km, medium <=3500 km, long beyond."
    },
    "route": {
      "type": "object",
      "required": [
        "departure",
        "arrival"
      ],
      "properties": {
        "arrival": {
          "type": "string",
          "description": "Arrival as 'IATA (City, Country)'."
        },
        "departure": {
          "type": "string",
          "description": "Departure as 'IATA (City, Country)'."
        },
        "arrival_country": {
          "type": "string",
          "description": "Arrival ISO country code."
        },
        "departure_country": {
          "type": "string",
          "description": "Departure ISO country code."
        }
      },
      "description": "Resolved airports and countries."
    },
    "reason": {
      "type": "object",
      "required": [
        "category",
        "exempt",
        "note"
      ],
      "properties": {
        "note": {
          "type": "string",
          "description": "Explanation with case-law pointers."
        },
        "exempt": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "enum": [
                "possibly",
                "unknown"
              ],
              "type": "string"
            }
          ],
          "description": "Whether it exempts the airline: true, false, 'possibly' or 'unknown'."
        },
        "category": {
          "type": "string",
          "description": "Reason category assessed."
        }
      },
      "description": "Assessment of the disruption cause."
    },
    "scheme": {
      "enum": [
        "EU261",
        "UK261",
        "none"
      ],
      "type": "string",
      "description": "Passenger-rights scheme that applies to this route."
    },
    "disclaimer": {
      "type": "string",
      "description": "Not-legal-advice disclaimer to show the user."
    },
    "next_steps": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Recommended next actions in order."
    },
    "care_rights": {
      "type": "object",
      "required": [
        "due",
        "items",
        "note"
      ],
      "properties": {
        "due": {
          "type": "boolean",
          "description": "Whether EU261/UK261 care is owed for this disruption (always false when no scheme applies)."
        },
        "note": {
          "type": "string",
          "description": "When care starts for this band, or why no scheme care applies."
        },
        "items": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Care items owed (empty when not due)."
        }
      },
      "description": "Duty-of-care entitlements (meals, hotel, calls)."
    },
    "distance_km": {
      "type": "number",
      "description": "Route distance in km used for the band."
    },
    "compensation": {
      "type": "object",
      "required": [
        "eligible",
        "amount",
        "currency",
        "note"
      ],
      "properties": {
        "note": {
          "type": "string",
          "description": "Explanation of the outcome."
        },
        "amount": {
          "type": [
            "number",
            "null"
          ],
          "description": "Amount due, or null when none."
        },
        "currency": {
          "enum": [
            "EUR",
            "GBP",
            null
          ],
          "type": [
            "string",
            "null"
          ],
          "description": "EUR for EU261, GBP for UK261, null when no scheme."
        },
        "eligible": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "enum": [
                "possibly"
              ],
              "type": "string"
            }
          ],
          "description": "true, false, or 'possibly' when the reason is unknown or crew-related."
        }
      },
      "description": "Fixed-compensation outcome."
    },
    "jurisdiction_reason": {
      "type": "string",
      "description": "Why that scheme does or does not apply."
    }
  }
}
check_compensation annotations
{
  "title": "Check compensation",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
compensation_table — Compensation table
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

compensation_table input schema
{
  "type": "object",
  "required": [],
  "properties": {}
}
compensation_table output schema
{
  "type": "object",
  "required": [
    "rules",
    "eligibility_summary",
    "claim_windows",
    "disclaimer"
  ],
  "properties": {
    "rules": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "band",
          "distance",
          "eu_eur",
          "uk_gbp",
          "care_from"
        ],
        "properties": {
          "band": {
            "type": "string",
            "description": "Band name: short, medium or long."
          },
          "eu_eur": {
            "type": "number",
            "description": "EU261 amount in EUR."
          },
          "uk_gbp": {
            "type": "number",
            "description": "UK261 amount in GBP."
          },
          "distance": {
            "type": "string",
            "description": "Distance range in words."
          },
          "care_from": {
            "type": "string",
            "description": "Delay at which care starts."
          }
        }
      },
      "description": "Compensation amounts per distance band."
    },
    "disclaimer": {
      "type": "string",
      "description": "Not-legal-advice disclaimer to show the user."
    },
    "claim_windows": {
      "type": "string",
      "description": "Time limits for filing claims (EU and UK)."
    },
    "eligibility_summary": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Key eligibility rules, one per entry."
    }
  }
}
compensation_table annotations
{
  "title": "Compensation table",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
disruption_rights — Disruption rights
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

disruption_rights input schema
{
  "type": "object",
  "required": [
    "departure",
    "arrival",
    "disrupted"
  ],
  "properties": {
    "arrival": {
      "type": "string",
      "description": "Arrival airport 3-letter IATA code, case-insensitive, e.g. FCO"
    },
    "departure": {
      "type": "string",
      "description": "Departure airport 3-letter IATA code, case-insensitive, e.g. CDG"
    },
    "disrupted": {
      "enum": [
        "delayed",
        "cancelled",
        "denied_boarding"
      ],
      "type": "string",
      "description": "What happened: delayed, cancelled, or denied_boarding (bumped/overbooked)."
    },
    "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."
    },
    "arrival_delay_hours": {
      "type": "number",
      "minimum": 0,
      "description": "For delays: hours late, e.g. 5. At 5h+ the refund option is added. Default 0."
    }
  }
}
disruption_rights output schema
{
  "type": "object",
  "required": [
    "disrupted",
    "distance_km",
    "band",
    "entitled_rights",
    "complaint_path",
    "disclaimer"
  ],
  "properties": {
    "band": {
      "enum": [
        "short",
        "medium",
        "long",
        "unknown"
      ],
      "type": "string",
      "description": "Distance band, or 'unknown' if an airport is not recognised."
    },
    "scheme": {
      "enum": [
        "EU261",
        "UK261",
        "none",
        "unknown"
      ],
      "type": "string",
      "description": "Scheme covering the route; none = EU261/UK261 do not apply (general guidance only); unknown = airport not recognised."
    },
    "disrupted": {
      "type": "string",
      "description": "Disruption type that was assessed."
    },
    "disclaimer": {
      "type": "string",
      "description": "Not-legal-advice disclaimer to show the user."
    },
    "distance_km": {
      "type": [
        "number",
        "null"
      ],
      "description": "Route distance in km, or null if an airport is unknown."
    },
    "complaint_path": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Escalation steps from airline to regulator to court."
    },
    "entitled_rights": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Rights that apply under the scheme, or general guidance when no scheme applies, one per entry."
    },
    "jurisdiction_reason": {
      "type": "string",
      "description": "Why that scheme does or does not apply."
    }
  }
}
disruption_rights annotations
{
  "title": "Disruption rights",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
claim_timeline — Claim timeline
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

claim_timeline input schema
{
  "type": "object",
  "required": [
    "flight_date",
    "scheme"
  ],
  "properties": {
    "scheme": {
      "enum": [
        "EU261",
        "UK261"
      ],
      "type": "string",
      "description": "EU261 (EU/EEA departure or EU carrier) or UK261 (UK departure or UK carrier); check_compensation tells you which."
    },
    "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"
    }
  }
}
claim_timeline output schema
{
  "type": "object",
  "required": [
    "flight_date",
    "scheme",
    "recommended_action_by",
    "window_guidance",
    "evidence_checklist",
    "disclaimer"
  ],
  "properties": {
    "scheme": {
      "type": "string",
      "description": "Scheme the guidance is for."
    },
    "disclaimer": {
      "type": "string",
      "description": "Not-legal-advice disclaimer to show the user."
    },
    "flight_date": {
      "type": "string",
      "description": "Flight date as given, 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."
    },
    "recommended_action_by": {
      "type": "string",
      "description": "Suggested claim-by date (flight + 12 months), YYYY-MM-DD."
    }
  }
}
claim_timeline annotations
{
  "title": "Claim timeline",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
generate_claim_letter — Generate claim letter
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

generate_claim_letter input schema
{
  "type": "object",
  "required": [
    "passenger_name",
    "airline_name",
    "flight_number",
    "flight_date",
    "departure",
    "arrival"
  ],
  "properties": {
    "scheme": {
      "enum": [
        "EU261",
        "UK261"
      ],
      "type": "string",
      "description": "Legal basis. Default: UK261 if departing the UK, else EU261 (without claimed_amount, worked out from the route; errors if neither applies)."
    },
    "arrival": {
      "type": "string",
      "description": "Arrival airport 3-letter IATA code, case-insensitive, e.g. JFK"
    },
    "currency": {
      "enum": [
        "EUR",
        "GBP"
      ],
      "type": "string",
      "description": "Currency of the claim. Default GBP for UK261, EUR for EU261."
    },
    "departure": {
      "type": "string",
      "description": "Departure airport 3-letter IATA code, case-insensitive, e.g. LHR"
    },
    "flight_date": {
      "type": "string",
      "minLength": 1,
      "description": "Scheduled flight date, YYYY-MM-DD, e.g. 2026-09-01"
    },
    "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"
    },
    "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."
    },
    "passenger_name": {
      "type": "string",
      "minLength": 1,
      "description": "Passenger's full name as on the booking, e.g. \"Jane Smith\""
    },
    "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."
    },
    "booking_reference": {
      "type": "string",
      "description": "Booking/PNR reference, e.g. ABC123. Optional."
    }
  }
}
generate_claim_letter output schema
{
  "type": "object",
  "required": [
    "subject",
    "scheme",
    "claimed_amount",
    "letter",
    "sending_tips",
    "disclaimer"
  ],
  "properties": {
    "letter": {
      "type": "string",
      "description": "Full letter text, ready to copy and send."
    },
    "scheme": {
      "enum": [
        "EU261",
        "UK261"
      ],
      "type": "string",
      "description": "Legal basis used in the letter."
    },
    "subject": {
      "type": "string",
      "description": "Suggested email or letter subject line."
    },
    "disclaimer": {
      "type": "string",
      "description": "Not-legal-advice disclaimer to show the user."
    },
    "sending_tips": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Practical tips for sending and follow-up."
    },
    "claimed_amount": {
      "type": "object",
      "required": [
        "value",
        "currency"
      ],
      "properties": {
        "value": {
          "type": "number",
          "description": "Amount claimed."
        },
        "currency": {
          "type": "string",
          "description": "EUR or GBP."
        }
      },
      "description": "Amount and currency claimed."
    }
  }
}
generate_claim_letter annotations
{
  "title": "Generate claim letter",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
217 ms
95th percentile latency
217 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 217 ms · metadata changed · 5 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http flightfix-mcp https://flight-fix.magicteams.ai/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add flightfix-mcp --url https://flight-fix.magicteams.ai/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable flightfix-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "flightfix-mcp": {
      "url": "https://flight-fix.magicteams.ai/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "flightfix-mcp": {
      "type": "streamableHttp",
      "url": "https://flight-fix.magicteams.ai/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start flightfix-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "flightfix-mcp": {
      "type": "http",
      "url": "https://flight-fix.magicteams.ai/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http flightfix-mcp https://flight-fix.magicteams.ai/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://flight-fix.magicteams.ai/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "flightfix-mcp": {
      "serverUrl": "https://flight-fix.magicteams.ai/mcp"
    }
  }
}

Let your agent find its tools

Find servers like FlightFix MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.