Doorfarer MCP
Doorfarer is a travel planning tool that finds the best door-to-door trip from a user's home town by comparing every reachable airport, including ground transport costs like trains, buses, or driving. It ranks options by price, time, or a balance, providing booking links and search details within AI assistants.
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.
https://doorfarer.com/mcpWhat you can do with it
- Find the cheapest door-to-door trip from home to a destination
- Compare flights from multiple nearby airports including ground transport
- Find the fastest travel option from home to a specific city
- Search for the cheapest destination in a region or country
Source and maintenance
Protocol and capabilities
- Server
- doorfarer 0.1.0
- MCP protocol
- 2025-06-18
- Tools
- 5 advertised
- Resources
- 4 advertised
- Resource templates
- 0 advertised
- Prompts
- 2 advertised
{
"tools": {
"listChanged": false
},
"prompts": {
"listChanged": false
},
"resources": {
"subscribe": false,
"listChanged": false
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
5 advertised
find_trips — Find door-to-door trips
Finds the best round trips from where someone lives, not just from one airport: it adds the train or bus to every airport they can reach and ranks all options door to door, by price, by total travel time, or balanced. Use it when someone wants flights from their home town, could fly from several airports, or asks for the cheapest or fastest way to get somewhere, e.g. "I live in New Haven: should I fly to Lisbon from JFK, Newark, Boston or Hartford?" Not for a search from one airport already chosen. For a one-way trip set one_way (the trip length is then ignored). Multi-city: search each leg as one_way only when the user gave dates for it; otherwise ask for the dates. Set mode only when the user says how they get to the airport (car, train, bus, any): by default a home in the US compares driving, a taxi to a near airport and public transport, and a home elsewhere uses the train or bus. A named departure airport is an ordinary search: pass it as from_airports, with the home town the user gave. Ask when and for how long first: with no dates from the user this tool runs no search and returns the question to ask (and a form); it searches once the user names a time, or says any time suits them (dates "flexible"). A month or holiday without a year means the next one coming; don't ask which year or to confirm a town. Travellers default to 1 and the trip length to 2-14 nights; the answer's summary names both. Any town or village works. The first search from a town we haven't seen takes about 20 seconds while we look up its train and bus connections; tell the user you're checking the connections from their town to each airport. Later searches from that town take a second or two. Give the home town and where to: airport, city or country codes, a list of them, or a region such as "Iberia" or "Southeast Asia". For "anywhere", a continent ("Asia") or "somewhere warm" it finds the cheapest places itself: pass "anywhere", "abroad" (another country) or the continent, or for warm, sunny or a beach the countries that fit the season with anywhere true; it searches the best 6 cities door to door. `dates` says where the dates came from: "from_user" with depart_from and depart_to, or "flexible" when the user said any time suits them; never pick dates yourself. Example call: {"home": "New Haven", "destinations": ["LIS"], "dates": "from_user", "depart_from": "2027-03-01", "depart_to": "2027-03-31", "nights_min": 5, "nights_max": 9, "travellers": 2}. For a season or a month ("next spring", "in June") pass that window yourself as depart_from and depart_to (spring = 1 Mar to 31 May of the coming year); the answer's searched window says what was searched. The widget already shows every option, so reply in 3-4 sentences: the `headline` (flight + ground = total per person), the `verdict` sentence with its usual-price range, as written, then the offer `next` gives: trip_details for the lead trip, and price_calendar too only when the dates were flexible or the verdict says above the usual. Don't repeat the table or list airports without fares (with no widget, list the top 3 rows compactly: route, dates, total per person), and give a booking link exactly as returned, as a clickable link (don't shorten or rewrite it). Airports more than 8.5 hours from the door are left out and named in the answer (max_ground_hours changes that: set it only if the user says how far they would travel). Say when a ground leg is an estimate. If the answer's status isn't "ok", tell the user plainly what its note says and don't invent prices; if nothing is found, say so and don't quote prices from other sources. Keep the user's own dates, trip length and places: if nothing is found, say so and offer to widen them, instead of widening on your own. Prices are in the traveller's home currency unless `currency` is given, per person; use the totals the answer gives for a party and don't convert or add up prices yourself; judge a price with the answer's verdict or price_calendar, never with outside benchmarks. Prices come from recent searches on Aviasales; the Book link shows today's price. Booking links are affiliate links: Doorfarer may earn a commission if you book, at no extra cost to you. Say so when you show them, and only then. When the user picks a trip, trip_details gives it step by step with a calendar file; when they ask which month is cheapest or whether a price is good, price_calendar answers: it is the cheapest fare found for each month, or the usual price where none was found (not bookable), while find_trips shows fares seen for the real dates (bookable). If an answer is wrong or confusing, report it with send_feedback.
{
"type": "object",
"title": "find_trips_toolArguments",
"required": [
"home",
"destinations",
"dates"
],
"properties": {
"home": {
"type": "string",
"title": "Home",
"maxLength": 80,
"description": "The traveller's home town or village, e.g. \"New Haven\" or \"Hamden, US\". Not an airport. Add the country when the name is common."
},
"mode": {
"anyOf": [
{
"enum": [
"public",
"train",
"bus",
"car",
"any"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Mode",
"default": null,
"description": "How the user gets to the airport: public (train or bus), train, bus, car (their own, parked at the airport), or any (car, taxi and public compete). Leave out unless the user says: then any for a home in the US, public elsewhere."
},
"dates": {
"enum": [
"from_user",
"flexible",
"assumed"
],
"type": "string",
"title": "Dates",
"description": "\"from_user\" when the user named a time (a month, season, holiday, \"next week\"): pass it as depart_from and depart_to. \"flexible\" only when the user said any time suits them (\"whenever\", \"cheapest time\"): then the next 3 months are searched. \"assumed\" when they said nothing about when: nothing is searched, the answer is the question to ask them."
},
"limit": {
"anyOf": [
{
"type": "integer",
"maximum": 25,
"minimum": 1
},
{
"type": "null"
}
],
"title": "Limit",
"default": null,
"description": "Rows to return, 1-25. Default: the picks plus the best trip from each airport."
},
"one_way": {
"type": "boolean",
"title": "One Way",
"default": false,
"description": "True if the user wants one way only: then the trip length is ignored."
},
"anywhere": {
"type": "boolean",
"title": "Anywhere",
"default": false,
"description": "True to find the cheapest places anywhere in the countries or regions named, instead of searching each one's biggest airports. A continent (Asia, Europe), \"anywhere\" or \"abroad\" (outside the home country) in destinations always searches this way. For \"somewhere warm\" or \"a beach\", pass the countries that fit the season and set this."
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Currency",
"default": null,
"description": "ISO code (USD, GBP, EUR) to show prices in. Default: the traveller's home currency."
},
"priority": {
"enum": [
"budget",
"time",
"balanced",
"cheapest",
"fastest"
],
"type": "string",
"title": "Priority",
"default": "balanced",
"description": "What matters most: budget (the cheapest door to door), time (the fastest) or balanced. Default balanced; the picks show the cheapest, the fastest and the balanced trip either way."
},
"depart_to": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
],
"title": "Depart To",
"default": null,
"description": "The window to leave in: last day. A window of about six months at most, within the next year."
},
"nights_max": {
"anyOf": [
{
"type": "integer",
"maximum": 180,
"minimum": 1
},
{
"type": "null"
}
],
"title": "Nights Max",
"default": null,
"description": "Trip length in nights: longest. Default 14."
},
"nights_min": {
"anyOf": [
{
"type": "integer",
"maximum": 180,
"minimum": 1
},
{
"type": "null"
}
],
"title": "Nights Min",
"default": null,
"description": "Trip length in nights: shortest. Default 2."
},
"travellers": {
"type": "integer",
"title": "Travellers",
"default": 1,
"maximum": 9,
"minimum": 1,
"description": "Adults travelling together. Default 1."
},
"depart_from": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
],
"title": "Depart From",
"default": null,
"description": "The window to leave in: first day. Leave out with depart_to for the next 3 months. A window of about six months at most, within the next year."
},
"destinations": {
"type": "array",
"items": {
"type": "string",
"maxLength": 80
},
"title": "Destinations",
"maxItems": 6,
"description": "Where to: airport codes (LIS), city codes (NYC), country codes (PT), a region, a continent (Asia), \"anywhere\" or \"abroad\" (outside the home country)."
},
"from_airports": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"maxLength": 80
},
"maxItems": 8
},
{
"type": "null"
}
],
"title": "From Airports",
"default": null,
"description": "Only these departure airports. For narrowing a previous answer."
},
"max_ground_hours": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Max Ground Hours",
"default": null,
"description": "The most hours from the front door to the departure airport, one way. Default 8.5: farther airports are left out and named in the answer. Set it only when the user says how far they would travel to the airport, or to include the far ones the answer names."
}
}
}{
"title": "Find door-to-door trips",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}price_calendar — Cheapest month from home
Shows the cheapest month to travel from someone's home town to a place, for each airport within reach: the cheapest fare found for each month (or, where none is found, what that route usually costs) plus the train or bus to the airport and the transfer into the city. Takes a few seconds. Airports further than 8.5 hours from home are left out and named. Use it when the user's dates are flexible or they ask when it's cheapest to go; then call find_trips for the month they choose to get bookable trips. Needs the home town; months as "2027-03", at most 12; for a season or a year pass its months ("next spring" = March to May), and the answer says which months have fares (state only those). Prices per person, in the home currency unless `currency` is given. The widget shows the months: reply in 3-4 sentences, with the best month and what it costs ("cheapest found" or "usual price", as the answer says), and don't quote prices from other sources.
{
"type": "object",
"title": "price_calendarArguments",
"required": [
"home",
"destinations"
],
"properties": {
"home": {
"type": "string",
"title": "Home",
"description": "The traveller's home town or village, e.g. \"New Haven\" or \"Hamden, US\". Not an airport. Add the country when the name is common."
},
"one_way": {
"type": "boolean",
"title": "One Way",
"default": false,
"description": "True for one-way fares."
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Currency",
"default": null,
"description": "ISO code (USD, GBP, EUR). Default: the home's."
},
"month_to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Month To",
"default": null,
"description": "Last month. Default: 6 months in all."
},
"month_from": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Month From",
"default": null,
"description": "First month, \"2027-03\". Default: this month."
},
"destinations": {
"type": "array",
"items": {
"type": "string"
},
"title": "Destinations",
"maxItems": 6,
"description": "Where to: airport codes (LIS), city codes (NYC) or country codes (PT)."
}
}
}{
"title": "Cheapest month from home",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}trip_details — Trip step by step
Shows one trip from a find_trips answer step by step, door to door: leaving home, the train or bus to the airport, the airport wait, the flight, the transfer into the city and arrival, then the way back, with local times. Also gives the booking link and a calendar file (.ics) the user can add. Pass a trip id from the find_trips answer ("Trip ids, row by row", or a row's `id`). Use it when the user picks a trip or asks how the journey works. Ids are kept for 72 hours.
{
"type": "object",
"title": "trip_detailsArguments",
"required": [
"trip_id"
],
"properties": {
"trip_id": {
"type": "string",
"title": "Trip Id",
"description": "A trip id from the find_trips answer, e.g. \"t_k3m9q2xa\"."
}
}
}{
"title": "Trip step by step",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}send_feedback — Report a problem with Doorfarer
Tell Doorfarer's maker where Doorfarer fell short, so it can be fixed. Use it when a find_trips answer was wrong, confusing, or missing something you needed to help, or when the user asks you to pass something on. Write as the assistant that used the tool: what you asked for, what came back, what you expected instead. The report is about Doorfarer only, never about the user: leave out names, contact details, travel plans, reasons for travelling and anything the user said about themselves. Be specific and honest, including when the problem may have been your own call. Pass the search_id from the answer's last line. One report per search. If the user asked you to report something, tell them it's sent.
{
"type": "object",
"title": "send_feedbackArguments",
"required": [
"kind",
"what_happened"
],
"properties": {
"kind": {
"enum": [
"bug",
"confusing",
"idea"
],
"type": "string",
"title": "Kind",
"description": "bug: something is wrong. confusing: right but hard to use. idea: something that would help."
},
"search_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Search Id",
"default": null,
"description": "The id from the find_trips answer this is about, e.g. \"s_7f3kq2m9xa\"."
},
"suggestion": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Suggestion",
"default": null,
"description": "What would have helped. At most 400 characters."
},
"what_happened": {
"type": "string",
"title": "What Happened",
"description": "What you asked for, what came back and what you expected. About Doorfarer, not the user. At most 600 characters."
}
}
}{
"title": "Report a problem with Doorfarer",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}find_group_trips — Find group trips
Finds trips for a group whose people leave from different towns to meet in one place on the same dates: each person's own door-to-door trip (the train, bus or car to their best airport, and the flight), one line per town, with the group's total, the longest journey and the dates that work for everyone. E.g. "Four of us want a week in Lisbon in May: two from New Haven, one each from Ithaca and Burlington." Put each town once in homes with how many people leave from it. For "where should we meet?" pass a region, countries or "anywhere" as destinations with anywhere true. For one home town, use find_trips. A month without a year means the next one coming. With no dates from the group this tool runs no search and returns the question to ask; once they name a time, or say any time suits them (flexible true), it searches. A month is enough to search: don't ask for exact dates. If a search finds nothing, say so and offer a wider window or single-town searches; never quote prices from other sources.
{
"type": "object",
"$defs": {
"HomeIn": {
"type": "object",
"title": "HomeIn",
"required": [
"town"
],
"properties": {
"town": {
"type": "string",
"title": "Town",
"description": "A home town, e.g. \"Ithaca, NY\" or \"Hamden, US\". Not an airport."
},
"travellers": {
"type": "integer",
"title": "Travellers",
"default": 1,
"maximum": 9,
"minimum": 1,
"description": "People leaving from this town."
}
}
}
},
"title": "find_group_trips_toolArguments",
"required": [
"homes",
"destinations"
],
"properties": {
"mode": {
"anyOf": [
{
"enum": [
"public",
"train",
"bus",
"car",
"any"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Mode",
"default": null,
"description": "How people get to the airport: public, train, bus, car or any. Leave out unless the user says: then any in the US, public elsewhere."
},
"homes": {
"type": "array",
"items": {
"$ref": "#/$defs/HomeIn"
},
"title": "Homes",
"maxItems": 20,
"minItems": 2,
"description": "Each town people leave from, with how many: [{\"town\": \"New Haven, CT\", \"travellers\": 2}, {\"town\": \"Ithaca, NY\"}]. Towns, not airports; the same town twice is one line."
},
"one_way": {
"type": "boolean",
"title": "One Way",
"default": false,
"description": "True if everyone flies one way only."
},
"anywhere": {
"type": "boolean",
"title": "Anywhere",
"default": false,
"description": "True to find the best places to meet in the countries or regions named."
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Currency",
"default": null,
"description": "ISO code (USD, GBP, EUR). Default: the first town's currency."
},
"flexible": {
"type": "boolean",
"title": "Flexible",
"default": false,
"description": "True only when the group said any time suits them: the next 3 months are searched. Otherwise pass the dates they named."
},
"priority": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Priority",
"default": null,
"description": "Best for the group: budget (the lowest total), time (the fewest hours) or balanced. Default balanced."
},
"same_day": {
"type": "boolean",
"title": "Same Day",
"default": false,
"description": "True if everyone must leave and return on the very same days; by default within a day."
},
"depart_to": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
],
"title": "Depart To",
"default": null,
"description": "The window to leave in: last day."
},
"nights_max": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Nights Max",
"default": null,
"description": "Trip length in nights: longest. Default 14."
},
"nights_min": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Nights Min",
"default": null,
"description": "Trip length in nights: shortest. Default 2."
},
"depart_from": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
],
"title": "Depart From",
"default": null,
"description": "The window to leave in: first day. Leave out with depart_to for the next 3 months."
},
"destinations": {
"type": "array",
"items": {
"type": "string"
},
"title": "Destinations",
"description": "Where to meet: airport codes (LIS), cities, country codes (PT), a region, a continent (Europe) or \"anywhere\"."
},
"max_ground_hours": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Max Ground Hours",
"default": null,
"description": "The most hours from the front door to the departure airport, one way. Default 8.5: farther airports are left out and named in the answer. Set it only when the user says how far they would travel to the airport, or to include the far ones the answer names."
}
}
}{
"title": "Find group trips",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}Prompts
2 advertised
plan_trip_from_home — Plan a trip from my home
Find the best trips door to door from your home town: every airport in reach, the train or bus there included.
- home
- Your home town, with its state or country if the name is common, e.g. "New Haven, CT". (required)
- destination
- Where to: a city, airport code, country or region, e.g. "Lisbon" or "Japan". (required)
- when
- Roughly when, e.g. "in March, about a week".
- travellers
- How many people, e.g. "2 adults".
cheapest_month — Cheapest month to go
Which month is cheapest to travel from your home town, per airport in reach.
- home
- Your home town, with its state or country if the name is common, e.g. "New Haven, CT". (required)
- destination
- Where to: a city, airport code, country or region, e.g. "Lisbon" or "Japan". (required)
Resources
4 advertised
trips — Doorfarer trips
Trip picks with photos, a compact table, booking and share buttons, and a form to change the search.
ui://doorfarer/find-trips-v2.htmltrip-details — Doorfarer trip step by step
One trip step by step, with booking and a calendar file.
ui://doorfarer/trip-details-v2.htmlprice-calendar — Doorfarer price calendar
The cheapest month for each airport in reach.
ui://doorfarer/price-calendar-v2.htmlgroup-trips — Doorfarer group trips
Options for a group meeting in one place, a line per town.
ui://doorfarer/group-trips-v2.html30-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
- 2382 ms
- 95th percentile latency
- 2382 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 2382 ms · metadata changed · 5 tool(s), 4 resource(s), 0 resource template(s), 2 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http doorfarer-mcp https://doorfarer.com/mcpCodex
codex mcp add doorfarer-mcp --url https://doorfarer.com/mcpCursor
{
"mcpServers": {
"doorfarer-mcp": {
"url": "https://doorfarer.com/mcp"
}
}
}Cline
{
"mcpServers": {
"doorfarer-mcp": {
"type": "streamableHttp",
"url": "https://doorfarer.com/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"doorfarer-mcp": {
"type": "http",
"url": "https://doorfarer.com/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http doorfarer-mcp https://doorfarer.com/mcpClaude Desktop
{
"mcpServers": {
"doorfarer-mcp": {
"url": "https://doorfarer.com/mcp"
}
}
}Windsurf
{
"mcpServers": {
"doorfarer-mcp": {
"serverUrl": "https://doorfarer.com/mcp"
}
}
}Let your agent find its tools
Find servers like Doorfarer MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other productivity and knowledge servers
Do you run Doorfarer MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.