Compare travel insurance quotes from 15+ insurers — Schengen, WHV, students, long stays, seniors.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
Exact HelloSafe card ID from a previous call — use it to re-check a specific candidate instead of fuzzy matching.
Language the user is conversing in, as a BCP 47 tag or 2-letter code (e.g. "fr", "pt-BR"). ALWAYS pass it.
Card network when stated: "Visa", "Mastercard", "Amex".
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.
ISO-2 country of the issuing bank (e.g. "US", "FR"). Defaults to the user's country of residence when known — greatly improves matching.
Optional trip details — sharpen the gap analysis. Omit what you do not know.
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.
| Argument | Type | Description |
|---|---|---|
| cardId | number | Exact HelloSafe card ID from a previous call — use it to re-check a specific candidate instead of fuzzy matching. |
| locale | string | Language the user is conversing in, as a BCP 47 tag or 2-letter code (e.g. "fr", "pt-BR"). ALWAYS pass it. |
| network | string | Card network when stated: "Visa", "Mastercard", "Amex". |
| cardQuery | string | 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 | string | 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 | object | Optional trip details — sharpen the gap analysis. Omit what you do not know. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cardId": {
"type": "number",
"description": "Exact HelloSafe card ID from a previous call — use it to re-check a specific candidate instead of fuzzy matching."
},
"locale": {
"type": "string",
"description": "Language the user is conversing in, as a BCP 47 tag or 2-letter code (e.g. \"fr\", \"pt-BR\"). ALWAYS pass it."
},
"network": {
"type": "string",
"description": "Card network when stated: \"Visa\", \"Mastercard\", \"Amex\"."
},
"cardQuery": {
"type": "string",
"description": "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": {
"type": "string",
"description": "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": {
"type": "object",
"properties": {
"intent": {
"type": "string",
"description": "Trip purpose when known — same values as get_quote (forTourism, schengenArea, studyInternship…). Drives the thresholds."
},
"arrivalCountries": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z]{2}$"
},
"description": "Destination countries as ISO-2 codes, when the user mentioned a trip."
},
"shouldCoverCancellation": {
"type": "boolean",
"description": "True when the user cares about cancellation cover."
},
"shouldCoverExtremeSports": {
"type": "boolean",
"description": "True for ski / diving / mountaineering trips."
}
},
"description": "Optional trip details — sharpen the gap analysis. Omit what you do not know."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| cardId | number | 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 | string | 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* | object | Trip details. |
| subscriptionId | string | Existing subscription ID to update instead of creating a new one. |
| displayCurrency | string | 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 | array | 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 | boolean | 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": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tripInfo"
],
"properties": {
"cardId": {
"type": "number",
"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)."
},
"locale": {
"type": "string",
"description": "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": {
"type": "object",
"required": [
"countryResidence",
"travellers"
],
"properties": {
"intent": {
"enum": [
"forTourism",
"schengenArea",
"annual",
"studyInternship",
"whv",
"cruise",
"digitalNomad",
"expat",
"groupTravel",
"humanitarian",
"auPair",
"cancellation"
],
"type": "string",
"description": "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."
},
"endDate": {
"type": "string",
"description": "Trip end date (YYYY-MM-DD). Either endDate or durationDays must be provided (or use intent=\"annual\"/\"expat\")."
},
"currency": {
"type": "string",
"description": "ISO 4217 code for tripPrice. Defaults to the currency of countryResidence. Only pass if the user gave an explicit amount in another currency."
},
"isAnnual": {
"type": "boolean",
"description": "Annual / multi-trip cover. Defaults to false (auto-true for intent=\"annual\" or \"expat\")."
},
"startDate": {
"type": "string",
"description": "Trip start date (YYYY-MM-DD). Defaults to tomorrow when omitted."
},
"tripPrice": {
"type": "number",
"description": "TOTAL trip cost for ALL travellers (not per traveller). Omit unless the user explicitly asked for cancellation coverage."
},
"travellers": {
"type": "array",
"items": {
"type": "object",
"required": [
"age"
],
"properties": {
"age": {
"type": "number",
"description": "Age in years, 0–99."
}
}
},
"description": "All travellers covered by the policy, including children. Example: a couple aged 35 with a 5-year-old → [{age:35},{age:35},{age:5}]."
},
"durationDays": {
"type": "integer",
"maximum": 9007199254740991,
"description": "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.",
"exclusiveMinimum": 0
},
"studiesAmount": {
"type": "number",
"description": "Tuition fees to cover, in tripInfo.currency. Required when studiesInterruption=true."
},
"stateResidence": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"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. No quote is computed without it. The US territories are countries here, not states (a Puerto Rico resident is countryResidence \"PR\", never \"US\" + \"PR\")."
},
"tripBoughtDate": {
"type": "string",
"description": "Date the trip was booked (YYYY-MM-DD). Required when shouldCoverCancellation=true (most insurers require booking within ~30 days)."
},
"arrivalCountries": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"pattern": "^([A-Za-z]{2}|SCH|sch)$"
}
},
{
"type": "string"
}
],
"description": "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."
},
"countryResidence": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "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."
},
"studiesInterruption": {
"type": "boolean",
"description": "Cover interrupted studies (intent=\"studyInternship\" only). Defaults to false. Requires studiesAmount when true."
},
"shouldCoverCancellation": {
"type": "boolean",
"description": "Include trip cancellation coverage. Defaults to false."
},
"shouldCoverExtremeSports": {
"type": "boolean",
"description": "Cover extreme sports (mountaineering, off-piste skiing, diving, paragliding, climbing). Defaults to false; set true only if the user mentioned such activities."
}
},
"description": "Trip details."
},
"subscriptionId": {
"type": "string",
"description": "Existing subscription ID to update instead of creating a new one."
},
"displayCurrency": {
"type": "string",
"description": "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": {
"type": "array",
"items": {
"enum": [
"maternityCover",
"preExistingConditionsCover",
"personalLiability",
"baggage",
"travelDelay",
"directHospitalBilling",
"disability",
"searchAndRescue",
"earlyReturn",
"tripInterruption",
"electronics",
"cashAdvance",
"expatMaternity",
"expatDental",
"expatOptical"
],
"type": "string"
},
"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."
},
"cancelForAnyReason": {
"type": "boolean",
"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."
}
}
}