Skip to main content
Glama

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 login

The 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.js

This 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

get_planning_guide

How to plan flexible dates, budgets, split stays and hotel comparisons; no login required.

search_hotels

Search by city/name/brand, city code or coordinates, with indicative nightly prices.

get_hotel

Address, policies, facilities, photos and optional catalogue rooms.

get_rates

Live rooms and rate plans for up to 15 hotels and 1–15 nights, with meal and cancellation terms.

create_booking

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

FORTRIP_TOKEN

Optional CLI access token (fth_…), preferred over saved credentials.

XDG_CONFIG_HOME

Optional configuration root; otherwise ~/.config is used.

FORTRIP_API_URL

Optional API origin; defaults to https://fortrip.ai. HTTPS required except localhost development.

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-mcp

Set 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-run

The 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 tools
create_bookingCreate booking payment linkA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
roomsYes
adultsYesAdults per room
guestsYesAt least one guest per room; Latin letters as on passport; roomNo is 1-based
roomIdYesroomId from get_rates
checkInYesCalendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn.
hotelIdYes
checkOutYesCalendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn.
contactNameYes
childrenAgesNoAge in years of each child, 0–17; omit or use [] when no children are travelling.
contactEmailNo
contactPhoneYes
ratePlanCodeYesratePlanCode from get_rates
specialRequestsNoEnglish only; not guaranteed

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 detailsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hotelIdYes
includeRoomsNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 guideA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 ratesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
roomsYesNumber of rooms requested for this stay, not number of guests.
adultsYesAdults per room
checkInYesCalendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn.
checkOutYesCalendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn.
currencyNoCurrency for displayed prices: CNY or USD. Booking charges the currency returned by create_booking.CNY
hotelIdsYesCatalogue hotel IDs returned by search_hotels; compare up to 15 hotels in one call.
boardCodesNoKeep 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.
nationalityNoGuest nationality as an uppercase ISO 3166-1 alpha-2 country code, e.g. CN or US; omit when unknown.
bookableOnlyNoTrue keeps only rates with bookable inventory on every night. False also includes rates with unavailable nights; do not present those as bookable.
childrenAgesNoAge in years of each child, 0–17; omit or use [] when no children are travelling.
freeCancellationNoTrue 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.
maxRoomsPerHotelNoMaximum room types returned per hotel, cheapest first after filtering; default 5. This limits response size, not the rooms being booked.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 hotelsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nearNo
pageNo
queryNo
sortByNorecommended
checkInYesCalendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn.
starMaxNo
starMinNo
checkOutYesCalendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn.
cityCodeNo
currencyNoCurrency for displayed prices: CNY or USD. Booking charges the currency returned by create_booking.CNY
pageSizeNo
priceMaxNo
priceMinNo
facilitiesNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 3 tool updatesv0.1.1
    • Changedcreate_booking3 fields changed
      • addedInput schema / properties / checkIn / description
        Added value: +"Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn."
      • addedInput schema / properties / checkOut / description
        Added value: +"Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn."
      • addedInput schema / properties / childrenAges / description
        Added value: +"Age in years of each child, 0–17; omit or use [] when no children are travelling."
    • Changedget_rates11 fields changed
      • addedInput schema / properties / boardCodes / description
        Added 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."
      • addedInput schema / properties / bookableOnly / description
        Added value: +"True keeps only rates with bookable inventory on every night. False also includes rates with unavailable nights; do not present those as bookable."
      • addedInput schema / properties / checkIn / description
        Added value: +"Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn."
      • addedInput schema / properties / checkOut / description
        Added value: +"Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn."
      • addedInput schema / properties / childrenAges / description
        Added value: +"Age in years of each child, 0–17; omit or use [] when no children are travelling."
      • addedInput schema / properties / currency / description
        Added value: +"Currency for displayed prices: CNY or USD. Booking charges the currency returned by create_booking."
      • addedInput schema / properties / freeCancellation / description
        Added 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."
      • addedInput schema / properties / hotelIds / description
        Added value: +"Catalogue hotel IDs returned by search_hotels; compare up to 15 hotels in one call."
      • addedInput schema / properties / maxRoomsPerHotel / description
        Added value: +"Maximum room types returned per hotel, cheapest first after filtering; default 5. This limits response size, not the rooms being booked."
      • addedInput schema / properties / nationality / description
        Added value: +"Guest nationality as an uppercase ISO 3166-1 alpha-2 country code, e.g. CN or US; omit when unknown."
      • addedInput schema / properties / rooms / description
        Added value: +"Number of rooms requested for this stay, not number of guests."
    • Changedsearch_hotels3 fields changed
      • addedInput schema / properties / checkIn / description
        Added value: +"Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn."
      • addedInput schema / properties / checkOut / description
        Added value: +"Calendar date in YYYY-MM-DD format; checkOut must be 1–15 nights after checkIn."
      • addedInput schema / properties / currency / description
        Added value: +"Currency for displayed prices: CNY or USD. Booking charges the currency returned by create_booking."
  2. 5 tool updatesv0.1.0
    • First observedcreate_booking
    • First observedget_hotel
    • First observedget_planning_guide
    • First observedget_rates
    • First observedsearch_hotels

TDQS

A4.1/5.0

Scored across 5 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Hotel 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.
    8
    16 npm
    3
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides 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.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    An 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