{"id":"514101bc-bce2-4fda-82d6-87130a527103","slug":"seats-mcp","kind":"mcp","name":"seats-MCP","summary":"Your coding agent now has frequent flyer status. MCP server for the seats.aero + rooms.aero Partner APIs — award availability across 20+ airline mileage programs and 7 hotel loyalty programs.","owner":"baeleb","repoUrl":"https://github.com/baeleb/seats-MCP","license":"GPL-3.0","licenseTier":"strong-copyleft","trust":"community","stars":0,"match":null,"fewStars":true,"format":"mcp","createdAt":"2026-06-09T17:06:15.000Z","addedAt":"2026-10-21T04:41:03.908Z","logoUrl":"https://avatars.githubusercontent.com/u/48233942?u=01bb391dee5d01f17079fa49c99f8972be903e2c&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["search","cloud-infra","memory-knowledge"],"tags":["award-travel","flight-search","go","seats-aero","hotel-search","points-and-miles","rooms-aero"],"runtime":"go","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-23T00:32:11.518Z","sample":false,"url":"https://conduits.dev/tools/seats-mcp","language":"Go","transports":["stdio"],"install":{},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# seats-MCP\n\n> Your coding agent now has frequent flyer status.\n\nAsk your AI to find award flights and hotel stays — right from the terminal, inside your editor, or mid-refactor. seats-MCP connects AI coding agents to the [seats.aero](https://developers.seats.aero/reference/getting-started-p) and [rooms.aero](https://developers.seats.aero/reference/rooms-getting-started) Partner APIs, giving them instant access to award availability across 20+ airline mileage programs and seven hotel loyalty programs (Hilton, Hyatt, IHG, Marriott, Choice, Wyndham and I Prefer).\n\n**Example:** \"Find me a business class seat from LAX to Tokyo on June 15th.\"\n\nYour agent searches Aeroplan, United, Delta, Alaska, Emirates, and more — all in one call — and comes back with mileage costs, seat counts, airlines, and dates. No browser tabs. No point-and-click calendar hunting. Just ask.\n\nBuilt on the [Model Context Protocol](https://modelcontextprotocol.io). stdio transport.\n\n## Quickstart\n\n### 1. Get an API key\n\nYou need a seats.aero account with a **Pro** or **Commercial** plan.\n\n1. Sign up at [seats.aero](https://seats.aero) and subscribe to Pro.\n2. Go to [seats.aero/settings](https://seats.aero/settings) and open the **API** tab.\n3. Copy your API key. Keep this secret! \n\n> **Note:** seats.aero may limit API key access by geographical location or other criteria at their sole discretion. Pro keys are for **non-commercial use only**; commercial use requires a written agreement with seats.aero.\n\nRate limit: **1,000 requests/day** shared across all uses of the key.\n\n### 2. Get the binary\n\n**Option A — Download (recommended)**\n\nGo to [Releases](https://github.com/baeleb/seats-MCP/releases) and download the binary for your platform, then make it executable:\n\n```sh\nchmod +x seats-mcp_darwin_arm64\n```\n\n| Platform | File |\n|---|---|\n| macOS Apple Silicon | `seats-mcp_darwin_arm64` |\n| macOS Intel | `seats-mcp_darwin_amd64` |\n| Linux x86_64 | `seats-mcp_linux_amd64` |\n| Linux ARM | `seats-mcp_linux_arm64` |\n| Windows x86_64 | `seats-mcp_windows_amd64.exe` |\n\n**Option B — Build from source**\n\n```sh\ngit clone https://github.com/baeleb/seats-MCP.git\ncd seats-MCP\ngo build -o bin/seats-mcp .\n```\n\nRequires Go 1.26+.\n\n### 3. Set your API key\n\nChoose one method to make the key available at runtime:\n\n**Option A — Shell profile (persistent, simplest)**\n\nAdd this line to `~/.zshrc` (or `~/.bashrc`):\n\n```sh\nexport SEATS_AERO_API_KEY=\"your-partner-api-key\"\n```\n\nThen restart your shell or run `source ~/.zshrc`.\n\n**Option B — Inline per-command**\n\n```sh\nSEATS_AERO_API_KEY=\"your-key\" ./bin/seats-mcp\n```\n\n### 3b. (Alternative) Authenticate with OAuth2\n\nInstead of a static API key, the server can connect a user's seats.aero Pro account via OAuth2 — useful for consumer-facing integrations. The server **prefers OAuth** when OAuth credentials and a saved token are present, and otherwise falls back to the API key, so the two can coexist.\n\n1. Register an application at [seats.aero](https://seats.aero) to obtain a **client ID** and **client secret**. seats.aero requires the **redirect URI to be a public HTTPS URL** (loopback `http://localhost` URIs are not accepted), and it must share a domain with the Website URL you register. Any HTTPS page that simply loads works — e.g. your project's GitHub repo or a GitHub Pages site — because you complete the flow by pasting the redirected URL back into the CLI; the page itself doesn't need to handle the code.\n\n2. Set the OAuth environment variables. `SEATS_OAUTH_REDIRECT_URI` must match the registered URI character-for-character:\n\n   ```sh\n   export SEATS_OAUTH_CLIENT_ID=\"your-client-id\"\n   export SEATS_OAUTH_CLIENT_SECRET=\"your-client-secret\"\n   export SEATS_OAUTH_REDIRECT_URI=\"https://github.com/you/your-repo\"\n   ```\n\n3. Run the consent flow once:\n\n   ```sh\n   ./bin/seats-mcp auth login\n   ```\n\n   This prints (and opens) the consent URL. After you authorize, seats.aero redirects your browser to your HTTPS redirect URI with `?code=…&state=…` appended. Copy the **full URL from the address bar** and paste it at the prompt — the server extracts the code, exchanges it, and saves the tokens. (You can paste just the `code` value instead if you prefer. Set `SEATS_MCP_NO_BROWSER=1` to skip auto-opening the browser on headless machines.)\n\n   Tokens are stored at `<user-config-dir>/seats-mcp/token.json` (override with `SEATS_OAUTH_TOKEN_FILE`). The server refreshes the access token automatically as it expires.\n\n   ```sh\n   ./bin/seats-mcp auth status    # show the stored token + signed-in user\n   ./bin/seats-mcp auth logout     # delete the stored token\n   ```\n\nThe OAuth access token is sent as `Partner-Authorization: Bearer <token>` on every Partner API request — the same header as an API key, prefixed with `Bearer`.\n\n> **Loopback callback (optional):** if seats.aero ever permits an `http://localhost:PORT/callback` redirect URI for your app, `auth login` will instead spin up a temporary local listener and capture the redirect automatically — no pasting needed. The CLI picks this path on its own when the redirect URI is a loopback address.\n\n### 4. Add to your MCP client\n\n#### OpenCode\n\nAdd to `~/.config/opencode/opencode.jsonc`:\n\n```jsonc\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"mcp\": {\n    \"seats-aero\": {\n      \"type\": \"local\",\n      \"command\": [\"/path/to/seats-MCP/bin/seats-mcp\"],\n      \"enabled\": true,\n      \"environment\": {\n        \"SEATS_AERO_API_KEY\": \"{env:SEATS_AERO_API_KEY}\"\n      }\n    }\n  }\n}\n```\n\nUse an absolute path to the binary. The `{env:SEATS_AERO_API_KEY}` syntax pulls the value from your shell environment — no secret written to the config file.\n\nRestart OpenCode. The tools below will appear under the `seats-aero_` prefix.\n\n#### Claude Desktop\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"seats-aero\": {\n      \"command\": \"/absolute/path/to/seats-MCP/bin/seats-mcp\",\n      \"env\": {\n        \"SEATS_AERO_API_KEY\": \"your-partner-api-key\"\n      }\n    }\n  }\n}\n```\n\n#### Claude Code\n\nAdd to your Claude Code MCP config:\n\n```json\n{\n  \"mcpServers\": {\n    \"seats-aero\": {\n      \"command\": \"/absolute/path/to/seats-MCP/bin/seats-mcp\",\n      \"env\": {\n        \"SEATS_AERO_API_KEY\": \"your-partner-api-key\"\n      }\n    }\n  }\n}\n```\n\n#### MCP Inspector (manual testing)\n\n```sh\nSEATS_AERO_API_KEY=\"your-key\" npx @modelcontextprotocol/inspector ./bin/seats-mcp\n```\n\n## Tools\n\nFlights (seats.aero):\n\n| Tool | Endpoint | Use for |\n| --- | --- | --- |\n| `search_award_availability` | `GET /search` | Cached, multi-program search by route + date range. Fast. |\n| `bulk_availability` | `GET /availability` | Single-program bulk fetch, paginated. Explore-style queries. |\n| `get_trips` | `GET /trips/{id}` | Drill into a specific Availability for flight-level itineraries. |\n| `live_search` | `POST /live` | Real-time search for one route/date/program. Slower (5-15s). |\n\nHotels (rooms.aero):\n\n| Tool | Endpoint | Use for |\n| --- | --- | --- |\n| `search_hotel_availability` | `GET /search` | Find hotels with award availability in an area + date range, cheapest first. |\n| `bulk_hotel_availability` | `GET /availability` | Every upcoming date with a rate for a program or a set of hotels. |\n| `get_hotel_availability_details` | `GET /availability/{id}` | Room types with points/cash prices and a booking link for one stay. |\n| `list_hotels` | `GET /hotels` | Browse the hotel directory by program, location, brand or name. |\n| `refresh_hotel` | `POST /hotels/{id}/refresh` | Request a fresh rate check (one per user every 24h). |\n| `list_hotel_alerts` | `GET /alerts` | List the price alerts on your rooms.aero account (read-only). |\n\n## Notes\n\n- **Flights and hotels share the same credentials.** Your seats.aero API key (or OAuth token) authenticates both the seats.aero and rooms.aero APIs. rooms.aero keeps its own separate quota of 1,000 calls/day, so hotel calls never count against your seats.aero quota (or vice versa).\n- **Live search is not available to Pro users.** The `/live` endpoint requires a commercial agreement with seats.aero. If you are a Pro user, the `live_search` tool will return errors.\n- IDs returned by `live_search` are ephemeral and cannot be passed to `get_trips`.\n- Times in responses use the **local airport timezone**, not UTC.\n- Not all mileage programs report seat counts or trip-level data — treat capability gaps as expected.\n- The server logs only to stderr (stdout is the MCP transport).\n\nSee [`AGENTS.md`](./AGENTS.md) for the full API surface reference. (A [`CLAUDE.md`](./CLAUDE.md) symlink is kept for Claude Code, which reads that name.)\n\n## License\n\nGPLv3. See [LICENSE](./LICENSE).\n"}