# 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). --- # Pilot hotel search Pilot runs a free, public, read-only MCP server for live hotel search: - Endpoint: `https://mcp.pilotplans.com/mcp` (Streamable HTTP, JSON-RPC 2.0) - Authentication: none. No API key, account or OAuth. - Tools: `search_hotels`, `get_hotel_details`, `get_room_rates_for_hotel` - Docs: https://mcp.pilotplans.com/index.md ## 1. Get the tools If your client can add remote MCP servers, add the endpoint once: | Client | How | | --------------------- | ---------------------------------------------------------------------------------------------------------------- | | Claude Code | `claude mcp add --transport http pilot https://mcp.pilotplans.com/mcp` | | Claude (web, desktop) | Customize → Connectors → Add custom connector, paste the URL | | ChatGPT | Developer mode (Settings → Security and login), create a connector, No authentication | | Cursor | `~/.cursor/mcp.json`: `{"mcpServers":{"pilot":{"url":"https://mcp.pilotplans.com/mcp"}}}` | | VS Code | `code --add-mcp '{"name":"pilot","type":"http","url":"https://mcp.pilotplans.com/mcp"}'` | | Windsurf | `~/.codeium/windsurf/mcp_config.json`: `{"mcpServers":{"pilot":{"serverUrl":"https://mcp.pilotplans.com/mcp"}}}` | | Codex CLI | `codex mcp add pilot --url https://mcp.pilotplans.com/mcp` | | Gemini CLI | `gemini mcp add --transport http pilot https://mcp.pilotplans.com/mcp` | | stdio-only clients | `npx -y mcp-remote https://mcp.pilotplans.com/mcp` as the server command | If you cannot install servers but can make HTTP requests, call the endpoint directly. It is stateless, so no `initialize` or session id is needed, and it answers with one `text/event-stream` message whose `data:` line holds the JSON-RPC response: ```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/call","params":{"name":"search_hotels","arguments":{"location":"Lisbon","check_in":"2027-03-12","check_out":"2027-03-15","limit":5}}}' ``` The full result is in `result.structuredContent` (`hotels`, `currency`, `has_more`, `next_offset`); `result.content[0].text` carries a compact JSON copy without photos. ## 2. Search well 1. **Pin down place, dates and party first.** `search_hotels` requires `location`, `check_in` and `check_out` (`YYYY-MM-DD`, check-out after check-in, both in the future). Resolve relative dates ("next weekend") against today before calling. Default party is 2 adults in 1 room; pass `guests`, `rooms` and `children_ages` when the user says otherwise. 2. **Filter instead of over-fetching.** Use `min_star_rating`, `min_guest_rating` (out of 10), `radius_meters` (at least 1000) and `ai_search` for soft preferences like "quiet, near the old town". Keep `limit` at 20 or below; when `has_more` is true, page with `offset` set to the previous `next_offset`. 3. **Use the user's currency.** Set `currency` (ISO 4217). Set `guest_nationality` (ISO 3166-1 alpha-2) when you know it; it changes which rates are available. 4. **Go deeper only on the shortlist.** Call `get_hotel_details` for description, amenities and photos, and `get_room_rates_for_hotel` for room offers with price, board type (room only, breakfast included and so on) and refundability. Both take the hotel `id` returned by `search_hotels`; it is opaque and already encodes the dates and party, so pass it through unchanged. ## 3. Present results - Lead with what the user asked for: price for their dates, location, rating, refundability. - Say which currency prices are in, and that rates are live and can change until booked. - Link each hotel's `url`. It opens the hotel on Pilot with the dates and guests filled in. ## 4. Booking The tools are read-only. They cannot hold, reserve or pay for a room. Never tell the user a room is booked or held. When they want to book, send them to the hotel's `url` on pilotplans.com. ## Troubleshooting - `406 Not Acceptable` on `GET /mcp`: expected. The endpoint takes `POST` from MCP clients; include `Accept: application/json, text/event-stream`. - Empty results: widen `radius_meters`, drop rating filters, or try a broader `location` (city rather than street). - A tool error mentioning dates: check the format and that the dates are in the future.