Koskamo

Pilot Hotel Search MCP

A free, read-only remote MCP server that enables AI agents to search for hotels by location and dates, retrieve detailed hotel information including amenities and photos, and check real-time room rates and refundability policies without requiring authentication.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Pilot Hotel Search MCP logo, by PilotVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Pilot
MCP endpoint (Streamable HTTP)
https://mcp.pilotplans.com/mcp
Vendor documentation

What you can do with it

  • Search for bookable hotels by city, neighborhood, or landmark with specific dates and guest counts
  • Retrieve static details for a specific hotel including description, amenities, photos, and address
  • Check bookable room offers for a hotel including price, board type, and refundability

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
pilot-hotels 1.0.0
MCP protocol
2025-06-18
Tools
3 advertised
Resources
1 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Tools

3 advertised

search_hotels — Search hotels
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Search bookable hotels by location and dates. Returns hotels with nightly prices, photos, coordinates, a `url` linking to the hotel on Pilot, and an opaque id to pass to get_hotel_details and get_rates. Booking is not available through this connector, so link the user to a hotel's `url` when they want to book. Narrow with the rating, amenity and radius filters rather than requesting a large limit, and page with offset using next_offset from the previous result.

search_hotels input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "location",
    "check_in",
    "check_out"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "default": 20,
      "maximum": 50,
      "minimum": 1,
      "description": "Maximum hotels to return"
    },
    "rooms": {
      "type": "integer",
      "default": 1,
      "maximum": 9007199254740991,
      "minimum": 1,
      "description": "Rooms required"
    },
    "guests": {
      "type": "integer",
      "default": 2,
      "maximum": 9007199254740991,
      "minimum": 1,
      "description": "Number of adults"
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Hotels to skip, for paging"
    },
    "check_in": {
      "type": "string",
      "description": "Check-in date, YYYY-MM-DD"
    },
    "currency": {
      "type": "string",
      "default": "USD",
      "maxLength": 3,
      "minLength": 3,
      "description": "ISO-4217 currency for returned prices"
    },
    "location": {
      "type": "string",
      "description": "City, address, or place name"
    },
    "ai_search": {
      "type": "string",
      "description": "Free-text preference, e.g. 'boutique hotel near the old town'. Ignored when it matches no inventory."
    },
    "check_out": {
      "type": "string",
      "description": "Check-out date, YYYY-MM-DD"
    },
    "amenity_ids": {
      "type": "array",
      "items": {
        "type": "integer",
        "maximum": 9007199254740991,
        "minimum": -9007199254740991
      },
      "description": "Supplier facility ids the hotel must offer"
    },
    "children_ages": {
      "type": "array",
      "items": {
        "type": "integer",
        "maximum": 17,
        "minimum": 0
      },
      "description": "Ages of children sharing the room"
    },
    "radius_meters": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 1000,
      "description": "Restrict to this radius around the location"
    },
    "min_star_rating": {
      "type": "number",
      "maximum": 5,
      "minimum": 1,
      "description": "Only hotels at or above this star rating"
    },
    "min_guest_rating": {
      "type": "number",
      "maximum": 10,
      "minimum": 1,
      "description": "Only hotels at or above this guest review score, out of 10"
    },
    "guest_nationality": {
      "type": "string",
      "default": "US",
      "maxLength": 2,
      "minLength": 2,
      "description": "ISO-2 country of the guest; affects rate eligibility"
    },
    "property_type_ids": {
      "type": "array",
      "items": {
        "type": "integer",
        "maximum": 9007199254740991,
        "minimum": -9007199254740991
      },
      "description": "Supplier hotel-type ids to restrict to"
    }
  }
}
search_hotels annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_hotel_details — Get hotel details
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Get static details (description, amenities, photos, address) for a hotel id returned by search_hotels.

get_hotel_details input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "hotel_id"
  ],
  "properties": {
    "hotel_id": {
      "type": "string",
      "description": "Hotel id from search_hotels"
    }
  }
}
get_hotel_details annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_room_rates_for_hotel — Get room rates
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Get room rates for a hotel id from search_hotels. Each offer includes a price, board type and refundability. Booking is not available through this connector; send the user to Pilot to book.

get_room_rates_for_hotel input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "hotel_id"
  ],
  "properties": {
    "guests": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 1,
      "description": "Number of guests"
    },
    "check_in": {
      "type": "string",
      "description": "Override check-in, YYYY-MM-DD"
    },
    "hotel_id": {
      "type": "string",
      "description": "Hotel id from search_hotels"
    },
    "check_out": {
      "type": "string",
      "description": "Override check-out, YYYY-MM-DD"
    }
  }
}
get_room_rates_for_hotel annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

hotel-results — Hotel results

Advertised by the server during the last successful anonymous check.

Photo cards and a map for search_hotels results

hotel-results URI
ui://pilot/hotel-results.html

MIME type: text/html;profile=mcp-app

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
725 ms
95th percentile latency
725 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 725 ms · metadata changed · 3 tool(s), 1 resource(s), 0 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http pilot-hotel-search-mcp https://mcp.pilotplans.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add pilot-hotel-search-mcp --url https://mcp.pilotplans.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable pilot-hotel-search-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "pilot-hotel-search-mcp": {
      "url": "https://mcp.pilotplans.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "pilot-hotel-search-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.pilotplans.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start pilot-hotel-search-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "pilot-hotel-search-mcp": {
      "type": "http",
      "url": "https://mcp.pilotplans.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http pilot-hotel-search-mcp https://mcp.pilotplans.com/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "pilot-hotel-search-mcp": {
      "url": "https://mcp.pilotplans.com/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "pilot-hotel-search-mcp": {
      "serverUrl": "https://mcp.pilotplans.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Pilot Hotel Search MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Pilot Hotel Search MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing