Bing Flights Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Bing Flights Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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.
📦 [View on PyPI](https://pypi.org/project/bing-flights-mcp/)
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.pyThe easiest way to use this MCP server is with uvx:
uvx bing-flights-mcpThis will automatically install the package and its dependencies in an isolated environment.
You can also install from PyPI:
pip install bing-flights-mcpAfter installation, install the Playwright browser:
playwright install chromiumFor development or if you want to modify the code:
On Windows:
python -m venv venv
venv\Scripts\activateOn macOS/Linux:
python -m venv venv
source venv/bin/activate pip install -r requirements.txt playwright install chromium#### Using uvx (Recommended)
If you installed via PyPI, run:
uvx bing-flights-mcpOr 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 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 futureIssue: 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 flightsIssue: Import errors
Solution:
- Ensure virtual environment is activated
- Run `pip install -r requirements.txt` again
- Verify Python version is 3.10 or higherTo 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.pyRun comprehensive end-to-end tests that perform actual flight searches:
python tests/test_e2e.pyNote: 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.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.