The Empty Leg Index
Free index of private-jet empty legs on UK and European routes, from operators' public listings, linked to each source. Indicative prices; no booking or payment.
Hosted MCP Server
npx add-mcp 'https://theemptylegindex.com/api/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
Endpoint
Point a client at this URL. No API key and no sign-in. The transport is streamable HTTP.
https://theemptylegindex.com/api/mcp
Registry name com.theemptylegindex/empty-leg-index. A short note for agents lives at /llms.txt, with the long version at /llms-full.txt. The server card is at /server-card.
Claude
Custom connector
In Claude, open Settings, then Connectors, and add a custom connector. Paste the URL above. Leave authentication empty. The same URL works on claude.ai and in the Claude desktop app.
Or add this block to claude_desktop_config.json under the key empty-leg-index.
{
"mcpServers": {
"empty-leg-index": {
"url": "https://theemptylegindex.com/api/mcp"
}
}
}
ChatGPT
Custom app or connector
In ChatGPT, open Settings, then Apps (some accounts still label this Connectors). Turn on developer mode if you are adding a server that is not in the directory, then add a custom MCP server and paste the URL. There is no token. The server will not ask you to sign in.
A directory listing is a separate submission. This page only connects a client you already use.
Cursor
The button adds the server to Cursor. The config it installs is {"url":"https://theemptylegindex.com/api/mcp"} under the name empty-leg-index.
To paste it yourself, this is the mcp.json block.
{
"mcpServers": {
"empty-leg-index": {
"url": "https://theemptylegindex.com/api/mcp"
}
}
}
VS Code
The install link uses VS Code's vscode:mcp/install handler. The saved file uses type: "http".
{
"servers": {
"empty-leg-index": {
"type": "http",
"url": "https://theemptylegindex.com/api/mcp"
}
}
}
Tools
Prices in every result are indicative. fetchedAt is when this index collected the row. A country or region matches when either airport is in that place.
search_empty_legs
Search empty-leg private jet flights currently published for the UK and Europe. A country or region matches when either airport is in that place. Prices are indicative, copied from the publishing source, and are not a quote. Each row includes the source name, the source URL, and fetchedAt, which is when this index collected the row. An empty list means nothing published matches. It does not mean the route cannot be chartered. This tool does not book a flight and does not take payment.
origin(optional) — Departure only. City, airport name, or IATA or ICAO code, for example LTN or London. Omit to leave that end open.destination(optional) — Arrival only. City, airport name, or IATA or ICAO code, for example NCE or Nice. Omit to leave that end open.country(optional) — ISO 3166-1 alpha-2 country code, for example GB or FR. A leg matches when either airport is in that country.region(optional) — Either "uk" (United Kingdom) or "europe" (this index's UK and Europe set). A leg matches when either airport is in the region.dateFrom(optional) — Inclusive first departure date, YYYY-MM-DD. Compared with the published date, not a time of day.dateTo(optional) — Inclusive last departure date, YYYY-MM-DD.aircraftCategory(optional) — One of very-light, light, midsize, super-midsize, heavy, ultra-long-range, turboprop. Aircraft this index cannot classify are "unspecified" and do not match a category filter.maxPrice(optional) — Highest published amount to include. Non-negative number, in the leg's own currency unless currency is also set. Legs with no numeric price are left out when this is set.currency(optional) — Three-letter currency code such as EUR or GBP. Applied only together with maxPrice: legs priced in another currency are left out. Ignored when maxPrice is omitted.
get_leg
Return one published empty leg by id, including the route, date, aircraft, indicative price or price band, each source name and source URL, and fetchedAt (when this index collected the row, not a live quote). An unknown id returns an error and no leg. This does not hold or book the seat.
id(required) — Id of a published leg, as returned by search_empty_legs. Example: leg-ltn-nce.
list_sources
List every configured empty-leg source: its id, public page, whether it is enabled, and the last refresh result (when it was attempted, whether that attempt worked, how many valid legs it yielded, and the failure text when it failed). A disabled source is not fetched. This is the census of this index, not a booking directory. Call it with an empty object.
No parameters. Call it with an empty object.
submit_enquiry
Store an enquiry about one published leg and return a reference. The result includes the sentence "No booking or payment made; the operator will contact you / enquire via their link" and the operator or broker's own booking URL. It does not reserve a seat, charge a card, or confirm the flight still exists. Call it only after the person has asked to enquire and has given their name, email, passenger count, and agreement to be contacted. consent must be the boolean true.
leg_id(required) — Id of a published leg, as returned by search_empty_legs. Example: leg-ltn-nce.name(required) — Name of the person who wants to be contacted. 1 to 200 characters.email(required) — Email address of that person. The operator or broker is who follows up.passengers(required) — How many people would fly. A whole number from 1 to 19. This does not reserve seats.notes(optional) — Optional note, at most 2000 characters. Omit it when there is nothing to add.consent(required) — Must be the boolean true. That means the person agreed to be contacted about this leg. Any other value is rejected, and the enquiry is not stored.
set_alert
Store a free email alert for new empty legs on a route. Set an origin, a destination, or both. Each end is an airport (city, name, or IATA or ICAO code) or a country (ISO code or English name, for example GB or France). originCountry and destinationCountry name the country for that end when you want it on its own. dateFrom and dateTo are an optional inclusive window, YYYY-MM-DD. maxPrice is an optional highest published amount, in the leg's own currency unless currency is also set. email is the address that receives the alert. consent must be the boolean true, and only after the person has asked to be emailed. The watch is stored as pending and a confirmation link is emailed. No alert is sent until that link is opened. Each alert email includes an unsubscribe link, and a delete-my-data link removes every watch stored for that address. This does not book a seat and it does not take payment. A leg is included only when every source on it is enabled. Villiers is never included.
origin(optional) — Departure airport or country. An airport is a city, a name, or an IATA or ICAO code, for example LTN or London Luton. A country is an ISO code or an English name, for example GB or France. Two letters are always a country. Omit this when originCountry carries the country, or when only the destination is set.destination(optional) — Arrival airport or country, in the same form as origin. Omit this when destinationCountry carries the country, or when only the origin is set.originCountry(optional) — Country of departure on its own, as an ISO code or an English name, for example FR or France. A leg matches when the departure airport is in that country. Use this when origin is an airport and you also want to name the country, or instead of origin.destinationCountry(optional) — Country of arrival on its own, as an ISO code or an English name. A leg matches when the arrival airport is in that country.dateFrom(optional) — Optional inclusive first departure date, YYYY-MM-DD. Omit it for no start.dateTo(optional) — Optional inclusive last departure date, YYYY-MM-DD. Omit it for no end.maxPrice(optional) — Optional highest published amount to include. Non-negative number, in the leg's own currency unless currency is also set. Legs with no numeric price are left out when this is set.currency(optional) — Three-letter currency code such as EUR or GBP. Applied only together with maxPrice. Omit it when maxPrice is omitted.email(required) — Email address that receives the confirmation and, after that, the alerts. One address, no spaces.consent(required) — Must be the boolean true. That means the person asked to be emailed about this route. Any other value is rejected, and the watch is not stored.
Example prompts
Which empty legs leave the UK in the next two weeks under 5000 EUR? Prices are indicative.
List the sources and say when each one was last fetched, including any that failed.
Get the full record for that leg id, including the source URL and when the row was collected.
I want to enquire about that leg for two passengers. Ask me for my name and email, and do not book or charge anything.
Watch London Luton to France through the end of next month, under 4000 EUR. Ask for my email and my consent, and do not book anything.
Route alerts
set_alert stores a free watch and emails a confirmation link. The live server registers the tool when free alerts are switched on. No alert is sent until that link is opened. Each alert links to the operator page and includes an unsubscribe link. A delete-my-data link removes every watch for that address. The same fields are accepted by POST /api/alerts. What a watch stores is on the privacy page.
Enquiries
submit_enquiry returns a reference and this sentence: No booking or payment made; the operator will contact you / enquire via their link. The result also includes the operator or broker's own booking URL. There is no book tool and no card handling. What an enquiry stores is on the privacy page.
Operators who want a listing removed, or who want to offer a direct feed, use the contact form. This site does not publish an email address.
People connecting a client use this page (https://theemptylegindex.com/mcp). Publishing the server into a directory is a separate step and is not done from here. Discovery files: AI catalog, mcp.json, server.json.
The site itself is theemptylegindex.com.