search_flights
Find and compare flight options for one-way, round-trip, or multi-city journeys with customizable preferences for dates, cabin class, and travel times.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Type of flight | |
| origin | Yes | Origin airport or city IATA code (e.g., SFO, NYC) | |
| destination | Yes | Destination airport or city IATA code (e.g., LAX, LHR) | |
| departureDate | Yes | Departure date in YYYY-MM-DD format | |
| returnDate | No | Return date in YYYY-MM-DD format (required for round-trip) | |
| departureTime | No | Preferred departure time window | |
| arrivalTime | No | Preferred arrival time window | |
| cabinClass | Yes | Cabin class | |
| adults | No | Number of adult passengers | |
| maxConnections | No | Maximum number of connections | |
| additionalStops | No | Additional stops for multi-city flights |
Implementation Reference
- src/server.ts:30-113 (registration)Registration of the 'search_flights' tool with MCP server, including inline handler function that handles one-way, round-trip, and multi-city flight searches using Duffel API.server.tool( 'search_flights', flightSearchSchema.shape, async (params: FlightSearch) => { try { const slices = []; // Build slices based on flight type if (params.type === 'one_way') { slices.push(flightClient.createSlice( params.origin, params.destination, params.departureDate, params.departureTime, params.arrivalTime )); } else if (params.type === 'round_trip') { if (!params.returnDate) { throw new Error('Return date required for round-trip flights'); } slices.push(flightClient.createSlice( params.origin, params.destination, params.departureDate, params.departureTime, params.arrivalTime )); slices.push(flightClient.createSlice( params.destination, params.origin, params.returnDate, params.departureTime, params.arrivalTime )); } else if (params.type === 'multi_city') { if (!params.additionalStops || params.additionalStops.length === 0) { throw new Error('Additional stops required for multi-city flights'); } // First leg slices.push(flightClient.createSlice( params.origin, params.destination, params.departureDate )); // Additional legs for (const stop of params.additionalStops) { slices.push(flightClient.createSlice( stop.origin, stop.destination, stop.departureDate )); } } // Create the offer request const response = await flightClient.createOfferRequest({ slices, cabin_class: params.cabinClass, adult_count: params.adults, max_connections: params.maxConnections, return_offers: true, supplier_timeout: 15000 // 15 seconds }); // Return formatted response return { content: [ { type: 'text', text: JSON.stringify(response, null, 2) } ] }; } catch (error) { console.error(`Error searching flights: ${error}`); throw error; } } );
- src/server.ts:33-112 (handler)Handler logic for executing flight searches: constructs slices for different trip types and requests offers from Duffel flight client.async (params: FlightSearch) => { try { const slices = []; // Build slices based on flight type if (params.type === 'one_way') { slices.push(flightClient.createSlice( params.origin, params.destination, params.departureDate, params.departureTime, params.arrivalTime )); } else if (params.type === 'round_trip') { if (!params.returnDate) { throw new Error('Return date required for round-trip flights'); } slices.push(flightClient.createSlice( params.origin, params.destination, params.departureDate, params.departureTime, params.arrivalTime )); slices.push(flightClient.createSlice( params.destination, params.origin, params.returnDate, params.departureTime, params.arrivalTime )); } else if (params.type === 'multi_city') { if (!params.additionalStops || params.additionalStops.length === 0) { throw new Error('Additional stops required for multi-city flights'); } // First leg slices.push(flightClient.createSlice( params.origin, params.destination, params.departureDate )); // Additional legs for (const stop of params.additionalStops) { slices.push(flightClient.createSlice( stop.origin, stop.destination, stop.departureDate )); } } // Create the offer request const response = await flightClient.createOfferRequest({ slices, cabin_class: params.cabinClass, adult_count: params.adults, max_connections: params.maxConnections, return_offers: true, supplier_timeout: 15000 // 15 seconds }); // Return formatted response return { content: [ { type: 'text', text: JSON.stringify(response, null, 2) } ] }; } catch (error) { console.error(`Error searching flights: ${error}`); throw error; } }
- src/models/flightSearch.ts:21-35 (schema)Zod schema defining input structure for search_flights tool, including trip type, airports, dates, and options.export const flightSearchSchema = z.object({ type: z.enum(['one_way', 'round_trip', 'multi_city']).describe('Type of flight'), origin: z.string().describe('Origin airport or city IATA code (e.g., SFO, NYC)'), destination: z.string().describe('Destination airport or city IATA code (e.g., LAX, LHR)'), departureDate: z.string().describe('Departure date in YYYY-MM-DD format'), returnDate: z.string().optional().describe('Return date in YYYY-MM-DD format (required for round-trip)'), departureTime: timeSpecSchema.optional().describe('Preferred departure time window'), arrivalTime: timeSpecSchema.optional().describe('Preferred arrival time window'), cabinClass: z.enum(['economy', 'premium_economy', 'business', 'first']).describe('Cabin class'), adults: z.number().min(1).default(1).describe('Number of adult passengers'), maxConnections: z.number().optional().describe('Maximum number of connections'), additionalStops: z.array(flightSegmentSchema).optional().describe('Additional stops for multi-city flights') }); export type FlightSearch = z.infer<typeof flightSearchSchema>;
- src/models/flightSearch.ts:6-9 (helper)Helper schema for time specifications used in flight search departure/arrival times.export const timeSpecSchema = z.object({ fromTime: z.string().describe('Start time in 24-hour format (HH:MM)'), toTime: z.string().describe('End time in 24-hour format (HH:MM)') });
- src/models/flightSearch.ts:13-17 (helper)Helper schema for individual flight segments used in multi-city searches.export const flightSegmentSchema = z.object({ origin: z.string().describe('Origin airport or city IATA code (e.g., SFO, NYC)'), destination: z.string().describe('Destination airport or city IATA code (e.g., LAX, LHR)'), departureDate: z.string().describe('Departure date in YYYY-MM-DD format') });