flighty-mcp
flighty-mcp is a read-only MCP server that exposes your personal Flighty app flight data for querying, analysis, and visualization.
List flights (
list_my_flights): Retrieve your flight history as geo-ready legs with departure/arrival airport coordinates, filterable by year, date range (after/before), result limit, and an upcoming-only flag. Returns up to 200 results (newest first) including flight number, airline, origin/destination city/country, lat/lon, and times.Get a specific flight (
get_flight): Fetch the most recent flight leg matching a given flight number (e.g. "UA194"), case- and space-insensitive — returns a single leg or null if not found.Aggregate stats (
flight_stats): View summary statistics over your flight history (or a specific year) — total flight count, total distance (km), unique airports and airlines, top routes by frequency, and top airlines by flight count.Animate a trip (
animate_trip): Generate a shareable flight-animator route link for a trip to a destination, resolving connected flights from your inferred home airport (or a specified origin); returns one-way and round-trip URLs and handles ambiguous destinations gracefully.
Configuration: Supports customization of the Flighty database path, user ID, and flight animator base URL. Requires macOS Full Disk Access to read the Flighty database.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@flighty-mcplist my flights from June 2025"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
flighty-mcp
A read-only MCP server that exposes your personal Flighty app flight data as geo-ready legs with departure and arrival coordinates. Query your flight history by date, year, or flight number; browse aggregate stats (distance, unique airports/airlines, top routes).
Credit: inspired by LukasHaas/flighty-mcp for the original idea.
Tools
list_my_flights
List your own flights as geo-ready legs (departure/arrival airports with coordinates).
Arguments:
year(optional): Filter to a calendar year (e.g. 2025).after(optional): Only flights departing on/after this ISO date (YYYY-MM-DD).before(optional): Only flights departing before this ISO date (YYYY-MM-DD).upcoming_only(optional): Return non-archived flights, soonest first. Full history is newest first.limit(optional): Maximum number of legs to return (default 200).
Returns: List of leg objects with this structure:
{
"date": "2025-06-23",
"flight_no": "UA194",
"airline": {
"iata": "UA",
"name": "United Airlines"
},
"from": {
"iata": "SFO",
"city": "San Francisco",
"country": "United States",
"lat": 37.6213,
"lon": -122.379
},
"to": {
"iata": "JFK",
"city": "New York",
"country": "United States",
"lat": 40.6413,
"lon": -73.7781
},
"departure": "2025-06-23T10:30:00",
"arrival": "2025-06-24T01:15:00Z"
}get_flight
Get your most recent flight leg matching a flight number (e.g. "UA194").
Arguments:
flight_no: The flight number (case- and space-insensitive).
Returns: A single leg object (or null if no match found).
flight_stats
Aggregate stats over your flights: counts, distance, unique airports/airlines, and top routes.
Arguments:
year(optional): Filter stats to a calendar year. Omit for all-time.
Returns: Stats object with this structure:
{
"flights": 42,
"distance_km": 18500.5,
"unique_airports": 15,
"unique_airlines": 5,
"top_routes": [
{ "route": "SFO -> JFK", "count": 8 },
{ "route": "JFK -> SFO", "count": 7 }
],
"top_airlines": [
{ "iata": "UA", "name": "United Airlines", "count": 12 }
],
"year": "all_time"
}animate_trip
Build a flight-animator route link for your trip to a place.
Resolves the connected flights from your home (or origin) to destination and returns shareable links: url (one-way trip) and round_trip_url (there and back). May instead return a resolution prompt with status ambiguous_destination, confirm_home, or no_match.
Arguments:
destination: Where the trip goes — IATA code, city, or country (e.g. "Japan", "NRT").origin(optional): Starting location — IATA code, city, or country. Defaults to your inferred home (most common departure airport).after(optional): ISO date (YYYY-MM-DD); only trips departing on/after it.before(optional): ISO date (YYYY-MM-DD); only trips departing before it.
Example: "animate my flight to Japan"
Returns: If successful, a dict with keys status (always "ok"), url, round_trip_url (if a return is found), home, destination, stops (summary), start_date, end_date, leg_count, and home_confidence. On ambiguity or mismatch, returns status with one of: no_match (no flights match criteria), ambiguous_destination (multiple cities match the destination), or confirm_home (inferred home confidence is low—returns top alternatives for confirmation).
Route link format: the ?d= value is base64url of {"v":1,"stops":[…]} (the versioned envelope shared with flight-animator's decoder). Each stop carries code, lat, lon, label, and optional arrive/depart (ISO 8601). We always embed lat/lon so the animator needs no airport-table lookup and so points outside its bundled dataset still render — consumers should prefer the embedded coordinates over resolving the code.
Related MCP server: flightaware-mcp
Installation
Install uv, clone this repository,
and replace /absolute/path/to/flighty-mcp below with the clone's absolute path.
Codex
codex mcp add flighty -- uv --directory /absolute/path/to/flighty-mcp run flighty-mcpRestart Codex after adding the server. The ChatGPT desktop app, Codex CLI, and Codex IDE extension share this configuration.
Claude Code
claude mcp add --scope user flighty -- uv --directory /absolute/path/to/flighty-mcp run flighty-mcpClaude Desktop and Cursor
Add this entry to Claude Desktop's claude_desktop_config.json or Cursor's
~/.cursor/mcp.json:
{
"mcpServers": {
"flighty": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/flighty-mcp", "run", "flighty-mcp"]
}
}
}Restart the client after saving the file.
VS Code / GitHub Copilot
Add this to your user or workspace mcp.json:
{
"servers": {
"flighty": {
"type": "stdio",
"command": "uv",
"args": ["--directory", "/absolute/path/to/flighty-mcp", "run", "flighty-mcp"]
}
}
}You can open the user file with MCP: Open User Configuration from the Command Palette.
Other stdio MCP clients
Use the mcpServers JSON example above, or adapt its command and args values to your
client's configuration format. This server uses standard MCP over stdio and has no
client-specific runtime behavior.
Configuration
Variable | Default | Description |
|
| Path to the Flighty app's SQLite database. |
| Auto-detected from | The Flighty user ID to query (normally auto-detected; set only if overriding). |
|
| Base URL for |
Full Disk Access Requirement
Important: The MCP server needs macOS Full Disk Access to read the Flighty database.
Symptom: If the server fails to connect or reads hang indefinitely, it's likely because Full Disk Access is missing.
Solution:
Open System Preferences → Privacy & Security → Full Disk Access.
Add the app that will launch this server:
For Codex, Claude Desktop, Cursor, or VS Code, add that application.
For Claude Code or another terminal-launched client, add Terminal (or your terminal app).
Restart the app (or kill and relaunch it).
Try again.
The database lives at ~/Library/Containers/com.flightyapp.flighty/Data/Documents/, which is in your user's private container — Full Disk Access is required for any application to read it.
Available Tools
3 toolsflight_statsA
Aggregate stats over your flights: counts, distance, unique airports/airlines, top routes.
Args: year: Filter stats to a calendar year. Omit for all-time. upcoming_only: If true, return only upcoming (non-archived) flights. Default false returns your full flight history.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | ||
| upcoming_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It describes the tool as returning aggregated stats (safe, read-only) without side effects, but does not disclose any rate limits or auth requirements. Given the simple nature, this is adequate but not exceptional.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with a front-loaded purpose sentence followed by parameter details. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description lists the types of stats (counts, distance, unique airports/airlines, top routes). This is informative, though exact field names are not provided. The tool is relatively simple, so completeness is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains 'year' filters to a calendar year, omit for all-time, and 'upcoming_only' returns only upcoming flights. This adds meaningful context beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it provides aggregate stats over flights, listing specific metrics (counts, distance, unique airports/airlines, top routes). This distinguishes it from siblings get_flight (single flight) and list_my_flights (list of flights).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for aggregated statistics but does not explicitly state when to use vs alternatives. It provides filtering options (year, upcoming_only) but no when-not or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_flightA
Get your most recent flight leg matching a flight number (e.g. "UA194").
Args: flight_no: The flight number (case- and space-insensitive).
| Name | Required | Description | Default |
|---|---|---|---|
| flight_no | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description states it's a retrieval operation ('Get'), implying no side effects. With no annotations, it carries full burden. It specifies 'most recent' but doesn't explain chronological ordering, error handling (e.g., no matching flight), or whether the tool requires authentication. Could add more detail on behavioral guarantees.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One clear sentence plus concise parameter description. No fluff or repetition. Front-loaded with action and purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one param and output schema, description covers what input is expected and what to get back ('most recent flight leg'). Minor gaps: doesn't specify whether 'most recent' is based on departure time or schedule, or if multiple legs exist per flight.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema provides no description (0% coverage). The description adds meaning: flight_no is case- and space-insensitive. This is valuable extra info beyond schema type. Single parameter fully described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), resource ('most recent flight leg'), and criterion (matching flight number). Example 'UA194' clarifies format. Distinguishes from siblings 'flight_stats' and 'list_my_flights' by implying a single recent leg lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving the most recent leg of a specific flight, but lacks explicit guidance on when to use this tool versus alternatives like 'list_my_flights' (for listing all flights) or 'flight_stats' (for statistics). No exclusions or prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_flightsA
List your own flights as geo-ready legs (departure/arrival airports with coordinates).
Args: year: Filter to a calendar year (e.g. 2025). after: Only flights departing on/after this ISO date (YYYY-MM-DD). before: Only flights departing before this ISO date (YYYY-MM-DD). upcoming_only: If true, return only upcoming (non-archived) flights. Default false returns your full flight history. limit: Maximum number of legs to return (default 200, newest first).
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | ||
| after | No | ||
| before | No | ||
| upcoming_only | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries transparency burden. It discloses filtering options and that output includes geo coordinates, but does not mention ordering beyond 'newest first' in limit param, pagination, error handling, or authentication needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is front-loaded with purpose, then parameter details. Slightly verbose with 'Args:' label, but overall efficient and clear. Could be trimmed but still good.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers input parameters well. Mentions output includes geo-coordinates for departure/arrival. With output schema present, not fully describing output is acceptable. Slight gap: doesn't explicitly state output is a list of flight legs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description compensates fully. Each of the 5 parameters (year, after, before, upcoming_only, limit) is explained with clear semantics and usage context, e.g., 'after: Only flights departing on/after this ISO date (YYYY-MM-DD).'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it lists the user's own flights as geo-ready legs with departure/arrival airports and coordinates. Distinguishes from siblings 'get_flight' and 'flight_stats' by focusing on list of flights with geo data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description implies use when needing a list of own flights with geo coordinates, but does not explicitly state when to use this versus siblings 'get_flight' or 'flight_stats'. No when-not or alternative guidance provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.0- First observed
flight_stats - First observed
get_flight - First observed
list_my_flights
TDQS
Scored across 3 tools
Each tool has a clear, distinct purpose: aggregate stats, get a specific flight by number, and list flights with filters. No overlap or ambiguity.
All tool names follow a consistent verb_noun pattern in snake_case (flight_stats, get_flight, list_my_flights), making them predictable and readable.
With only 3 tools, the server feels slightly undersized for a flight tracking domain, but each tool serves a core read operation. The count is reasonable for a minimal API.
The server is read-only, missing any create, update, or delete operations for flights. Users cannot add or modify flight data, which is a significant gap for a personal flight tracker.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Geo-based flight search MCP server. Find more flights between any two places on earth
Google Flights search data: fares, routes, stops, and price insights via a hosted MCP server.
Flight search MCP server providing search, pagination, and itinerary details for AI assistants.
Flights MCP — wraps OpenSky Network API (free, no auth required)
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that provides access to a trip tracking SQLite database. This server enables AI assistants to query and manage flight trip information including users, airports, and flight details.Apache 2.0
- AlicenseAqualityAmaintenanceMCP server for FlightAware AeroAPI that enables live flight tracking, airport boards, operator and aircraft lookup, schedule retrieval, and flight alert management via natural language.343541MIT
- AlicenseNot gradedqualityBmaintenanceMCP server that exposes SQLite datasets as queryable tools and resources via Streamable HTTP, enabling read-only exploration and SQL queries.Apache 2.0
- AlicenseNot gradedqualityCmaintenanceRead-only MCP server that exposes Garmin Connect health data from a local SQLite database to AI assistants, enabling queries for recent days, sleep, weekly trends, and a guarded SQL query surface.MIT