travel-insurance
Server Details
Compare travel insurance quotes from 15+ insurers — Schengen, WHV, students, long stays, seniors.
- Status
- Healthy
- Uptime
- 99.7% over 60 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 2 tools
The two tools target clearly different intents: check_card_coverage answers 'what does my card already cover' while get_quote returns priced insurance offers. The descriptions explicitly explain how they connect (cardId flows from one to the other), so there is no realistic risk of misselection.
Both names use snake_case with a verb_noun structure (check_card_coverage, get_quote). The convention is predictable and readable, with no mixed styles or casing.
Two tools is on the thin side for a travel-insurance service, though each is a substantial, well-scoped operation (coverage analysis and quote retrieval). It borders on feeling like a minimal surface rather than a complete toolset.
The pair covers the two core entry points (coverage check and quoting) but leaves notable lifecycle gaps: no purchase/subscribe, no retrieval of an existing policy, and no claims or partner/offer-detail operations. Agents can work around this via the rendered widget, but the surface is not full coverage.
Available Tools
2 toolscheck_card_coverageCheck a bank card's travel insuranceARead-onlyInspect
Use HelloSafe to check what travel insurance a credit card already includes, from the card's real terms & conditions. Use it when the user asks what their card covers for travel (medical, cancellation, baggage, ski…) or whether their card is enough for a trip. Identify the card from its name (and bank / country when given). Returns the covered guarantees with amounts and conditions, the coverage gaps, and the card id — which get_quote accepts as cardId to rank offers by how well they fill those gaps. Never invent coverage: only state what this tool returns.
| Name | Required | Description | Default |
|---|---|---|---|
| cardId | No | Exact HelloSafe card ID from a previous call — use it to re-check a specific candidate instead of fuzzy matching. | |
| locale | No | Language the user is conversing in, as a BCP 47 tag or 2-letter code (e.g. "fr", "pt-BR"). ALWAYS pass it. | |
| network | No | Card network when stated: "Visa", "Mastercard", "Amex". | |
| cardQuery | No | Card name as the user said it, expanded ("American Express Platinum", not "Amex Plat"). Include the bank when known ("Chase Sapphire Reserve"). Omit only when cardId is provided. | |
| bankCountry | No | ISO-2 country of the issuing bank (e.g. "US", "FR"). Defaults to the user's country of residence when known — greatly improves matching. | |
| tripContext | No | Optional trip details — sharpen the gap analysis. Omit what you do not know. |
Output Schema
| Name | Required | Description |
|---|---|---|
| card | No | The card the analysis is about. |
| gaps | No | Guarantees missing or insufficient for the trip — the offer features a complementary policy should provide. |
| error | No | Human-readable reason when the check could not run. Absent on success. |
| covered | No | Travel guarantees the card really includes, with amounts and conditions from the card T&Cs. |
| unknown | No | Core guarantees with no data on this card — phrase as "not documented, check your contract", never as "not covered". |
| cardWidget | No | Data rendered by the card widget (gaps, catches, full sheet) — not meant for the assistant. |
| alternatives | No | Other cards matching the query. If the analysed card is not the user's, ask which one and call again with its cardId. |
| translations | No | Localized UI strings consumed by the widget — not meant for the assistant. |
| allGuarantees | No | The card's FULL guarantee sheet, grouped by section (travel first). Shown in the widget. |
| _assistantGuidance | No | |
| cancellationOnlyGap | No | True when cancellation is the ONLY gap — suggest a cancellation-only policy (intent "cancellation" in get_quote), usually much cheaper. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that: it discloses the shape of the result (covered guarantees with amounts and conditions, plus coverage gaps) and imposes a grounding constraint ('Never invent coverage: only state what this tool returns'). It does not discuss failure modes for unmatched cards or rate limits.
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, front-loaded with the action and scope before moving to triggers and then return values. Every clause earns its place, including the anti-hallucination instruction, and there is no repetition of schema field docs.
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 6 parameters, full schema coverage, a nested tripContext object and an output schema, the description still covers the essentials: what is checked, when to invoke it, what comes back, and how the result feeds get_quote. Nothing an agent needs to call this correctly 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 100%, so the baseline is 3. The description nonetheless adds interpretation beyond the schema: it explains the card is identified from its name plus bank/country context, and clarifies that the returned card id is meant to be reused as `cardId`, tying the input params to a workflow rather than just restating field docs.
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 and resource ('check what travel insurance a credit card already includes') and grounds it in the 'card's real terms & conditions', which distinguishes it from the sibling get_quote. It also names the exact handoff artifact (card id accepted as `cardId`), so the agent can separate checking coverage from ranking offers without opening either 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?
Gives concrete triggering conditions ('when the user asks what their card covers for travel (medical, cancellation, baggage, ski…) or whether their card is enough for a trip') and positions get_quote as the follow-up step. It never states when NOT to call it or when to prefer get_quote directly, so it stops short of full when/when-not/alternatives coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quoteGet travel insurance quotesRead-onlyInspect
Use HelloSafe to get travel-insurance quotes when the user asks for travel insurance for a trip. Returns priced offers from HelloSafe partners and renders the comparison widget. Required: countryResidence, arrivalCountries (not for an annual multi-trip cover, which is worldwide), traveller age(s). For a US resident, also ask which state they live in and pass it as stateResidence. Everything else has a sensible default — never ask the user for an optional field. After calling, reply with 1-2 short sentences highlighting the recommended offer — never re-list offers as a table, never paste subscribe URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| cardId | No | HelloSafe card ID returned by check_card_coverage. Pass it when the user holds a credit card with travel cover: offers are then re-ranked by how well they fill that card's coverage gaps, and each offer lists what it adds over the card (complementsCard). | |
| locale | No | Language the user is conversing in, as a BCP 47 tag or 2-letter code (e.g. "fr", "pt-BR"). ALWAYS pass it — the widget and all offer texts are localized with it. Falls back to the ChatGPT account locale, then to English. | |
| tripInfo | Yes | Trip details. | |
| subscriptionId | No | Existing subscription ID to update instead of creating a new one. | |
| displayCurrency | No | ISO 4217 code to override the widget display currency. Omit unless the user explicitly asked for a different display currency than the trip-cost currency. | |
| requiredCoverages | No | Optional filter on policy features, the guarantee filters of the HelloSafe comparison site: only the offers whose contract includes every listed cover are returned, that cover listed first. maternityCover = covers pregnancy; preExistingConditionsCover = covers pre-existing medical conditions; personalLiability; baggage; travelDelay; directHospitalBilling = the insurer pays the hospital directly; disability; searchAndRescue; earlyReturn; tripInterruption; electronics = electronic devices; cashAdvance; expatMaternity, expatDental, expatOptical (expatriates). Each trip purpose has its own filters, as on the site; a cover that is not one of them is ignored and reported. Set it only when the user explicitly asks for a policy that includes this cover; the tool never asks the user about their health. It changes neither prices nor eligibility; health-related covers are not stored. | |
| cancelForAnyReason | No | Cancel For Any Reason option, like trip cancellation: an add-on bought with the policy (extra cost, a purchase window counted from the first trip payment, usually 75 % of prepaid costs refunded). Sold to US residents only, on a forTourism, cruise or cancellation trip; true keeps the offers that sell it. Set it only when the user asks for it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Human-readable reason when the quote could not be generated. Absent on success. |
| tripInfo | No | Normalized trip parameters the quote was computed with. |
| cardContext | No | Present only when the quote was computed against a card (cardId argument): the card and its gaps. |
| subscribeUrl | No | HelloSafe comparator URL for this quote. The widget already renders clickable buttons — never paste it in the reply. |
| translations | No | Localized UI strings consumed by the widget — not meant for the assistant. |
| displayOffers | No | Priced offers sorted by price, with the recommended offer (isBestScore=true) promoted first. |
| subscriptionId | No | Quote session ID — pass it back as `subscriptionId` to update this quote instead of creating a new one. |
| _assistantGuidance | No | Guidance for the assistant reply — follow "instruction". |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
get_quote6 fields changed- added
Input schema / properties / cancelForAnyReasonAdded value: +{ + "description": "Cancel For Any Reason option, like trip cancellation: an add-on bought with the policy (extra cost, a purchase window counted from the first trip payment, usually 75 % of prepaid costs refunded). Sold to US residents only, on a forTourism, cruise or cancellation trip; true keeps the offers that sell it. Set it only when the user asks for it.", + "type": "boolean" +} - added
Input schema / properties / requiredCoveragesAdded value: +{ + "description": "Optional filter on policy features, the guarantee filters of the HelloSafe comparison site: only the offers whose contract includes every listed cover are returned, that cover listed first. maternityCover = covers pregnancy; preExistingConditionsCover = covers pre-existing medical conditions; personalLiability; baggage; travelDelay; directHospitalBilling = the insurer pays the hospital directly; disability; searchAndRescue; earlyReturn; tripInterruption; electronics = electronic devices; cashAdvance; expatMaternity, expatDental, expatOptical (expatriates). Each trip purpose has its own filters, as on the site; a cover that is not one of them is ignored and reported. Set it only when the user explicitly asks for a policy that includes this cover; the tool never asks the user about their health. It changes neither prices nor eligibility; health-related covers are not stored.", + "items": { + "enum": [ + "maternityCover", + "preExistingConditionsCover", + "personalLiability", + "baggage", + "travelDelay", + "directHospitalBilling", + "disability", + "searchAndRescue", + "earlyReturn", + "tripInterruption", + "electronics", + "cashAdvance", + "expatMaternity", + "expatDental", + "expatOptical" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / tripInfo / properties / arrivalCountries / anyOfPrevious value: -[ - { - "items": { - "pattern": "^[A-Za-z]{2}$", - "type": "string" - }, - "type": "array" - }, - { - "type": "string" - } -]New value: +[ + { + "items": { + "pattern": "^([A-Za-z]{2}|SCH|sch)$", + "type": "string" + }, + "type": "array" + }, + { + "type": "string" + } +] - changed
Input schema / properties / tripInfo / properties / arrivalCountries / descriptionPrevious value: -"Destination countries as ISO 3166-1 alpha-2 codes. Prefer an array ([\"TH\",\"VN\"]); a comma-separated string also works. Required, EXCEPT for intent \"annual\": a yearly multi-trip cover is worldwide, so never ask for a destination then — omit it."New value: +"Destination countries as ISO 3166-1 alpha-2 codes. Prefer an array ([\"TH\",\"VN\"]); a comma-separated string also works. \"WW\" = the whole world (intents forTourism, cruise, digitalNomad); \"SCH\" = the whole Schengen area (intent schengenArea). Required, EXCEPT for intent \"annual\": a yearly multi-trip cover is worldwide, so never ask for a destination then — omit it." - changed
Input schema / properties / tripInfo / properties / stateResidence / descriptionPrevious value: -"State of residence as its USPS 2-letter code (e.g. \"CA\", \"TX\") — for US residents only, ignored for every other country. US travel insurance is regulated state by state, so when countryResidence is \"US\" ASK THE USER which state they live in and pass it; never guess it from the destination or the chat language. The quote is still produced without it. The US territories are countries here, not states (a Puerto Rico resident is countryResidence \"PR\", never \"US\" + \"PR\")."New value: +"State of residence as its USPS 2-letter code (e.g. \"CA\", \"TX\") — for US residents only, ignored for every other country. US travel insurance is regulated state by state, so when countryResidence is \"US\" ASK THE USER which state they live in and pass it; never guess it from the destination or the chat language. No quote is computed without it. The US territories are countries here, not states (a Puerto Rico resident is countryResidence \"PR\", never \"US\" + \"PR\")." - changed
Output schema / properties / displayOffers / items / properties / profileGuarantees / descriptionPrevious value: -"What the contract of each offer states on four guarantees, for every offer that documents them (contract facts, the same for every buyer): pregnancyCover (value = last covered week of pregnancy, e.g. \"35 wks\"), preExistingConditions (illnesses known before departure), seniorConditions (value = maximum age covered, in years), cancelAnyReason (Cancel For Any Reason, US residents only: value = share of prepaid non-refundable costs refunded; always an add-on bought with the policy at extra cost, not in priceFullText). covered=false means the offer does not cover it. description is HelloSafe's summary of the contract for this trip purpose."New value: +"What the contract of each offer states on four guarantees, for every offer that documents them (contract facts, the same for every buyer): pregnancyCover (value = last covered week of pregnancy, e.g. \"35 wks\"), preExistingConditions (illnesses known before departure), seniorConditions (value = maximum age covered, in years), cancelAnyReason (Cancel For Any Reason, US residents only: value = share of prepaid non-refundable costs refunded; always an add-on bought with the policy at extra cost, not in priceFullText). covered=false means the offer does not cover it. description is HelloSafe's summary of the contract for this trip purpose; exclusions is given for the covers asked with requiredCoverages or cancelForAnyReason."
1 tool update
- Changed
get_quote1 field changed- added
Output schema / properties / displayOffers / items / properties / profileGuaranteesAdded value: +{ + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "covered": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "exclusions": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "description": "What the contract of each offer states on four guarantees, for every offer that documents them (contract facts, the same for every buyer): pregnancyCover (value = last covered week of pregnancy, e.g. \"35 wks\"), preExistingConditions (illnesses known before departure), seniorConditions (value = maximum age covered, in years), cancelAnyReason (Cancel For Any Reason, US residents only: value = share of prepaid non-refundable costs refunded; always an add-on bought with the policy at extra cost, not in priceFullText). covered=false means the offer does not cover it. description is HelloSafe's summary of the contract for this trip purpose.", + "propertyNames": { + "type": "string" + }, + "type": "object" +}
1 tool update
- Changed
check_card_coverage1 field changed- changed
Output schema / properties / allGuarantees / descriptionPrevious value: -"The card's FULL guarantee sheet, grouped by section (travel first) — render as one markdown table per section: Guarantee | Your card | Recommended | Verdict."New value: +"The card's FULL guarantee sheet, grouped by section (travel first). Shown in the widget."
2 tool updates
- Changed
check_card_coverage2 fields changed- added
Output schema / properties / cardWidgetAdded value: +{ + "additionalProperties": {}, + "description": "Data rendered by the card widget (gaps, catches, full sheet) — not meant for the assistant.", + "properties": {}, + "type": "object" +} - added
Output schema / properties / translationsAdded value: +{ + "additionalProperties": {}, + "description": "Localized UI strings consumed by the widget — not meant for the assistant.", + "propertyNames": { + "type": "string" + }, + "type": "object" +}
- Changed
get_quote2 fields changed- changed
Input schema / properties / tripInfo / properties / arrivalCountries / descriptionPrevious value: -"Destination countries as ISO 3166-1 alpha-2 codes. Prefer an array ([\"TH\",\"VN\"]); a comma-separated string also works."New value: +"Destination countries as ISO 3166-1 alpha-2 codes. Prefer an array ([\"TH\",\"VN\"]); a comma-separated string also works. Required, EXCEPT for intent \"annual\": a yearly multi-trip cover is worldwide, so never ask for a destination then — omit it." - changed
Input schema / properties / tripInfo / requiredPrevious value: -[ - "countryResidence", - "arrivalCountries", - "travellers" -]New value: +[ + "countryResidence", + "travellers" +]
2 tool updates
- Changed
check_card_coverage1 field changed- changed
Input schema / properties / tripContext / properties / intent / descriptionPrevious value: -"Trip purpose when known — same values as get_quote (forTourism, mountainTrip, schengenArea…). Drives the thresholds (e.g. ski cover checked for mountainTrip)."New value: +"Trip purpose when known — same values as get_quote (forTourism, schengenArea, studyInternship…). Drives the thresholds."
- Changed
get_quote2 fields changed- changed
Input schema / properties / tripInfo / properties / intent / descriptionPrevious value: -"Trip purpose. Map from the user message when clear: leisure / holidays / sightseeing → \"forTourism\"; study abroad, Erasmus, internship → \"studyInternship\"; working-holiday visa (PVT) → \"whv\"; yearly multi-trip cover → \"annual\"; long-term relocation → \"expat\"; cancellation-only (no medical) → \"cancellation\"; ski / trek / mountaineering → \"mountainTrip\"; cruise → \"cruise\"; remote-work nomading → \"digitalNomad\"; group of 10+ travellers → \"groupTravel\"; Schengen visa application → \"schengenArea\"; humanitarian mission or volunteering → \"humanitarian\"; au pair placement → \"auPair\"; business / work trip → \"toWork\"; returning home for a visit → \"backToHome\"; rental / Airbnb stay focus → \"rentalStay\". If you cannot confidently map the user's situation to one of these values, ASK THE USER which purpose fits best — do not guess. Note: \"annual\" and \"expat\" automatically force isAnnual=true."New value: +"Trip purpose. Map from the user message when clear: leisure / holidays / sightseeing → \"forTourism\"; study abroad, Erasmus, internship → \"studyInternship\"; working-holiday visa (PVT) → \"whv\"; yearly multi-trip cover → \"annual\"; long-term relocation → \"expat\"; cancellation-only (no medical) → \"cancellation\"; ski / trek / mountaineering → \"forTourism\" with the extreme sports option; cruise → \"cruise\"; remote-work nomading → \"digitalNomad\"; group of 10+ travellers → \"groupTravel\"; Schengen visa application → \"schengenArea\"; humanitarian mission or volunteering → \"humanitarian\"; au pair placement → \"auPair\"; a business trip, a visit back home or a rental stay → \"forTourism\". If you cannot confidently map the user's situation to one of these values, ASK THE USER which purpose fits best — do not guess. Note: \"annual\" and \"expat\" automatically force isAnnual=true." - changed
Input schema / properties / tripInfo / properties / intent / enumPrevious value: -[ - "forTourism", - "schengenArea", - "annual", - "studyInternship", - "whv", - "cruise", - "digitalNomad", - "expat", - "groupTravel", - "rentalStay", - "mountainTrip", - "backToHome", - "humanitarian", - "auPair", - "toWork", - "cancellation" -]New value: +[ + "forTourism", + "schengenArea", + "annual", + "studyInternship", + "whv", + "cruise", + "digitalNomad", + "expat", + "groupTravel", + "humanitarian", + "auPair", + "cancellation" +]
1 tool update
- Changed
get_quote6 fields changed- changed
Output schema / properties / _assistantGuidance / properties / recommendedOffer / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "properties": { - "coverages": { - "additionalProperties": { - "type": "string" - }, - "description": "Coverage label → covered amount for the recommended offer.", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "insurerName": { - "type": "string" - }, - "name": { - "type": "string" - }, - "price": { - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "coverages": { + "additionalProperties": { + "type": "string" + }, + "description": "Coverage label → covered amount for the recommended offer.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "insurerName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optionsNotTaken": { + "additionalProperties": { + "type": "string" + }, + "description": "Options available on the recommended offer that this quote does NOT include (not covered unless the user adds them).", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "price": { + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / displayOffers / items / properties / featureDetailsAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Second line of a feature row, part of that guarantee: on cancelTrip, the covered cancellation reasons (e.g. \"Any justified reason\"). They share the verdict of cancelTrip — never a cover of their own.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - changed
Output schema / properties / displayOffers / items / properties / features / descriptionPrevious value: -"Coverage feature slug → formatted covered amount, already filtered for the trip purpose and converted to the display currency."New value: +"Coverage feature slug → formatted covered amount, already filtered for the trip purpose and converted to the display currency. Slugs listed in optionalFeatures are NOT covered: they are options the traveller has not added (value \"Optional\"). When cancellation is an option, its covered reasons are in featureDetails.cancelTrip, part of that guarantee and never covered on their own; on a cancellation-only trip they are their own cancellationReasons entry." - added
Output schema / properties / displayOffers / items / properties / notIncludedFeaturesAdded value: +{ + "description": "Feature slugs of `features` that this offer does NOT cover (value \"Not included\"), listed last like the results page's \"Not covered\" section.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / displayOffers / items / properties / optionalFeaturesAdded value: +{ + "description": "Feature slugs of `features` that are options NOT taken on this quote (trip cancellation, studies interruption, extreme sports): available on the offer, not covered.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / displayOffers / items / properties / takenOptionsAdded value: +{ + "description": "Feature slugs of the options the traveller added on this quote (trip cancellation, extreme sports, studies interruption): covered, and part of their quote.", + "items": { + "type": "string" + }, + "type": "array" +}
1 tool update
- Changed
get_quote1 field changed- added
Input schema / properties / tripInfo / properties / stateResidenceAdded value: +{ + "description": "State of residence as its USPS 2-letter code (e.g. \"CA\", \"TX\") — for US residents only, ignored for every other country. US travel insurance is regulated state by state, so when countryResidence is \"US\" ASK THE USER which state they live in and pass it; never guess it from the destination or the chat language. The quote is still produced without it. The US territories are countries here, not states (a Puerto Rico resident is countryResidence \"PR\", never \"US\" + \"PR\").", + "pattern": "^[A-Za-z]{2}$", + "type": "string" +}
2 tool updates
- Added
check_card_coverage - Changed
get_quote3 fields changed- added
Input schema / properties / cardIdAdded value: +{ + "description": "HelloSafe card ID returned by check_card_coverage. Pass it when the user holds a credit card with travel cover: offers are then re-ranked by how well they fill that card's coverage gaps, and each offer lists what it adds over the card (complementsCard).", + "type": "number" +} - changed
Input schema / properties / locale / descriptionPrevious value: -"Language of the user. Defaults to the host locale."New value: +"Language the user is conversing in, as a BCP 47 tag or 2-letter code (e.g. \"fr\", \"pt-BR\"). ALWAYS pass it — the widget and all offer texts are localized with it. Falls back to the ChatGPT account locale, then to English." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "_assistantGuidance": { + "additionalProperties": {}, + "description": "Guidance for the assistant reply — follow \"instruction\".", + "properties": { + "instruction": { + "description": "How the assistant should present the result to the user.", + "type": "string" + }, + "recommendedOffer": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": { + "coverages": { + "additionalProperties": { + "type": "string" + }, + "description": "Coverage label → covered amount for the recommended offer.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "insurerName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "price": { + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Compact summary of the offer HelloSafe recommends for this trip." + } + }, + "type": "object" + }, + "cardContext": { + "additionalProperties": {}, + "description": "Present only when the quote was computed against a card (cardId argument): the card and its gaps.", + "properties": { + "cancellationOnlyGap": { + "type": "boolean" + }, + "cardId": { + "type": "number" + }, + "cardName": { + "type": "string" + }, + "gaps": { + "description": "The card coverage gaps that drove the offer ranking.", + "items": {}, + "type": "array" + }, + "unknown": { + "items": {}, + "type": "array" + } + }, + "type": "object" + }, + "displayOffers": { + "description": "Priced offers sorted by price, with the recommended offer (isBestScore=true) promoted first.", + "items": { + "additionalProperties": {}, + "properties": { + "complementsCard": { + "description": "Only when the quote carries a cardId: labels of the card's coverage gaps this offer fills — what it adds over the user's card.", + "items": { + "type": "string" + }, + "type": "array" + }, + "faq": { + "description": "Frequently asked questions about this offer.", + "items": {}, + "type": "array" + }, + "features": { + "additionalProperties": { + "type": "string" + }, + "description": "Coverage feature slug → formatted covered amount, already filtered for the trip purpose and converted to the display currency.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "id": { + "description": "HelloSafe offer ID.", + "type": "number" + }, + "insurerLogoUrl": { + "description": "Absolute URL of the insurer logo.", + "type": "string" + }, + "insurerName": { + "description": "Insurer brand name.", + "type": "string" + }, + "isBestScore": { + "description": "True for the single offer HelloSafe recommends for this trip (shown first).", + "type": "boolean" + }, + "isStartingPrice": { + "description": "True when the price is a \"from\" price.", + "type": "boolean" + }, + "name": { + "description": "Commercial name of the offer / formula.", + "type": "string" + }, + "noList": { + "description": "Newline-separated list of exclusions.", + "type": "string" + }, + "priceFullText": { + "description": "Total price for the whole trip and all travellers, formatted in the display currency (e.g. \"34,20 €\").", + "type": "string" + }, + "priceParts": { + "additionalProperties": {}, + "description": "Price split into rendering parts (used by the widget).", + "properties": { + "decimal": { + "type": "string" + }, + "decimalSeparator": { + "type": "string" + }, + "integer": { + "type": "string" + }, + "symbol": { + "type": "string" + }, + "symbolPosition": { + "description": "\"prefix\" or \"suffix\".", + "type": "string" + } + }, + "type": "object" + }, + "subscribeUrl": { + "description": "HelloSafe comparator URL for this quote. The widget already renders it as a button — never paste it in the reply.", + "type": "string" + }, + "suffix": { + "description": "Price period suffix key: \"perMonth\", \"perYear\", \"perDay\" or empty.", + "type": "string" + }, + "topBanner": { + "description": "Short marketing highlight for this offer, if any.", + "type": "string" + }, + "yesList": { + "description": "Newline-separated list of advantages.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "error": { + "description": "Human-readable reason when the quote could not be generated. Absent on success.", + "type": "string" + }, + "subscribeUrl": { + "description": "HelloSafe comparator URL for this quote. The widget already renders clickable buttons — never paste it in the reply.", + "type": "string" + }, + "subscriptionId": { + "description": "Quote session ID — pass it back as `subscriptionId` to update this quote instead of creating a new one.", + "type": "string" + }, + "translations": { + "additionalProperties": {}, + "description": "Localized UI strings consumed by the widget — not meant for the assistant.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "tripInfo": { + "additionalProperties": {}, + "description": "Normalized trip parameters the quote was computed with.", + "properties": { + "arrivalCountriesCodes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "arrivalCountriesNames": { + "description": "Destination country names in the response locale.", + "items": { + "type": "string" + }, + "type": "array" + }, + "countryResidenceCode": { + "type": "string" + }, + "countryResidenceName": { + "type": "string" + }, + "currency": { + "description": "ISO 4217 currency the amounts are shown in.", + "type": "string" + }, + "endDate": { + "type": "string" + }, + "endDateLabel": { + "type": "string" + }, + "intentName": { + "description": "Human-readable trip purpose.", + "type": "string" + }, + "isAnnual": { + "type": "boolean" + }, + "numberOfDays": { + "type": "number" + }, + "shouldCoverCancellation": { + "type": "boolean" + }, + "startDate": { + "type": "string" + }, + "startDateLabel": { + "type": "string" + }, + "travellers": { + "items": { + "additionalProperties": {}, + "properties": { + "age": { + "type": "number" + } + }, + "type": "object" + }, + "type": "array" + }, + "tripBoughtDateLabel": { + "type": "string" + }, + "tripPrice": { + "description": "Trip cost per traveller; -1 when not provided.", + "type": "number" + }, + "tripPriceText": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" +}
1 tool update
- Changed
get_quote1 field changed- changed
Input schema / properties / tripInfo / properties / tripPrice / descriptionPrevious value: -"Trip cost PER TRAVELLER (not the group total). Omit unless the user explicitly asked for cancellation coverage."New value: +"TOTAL trip cost for ALL travellers (not per traveller). Omit unless the user explicitly asked for cancellation coverage."
1 tool update
- Changed
get_quote2 fields changed- changed
Input schema / properties / tripInfo / properties / intent / descriptionPrevious value: -"Trip purpose. Map from the user message when clear: leisure / holidays / sightseeing → \"forTourism\"; study abroad, Erasmus, internship → \"studyInternship\"; working-holiday visa (PVT) → \"whv\"; yearly multi-trip cover → \"annual\"; long-term relocation → \"expat\"; cancellation-only (no medical) → \"cancellation\"; ski / trek / mountaineering → \"mountainTrip\"; cruise → \"cruise\"; remote-work nomading → \"digitalNomad\"; group of 10+ travellers → \"groupTravel\"; Schengen visa application → \"schengenArea\"; humanitarian mission or au pair → \"humanitarianAuPair\"; business / work trip → \"toWork\"; returning home for a visit → \"backToHome\"; rental / Airbnb stay focus → \"rentalStay\". If you cannot confidently map the user's situation to one of these values, ASK THE USER which purpose fits best — do not guess. Note: \"annual\" and \"expat\" automatically force isAnnual=true."New value: +"Trip purpose. Map from the user message when clear: leisure / holidays / sightseeing → \"forTourism\"; study abroad, Erasmus, internship → \"studyInternship\"; working-holiday visa (PVT) → \"whv\"; yearly multi-trip cover → \"annual\"; long-term relocation → \"expat\"; cancellation-only (no medical) → \"cancellation\"; ski / trek / mountaineering → \"mountainTrip\"; cruise → \"cruise\"; remote-work nomading → \"digitalNomad\"; group of 10+ travellers → \"groupTravel\"; Schengen visa application → \"schengenArea\"; humanitarian mission or volunteering → \"humanitarian\"; au pair placement → \"auPair\"; business / work trip → \"toWork\"; returning home for a visit → \"backToHome\"; rental / Airbnb stay focus → \"rentalStay\". If you cannot confidently map the user's situation to one of these values, ASK THE USER which purpose fits best — do not guess. Note: \"annual\" and \"expat\" automatically force isAnnual=true." - changed
Input schema / properties / tripInfo / properties / intent / enumPrevious value: -[ - "forTourism", - "schengenArea", - "annual", - "studyInternship", - "whv", - "cruise", - "digitalNomad", - "expat", - "groupTravel", - "rentalStay", - "mountainTrip", - "backToHome", - "humanitarianAuPair", - "toWork", - "cancellation" -]New value: +[ + "forTourism", + "schengenArea", + "annual", + "studyInternship", + "whv", + "cruise", + "digitalNomad", + "expat", + "groupTravel", + "rentalStay", + "mountainTrip", + "backToHome", + "humanitarian", + "auPair", + "toWork", + "cancellation" +]
1 tool update
- Changed
get_quote20 fields changed- added
Input schema / properties / displayCurrency / descriptionAdded value: +"ISO 4217 code to override the widget display currency. Omit unless the user explicitly asked for a different display currency than the trip-cost currency." - added
Input schema / properties / locale / descriptionAdded value: +"Language of the user. Defaults to the host locale." - added
Input schema / properties / subscriptionId / descriptionAdded value: +"Existing subscription ID to update instead of creating a new one." - added
Input schema / properties / tripInfo / descriptionAdded value: +"Trip details." - added
Input schema / properties / tripInfo / properties / arrivalCountries / descriptionAdded value: +"Destination countries as ISO 3166-1 alpha-2 codes. Prefer an array ([\"TH\",\"VN\"]); a comma-separated string also works." - added
Input schema / properties / tripInfo / properties / countryResidence / descriptionAdded value: +"User's country of residence as ISO 3166-1 alpha-2 code (e.g. \"FR\"). Ask the user if they did not state it — do not infer from destination or chat language." - added
Input schema / properties / tripInfo / properties / currency / descriptionAdded value: +"ISO 4217 code for tripPrice. Defaults to the currency of countryResidence. Only pass if the user gave an explicit amount in another currency." - added
Input schema / properties / tripInfo / properties / durationDays / descriptionAdded value: +"Trip length in days. Use this instead of endDate when the user gave a duration (e.g. \"20 days\") — the server computes endDate = startDate + durationDays." - added
Input schema / properties / tripInfo / properties / endDate / descriptionAdded value: +"Trip end date (YYYY-MM-DD). Either endDate or durationDays must be provided (or use intent=\"annual\"/\"expat\")." - added
Input schema / properties / tripInfo / properties / intent / descriptionAdded value: +"Trip purpose. Map from the user message when clear: leisure / holidays / sightseeing → \"forTourism\"; study abroad, Erasmus, internship → \"studyInternship\"; working-holiday visa (PVT) → \"whv\"; yearly multi-trip cover → \"annual\"; long-term relocation → \"expat\"; cancellation-only (no medical) → \"cancellation\"; ski / trek / mountaineering → \"mountainTrip\"; cruise → \"cruise\"; remote-work nomading → \"digitalNomad\"; group of 10+ travellers → \"groupTravel\"; Schengen visa application → \"schengenArea\"; humanitarian mission or au pair → \"humanitarianAuPair\"; business / work trip → \"toWork\"; returning home for a visit → \"backToHome\"; rental / Airbnb stay focus → \"rentalStay\". If you cannot confidently map the user's situation to one of these values, ASK THE USER which purpose fits best — do not guess. Note: \"annual\" and \"expat\" automatically force isAnnual=true." - added
Input schema / properties / tripInfo / properties / isAnnual / descriptionAdded value: +"Annual / multi-trip cover. Defaults to false (auto-true for intent=\"annual\" or \"expat\")." - added
Input schema / properties / tripInfo / properties / shouldCoverCancellation / descriptionAdded value: +"Include trip cancellation coverage. Defaults to false." - added
Input schema / properties / tripInfo / properties / shouldCoverExtremeSports / descriptionAdded value: +"Cover extreme sports (mountaineering, off-piste skiing, diving, paragliding, climbing). Defaults to false; set true only if the user mentioned such activities." - added
Input schema / properties / tripInfo / properties / startDate / descriptionAdded value: +"Trip start date (YYYY-MM-DD). Defaults to tomorrow when omitted." - added
Input schema / properties / tripInfo / properties / studiesAmount / descriptionAdded value: +"Tuition fees to cover, in tripInfo.currency. Required when studiesInterruption=true." - added
Input schema / properties / tripInfo / properties / studiesInterruption / descriptionAdded value: +"Cover interrupted studies (intent=\"studyInternship\" only). Defaults to false. Requires studiesAmount when true." - added
Input schema / properties / tripInfo / properties / travellers / descriptionAdded value: +"All travellers covered by the policy, including children. Example: a couple aged 35 with a 5-year-old → [{age:35},{age:35},{age:5}]." - added
Input schema / properties / tripInfo / properties / travellers / items / properties / age / descriptionAdded value: +"Age in years, 0–99." - added
Input schema / properties / tripInfo / properties / tripBoughtDate / descriptionAdded value: +"Date the trip was booked (YYYY-MM-DD). Required when shouldCoverCancellation=true (most insurers require booking within ~30 days)." - added
Input schema / properties / tripInfo / properties / tripPrice / descriptionAdded value: +"Trip cost PER TRAVELLER (not the group total). Omit unless the user explicitly asked for cancellation coverage."
1 tool update
- Changed
get_quote3 fields changed- added
Input schema / properties / tripInfo / properties / durationDaysAdded value: +{ + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Input schema / properties / tripInfo / requiredPrevious value: -[ - "intent", - "startDate", - "endDate", - "countryResidence", - "arrivalCountries", - "tripPrice", - "currency", - "isAnnual", - "travellers" -]New value: +[ + "countryResidence", + "arrivalCountries", + "travellers" +] - changed
Input schema / requiredPrevious value: -[ - "locale", - "tripInfo" -]New value: +[ + "tripInfo" +]
1 tool update
- Changed
get_quote1 field changed- added
Input schema / properties / tripInfo / properties / shouldCoverExtremeSportsAdded value: +{ + "type": "boolean" +}
1 tool update
- First observed
get_quote
Related MCP Connectors
Compare travel eSIM plans by country, days and data — live prices and links to buy on esimoa.
Compare prepaid travel eSIM plans by destination, data and trip length; plan multi-country trips.
41Compare US mobile plans, VPNs, travel eSIMs, home internet by address, and German energy tariffs.
Aggregated travel MCP — flights, tours, activities, price checks, visas, and more.
Related MCP Servers
AlicenseAqualityBmaintenanceTravel compliance and trip planning for digital nomads — visa requirements, tax residency analysis, Schengen 90/180-day tracking, and curated accommodation, transport, and experience search across 189 European destinations.7MIT- AlicenseBqualityDmaintenanceCompare parcel and letter delivery prices across 60+ carriers in 27 European countries.1MIT
- AlicenseAqualityCmaintenanceCheck visa requirements for 39,585 passport-destination pairs in 15 languages. Returns visa type, required documents, application process, and travel tips from 136 official government sources. Free quick checks without API key.567 npm1MIT
- FlicenseNot gradedqualityBmaintenanceSearch flights, compare prices, check visas, look up airports, get travel advisories through a single endpoint.-
Glama MCP Gateway
Add one secure layer between your agents and this server.