Bing Flights MCP Server
Enables flight search and price comparison by scraping flight information from Bing Flights. Supports one-way and round-trip searches with customizable passenger counts, cabin classes, and booking details.
README
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.
Features
- 🔍 Search for one-way and round-trip flights
- ✈️ Support for multiple passengers (adults, children, infants)
- 💺 All cabin classes (Economy, Premium Economy, Business, First)
- 🤖 Headless or headed browser modes
- 📊 Structured JSON responses
- 🔧 Easy integration via MCP protocol
Project Structure
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
Installation
Quick Start (Recommended)
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.
Installation via pip
You can also install from PyPI:
pip install bing-flights-mcp
After installation, install the Playwright browser:
playwright install chromium
Development Installation
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\activateOn macOS/Linux:
python -m venv venv source venv/bin/activate -
Install dependencies
pip install -r requirements.txt -
Install Playwright browsers
playwright install chromium
Usage
As an MCP Server
Using uvx (Recommended)
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"]
}
}
}
Running from Source
If you're developing or running from source:
python mcp_server.py
Available Tools
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 mode
Example 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
}
}
As a Standalone Python Module
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()
Response Format
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"
}
Configuration Options
Cabin Classes
0- Economy1- Premium Economy2- Business3- First Class
Browser Modes
headless=True- Browser runs in the background (faster, no UI)headless=False- Browser window visible (useful for debugging)
Troubleshooting
Common Issues
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
Debugging
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.
Running Tests
Basic Tests
Run the basic unit tests that verify module imports and URL construction:
python tests/test_mcp.py
End-to-End Tests
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:
- Invalid Parameters Test - Verifies error handling
- One-Way Search Test - Real search from SEA to ICN
- Round-Trip Search Test - Real search from LAX to JFK
- Multiple Passengers Test - Search with 2 adults and 1 child
The tests use headless browser mode and future dates to ensure valid searches.
Technical Details
Web Scraping Approach
- Uses Playwright for browser automation
- Waits for dynamic content to load
- Extracts data from Bing Flights result cards
- Handles multiple selector patterns for robustness
Error Handling
The scraper uses minimal error handling and allows exceptions to propagate:
- Network errors → Raises exception
- Timeout errors → Raises
PlaywrightTimeoutError - Invalid parameters → Raises
ValueError - Parsing errors → Returns partial results or empty list
This design allows the MCP client to implement appropriate retry logic and error recovery.
Limitations
- Only returns outbound flight details (return flight info not available on Bing results page)
- Maximum results limited by what's visible on the initial page load
- No pagination support (first page results only)
- Scraping depends on Bing's page structure (may break if they change their HTML)
Dependencies
fastmcp>=0.1.0- MCP server frameworkplaywright>=1.40.0- Browser automationpython-dateutil>=2.8.2- Date parsing utilities
Contributing
When contributing, please:
- Test changes with both headless and headed modes
- Verify compatibility with the MCP protocol
- Update documentation for new features
- Follow existing code style and patterns
License
MIT License - See LICENSE file for details
Disclaimer
This tool scrapes publicly available data from Bing Flights. Please:
- Use responsibly and respect rate limits
- Review Bing's Terms of Service
- Do not use for commercial purposes without proper authorization
- Be aware that web scraping may break if the website changes
Support
For issues, questions, or contributions, please open an issue on the project repository.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。