search_flights
Find and compare flight prices for your travel dates. Search for one-way or round-trip flights with customizable passenger counts and cabin classes to get available options with pricing details.
Instructions
Search for flights on Bing Flights.
Args: origin: Origin airport code (e.g., "SEA") destination: Destination airport code (e.g., "ICN") departure_date: Departure date in YYYY-MM-DD format return_date: Return date in YYYY-MM-DD format (optional) adults: Number of adult passengers (default: 1) children: Number of child passengers (default: 0) infants: Number of infant passengers (default: 0) cabin_class: 0=Economy, 1=Premium Economy, 2=Business, 3=First (default: 0) max_results: Maximum number of results to return (default: 10) headless: Run browser in headless mode (default: True)
Returns: Dictionary containing flight search results with structure: - search_params: Search parameters used - results_count: Number of results returned - flights: List of flight options with pricing, airline, times, etc. - timestamp: When the search was performed
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| origin | Yes | ||
| destination | Yes | ||
| departure_date | Yes | ||
| return_date | No | ||
| adults | No | ||
| children | No | ||
| infants | No | ||
| cabin_class | No | ||
| max_results | No | ||
| headless | No |
Implementation Reference
- mcp_server.py:8-59 (handler)The MCP tool handler for 'search_flights'. This is the primary entry point decorated with @mcp.tool(), defining the tool schema via type hints and docstring, instantiating the scraper, calling its search_flights method, and handling cleanup. Handles the core tool logic for MCP.@mcp.tool() async def search_flights( origin: str, destination: str, departure_date: str, return_date: str | None = None, adults: int = 1, children: int = 0, infants: int = 0, cabin_class: int = 0, max_results: int = 10, headless: bool = True ) -> dict: """Search for flights on Bing Flights. Args: origin: Origin airport code (e.g., "SEA") destination: Destination airport code (e.g., "ICN") departure_date: Departure date in YYYY-MM-DD format return_date: Return date in YYYY-MM-DD format (optional) adults: Number of adult passengers (default: 1) children: Number of child passengers (default: 0) infants: Number of infant passengers (default: 0) cabin_class: 0=Economy, 1=Premium Economy, 2=Business, 3=First (default: 0) max_results: Maximum number of results to return (default: 10) headless: Run browser in headless mode (default: True) Returns: Dictionary containing flight search results with structure: - search_params: Search parameters used - results_count: Number of results returned - flights: List of flight options with pricing, airline, times, etc. - timestamp: When the search was performed """ scraper = BingFlightsScraper(headless=headless) try: results = await scraper.search_flights( origin=origin, destination=destination, departure_date=departure_date, return_date=return_date, adults=adults, children=children, infants=infants, cabin_class=cabin_class, max_results=max_results ) return results finally: await scraper.close()
- mcp_server.py:8-8 (registration)The @mcp.tool() decorator registers the search_flights function as an MCP tool.@mcp.tool()
- mcp_server.py:9-42 (schema)Input schema defined by function parameters with type annotations and comprehensive docstring describing args and return type.async def search_flights( origin: str, destination: str, departure_date: str, return_date: str | None = None, adults: int = 1, children: int = 0, infants: int = 0, cabin_class: int = 0, max_results: int = 10, headless: bool = True ) -> dict: """Search for flights on Bing Flights. Args: origin: Origin airport code (e.g., "SEA") destination: Destination airport code (e.g., "ICN") departure_date: Departure date in YYYY-MM-DD format return_date: Return date in YYYY-MM-DD format (optional) adults: Number of adult passengers (default: 1) children: Number of child passengers (default: 0) infants: Number of infant passengers (default: 0) cabin_class: 0=Economy, 1=Premium Economy, 2=Business, 3=First (default: 0) max_results: Maximum number of results to return (default: 10) headless: Run browser in headless mode (default: True) Returns: Dictionary containing flight search results with structure: - search_params: Search parameters used - results_count: Number of results returned - flights: List of flight options with pricing, airline, times, etc. - timestamp: When the search was performed """
- Supporting helper method in BingFlightsScraper class that performs the actual flight search: validates inputs, builds Bing Flights URL, launches Playwright browser, navigates, waits for results, scrapes flight cards, parses details like price, airlines, times, stops, and structures the response dictionary.async def search_flights( self, origin: str, destination: str, departure_date: str, return_date: Optional[str] = None, adults: int = 1, children: int = 0, infants: int = 0, cabin_class: int = 0, max_results: int = 10 ) -> dict: """Search for flights and return results. Args: origin: Airport code (e.g., "SEA") destination: Airport code (e.g., "ICN") departure_date: Departure date in YYYY-MM-DD format return_date: Return date in YYYY-MM-DD format (None for one-way) adults: Number of adult passengers (default: 1) children: Number of child passengers (default: 0) infants: Number of infant passengers (default: 0) cabin_class: 0=Economy, 1=Premium Economy, 2=Business, 3=First (default: 0) max_results: Maximum number of results to return (default: 10) Returns: Dictionary with flight results Raises: ValueError: If parameters are invalid PlaywrightTimeoutError: If page doesn't load within timeout """ # Validate inputs if not origin or not destination: raise ValueError("Origin and destination are required") if not departure_date: raise ValueError("Departure date is required") if cabin_class not in self.CABIN_CLASSES: raise ValueError(f"Cabin class must be 0-3, got {cabin_class}") if adults < 1: raise ValueError("At least 1 adult passenger is required") if max_results < 1: raise ValueError("max_results must be at least 1") # Build URL url = self._build_url( origin=origin.upper(), destination=destination.upper(), departure_date=departure_date, return_date=return_date, adults=adults, children=children, infants=infants, cabin_class=cabin_class ) # Ensure browser is started if not self.context: await self._start() # Create page and navigate page = await self.context.new_page() try: await page.goto(url, timeout=60000, wait_until='networkidle') # Store the URL for use in flight data search_url = url # Wait for flight results to load - Bing uses .itrCard class try: await page.wait_for_selector('.itrCard', timeout=30000) except PlaywrightTimeoutError: # If no results, still try to scrape await page.wait_for_timeout(5000) # Scrape results flights = await self._scrape_flight_results( page, max_results, search_url ) # Build response trip_type = "round-trip" if return_date else "one-way" return { "search_params": { "origin": origin.upper(), "destination": destination.upper(), "departure_date": departure_date, "return_date": return_date, "trip_type": trip_type, "passengers": { "adults": adults, "children": children, "infants": infants }, "cabin_class": self.CABIN_CLASSES[cabin_class] }, "results_count": len(flights), "flights": flights, "timestamp": datetime.utcnow().isoformat() + "Z" } finally: await page.close()