Fortrip
OfficialFortrip MCP is a local stdio server for planning hotel trips, searching hotels, checking live rates, retrieving hotel details, and creating booking payment links via Fortrip.
Use
get_planning_guidefor flexible dates, budgets, split stays, multi-destination trips, and hotel comparison guidance; no login required.Use
search_hotelsto find hotels by name/brand/city query, city code, or coordinates for a date range, with indicative nightly prices and filters for stars, price, facilities, sorting, pagination, and currency.Use
get_hotelto get static hotel details: address, contact, description, policies, check-in/out times, facilities, photos, and optional catalogue rooms.Use
get_ratesto get live room and rate plans for up to 15 hotels and 1–15 nights, with rooms, adults, children’s ages, meal-plan and free-cancellation filters, bookable-only options, and CNY/USD pricing.Use
create_bookingto create or resume a selected booking, collect guest and contact details, show accepted terms, and return a private Fortrip/Stripe payment link; it does not charge cards or support cancellation/modification.
Allows creating hotel bookings that return a private payment link; the checkout page continues to Stripe for payment, with no card charged until the user pays.
Fortrip MCP
An open-source, locally runnable MCP server for hotel search, live room rates, hotel details and booking payment links through Fortrip. It uses stdio and works with MCP clients that launch local commands.
Quick start
Requires Node.js 22 or newer, npm, and a Fortrip account for hotel API calls.
git clone https://github.com/FortripEngineering/fortrip-mcp.git
cd fortrip-mcp
npm ci
npm run build
npx -y fortrip loginThe login command belongs to the separately maintained
Fortrip CLI.
Complete its browser login. This server reads the resulting credentials; it
does not modify them. You can instead provide a CLI token with FORTRIP_TOKEN.
Configure your MCP client using the absolute path to this checkout:
{
"mcpServers": {
"fortrip-local": {
"command": "node",
"args": ["/absolute/path/to/fortrip-mcp/dist/index.js"]
}
}
}Use this entry in Claude Desktop's MCP configuration or Cursor's .cursor/mcp.json.
If your desktop app cannot find node, use its absolute executable path.
The MCP process waits for JSON-RPC on stdin; running npm start in a terminal
alone does not open a chat interface.
For Codex, add this to ~/.codex/config.toml:
[mcp_servers.fortrip-local]
command = "node"
args = ["/absolute/path/to/fortrip-mcp/dist/index.js"]For Claude Code:
claude mcp add --transport stdio fortrip-local -- node /absolute/path/to/fortrip-mcp/dist/index.jsThis repository is runnable from source. An npm release of fortrip-mcp
has not been published; use the checkout instructions above.
Related MCP server: Travel Planner MCP Server
Tools
Tool | What it does |
| How to plan flexible dates, budgets, split stays and hotel comparisons; no login required. |
| Search by city/name/brand, city code or coordinates, with indicative nightly prices. |
| Address, policies, facilities, photos and optional catalogue rooms. |
| Live rooms and rate plans for up to 15 hotels and 1–15 nights, with meal and cancellation terms. |
| Create or resume a selected booking and return a private payment link with accepted terms. |
Example prompts:
“Find a hotel in Tokyo for November 10–12, 2026, for two adults, then compare live rates.”
“Compare three hotels near this location with breakfast and free cancellation.”
“Use the room I selected to prepare a payment link, and show me all accepted terms first.”
Search prices are indicative; availability and quotes come from get_rates.
Rooms and adults per room are separate inputs. Provide each child's age.
Rates default to CNY and also support USD. get_rates defaults to five rooms
per hotel and can take about 15 seconds.
create_booking creates an order but does not charge a card. It returns a
Fortrip page that shows booking terms and continues to Stripe. The assistant
must show amount, currency, meals, cancellation, confirmation and any fees,
then obtain confirmation before sharing the link. Links are private; do not
post them in issues or logs. Cancellation and modification are not supported
by this server. API access needs a Fortrip account, and hotel purchases have
the prices and conditions shown at checkout.
Authentication and configuration
Variable | Purpose |
| Optional CLI access token ( |
| Optional configuration root; otherwise |
| Optional API origin; defaults to |
Saved credentials are read from $XDG_CONFIG_HOME/fortrip/credentials.json
(normally ~/.config/fortrip/credentials.json) and selected by API origin.
They are re-read on each call, so logging in again does not require a restart.
Expired or missing credentials produce a tool error with login instructions.
Do not commit tokens. If you set an explicit token, it will be sent to the
configured API origin; only configure an origin you trust.
The server sends the tool's hotel/traveller inputs and bearer token to Fortrip over HTTPS. It stores no bookings or traveller data locally. Fortrip performs authentication, pricing, booking validation and payment handling. Tool results are returned to your MCP client and its model provider according to that client's settings. Logs and errors do not intentionally print credentials.
Relationship to the hosted MCP and CLI
This repository has its own code, tests and release cycle. It implements MCP over local stdio and calls Fortrip's existing authenticated hotel HTTP APIs. It is not a second booking backend and does not run the Fortrip website.
The hosted MCP at https://fortrip.ai/api/mcp continues to use Clerk OAuth.
Use it directly in clients that support remote OAuth MCP; see the
hosted MCP setup guide for configuration examples. CLI tokens cannot
be used as credentials for that hosted MCP endpoint.
This repo: runnable local MCP server, intended for Glama's Server directory.
Hosted MCP: existing Glama Connector.
Fortrip CLI: separately maintained command-line interface and login utility.
Configure either local or hosted MCP in a given client to avoid duplicate tool listings. Both access the same Fortrip service; available account data depends on the account used to log in.
Docker
docker build -t fortrip-mcp .
docker run --rm -i -e FORTRIP_TOKEN fortrip-mcpSet FORTRIP_TOKEN in the launching environment first. Do not put it in the
Dockerfile or image. The image runs as an unprivileged user; no port is needed.
Without credentials, initialization, tool discovery and the planning guide
still work, while hotel API calls explain how to log in.
Development and support
npm ci
npm run build
npm test
npm pack --dry-runThe server is written in TypeScript with strict type checking.
Run npm run typecheck to build the server and strictly check the TypeScript tests.
npm test compiles the tests into .test-build/ and runs them against dist/.
Both output directories are ignored by Git.
Tests exercise the actual stdio process, tool routing, schema validation,
credential scoping, API failures and payment-link handling using mock API
responses. They do not make live bookings. CI runs on Node.js 22 and 24.
The Dockerfile is provided for directory builds and local container use.
Tool schemas follow the Fortrip HTTP API contract. When that contract changes, update schemas, descriptions and tests here together. Business rules and supplier integrations remain on the backend.
Report bugs and request help through GitHub Issues. Never include access tokens, private payment URLs, passport details or other traveller information in a public issue.
License
MIT, copyright 2026 FortripEngineering. The planning guide is adapted from the MIT-licensed Fortrip CLI. This license covers the repository's code and documentation; using the hosted service is subject to its own terms.
Available Tools
5 toolscreate_bookingCreate booking payment linkAIdempotent
Create or resume a booking for a user-selected rate from get_rates. Provide guests and contact details. Returns amount, currency, accepted terms and a private paymentUrl. Show terms and ask for confirmation before sharing paymentUrl exactly. Nothing is charged until the user pays on Fortrip/Stripe. Same user and stay resumes the same order; paid stays return 409. Does not cancel or modify bookings.
| Name | Required | Description | Default |
|---|---|---|---|
| rooms | Yes | ||
| adults | Yes | Adults per room | |
| guests | Yes | At least one guest per room; Latin letters as on passport; roomNo is 1-based | |
| roomId | Yes | roomId from get_rates | |
| checkIn | Yes | Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn. | |
| hotelId | Yes | ||
| checkOut | Yes | Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn. | |
| contactName | Yes | ||
| childrenAges | No | Age in years of each child, 0–17; omit or use [] when no children are travelling. | |
| contactEmail | No | ||
| contactPhone | Yes | ||
| ratePlanCode | Yes | ratePlanCode from get_rates | |
| specialRequests | No | English only; not guaranteed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavioral context beyond the annotations: return payload (amount, currency, accepted terms, private paymentUrl), the no-charge-until-payment guarantee, idempotent resume semantics keyed on same user and stay, and the 409 on paid stays. Annotations cover the safety profile (idempotentHint, destructiveHint=false) and the description layers on the operational details an agent needs at call time.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then packed with distinct behavioral facts, each sentence carrying its own weight. No filler, though the run-on delivery could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-param mutation with no output schema, the description proactively discloses the return shape and the key failure/idempotency behavior. Parameter-level detail remains thin in places, but nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 62%, and the description adds only a thin layer ('Provide guests and contact details') over parameters the schema already documents, such as ratePlanCode, roomId, checkIn/checkOut and the guests array. It does not clarify the remaining undocumented params (hotelId, contactName, contactPhone, rooms, adults) beyond what the schema structure implies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create or resume a booking') and ties it to the sibling that produces its inputs ('from get_rates'). The closing 'Does not cancel or modify bookings' explicitly fences it off from update/cancel operations, so an agent can distinguish it from siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Establishes the prerequisite chain clearly (rate comes from get_rates) and gives procedural guidance ('Show terms and ask for confirmation before sharing paymentUrl'). It does not name a competing alternative tool for the cancel/modify case, so routing guidance is inferred rather than enumerated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hotelGet hotel detailsARead-only
Static catalogue facts for hotelId: address, contact, description, policies, check-in/out times, facilities and photos. includeRooms adds catalogue rooms. No live prices or availability.
| Name | Required | Description | Default |
|---|---|---|---|
| hotelId | Yes | ||
| includeRooms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so safety is covered. The description adds genuinely useful context beyond them: the data is 'static catalogue' (i.e. not live/possibly stale) and that prices and availability are absent, plus that includeRooms expands the payload. No auth or error behavior is mentioned, but that is a minor gap given annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: contents first, the one optional parameter second, the exclusion last. Front-loaded and every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly assumes the burden of describing the return payload and does so field-by-field. It does not cover shape details such as how photos/facilities are returned (list vs. nested, any paging) or behavior for an unknown hotelId, leaving a small completeness gap for a zero-annotation-return tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the semantics. It does describe includeRooms precisely ('adds catalogue rooms') and ties hotelId to the returned fact set, which is more than the schema alone conveys; only the accepted format/range of hotelId is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb-less but unambiguous retrieval: static catalogue facts for a given hotelId, and enumerates exactly what comes back (address, contact, description, policies, check-in/out, facilities, photos). The clause 'No live prices or availability' separates it from get_rates, and the resource name separates it from search_hotels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied context is clear — call this when you already have a hotelId and need catalogue detail rather than pricing or discovery, and the closing sentence steers away from rate/availability tools. It never names get_rates or search_hotels explicitly, so the routing is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_planning_guideGet hotel planning guideARead-only
Read before planning flexible dates, budget trips, split stays, multiple destinations or best-hotel comparisons. Explains what to ask, live-rate evidence and how to rank options.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds real value by disclosing the content shape (what to ask, evidence, ranking method) and that it should be consumed before planning, which tells the agent this is static advisory content rather than a live data call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. The usage trigger is front-loaded in the first sentence and the content summary follows, which is the correct ordering for a read-me-first tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, annotation-covered guidance tool with no output schema, the description tells the agent when to call it and what it contains — sufficient to invoke correctly. A small gap remains: it never explicitly says the result is text guidance (vs. structured hotel data), which an agent could infer but must guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the schema is trivially complete with additionalProperties=false. Baseline 4 applies since no parameter explanation is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource and its advisory role ('planning guide') and enumerates the topics it explains (what to ask, live-rate evidence, how to rank options). It is clear what the tool delivers, though the phrasing 'read before...' describes timing more than the artifact itself, leaving the title to carry the 'this is a guide' framing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger scenarios: flexible dates, budget trips, split stays, multiple destinations, best-hotel comparisons. It implies the guide precedes the sibling tools (search_hotels, get_rates) but never names an alternative or states an explicit exclusion, so routing is inferred rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ratesGet live ratesARead-only
Live rooms and rate plans for 1–15 hotelIds and a stay of 1–15 nights. Specify rooms and adults per room; provide every child age. Prices in CNY (default) or USD. Returns roomId/ratePlanCode for create_booking and meal/cancellation terms. Defaults to 5 cheapest rooms per hotel. Takes about 15 seconds; query a few hotels per call. Use search_hotels first to find IDs, get_hotel for static policies/photos, and get_planning_guide for flexible trips. Use this tool to verify availability and quote live prices before booking. Requires Fortrip login; 429 errors include retry guidance.
| Name | Required | Description | Default |
|---|---|---|---|
| rooms | Yes | Number of rooms requested for this stay, not number of guests. | |
| adults | Yes | Adults per room | |
| checkIn | Yes | Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn. | |
| checkOut | Yes | Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn. | |
| currency | No | Currency for displayed prices: CNY or USD. Booking charges the currency returned by create_booking. | CNY |
| hotelIds | Yes | Catalogue hotel IDs returned by search_hotels; compare up to 15 hotels in one call. | |
| boardCodes | No | Keep any of these meal plans: RO=room only, BB=breakfast, HB/HBLD=breakfast and dinner, FB=breakfast/lunch/dinner, BL=lunch, BD=dinner, HBBL=breakfast and lunch, AI=all inclusive. Omit for all meal plans; use returned terms for exact inclusions. | |
| nationality | No | Guest nationality as an uppercase ISO 3166-1 alpha-2 country code, e.g. CN or US; omit when unknown. | |
| bookableOnly | No | True keeps only rates with bookable inventory on every night. False also includes rates with unavailable nights; do not present those as bookable. | |
| childrenAges | No | Age in years of each child, 0–17; omit or use [] when no children are travelling. | |
| freeCancellation | No | True keeps rates that can still be cancelled free of charge now. False or omitted applies no cancellation filter; it does not mean non-refundable only. Read each returned deadline and penalty. | |
| maxRoomsPerHotel | No | Maximum room types returned per hotel, cheapest first after filtering; default 5. This limits response size, not the rooms being booked. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, it discloses latency (~15 seconds), an authentication requirement (Fortrip login), rate-limit behavior (429s include retry guidance), a default response-shaping rule (5 cheapest rooms per hotel), and the currency actually charged by the downstream booking call. These are exactly the behavioral facts an agent needs to plan around.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with scope and return values, then usage sequencing, then operational caveats. Every sentence carries information, though it is denser and longer than strictly necessary for a schema that already documents the parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description partially compensates by naming what comes back (roomId/ratePlanCode for create_booking, meal and cancellation terms). Combined with full schema coverage, auth, latency and rate-limit disclosure, an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter is already documented in the schema, including enums and defaults. The description restates counts and currency defaults (1–15 hotelIds, 1–15 nights, CNY default) but adds no format or syntax detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource and scope: live rooms and rate plans for 1–15 hotel IDs over a 1–15 night stay, with pricing currency and return identifiers named. It is clearly separable from search_hotels, get_hotel, get_planning_guide and create_booking without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly sequences the workflow: use search_hotels first to find IDs, get_hotel for static policies/photos, get_planning_guide for flexible trips, and this tool to verify availability and quote prices before booking. It also gives a practical usage constraint ('query a few hotels per call').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_hotelsSearch hotelsARead-only
Find hotels by query (name, brand or city), cityCode or near coordinates for checkIn/checkOut. Prices are indicative nightly floors in CNY (default) or USD: quote get_rates, not search prices. Facilities must match catalogue names. Narrow searches refused with 422. Use get_planning_guide for complex trips.
| Name | Required | Description | Default |
|---|---|---|---|
| near | No | ||
| page | No | ||
| query | No | ||
| sortBy | No | recommended | |
| checkIn | Yes | Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn. | |
| starMax | No | ||
| starMin | No | ||
| checkOut | Yes | Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn. | |
| cityCode | No | ||
| currency | No | Currency for displayed prices: CNY or USD. Booking charges the currency returned by create_booking. | CNY |
| pageSize | No | ||
| priceMax | No | ||
| priceMin | No | ||
| facilities | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, open-world), so the description earns credit for adding semantics: search prices are indicative nightly floors, not bookable rates, and facilities must match catalogue names exactly. It stops short of describing result shape or pagination, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense, front-loaded, and every sentence carries a distinct payload: search modes, price caveat, facility constraint, error behavior, alternative tool. No filler and the most important routing information (search modes and the get_rates caveat) comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter tool with a nested near object, no output schema, and low schema coverage, the description is helpful on the primary path but silent on filters (price, star, sort) and pagination behavior. With no output schema it could also hint at what a result set contains beyond indicative prices.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 21%, so the description must carry the load and does add meaning for query, cityCode, near, facilities, and currency (CNY default vs USD). However, roughly half the parameters (priceMin/priceMax, starMin/starMax, sortBy, page/pageSize) are unexplained in both schema and description, so the compensation is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Find) and resource (hotels) plus the three ways to scope a search: query (name/brand/city), cityCode, or near coordinates. It implicitly separates itself from get_hotel (single hotel) and get_rates (pricing), so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use get_rates to quote prices rather than trusting search prices, and use get_planning_guide for complex trips. It also states the failure condition ('Narrow searches refused with 422'), giving a when-not signal rather than leaving the agent to infer it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.1- Changed
create_booking3 fields changed- added
Input schema / properties / checkIn / descriptionAdded value: +"Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn." - added
Input schema / properties / checkOut / descriptionAdded value: +"Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn." - added
Input schema / properties / childrenAges / descriptionAdded value: +"Age in years of each child, 0–17; omit or use [] when no children are travelling."
- Changed
get_rates11 fields changed- added
Input schema / properties / boardCodes / descriptionAdded value: +"Keep any of these meal plans: RO=room only, BB=breakfast, HB/HBLD=breakfast and dinner, FB=breakfast/lunch/dinner, BL=lunch, BD=dinner, HBBL=breakfast and lunch, AI=all inclusive. Omit for all meal plans; use returned terms for exact inclusions." - added
Input schema / properties / bookableOnly / descriptionAdded value: +"True keeps only rates with bookable inventory on every night. False also includes rates with unavailable nights; do not present those as bookable." - added
Input schema / properties / checkIn / descriptionAdded value: +"Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn." - added
Input schema / properties / checkOut / descriptionAdded value: +"Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn." - added
Input schema / properties / childrenAges / descriptionAdded value: +"Age in years of each child, 0–17; omit or use [] when no children are travelling." - added
Input schema / properties / currency / descriptionAdded value: +"Currency for displayed prices: CNY or USD. Booking charges the currency returned by create_booking." - added
Input schema / properties / freeCancellation / descriptionAdded value: +"True keeps rates that can still be cancelled free of charge now. False or omitted applies no cancellation filter; it does not mean non-refundable only. Read each returned deadline and penalty." - added
Input schema / properties / hotelIds / descriptionAdded value: +"Catalogue hotel IDs returned by search_hotels; compare up to 15 hotels in one call." - added
Input schema / properties / maxRoomsPerHotel / descriptionAdded value: +"Maximum room types returned per hotel, cheapest first after filtering; default 5. This limits response size, not the rooms being booked." - added
Input schema / properties / nationality / descriptionAdded value: +"Guest nationality as an uppercase ISO 3166-1 alpha-2 country code, e.g. CN or US; omit when unknown." - added
Input schema / properties / rooms / descriptionAdded value: +"Number of rooms requested for this stay, not number of guests."
- Changed
search_hotels3 fields changed- added
Input schema / properties / checkIn / descriptionAdded value: +"Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn." - added
Input schema / properties / checkOut / descriptionAdded value: +"Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn." - added
Input schema / properties / currency / descriptionAdded value: +"Currency for displayed prices: CNY or USD. Booking charges the currency returned by create_booking."
5 tool updates
v0.1.0- First observed
create_booking - First observed
get_hotel - First observed
get_planning_guide - First observed
get_rates - First observed
search_hotels
TDQS
Scored across 5 tools
Each tool targets a distinct phase (planning guidance, hotel discovery, live rates, booking, static facts), and descriptions explicitly steer usage (e.g. 'quote get_rates, not search prices'). There is mild overlap between search_hotels, get_hotel and get_rates since all three surface hotel data, but the static/live/discovery boundaries are clearly drawn.
All five tools follow a clean verb_noun snake_case pattern (get_planning_guide, search_hotels, get_rates, create_booking, get_hotel). No mixed conventions or vague standalone verbs.
Five tools is a lean but sensible surface for a search-and-book flow, and each earns its place. It sits near the thin end for a booking domain, but nothing is redundant.
The search → rates → book path is covered, plus static facts and a planning guide. However there is no way to cancel, modify, or retrieve existing bookings/orders, and create_booking itself states it does not cancel or modify, leaving agents at a dead end for post-booking lifecycle operations.
Maintenance
Related MCP Connectors
Official MCP server for MAQAMI, a hotel and flight booking platform with 3M+ hotels. Search live hotel rates and flights, look up places, airports and hotel details, then prebook and book. Remote Streamable HTTP endpoint, no API key required.
Hotel booking MCP server. Search, book, and manage reservations across 250K+ properties worldwide.
Corporate travel booking and expense management for TripGain, exposed as an MCP server.
Search and compare flight offers through a cache-aware Streamable HTTP MCP server for AI agents.
Related MCP Servers
- AlicenseAqualityCmaintenanceHotel booking MCP server — the first transaction-complete hotel booking integration for AI agents. Search 300K+ properties in 140+ countries, get live rates and room details, and generate secure checkout URLs. No payment in the AI conversation — guests complete booking at a hosted checkout page and receive a real hotel confirmation number. Set your own booking fee via Stripe Connect.816 npm3-
- AlicenseAqualityDmaintenanceMinimal TypeScript MCP server providing real flight and hotel search via SerpApi for a personal travel-planning agent.22 npmMIT
- FlicenseNot gradedqualityDmaintenanceProvides two MCP servers: one for searching real-time flight prices via FlightAPI.io and another for hotel prices via Booking.com through RapidAPI, both accessible over Streamable HTTP.-
- AlicenseNot gradedqualityDmaintenanceAn MCP server that exposes FortiCNAPP (formerly Lacework) API 2.0 operations as typed, auth-aware tools generated from the API spec at startup, supporting both local stdio and remote Streamable HTTP transports.MIT