# Pilot Hotel Search MCP Server

> Free, remote Model Context Protocol (MCP) server for live hotel search. Connect Claude, ChatGPT, Cursor, VS Code or any MCP client to `https://mcp.pilotplans.com/mcp` to search hotels, compare room rates and check availability. No API key, no sign-up, no OAuth.

- **MCP endpoint:** `https://mcp.pilotplans.com/mcp`
- **Transport:** Streamable HTTP (MCP protocol versions 2024-11-05 to 2025-11-25)
- **Authentication:** none
- **Access:** read-only, free
- **Tools:** `search_hotels`, `get_hotel_details`, `get_room_rates_for_hotel`

Pilot's MCP server gives AI assistants and agents live hotel inventory from [Pilot](https://www.pilotplans.com/). Search hotels by city, neighbourhood, address or landmark for your dates; filter by star rating, guest review score, amenities and distance; pull descriptions, photos and addresses; and compare bookable room rates with board type and refundability. Prices come from Pilot's suppliers at request time. Every hotel includes a link to book it on Pilot.

## Install

Paste this URL wherever a client asks for a remote or custom MCP server:

```text
https://mcp.pilotplans.com/mcp
```

### Claude (claude.ai and Claude Desktop)

1. Open **Customize → Connectors → Add custom connector**.
2. Name it `Pilot` and paste `https://mcp.pilotplans.com/mcp`.
3. Leave the advanced settings empty and add it.

### ChatGPT

1. Turn on developer mode under **Settings → Security and login**.
2. Create a connector with the URL `https://mcp.pilotplans.com/mcp` and choose **No authentication**.

### Claude Code

```bash
claude mcp add --transport http pilot https://mcp.pilotplans.com/mcp
```

Add `--scope user` to make the server available in every project.

### Cursor

[Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=pilot&config=eyJ1cmwiOiJodHRwczovL21jcC5waWxvdHBsYW5zLmNvbS9tY3AifQ==) in one click, or add this to `~/.cursor/mcp.json`:

```json
{
  "mcpServers": {
    "pilot": { "url": "https://mcp.pilotplans.com/mcp" }
  }
}
```

### VS Code (GitHub Copilot agent mode)

[Install in VS Code](vscode:mcp/install?%7B%22name%22%3A%22pilot%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.pilotplans.com%2Fmcp%22%7D) in one click, or run:

```bash
code --add-mcp '{"name":"pilot","type":"http","url":"https://mcp.pilotplans.com/mcp"}'
```

For a single workspace, add this to `.vscode/mcp.json`:

```json
{
  "servers": {
    "pilot": { "type": "http", "url": "https://mcp.pilotplans.com/mcp" }
  }
}
```

### Windsurf

Add this to `~/.codeium/windsurf/mcp_config.json`:

```json
{
  "mcpServers": {
    "pilot": { "serverUrl": "https://mcp.pilotplans.com/mcp" }
  }
}
```

### OpenAI Codex CLI

```bash
codex mcp add pilot --url https://mcp.pilotplans.com/mcp
```

Or add this to `~/.codex/config.toml`:

```toml
[mcp_servers.pilot]
url = "https://mcp.pilotplans.com/mcp"
```

### Gemini CLI

```bash
gemini mcp add --transport http pilot https://mcp.pilotplans.com/mcp
```

### Any other MCP client

Clients that support remote servers over Streamable HTTP take the URL directly:

```json
{
  "mcpServers": {
    "pilot": { "type": "http", "url": "https://mcp.pilotplans.com/mcp" }
  }
}
```

