Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Fortrip

NPM · FORTRIP · 2 COMPONENTS

Search hotels worldwide, compare live room rates, book and pay securely, and cancel bookings.

+3 this week 83 Trust /100

Last scanned (5 hours ago)

Scores higher than 76% of npm servers

Category E-commerce

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security99
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 3 of 14 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to FortripEngineering/fortrip). View diagnostics → Pass
  • Clear OSI-approved license (Apache-2.0).Pass
  • Actively maintained (last published 0 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability59
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 2698 tokens (~299/item across 9 items; 9 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management40
  • Stability observed for 12 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (89% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 10 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 +15
    • Tool safety: pass → unverified ▼ security
    • Stability: 0.33 → unverified ▼ security
    • Known CVEs: pass → unverified ▼ security
    • Malware scan: unverified → pass ▲ security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Dependency health: 0.93 → unverified ▼ functional
    • First check of Schema quality: unverified functional
    • Package version: 3.4.0 → 4.2.0 functional
    • Package version: 3.4.0 → 4.1.0 functional
    • Package version: 3.4.0 → 4.0.0 functional
    • Package version: 3.4.0 → 3.5.0 functional
  • 3 Nov 26 −14
    • Malware scan: pass → unverified ▼ security
    • Known CVEs: pass → unverified ▼ security
    • Schema quality: 2201 → 2557 ▼ functional
    • Dependency health: 0.93 → unverified ▼ functional
    • Destructive annotations: pass → 100 functional
    • Package version: 3.3.0 → 3.4.0 functional
    • Package version: 3.3.0 → 3.3.1 functional
  • 1 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

  • 30 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

  • 28 Oct 26 +26
    • Malware scan: unverified → pass ▲ security
    • Known CVEs: unverified → pass ▲ security
    • Dependency health: unverified → 0.93 ▲ functional
  • 27 Oct 26 −10
    • Known CVEs: pass → unverified ▼ security
    • Malware scan: unverified → pass ▲ security
    • Schema quality: 1896 → 2201 ▼ functional
    • Dependency health: 0.93 → unverified ▼ functional
    • Schema quality: good → excellent functional
    • Package version: 3.1.0 → 3.3.0 functional
    • Package version: 3.1.0 → 3.2.0 functional
  • 26 Oct 26 −14
    • Malware scan: pass → unverified ▼ security
    • Stability: unverified → 0.07 ▲ functional
    • Package version: 3.0.0 → 3.1.0 functional
  • 25 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed npm/fortrip@4.2.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo FortripEngineering/fortrip
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/FortripEngineering/fortrip/.github/workflows/publish.yml@refs/tags/v4.2.0
Rekor log index 3690515631
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha512:ec8f7d78894c15551e1dd012951a71687c32485a5c587e0e2bc619cc284ac3e8e85d93d3d9d957445c64a8ec157869737a857243c78b867db12d99ee9

Background: How many MCP packages publish verified provenance →

Dependencies 14 packages
Packages resolved 14
Stale 3
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 9 exposed · ~2,088 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
book_hotel ~266

Order one offer from get_hotel_offers. The answer is an unpaid order with a payment link: status awaiting_payment, the total, the stay and its terms, and payment.url, a Fortrip page to pay on. Nothing is charged until the order is paid, on that page or with pay_order (or Alipay/WeChat Pay); anyone holding the link can pay. Send the contact and, for each room of the offer, at least one guest. If the price or terms changed since the offer, the answer is offer_changed with every change and a new offer: show the changes and ask the user again before ordering it. Sending the same details again returns the same order. An offer is ordered once: for another order of the stay (another party, or a corrected guest name), get offers again and order the new offer; when it replaces an unpaid order, tell the user to pay only the new link, as the earlier one expires unpaid. To cancel an order, use cancel_order; for changes, or a cancellation cancel_order can't make, the user emails info@fortrip.ai with the order's reference.

NameTypeReqDescription
contactobjectyesWho the hotel and the confirmation reach.
itemsarrayyesThe offer to book: exactly one.
NameTypeReqDescription
cancelobjectyesWhether the order can be cancelled now, and for what penalty and refund.
createdAtstringyes–
itemsarrayyes–
manageUrlstringyes–
nextStepstring–What to show and ask before giving a payment.url. Present when the answer holds a non-null payment.url, and only then.
orderIdstringyes–
paymentobjectyes–
priceobjectyes–
referencestringyes–
status–yes–
updatedAtstringyes–

No examples provided.

cancel_order ~268

Cancel one of the user's orders by orderId under its cancellation terms, when its cancel.available is true: the hotel booking is cancelled and cancel.refund, what was paid less cancel.penalty, is refunded. Before you call cancel_order, show the user the order's stay (hotel, dates), cancel.penalty and cancel.refund (amount and currency), then end your reply by asking them to confirm the cancellation, and wait for a clear yes. Pass maximumPenalty as the number in cancel.penalty.amount ("120.00" → 120). Never state a refund the order did not return. If the penalty is now higher than maximumPenalty, the answer is cancellation_changed and nothing changes: read the order again and ask the user again. Answers the order: status cancelling, then cancelled once the hotel cancels and the refund is issued; poll get_order. If the hotel refuses, the order goes back to confirmed with cancel.reason refused. Calling it again for the same order answers the order as it is.

NameTypeReqDescription
maximumPenaltynumberyesThe penalty the user agreed to, in the order's currency. Pass maximumPenalty as the number in cancel.penalty.amount ("120.00" → 120).
orderIdstringyesThe orderId of the order to cancel.
NameTypeReqDescription
cancelobjectyesWhether the order can be cancelled now, and for what penalty and refund.
createdAtstringyes–
itemsarrayyes–
manageUrlstringyes–
orderIdstringyes–
paymentobjectyes–
priceobjectyes–
referencestringyes–
status–yes–
updatedAtstringyes–

No examples provided.

get_hotel ~118

One hotel's catalogue facts: names, address, location, time zone, check-in and check-out times, the full description, every policy and the amenities, and its rooms with include: "rooms". "Not listed" is not "no". No prices or availability: get_hotel_offers has those.

NameTypeReqDescription
hotelIdstringyeshotelId from a search response.
includestring–`rooms` adds the room list.
localestring–Language for names and text in the response: en or zh.
NameTypeReqDescription
addressobjectyes–
amenitiesobjectyes–
bookablebooleanyes–
breakfastServed–yes–
checkInTimesobjectyes–
checkOutTimesobjectyes–
contactobjectyes–
depositobjectyes–
description–yes–
hotelIdstringyes–
location–yes–
namestringyes–
namesobjectyes–
photos–yesUp to 8 hotel photos, the cover first; null when the catalogue lists none.
policiesobjectyes–
roomsobject––
stars–yes–
timeZone–yes–

No examples provided.

get_hotel_offers ~307

Live, bookable offers for up to 15 hotels and one stay. Every room in stay.rooms must have the same party: for different parties, call once per party. Each offer has the room, the meals included, price.total in USD for the whole stay and every room (what is charged), fees payable at the property, the cancellation terms with times in UTC and the hotel's time zone, the confirmation mode, and an offerId for book_hotel that expires at expiresAt. Hotels with nothing to offer are listed under unavailable with the reason. Up to limitPerHotel offers per hotel, default 10, chosen for a spread of choices in this order while room remains: the cheapest offer, the cheapest that can be cancelled free, the cheapest with breakfast, the cheapest of each other room, then the rest by price; listed cheapest first.

NameTypeReqDescription
displayCurrencystring–Currency to show prices in, USD or CNY. It never changes what is charged: payment is in USD.
filtersobject–Filters every offer must pass.
hotelIdsarrayyesHotels to price, 1 to 15, no repeats.
limitPerHotelinteger–Offers per hotel, 1 to 20. Default 10.
localestring–Language for names and text in the response: en or zh.
stayobjectyesDates and party. One party per call: every room must be the same.
NameTypeReqDescription
hotelsarrayyes–
stayobjectyes–
unavailablearrayyes–

No examples provided.

get_order ~109

One of the user's orders by orderId: its status, the payment status and, while it awaits payment, payment.url; the stay and its terms; and the hotel's confirmation number once there is one. Check it after the user pays. An order awaiting payment whose payment.url is null had its link unreadable this time: read it again.

NameTypeReqDescription
localestring–Language for names and text in the response: en or zh.
orderIdstringyesThe order's orderId.
NameTypeReqDescription
cancelobjectyesWhether the order can be cancelled now, and for what penalty and refund.
createdAtstringyes–
itemsarrayyes–
manageUrlstringyes–
nextStepstring–What to show and ask before giving a payment.url. Present when the answer holds a non-null payment.url, and only then.
orderIdstringyes–
paymentobjectyes–
priceobjectyes–
referencestringyes–
status–yes–
updatedAtstringyes–

No examples provided.

get_planning_guide ~70

Returns Fortrip's planning guide for a request that is more than one hotel for fixed dates (flexible dates, a budget, split stays, several destinations, "find me the best"): what to ask the user, which results count as evidence, how to rank and how to present options.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_orders ~92

The user's hotel orders, newest first, including those made on the Fortrip website. Pass nextCursor back as cursor for the next page.

NameTypeReqDescription
cursorstring–`nextCursor` from the previous page of orders.
limitinteger–Orders per page, 1 to 50. Default 20.
localestring–Language for names and text in the response: en or zh.
NameTypeReqDescription
dataarrayyes–
nextCursor–yesPass it back as cursor for the next page; null on the last page.
nextStepstring–What to show and ask before giving a payment.url. Present when the answer holds a non-null payment.url, and only then.

No examples provided.

pay_order ~409

Pay an order without its link, by shared payment token or Alipay/WeChat Pay (method alipay_wechat_pay). Token: only if payment.handlers isn't empty and you can request one from the user's Link wallet (US and Canadian accounts); never ask the user for one. First show the user the USD total, the stay and every term (meals, cancellation, fees payable at the property), ask them to confirm and wait for a clear yes. Token: request it with config.business_profile and payment.credentialLimits; pass it with price.total. Wallet: pass method, price.total; show payment.wallets (WeChat code as an image if you can, both links); they pay once by either; a code lasts 120 minutes; then the WeChat link opens a new one, or call again. Pay one way only: payment.url or pay_order. On success payment.url stops working; on failure it stays open. Then poll get_order. payment_total_changed: confirm details.total, retry. payment_credential_invalid: new token. service_unavailable: retry. Else payment.url. A token pays one order only.

NameTypeReqDescription
methodstring–Pay with Alipay or WeChat Pay instead of a token: opens the payment and returns payment.wallets. Exactly one of sharedPaymentToken, payment and method.
orderIdstringyesThe orderId of the order to pay.
paymentobject–UCP's Complete Checkout payment, in place of sharedPaymentToken: the token as the stripe_payment_token credential of the one selected stripe_payments card instrument. Exactly one of sharedPaymentToke…
sharedPaymentTokenstring–The shared payment token (spt_…) the user approved for this order, requested with the order's payment.credentialLimits. Exactly one of sharedPaymentToken, payment and method.
totalobjectyesThe total the user approved: the order's price.total, exactly as returned.
NameTypeReqDescription
cancelobjectyesWhether the order can be cancelled now, and for what penalty and refund.
createdAtstringyes–
itemsarrayyes–
manageUrlstringyes–
orderIdstringyes–
paymentobjectyes–
priceobjectyes–
referencestringyes–
status–yes–
updatedAtstringyes–

No examples provided.

search_hotels ~449

Find hotels by destination and/or text, with an indicative per-room-night price when a stay is given. destination is a place_name with its countryCode, a place or locality by placeId from an earlier answer, a point, or a country. A name several places bear answers destination_ambiguous with candidates: ask the user, then search the chosen placeId. text matches hotel names, brands and areas word for word. Indicative prices are estimates and not bookable: get_hotel_offers returns what the user pays. A search too broad to answer is refused with search_too_broad and its localities: pass one back as { kind: "locality", placeId }, never by name. The answer states the scope, the counts and notes; a next page is the cursor and, optionally, limit.

NameTypeReqDescription
cursorstring–`nextCursor` from the previous response. A next page is the cursor and, optionally, `limit`; nothing else.
destination––Where to search. A first page needs this or `text`.
displayCurrencystring–Currency to show prices in, USD or CNY. It never changes what is charged: payment is in USD.
filtersobject–Filters every hotel in the answer must pass.
limitinteger–Hotels per page, 1 to 50. Default 20.
localestring–Language for names and text in the response: en or zh.
pricingstring–`indicative` adds an approximate price per hotel and needs a stay; `none` skips prices. Default: indicative with a stay, otherwise none.
sortstring–Result order. `distance` needs a destination, `relevance` needs `text`, `price_asc` and `price_desc` need indicative pricing. Default: relevance with `text`, otherwise distance.
stayobject–Dates and party. Needed for indicative prices. Search uses only the dates when the rooms differ.
textstring–Hotel name, brand or area to match, 1 to 128 characters. A first page needs this or `destination`.
NameTypeReqDescription
coverageobjectyes–
dataarrayyes–
destination–yes–
nextCursor–yesPass it back as cursor for the next page; null on the last page.
notesarrayyes–
pricingobjectyes–
sort–yes–
stay–yes–
text–yes–

No examples provided.

Install

How do I install the Fortrip MCP server?

Fortrip runs locally as an npm package, launched with npx -y fortrip. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · fortrip

# add to Claude Code
claude mcp add fortripengineering-fortrip -- npx -y fortrip
Common questions

What is the Fortrip MCP server?

Fortrip is an MCP server listed in the public MCP registry as io.github.FortripEngineering/fortrip. Search hotels worldwide, compare live room rates, book and pay securely, and cancel bookings. This page covers its npm package (fortrip).

Is the Fortrip MCP server safe to use?

Fortrip scores 83 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Fortrip MCP server expose?

Fortrip exposes 9 tools: get_planning_guide, search_hotels, get_hotel, get_hotel_offers, book_hotel, and 4 more. Their descriptions and schemas cost roughly 2,088 tokens of context every time the server is loaded.

Is the Fortrip MCP server still maintained?

Fortrip is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Fortrip MCP server under?

Fortrip declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.