Skip to main content
Glama
DhanyaHegdek

Flight Booking MCP Server

by DhanyaHegdek
README.md
# Flight Booking MCP Server

A simple MCP (Model Context Protocol) server that lets an AI assistant
like Claude search for flights, book them, check booking status, and
cancel bookings — using mock flight data, so it runs with zero API
keys or signups.

## What is this?

[MCP](https://modelcontextprotocol.io) is a standard that lets AI
models call external tools. This project exposes 4 tools an AI
assistant can call directly in conversation:

| Tool                 | What it does                                        |
| -------------------- | --------------------------------------------------- |
| `search_flights`     | Search flights between two airports on a given date |
| `book_flight`        | Book a specific flight for a passenger              |
| `get_booking_status` | Look up an existing booking by its ID               |
| `cancel_booking`     | Cancel an existing booking                          |

Flight data is generated by `mock_data.py` — deterministic fake flights
(same query always returns the same results), so you can build and
test without a real flight API. A real-API version (`amadeus_client.py`)
is included as a reference but is disabled by default — see the note
near the bottom.

## Prerequisites

- **Python 3.10+**
- **[uv](https://docs.astral.sh/uv/getting-started/installation/)** —
  used to manage dependencies and the virtual environment
- **Node.js** (only needed if you want to test with MCP Inspector, step 3 below)
- An MCP-compatible client, e.g. **Claude Desktop**

## Setup

1. **Clone the repo**

   ```bash
   git clone https://github.com/YOUR-USERNAME/flight-booking-mcp.git
   cd flight-booking-mcp
   ```

2. **Install dependencies**

   ```bash
   uv sync
   ```

   This creates a `.venv` and installs everything listed in `pyproject.toml`.

3. **(Optional) Test it standalone first**

   ```bash
   uv run python -c "import main; print(main.search_flights('BLR','DEL','2026-08-15'))"
   ```

   You should see a list of 3 fake flight offers printed as JSON — this
   confirms the code itself works, before wiring up any MCP client.

4. **(Optional) Test it as a real MCP server with the Inspector**
   ```bash
   npx @modelcontextprotocol/inspector uv run main.py
   ```
   This opens a browser UI where you can call each tool manually and
   see the JSON response — the fastest way to confirm everything works
   before connecting a real client.

## Connect it to Claude Desktop

Open your Claude Desktop config file:

- **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`

Add this entry, replacing the path with the absolute path to where you cloned the repo:

```json
{
  "mcpServers": {
    "flight-booking": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/flight-booking-mcp",
        "run",
        "main.py"
      ]
    }
  }
}
```

Restart Claude Desktop completely (quit fully, don't just close the
window). You should see "flight-booking" listed as a connected tool.

## Try it

Ask your AI assistant things like:

```
Search flights from BLR to DEL on 2026-08-15
```

```
Book the IndiGo flight (IN855-2) for passenger Jane Doe, email jane@example.com
```

```
What's the status of booking BK1000?
```

```
Cancel booking BK1000
```

## Project structure

```
flight-booking-mcp/
├── main.py             # the MCP server — defines the 4 tools
├── mock_data.py         # fake flight data generator + in-memory bookings (default backend)
├── amadeus_client.py    # real flight API backend (Amadeus) — disabled by default, see note below
├── pyproject.toml       # project + dependency config (used by uv)
├── uv.lock              # exact locked dependency versions
├── .env.example         # template for real-API credentials
├── .gitignore
└── README.md
```

**How the mock/real switch works:** `main.py` picks a backend based on
the `USE_REAL_API` environment variable (defaults to `false`). Every
tool calls a generic `flight_backend.search_flights(...)` etc., rather
than naming `mock_data` directly — so swapping data sources never
requires touching the tool definitions themselves.

## Note on real flight data

`amadeus_client.py` shows how to wire this up to Amadeus's real
sandbox API (OAuth2 token handling, normalizing their nested JSON into
the same shape `mock_data.py` returns). However, Amadeus's Self-Service
developer portal was decommissioned in July 2026, so new signups
currently aren't possible. The file is kept as a reference pattern for
integrating any real flight API later — the mock backend is fully
sufficient for using and understanding this project as-is.

TDQS

C2.1/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a distinct purpose: searching, booking, canceling, and checking status. No overlap.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern (e.g., search_flights, book_flight).

Tool Count5/5

4 tools is appropriate for a flight booking server, covering core operations without being over- or under-scoped.

Completeness4/5

Covers essential operations (search, book, cancel, status). Missing update booking or other advanced features, but fine for basic usage.

Maintenance

ActivityStale
ResponsivenessNo issues