Clients that only launch local (stdio) servers can bridge with [`mcp-remote`](https://www.npmjs.com/package/mcp-remote):

```json
{
  "mcpServers": {
    "pilot": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.pilotplans.com/mcp"]
    }
  }
}
```

## What to ask

Once the server is connected, ask in plain language. The assistant picks the tools.

- "Find 4-star hotels near the old town in Lisbon for three nights next month, under $250 a night."
- "Hotels within 2 km of Shibuya Station for 2 adults and a 6-year-old. Which rooms are refundable?"
- "Boutique hotels in Roma Norte, Mexico City, with a guest rating of 9 or higher."
- "Compare breakfast-included rates at the top three."

In clients that render MCP Apps, including Claude and ChatGPT, hotel search results appear as photo cards with a map.

## Tools

All three tools are read-only (`readOnlyHint: true`) and never change state, so clients can run them without asking for confirmation. The live `tools/list` response is the source of truth for schemas.

A typical run: `search_hotels` for the place and dates, `get_hotel_details` for the hotels worth a closer look, `get_room_rates_for_hotel` to price rooms, then the hotel's `url` so the user can book on Pilot.

### search_hotels

Search bookable hotels by location and dates. Returns hotels with prices, star rating, guest rating and review count, photos, address, coordinates, a `url` to the hotel on Pilot, and an opaque `id` for the other two tools. Page with `offset`, using `next_offset` from the previous result.

| Parameter           | Type      | Required          | Description                                                       |
| ------------------- | --------- | ----------------- | ----------------------------------------------------------------- |
| `location`          | string    | yes               | City, neighbourhood, address or place name                        |
| `check_in`          | string    | yes               | Check-in date, `YYYY-MM-DD`                                       |
| `check_out`         | string    | yes               | Check-out date, `YYYY-MM-DD`                                      |
| `guests`            | integer   | no, default 2     | Number of adults                                                  |
| `rooms`             | integer   | no, default 1     | Rooms required                                                    |
| `children_ages`     | integer[] | no                | Ages (0–17) of children sharing the room                          |
| `currency`          | string    | no, default `USD` | ISO 4217 currency for prices                                      |
| `guest_nationality` | string    | no, default `US`  | ISO 3166-1 alpha-2 country of the guest; affects rate eligibility |
| `limit`             | integer   | no, default 20    | Hotels to return, 1–50                                            |
| `offset`            | integer   | no, default 0     | Hotels to skip, for paging                                        |
| `radius_meters`     | integer   | no                | Only hotels within this radius of the location (minimum 1000)     |
| `min_star_rating`   | number    | no                | Minimum star rating, 1–5                                          |
| `min_guest_rating`  | number    | no                | Minimum guest review score, 1–10                                  |
| `amenity_ids`       | integer[] | no                | Supplier facility ids the hotel must offer                        |
| `property_type_ids` | integer[] | no                | Supplier property-type ids to restrict to                         |
| `ai_search`         | string    | no                | Free-text preference, e.g. "boutique hotel near the old town"     |

### get_hotel_details

Static details for one hotel: description, amenities, photos and address.

| Parameter  | Type   | Required | Description                     |
| ---------- | ------ | -------- | ------------------------------- |
| `hotel_id` | string | yes      | Hotel `id` from `search_hotels` |

### get_room_rates_for_hotel

Bookable room offers for one hotel, each with price, board type (for example room only or breakfast included) and refundability.

| Parameter   | Type    | Required | Description                      |
| ----------- | ------- | -------- | -------------------------------- |
| `hotel_id`  | string  | yes      | Hotel `id` from `search_hotels`  |
| `check_in`  | string  | no       | Override check-in, `YYYY-MM-DD`  |
| `check_out` | string  | no       | Override check-out, `YYYY-MM-DD` |
| `guests`    | integer | no       | Number of guests                 |

## Use it from your own agent

### Claude API

The Messages API connects to remote MCP servers for you. Pass the server in `mcp_servers` and reference it from an `mcp_toolset`:

```bash
curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: mcp-client-2025-11-20" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-opus-5",
    "max_tokens": 16000,
    "mcp_servers": [
      { "type": "url", "url": "https://mcp.pilotplans.com/mcp", "name": "pilot" }
    ],
    "tools": [{ "type": "mcp_toolset", "mcp_server_name": "pilot" }],
    "messages": [
      { "role": "user", "content": "Find 4-star hotels in Lisbon for three nights next month under $250 a night." }
    ]
  }'
```

```python
import anthropic

client = anthropic.Anthropic()
response = client.beta.messages.create(
    model="claude-opus-5",
    max_tokens=16000,
    betas=["mcp-client-2025-11-20"],
    mcp_servers=[{"type": "url", "url": "https://mcp.pilotplans.com/mcp", "name": "pilot"}],
    tools=[{"type": "mcp_toolset", "mcp_server_name": "pilot"}],
    messages=[{"role": "user", "content": "Find 4-star hotels in Lisbon for three nights next month under $250 a night."}],
)
```

### OpenAI Responses API

```python
from openai import OpenAI

client = OpenAI()
response = client.responses.create(
    model="gpt-5",
    tools=[{
        "type": "mcp",
        "server_label": "pilot",
        "server_url": "https://mcp.pilotplans.com/mcp",
        "require_approval": "never",
    }],
    input="Find 4-star hotels in Lisbon for three nights next month under $250 a night.",
)
print(response.output_text)
```

### Raw JSON-RPC

The server is stateless and issues no session id, so you can call it directly to test. It answers with a single `text/event-stream` message.

```bash
curl -s https://mcp.pilotplans.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
```

```bash
curl -s https://mcp.pilotplans.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"search_hotels","arguments":{"location":"Lisbon","check_in":"2027-03-12","check_out":"2027-03-15","limit":5}}}'
```

Use future dates. MCP SDK clients send `initialize` first, which also works.

## Access and booking

- **Free and open.** No API key, account, OAuth flow or rate agreement. Connect and call in one step.
- **Read-only.** The tools search and price hotels. They cannot hold, reserve or pay for a room, so nothing a client does here commits a user to a purchase.
- **Booking happens on Pilot.** Every hotel result carries a `url` to that hotel on pilotplans.com with the dates and guests filled in. Send the user there to book.
- **Live data.** Rates and availability come from Pilot's hotel suppliers when the tool is called and can change until a room is booked.

## FAQ

### Is the Pilot MCP server free?

Yes. The server is free to use and needs no account, API key or payment details.

### Do I need an API key or OAuth to connect?

No. The server is public and unauthenticated. Add `https://mcp.pilotplans.com/mcp` to your client and choose no authentication if it asks.

### Can it book hotels?

Not directly. The tools find hotels and compare live room rates, and each result links to the hotel on Pilot, where the user completes the booking.

### Which AI assistants and clients does it work with?

Any MCP client that supports remote servers over Streamable HTTP, including Claude, Claude Code, ChatGPT, Cursor, VS Code with GitHub Copilot, Windsurf, OpenAI Codex CLI and Gemini CLI. Clients limited to local stdio servers can connect through `mcp-remote`.

### Where do the prices and hotel data come from?

From Pilot's hotel suppliers, fetched live when a tool runs. Content includes descriptions, amenities, photos, star ratings and guest review scores.

### Why does opening /mcp in a browser show an error?

`/mcp` is a JSON-RPC endpoint for MCP clients. It expects a POST, so a browser visit returns `406 Not Acceptable`. This page is the human-readable guide.

## For agents and crawlers

- [`/llms.txt`](https://mcp.pilotplans.com/llms.txt) and [`/llms-full.txt`](https://mcp.pilotplans.com/llms-full.txt): LLM-oriented overview and full text
- [`/index.md`](https://mcp.pilotplans.com/index.md): this page as Markdown, also returned at `/` for `Accept: text/markdown`
- [`/.well-known/mcp/server-card.json`](https://mcp.pilotplans.com/.well-known/mcp/server-card.json): MCP Server Card (also at `/mcp/server-card`)
- [`/.well-known/ai-catalog.json`](https://mcp.pilotplans.com/.well-known/ai-catalog.json): AI Catalog (ARD) manifest
- [`/.well-known/api-catalog`](https://mcp.pilotplans.com/.well-known/api-catalog): RFC 9727 API catalog
- [`/.well-known/agent-skills/index.json`](https://mcp.pilotplans.com/.well-known/agent-skills/index.json): Agent Skills index, with a skill for installing and using this server
- [`/auth.md`](https://mcp.pilotplans.com/auth.md): authentication notes for agents (none required)
- WebMCP: the HTML page registers the same three tools with the browser's model context, so in-browser agents can search without installing anything.

## About Pilot

[Pilot](https://www.pilotplans.com/) is a free, AI-powered collaborative trip booking and planning app for individuals, couples, families and groups. Plan itineraries together, book vetted hotels with member-only rates, and keep bookings, files, checklists and maps in one shared workspace, on web, iOS and Android. Made in Canada by HappyHour Services Inc. More for AI assistants: [pilotplans.com/for-ai-assistants](https://www.pilotplans.com/for-ai-assistants).
