Are you the author? Sign in to claim
Bing flights MCP Server
A Model Context Protocol (MCP) server that scrapes flight information from Bing Flights using Playwright. This project provides both a standalone Python scraper module and an MCP server wrapper for integration with MCP-compatible applications.
bing-flights-mcp/
├── pyproject.toml # Package configuration
├── requirements.txt # Python dependencies
├── README.md # This file
├── bing_flights_scraper/ # Standalone scraper module
│ ├── __init__.py
│ └── scraper.py
├── mcp_server.py # MCP server implementation
└── tests/ # Test suite
├── __init__.py
├── test_mcp.py
└── test_e2e.py
The easiest way to use this MCP server is with uvx:
uvx bing-flights-mcp
This will automatically install the package and its dependencies in an isolated environment.
You can also install from PyPI:
pip install bing-flights-mcp
After installation, install the Playwright browser:
playwright install chromium
For development or if you want to modify the code:
Clone or download this repository
Create and activate a virtual environment
On Windows:
python -m venv venv
venv\Scripts\activate
On macOS/Linux:
python -m venv venv
source venv/bin/activate
Install dependencies
pip install -r requirements.txt
Install Playwright browsers
playwright install chromium
If you installed via PyPI, run:
uvx bing-flights-mcp
Or add to your MCP settings configuration:
{
"mcpServers": {
"bing-flights": {
"command": "uvx",
"args": ["bing-flights-mcp"]
}
}
}
If you're developing or running from source:
python mcp_server.py
The MCP server exposes two tools:
1. search_flights
Search for flight options from Bing Flights.
Parameters:
origin (string, required): Origin airport code (e.g., "SEA")destination (string, required): Destination airport code (e.g., "ICN")departure_date (string, required): Departure date in YYYY-MM-DD formatreturn_date (string, optional): Return date for round-trip searchesadults (integer, optional, default=1): Number of adult passengerschildren (integer, optional, default=0): Number of child passengersinfants (integer, optional, default=0): Number of infant passengerscabin_class (integer, optional, default=0): 0=Economy, 1=Premium Economy, 2=Business, 3=Firstmax_results (integer, optional, default=10): Maximum number of resultsheadless (boolean, optional, default=true): Run browser in headless modeExample MCP Tool Call:
{
"origin": "SEA",
"destination": "ICN",
"departure_date": "2025-11-30",
"return_date": "2025-12-02",
"adults": 1,
"cabin_class": 0,
"max_results": 10,
"headless": true
}
2. get_scraper_status
Check scraper health and configuration.
Example Response:
{
"status": "healthy",
"version": "1.0.1",
"capabilities": {
"one_way_search": true,
"round_trip_search": true,
"cabin_classes": ["economy", "premium_economy", "business", "first"],
"max_results": 50,
"headless_mode": true
}
}
You can also use the scraper directly in your Python code:
from bing_flights_scraper import BingFlightsScraper
# Create scraper instance
scraper = BingFlightsScraper(headless=True)
try:
# Search for flights
results = scraper.search_flights(
origin="SEA",
destination="ICN",
departure_date="2025-11-30",
return_date="2025-12-02",
adults=1,
cabin_class=0,
max_results=10
)
# Process results
print(f"Found {results['results_count']} flights")
for flight in results['flights']:
print(f"Price: ${flight['price']['total']}")
print(f"Airlines: {', '.join(flight['airlines'])}")
print(f"Departure: {flight['outbound']['departure_time']}")
print(f"Arrival: {flight['outbound']['arrival_time']}")
print(f"Duration: {flight['outbound']['duration']}")
print("---")
finally:
scraper.close()
The scraper returns results in the following JSON structure:
{
"search_params": {
"origin": "SEA",
"destination": "ICN",
"departure_date": "2025-11-30",
"return_date": "2025-12-02",
"trip_type": "round-trip",
"passengers": {
"adults": 1,
"children": 0,
"infants": 0
},
"cabin_class": "economy"
},
"results_count": 10,
"flights": [
{
"price": {
"total": 1200.00,
"currency": "USD",
"per_person": 1200.00
},
"airlines": ["Korean Air", "Delta"],
"outbound": {
"departure_time": "10:30",
"arrival_time": "14:45",
"duration": "13h 15m",
"stops": 1,
"layovers": [],
"flight_numbers": []
},
"booking_link": "https://www.bing.com/...",
"result_index": 1
}
],
"timestamp": "2025-10-23T02:19:00Z"
}
0 - Economy1 - Premium Economy2 - Business3 - First Classheadless=True - Browser runs in the background (faster, no UI)headless=False - Browser window visible (useful for debugging)Issue: Playwright browser not found
Solution: Run `playwright install chromium`
Issue: Timeout waiting for flight results
Solution:
- Check your internet connection
- Try with headless=False to see what's happening
- Verify the airport codes are valid
- Ensure the dates are in the future
Issue: No results returned
Solution:
- Verify airport codes are correct (use IATA codes like "SEA", "ICN")
- Check that dates are in YYYY-MM-DD format
- Try different date ranges
- Some routes may not have available flights
Issue: Import errors
Solution:
- Ensure virtual environment is activated
- Run `pip install -r requirements.txt` again
- Verify Python version is 3.10 or higher
To debug scraping issues, run with headless=False:
scraper = BingFlightsScraper(headless=False)
This will show the browser window so you can see what's being loaded.
Run the basic unit tests that verify module imports and URL construction:
python tests/test_mcp.py
Run comprehensive end-to-end tests that perform actual flight searches:
python tests/test_e2e.py
Note: E2E tests make real web requests to Bing Flights and may take several minutes to complete. They include:
The tests use headless browser mode and future dates to ensure valid searches.
The scraper uses minimal error handling and allows exceptions to propagate:
PlaywrightTimeoutErrorValueErrorThis design allows the MCP client to implement appropriate retry logic and error recovery.
fastmcp>=0.1.0 - MCP server frameworkplaywright>=1.40.0 - Browser automationpython-dateutil>=2.8.2 - Date parsing utilitiesWhen contributing, please:
MIT License - See LICENSE file for details
This tool scrapes publicly available data from Bing Flights. Please:
For issues, questions, or contributions, please open an issue on the project repository.
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
Google's universal MCP server supporting PostgreSQL, MySQL, MongoDB, Redis, and 10+ databases
Official GitHub integration for repos, issues, PRs, and CI/CD workflows