Overview
Search hotels, compare live offers and create orders with a payment link from any MCP client. Each tool matches a CLI command and an HTTP endpoint.
Endpoint
https://mcp.fortrip.ai/Streamable HTTP with OAuth sign-in to a Fortrip account; no API key. Clients that only launch local commands can run npx -y fortrip mcp, a stdio bridge to this server with the same tools, instead. Setup for each client is in Installation.
Tools
| Tool | Description | Access |
|---|---|---|
search_hotels | Search hotels | Read-only |
get_hotel | Get hotel details | Read-only |
get_hotel_offers | Get live hotel offers | Read-only |
book_hotel | Create hotel order and payment link | Creates an unpaid order |
get_order | Get order | Read-only |
list_orders | List orders | Read-only |
cancel_order | Cancel order | Cancels an order |
pay_order | Pay order by token or Alipay/WeChat Pay | Pays an order |
get_planning_guide | Get hotel planning guide | Read-only |
Results and errors
- Success:
structuredContentis the full response object, the same as the HTTP API's, and every tool butget_planning_guidedeclares itsoutputSchema.contentholds the answer as compact text for the model: one line per hotel, offer or order with its ids, full descriptions and policies, every note, and "not listed" or "unknown" written out. Some tools add blocks before or after it, so find a block by itstype(text,image), not by its position. By tool:
| Tool | content |
|---|---|
get_planning_guide | content[0] is the planning guide, as Markdown. |
search_hotels | content[0] is the answer as compact text, and content[1] is the presentation hint: how to show hotels to the user. |
get_hotel | content[0] is the answer as compact text, and content[1] is the presentation hint: how to show hotels to the user. |
get_hotel_offers | content[0] is the answer as compact text, and content[1] is the presentation hint: how to show hotels to the user. |
book_hotel | content[0] is the answer as compact text. |
get_order | content[0] is the answer as compact text. |
list_orders | content[0] is the answer as compact text. |
cancel_order | content[0] is the answer as compact text. |
pay_order | When the answer holds a live WeChat Pay code, content[0] is the WeChat Pay code as a PNG image, and content[1] is the answer as compact text, unless the image couldn't be fetched; otherwise content[0] is the answer as compact text. Find the blocks by type, not by position. |
- The hotel tools' presentation hint asks the model to show only what Fortrip returned, as cards where the client can draw them. A WeChat Pay code comes as an image when
pay_order's answer holds a live one and the image could be fetched; the code and its link are instructuredContenteither way. - An answer of
book_hotel,get_orderandlist_ordersthat holds apayment.urlalso carriesnextStepinstructuredContent, and its text states the same rule: show the user the total and terms and wait for a clear yes before giving them the link. - Failure:
isError: truewith nostructuredContent.content[0]says what happened and the next call to make;content[1]is the error envelope as JSON text. - Input is checked by Fortrip, not by the client's SDK, so an invalid argument answers
invalid_requestwith the field at fault. _meta["ai.fortrip/requestId"]carries the request id, and_meta["ai.fortrip/replayed"]marks an order answered again for the same details.
See Errors & limits.