Skip to main content
Glama

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

TableJSON Schema
NameRequiredDescriptionDefault
originYes
destinationYes
departure_dateYes
return_dateNo
adultsNo
childrenNo
infantsNo
cabin_classNo
max_resultsNo
headlessNo

Implementation Reference

  • 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()
  • 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()

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/chonseng/bing-flights-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server