Swiss LAMal premium comparison (OFSP 2027), single or household; consented offer requests to SPI.
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.
Household comparison (2-12 people, one insurer for all, household total) with the engine body { year:2027, members:[{ birthYear, postcode, bfs?, franchise, accident:"MIT"|"OHN", careType:"any"|"BASE"|"PRAXIS"|"FLEX"|"TEL_DIG"|"PHARM" }] }: bfs only when the postcode spans several communes (the error lists the choices); franchise child 0-600, adult 300-2500; MIT means accident included. The result holds offers[] with people[], verification.criteria and submission.comparisonToken (24 h) but no cashback texts, consent question or request_id: take cashback.client_sentence and client_messages.consent_request from any compare_lamal_premiums result, mint any RFC 4122 UUID as request_id, then send ONE request_adviser_contact with comparison = verification.criteria and comparison_token = submission.comparisonToken instead of comparison_id. One person: compare_lamal_premiums.
Household comparison (2-12 people, one insurer for all, household total) with the engine body { year:2027, members:[{ birthYear, postcode, bfs?, franchise, accident:"MIT"|"OHN", careType:"any"|"BASE"|"PRAXIS"|"FLEX"|"TEL_DIG"|"PHARM" }] }: bfs only when the postcode spans several communes (the error lists the choices); franchise child 0-600, adult 300-2500; MIT means accident included. The result holds offers[] with people[], verification.criteria and submission.comparisonToken (24 h) but no cashback texts, consent question or request_id: take cashback.client_sentence and client_messages.consent_request from any compare_lamal_premiums result, mint any RFC 4122 UUID as request_id, then send ONE request_adviser_contact with comparison = verification.criteria and comparison_token = submission.comparisonToken instead of comparison_id. One person: compare_lamal_premiums.
| Argument | Type | Description |
|---|---|---|
| year* | integer | |
| members* | array |
{
"type": "object",
"title": "SPI — comparaison LAMal 2027",
"required": [
"year",
"members"
],
"properties": {
"year": {
"type": "integer",
"const": 2027
},
"members": {
"type": "array",
"items": {
"type": "object",
"required": [
"birthYear",
"postcode",
"franchise",
"accident",
"careType"
],
"properties": {
"bfs": {
"type": "string",
"pattern": "^[0-9]{1,6}$",
"description": "Commune OFS, obligatoire uniquement si le NPA couvre des régions ou des modèles disponibles différents. Vérifier requiresCommune dans places(postcode)."
},
"accident": {
"enum": [
"MIT",
"OHN"
],
"type": "string",
"description": "MIT : inclus ; OHN : exclu. Ne pas déduire ce choix de l’âge ou de la profession."
},
"careType": {
"enum": [
"any",
"BASE",
"PRAXIS",
"FLEX",
"TEL_DIG",
"PHARM"
],
"type": "string"
},
"postcode": {
"type": "string",
"pattern": "^[0-9]{4}$"
},
"birthYear": {
"type": "integer",
"maximum": 2027,
"minimum": 1907
},
"franchise": {
"enum": [
0,
100,
200,
300,
400,
500,
600,
1000,
1500,
2000,
2500
],
"type": "integer"
},
"currentPremium": {
"type": "string",
"pattern": "^[0-9]{1,5}([.,][0-9]{1,2})?$",
"description": "CHF par mois, base seule, nette de redistribution, avant subsides. Remplace la référence calculée."
},
"currentProduct": {
"type": "string",
"pattern": "^[0-9]+\\|[^|]+$",
"maxLength": 100,
"description": "Clé renvoyée par searchReferences ; facultative."
}
},
"additionalProperties": false
},
"maxItems": 12,
"minItems": 1
}
},
"additionalProperties": false
}Read-only compact comparison of official LAMal premiums from the OFSP data, without contact details. Use the exact birth year and ask for every material choice, including accident cover; model_group any means all categories, and all eligible imported models are included. The result carries comparison_id, submission.request_id, the ranked offers, the cashback sentence to say and the consent question to ask. Keep these technical fields yourself; the client fills no website form. Cashback never changes premiums or ranking. One person per call; for a household use compare_lamal_household.
| Argument | Type | Description |
|---|---|---|
| language | string | Language of the client texts and HTML pages; a region suffix is ignored. |
| birth_year* | integer | Exact four-digit birth year, not an age. |
| model_group* | string | any = all categories; BASE = free choice of doctor; PRAXIS = family doctor / HMO network; FLEX = hybrid model; TEL_DIG = telemedicine first; PHARM = pharmacy first. |
| postal_code* | string | |
| municipality | string | Official municipality name; required with ambiguous region/model availability unless municipality_bfs is given. |
| premium_year* |
Return a link when the client prefers to complete a website form, using comparison_id from the comparison. No contact details, lead or email are sent. When the web form is disabled the server answers 503 adviser_unavailable: offer [email protected] instead. For a client who asks you to send the request in this conversation, use request_adviser_contact after explicit consent instead. Swiss Premium Insurance assistance is optional; clients may apply directly with insurers.
| Argument | Type | Description |
|---|---|---|
| agent | object | |
| agentContext | object | Deprecated alias of agent; not with agent. |
| comparison_id* | string |
{
"type": "object",
"required": [
"comparison_id"
],
"properties": {
"agent": {
"type": "object",
"required": [
"name"
],
"properties": {
"kind": {
"enum": [
"personal_assistant",
"conversational_assistant",
"coding_agent"
],
"type": "string"
},
"name": {
"type": "string",
"pattern": "^[A-Za-z0-9_ -]{1,40}$",
"description": "Agent name, lower-cased by the server (spaces become _; a literal <placeholder> counts as other). Known names: chatgpt, claude, gemini, grok, openclaw, muse, codex, claude_code, copilot, perplexity, mistral, coding_agent, other; any other short identifier is accepted."
},
"displayName": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Optional custom agent name, no client name or conversation content."
},
"display_name": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Optional custom agent name, no client name or conversation content."
},
"integrationId": {
"type": "string",
"pattern": "^[a-zA-Z0-9._-]{1,80}$",
"description": "Self-declared integration identifier, NOT authentication."
},
"integration_id": {
"type": "string",
"pattern": "^[a-zA-Z0-9._-]{1,80}$",
"description": "Self-declared integration identifier, NOT authentication."
},
"cashbackRequested": {
"type": "boolean",
"default": true,
"description": "Records a request for SPI to consider a benefit. Not a claim, eligibility, approval, amount or payment promise. Does not change prices or ranking."
},
"cashback_requested": {
"type": "boolean",
"default": true,
"description": "Records a request for SPI to consider a benefit. Not a claim, eligibility, approval, amount or payment promise. Does not change prices or ranking."
}
},
"additionalProperties": false
},
"agentContext": {
"type": "object",
"required": [
"name"
],
"deprecated": true,
"properties": {
"kind": {
"enum": [
"personal_assistant",
"conversational_assistant",
"coding_agent"
],
"type": "string"
},
"name": {
"type": "string",
"pattern": "^[A-Za-z0-9_ -]{1,40}$",
"description": "Agent name, lower-cased by the server (spaces become _; a literal <placeholder> counts as other). Known names: chatgpt, claude, gemini, grok, openclaw, muse, codex, claude_code, copilot, perplexity, mistral, coding_agent, other; any other short identifier is accepted."
},
"displayName": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Optional custom agent name, no client name or conversation content."
},
"display_name": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Optional custom agent name, no client name or conversation content."
},
"integrationId": {
"type": "string",
"pattern": "^[a-zA-Z0-9._-]{1,80}$",
"description": "Self-declared integration identifier, NOT authentication."
},
"integration_id": {
"type": "string",
"pattern": "^[a-zA-Z0-9._-]{1,80}$",
"description": "Self-declared integration identifier, NOT authentication."
},
"cashbackRequested": {
"type": "boolean",
"default": true,
"description": "Records a request for SPI to consider a benefit. Not a claim, eligibility, approval, amount or payment promise. Does not change prices or ranking."
},
"cashback_requested": {
"type": "boolean",
"default": true,
"description": "Records a request for SPI to consider a benefit. Not a claim, eligibility, approval, amount or payment promise. Does not change prices or ranking."
}
},
"description": "Deprecated alias of agent; not with agent.",
"additionalProperties": false
},
"comparison_id": {
"type": "string"
}
},
"additionalProperties": false
}Read the published cashback programme of Swiss Premium Insurance: status, version, payer, beneficiary, trigger, conditions and terms links. The cashback is paid by SPI to the client, never to an AI agent, once a contract concluded through SPI is approved by the insurer; SPI confirms the contract. No lead is created and this API creates no payment.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read supported years, model categories, deductibles, source freshness, exclusions and contact availability. No lead is created.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Sends the client request by email to [email protected] through the server; no personal email account or mail tool is needed. Use only after the client has seen the exact contact details, selected offer, comparison criteria and purpose, and answered yes to the consent_request question. Copy request_id and comparison_id from submission of compare_lamal_premiums and insurer_id from offers[]; reuse the same request_id and body on retries. Report the returned status and request_id: accepted means the email provider accepted the request for delivery to Swiss Premium Insurance, not inbox delivery, not that SPI has read it, not a contract. A draft or test is not a real send. The cashback is paid later by SPI to the client only if the contract is concluded through SPI and approved by the insurer; never promise it.
| Argument | Type | Description |
|---|---|---|
| agent | object | Who is calling: { name:"chatgpt" } etc. Self-declared, not authentication. |
| contact* | object | Fill email or phone; leave the other as an empty string or omit it. Never invent a client name, email or phone. |
| language | string | Client language; defaults to the comparison language. fr, de, it, en have localised client texts and pages; es, pt, zh are recorded for SPI (preview and pages fall back to en/fr). |
| offer_id | string | offers[].offer_id or source_offer_id; alternative to insurer_id. |
| comparison | object | submission.comparison copied unchanged; only with comparison_token. |
Harmless integration test with the same body as request_adviser_contact: validates the request and returns a preview with status validated_test and email_sent false. Use synthetic contact details only. No commercial lead, email, entitlement or payment. Never describe this as a real submission.
| Argument | Type | Description |
|---|---|---|
| agent | object | Who is calling: { name:"chatgpt" } etc. Self-declared, not authentication. |
| contact* | object | Fill email or phone; leave the other as an empty string or omit it. Never invent a client name, email or phone. |
| language | string | Client language; defaults to the comparison language. fr, de, it, en have localised client texts and pages; es, pt, zh are recorded for SPI (preview and pages fall back to en/fr). |
| offer_id | string | offers[].offer_id or source_offer_id; alternative to insurer_id. |
| comparison | object | submission.comparison copied unchanged; only with comparison_token. |
| insurer_id | integer | string | insurer_id of the offer the client chose, from offers[]. |
| request_id* | string |
| integer |
| Tariff year: always 2027, the only imported year (metadata.supported_years). Required, no default. |
| deductible_chf* | integer | Annual deductible: adults (19 or older in 2027) 300, 500, 1000, 1500, 2000 or 2500; children (18 or under) 0, 100, 200, 300, 400, 500 or 600. No interpolation. |
| municipality_bfs | string |
| accident_included* | boolean | Explicit JSON boolean required (not the string "true"). Do not infer legal eligibility to exclude accident cover. |
{
"type": "object",
"required": [
"premium_year",
"postal_code",
"birth_year",
"deductible_chf",
"accident_included",
"model_group"
],
"properties": {
"language": {
"enum": [
"fr",
"de",
"it",
"en"
],
"type": "string",
"default": "fr",
"description": "Language of the client texts and HTML pages; a region suffix is ignored."
},
"birth_year": {
"type": "integer",
"maximum": 2027,
"minimum": 1907,
"description": "Exact four-digit birth year, not an age."
},
"model_group": {
"enum": [
"any",
"BASE",
"PRAXIS",
"FLEX",
"TEL_DIG",
"PHARM"
],
"type": "string",
"description": "any = all categories; BASE = free choice of doctor; PRAXIS = family doctor / HMO network; FLEX = hybrid model; TEL_DIG = telemedicine first; PHARM = pharmacy first."
},
"postal_code": {
"type": "string",
"pattern": "^[0-9]{4}$"
},
"municipality": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Official municipality name; required with ambiguous region/model availability unless municipality_bfs is given."
},
"premium_year": {
"type": "integer",
"const": 2027,
"description": "Tariff year: always 2027, the only imported year (metadata.supported_years). Required, no default."
},
"deductible_chf": {
"enum": [
0,
100,
200,
300,
400,
500,
600,
1000,
1500,
2000,
2500
],
"type": "integer",
"description": "Annual deductible: adults (19 or older in 2027) 300, 500, 1000, 1500, 2000 or 2500; children (18 or under) 0, 100, 200, 300, 400, 500 or 600. No interpolation."
},
"municipality_bfs": {
"type": "string",
"pattern": "^[0-9]{1,6}$"
},
"accident_included": {
"type": "boolean",
"description": "Explicit JSON boolean required (not the string \"true\"). Do not infer legal eligibility to exclude accident cover."
}
},
"description": "Criteria for one person. For a household (2-12 people, one insurer for all) use calculateHousehold.",
"additionalProperties": false
}| insurer_id | integer | string | insurer_id of the offer the client chose, from offers[]. |
| request_id* | string | Copy submission.request_id from the quote (any RFC 4122 UUID). Reuse the same value and body on every retry. |
| comparison_id | string | comparison_id from the quote; valid 30 days. Preferred. |
| client_consent* | boolean | true only after the client explicitly answered yes to consent_request. Never infer consent from a comparison. |
| comparison_token | string | submission.comparisonToken with the identical submission.comparison; alternative to comparison_id. |
| subsidy_requested | boolean | Client wants information on premium subsidies. |
| cashback_terms_version | string | cashback.version shown to the client; 409 cashback_terms_outdated when stale. |
| supplementary_interest | boolean | Client also wants supplementary (LCA) offers; enables the LCA cashback. |
{
"type": "object",
"anyOf": [
{
"required": [
"comparison_id"
]
},
{
"required": [
"comparison",
"comparison_token"
]
}
],
"required": [
"request_id",
"contact",
"client_consent"
],
"properties": {
"agent": {
"type": "object",
"required": [
"name"
],
"properties": {
"kind": {
"enum": [
"personal_assistant",
"conversational_assistant",
"coding_agent"
],
"type": "string"
},
"name": {
"type": "string",
"pattern": "^[A-Za-z0-9_ -]{1,40}$",
"description": "Agent name, lower-cased by the server (spaces become _; a literal <placeholder> counts as other). Known names: chatgpt, claude, gemini, grok, openclaw, muse, codex, claude_code, copilot, perplexity, mistral, coding_agent, other; any other short identifier is accepted."
},
"displayName": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Optional custom agent name, no client name or conversation content."
},
"display_name": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Optional custom agent name, no client name or conversation content."
},
"integrationId": {
"type": "string",
"pattern": "^[a-zA-Z0-9._-]{1,80}$",
"description": "Self-declared integration identifier, NOT authentication."
},
"integration_id": {
"type": "string",
"pattern": "^[a-zA-Z0-9._-]{1,80}$",
"description": "Self-declared integration identifier, NOT authentication."
},
"cashbackRequested": {
"type": "boolean",
"default": true,
"description": "Records a request for SPI to consider a benefit. Not a claim, eligibility, approval, amount or payment promise. Does not change prices or ranking."
},
"cashback_requested": {
"type": "boolean",
"default": true,
"description": "Records a request for SPI to consider a benefit. Not a claim, eligibility, approval, amount or payment promise. Does not change prices or ranking."
}
},
"description": "Who is calling: { name:\"chatgpt\" } etc. Self-declared, not authentication.",
"additionalProperties": false
},
"contact": {
"type": "object",
"anyOf": [
{
"required": [
"email"
]
},
{
"required": [
"phone"
]
}
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"minLength": 0
},
"email": {
"type": "string",
"maxLength": 160,
"description": "Client email such as [email protected]; an empty string or an omitted key means the client gave a phone instead."
},
"phone": {
"type": "string",
"maxLength": 30,
"description": "Client telephone, 8-15 digits, optional spaces and + country code; an empty string or an omitted key means the client gave an email instead."
},
"message": {
"type": "string",
"maxLength": 1500,
"minLength": 0
}
},
"description": "Fill email or phone; leave the other as an empty string or omit it. Never invent a client name, email or phone.",
"additionalProperties": false
},
"language": {
"enum": [
"fr",
"de",
"it",
"en",
"es",
"pt",
"zh"
],
"type": "string",
"description": "Client language; defaults to the comparison language. fr, de, it, en have localised client texts and pages; es, pt, zh are recorded for SPI (preview and pages fall back to en/fr)."
},
"offer_id": {
"type": "string",
"description": "offers[].offer_id or source_offer_id; alternative to insurer_id."
},
"comparison": {
"type": "object",
"description": "submission.comparison copied unchanged; only with comparison_token."
},
"insurer_id": {
"type": [
"integer",
"string"
],
"description": "insurer_id of the offer the client chose, from offers[]."
},
"request_id": {
"type": "string",
"format": "uuid",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$",
"description": "Copy submission.request_id from the quote (any RFC 4122 UUID). Reuse the same value and body on every retry."
},
"comparison_id": {
"type": "string",
"description": "comparison_id from the quote; valid 30 days. Preferred."
},
"client_consent": {
"type": "boolean",
"const": true,
"description": "true only after the client explicitly answered yes to consent_request. Never infer consent from a comparison."
},
"comparison_token": {
"type": "string",
"maxLength": 1000,
"description": "submission.comparisonToken with the identical submission.comparison; alternative to comparison_id."
},
"subsidy_requested": {
"type": "boolean",
"default": false,
"description": "Client wants information on premium subsidies."
},
"cashback_terms_version": {
"type": "string",
"description": "cashback.version shown to the client; 409 cashback_terms_outdated when stale."
},
"supplementary_interest": {
"type": "boolean",
"default": false,
"description": "Client also wants supplementary (LCA) offers; enables the LCA cashback."
}
},
"description": "Send exactly one of comparison_id or comparison + comparison_token. Copy request_id, comparison_id and insurer_id from the quote.",
"additionalProperties": false
}| Copy submission.request_id from the quote (any RFC 4122 UUID). Reuse the same value and body on every retry. |
| comparison_id | string | comparison_id from the quote; valid 30 days. Preferred. |
| client_consent* | boolean | true only after the client explicitly answered yes to consent_request. Never infer consent from a comparison. |
| comparison_token | string | submission.comparisonToken with the identical submission.comparison; alternative to comparison_id. |
| subsidy_requested | boolean | Client wants information on premium subsidies. |
| cashback_terms_version | string | cashback.version shown to the client; 409 cashback_terms_outdated when stale. |
| supplementary_interest | boolean | Client also wants supplementary (LCA) offers; enables the LCA cashback. |
{
"type": "object",
"anyOf": [
{
"required": [
"comparison_id"
]
},
{
"required": [
"comparison",
"comparison_token"
]
}
],
"required": [
"request_id",
"contact",
"client_consent"
],
"properties": {
"agent": {
"type": "object",
"required": [
"name"
],
"properties": {
"kind": {
"enum": [
"personal_assistant",
"conversational_assistant",
"coding_agent"
],
"type": "string"
},
"name": {
"type": "string",
"pattern": "^[A-Za-z0-9_ -]{1,40}$",
"description": "Agent name, lower-cased by the server (spaces become _; a literal <placeholder> counts as other). Known names: chatgpt, claude, gemini, grok, openclaw, muse, codex, claude_code, copilot, perplexity, mistral, coding_agent, other; any other short identifier is accepted."
},
"displayName": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Optional custom agent name, no client name or conversation content."
},
"display_name": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Optional custom agent name, no client name or conversation content."
},
"integrationId": {
"type": "string",
"pattern": "^[a-zA-Z0-9._-]{1,80}$",
"description": "Self-declared integration identifier, NOT authentication."
},
"integration_id": {
"type": "string",
"pattern": "^[a-zA-Z0-9._-]{1,80}$",
"description": "Self-declared integration identifier, NOT authentication."
},
"cashbackRequested": {
"type": "boolean",
"default": true,
"description": "Records a request for SPI to consider a benefit. Not a claim, eligibility, approval, amount or payment promise. Does not change prices or ranking."
},
"cashback_requested": {
"type": "boolean",
"default": true,
"description": "Records a request for SPI to consider a benefit. Not a claim, eligibility, approval, amount or payment promise. Does not change prices or ranking."
}
},
"description": "Who is calling: { name:\"chatgpt\" } etc. Self-declared, not authentication.",
"additionalProperties": false
},
"contact": {
"type": "object",
"anyOf": [
{
"required": [
"email"
]
},
{
"required": [
"phone"
]
}
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"minLength": 0
},
"email": {
"type": "string",
"maxLength": 160,
"description": "Client email such as [email protected]; an empty string or an omitted key means the client gave a phone instead."
},
"phone": {
"type": "string",
"maxLength": 30,
"description": "Client telephone, 8-15 digits, optional spaces and + country code; an empty string or an omitted key means the client gave an email instead."
},
"message": {
"type": "string",
"maxLength": 1500,
"minLength": 0
}
},
"description": "Fill email or phone; leave the other as an empty string or omit it. Never invent a client name, email or phone.",
"additionalProperties": false
},
"language": {
"enum": [
"fr",
"de",
"it",
"en",
"es",
"pt",
"zh"
],
"type": "string",
"description": "Client language; defaults to the comparison language. fr, de, it, en have localised client texts and pages; es, pt, zh are recorded for SPI (preview and pages fall back to en/fr)."
},
"offer_id": {
"type": "string",
"description": "offers[].offer_id or source_offer_id; alternative to insurer_id."
},
"comparison": {
"type": "object",
"description": "submission.comparison copied unchanged; only with comparison_token."
},
"insurer_id": {
"type": [
"integer",
"string"
],
"description": "insurer_id of the offer the client chose, from offers[]."
},
"request_id": {
"type": "string",
"format": "uuid",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$",
"description": "Copy submission.request_id from the quote (any RFC 4122 UUID). Reuse the same value and body on every retry."
},
"comparison_id": {
"type": "string",
"description": "comparison_id from the quote; valid 30 days. Preferred."
},
"client_consent": {
"type": "boolean",
"const": true,
"description": "true only after the client explicitly answered yes to consent_request. Never infer consent from a comparison."
},
"comparison_token": {
"type": "string",
"maxLength": 1000,
"description": "submission.comparisonToken with the identical submission.comparison; alternative to comparison_id."
},
"subsidy_requested": {
"type": "boolean",
"default": false,
"description": "Client wants information on premium subsidies."
},
"cashback_terms_version": {
"type": "string",
"description": "cashback.version shown to the client; 409 cashback_terms_outdated when stale."
},
"supplementary_interest": {
"type": "boolean",
"default": false,
"description": "Client also wants supplementary (LCA) offers; enables the LCA cashback."
}
},
"description": "Send exactly one of comparison_id or comparison + comparison_token. Copy request_id, comparison_id and insurer_id from the quote.",
"additionalProperties": false
}