Serveur MCP

vhis

com.vhishongkong/vhis
Santé Public et accessible MCP 2025-11-25

Ce que fait ce MCP

Compares and prices Hong Kong VHIS health-insurance plans, including coverage, filed terms, premiums, renewal estimates, insurer rate histories, and adviser handoff.

adviser_notes
Adviser and scheme notes
Curated notes from licensed advisers and the scheme rules: how underwriting works, what usually happens with common conditions, switching, claims practice, tax. Guidance, not plan terms.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'adviser_notesArguments', 'properties': {'brand': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Brand', 'default': None}, 'topic': {'anyOf': [{'type': 'string', 'pattern': '^(underwriting|claims|scheme|insurer|renewal)$'}, {'type': 'null'}], 'title': 'Topic', 'default': None}, 'question': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Question', 'default': None}}}
Schéma de sortie
{'type': 'object', 'title': 'adviser_notesDictOutput', 'additionalProperties': True}
compare_plans
Compare two or three plans
Side by side on what actually differs: premium now and at 65, next-year range, deductible, room class, limits, area and each insurer's rate record. Use it for "which is better" and "why is one cheaper"; state the trade-off and let the person choose. Needs a key on the public server; without one it returns key_required and tells the user where to get one.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'compare_plansArguments', 'required': ['option_ids', 'age'], 'properties': {'age': {'type': 'integer', 'title': 'Age', 'maximum': 99, 'minimum': 0, 'description': 'Age last birthday, as the premium schedules state it'}, 'gender': {'type': 'string', 'title': 'Gender', 'default': 'F', 'pattern': '^[MF]$', 'description': 'M or F, as the schedules rate it'}, 'smoker': {'type': 'boolean', 'title': 'Smoker', 'default': False, 'description': 'True only if the person said they smoke; a few plans rate for it'}, 'option_ids': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Option Ids', 'maxItems': 3, 'minItems': 2, 'description': 'Option ids from an earlier result'}}}
Schéma de sortie
{'type': 'object', 'title': 'compare_plansDictOutput', 'additionalProperties': True}
create_lead
Hand over to a licensed adviser
Pass the person to a licensed adviser: saves the enquiry, emails them their shortlist, emails the adviser and returns a WhatsApp link and a reference. Only call it once they have given a name and a phone number or email and have said they want to be contacted. Never put a health detail in the note; the adviser asks directly. Needs a key on the public server; without one it returns key_required and tells the user where to get one.
Accès externe
Schéma d’entrée
{'type': 'object', 'title': 'create_leadArguments', 'required': ['name'], 'properties': {'age': {'anyOf': [{'type': 'integer', 'maximum': 99, 'minimum': 0}, {'type': 'null'}], 'title': 'Age', 'default': None}, 'name': {'type': 'string', 'title': 'Name', 'maxLength': 120}, 'note': {'anyOf': [{'type': 'string', 'maxLength': 1000}, {'type': 'null'}], 'title': 'Note', 'default': None, 'description': 'What they asked for. Never any health detail.'}, 'email': {'anyOf': [{'type': 'string', 'maxLength': 160}, {'type': 'null'}], 'title': 'Email', 'default': None}, 'phone': {'anyOf': [{'type': 'string', 'maxLength': 60}, {'type': 'null'}], 'title': 'Phone', 'default': None}, 'gender': {'anyOf': [{'type': 'string', 'pattern': '^[MF]$'}, {'type': 'null'}], 'title': 'Gender', 'default': None}, 'option_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Option Id', 'default': None, 'description': 'The plan they want to talk about'}, 'preferred_contact': {'anyOf': [{'type': 'string', 'pattern': '^(WhatsApp|Phone|Email)$'}, {'type': 'null'}], 'title': 'Preferred Contact', 'default': None}}}
Schéma de sortie
{'type': 'object', 'title': 'create_leadDictOutput', 'additionalProperties': True}
estimate_renewal
What a plan may cost at renewal
The premium at age plus one on the current schedule, which is certain unless the insurer refiles, plus a low, mid and high range built from this plan's own rate changes since 2021. Needs a key on the public server; without one it returns key_required and tells the user where to get one.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'estimate_renewalArguments', 'required': ['option_id', 'age'], 'properties': {'age': {'type': 'integer', 'title': 'Age', 'maximum': 99, 'minimum': 0, 'description': 'Age last birthday, as the premium schedules state it'}, 'gender': {'type': 'string', 'title': 'Gender', 'default': 'F', 'pattern': '^[MF]$', 'description': 'M or F, as the schedules rate it'}, 'smoker': {'type': 'boolean', 'title': 'Smoker', 'default': False, 'description': 'True only if the person said they smoke; a few plans rate for it'}, 'option_id': {'type': 'string', 'title': 'Option Id', 'description': 'Option id from an earlier result'}}}
Schéma de sortie
{'type': 'object', 'title': 'estimate_renewalDictOutput', 'additionalProperties': True}
fetch
Fetch one plan record
The full record behind a search id: what the plan pays and every term as filed, with the page of each clause.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'fetchArguments', 'required': ['id'], 'properties': {'id': {'type': 'string', 'title': 'Id', 'description': 'An id from search, e.g. F00070-06-000-02'}}}
Schéma de sortie
{'type': 'object', 'title': 'fetchDictOutput', 'additionalProperties': True}
find_plans
Find plans on coverage and price
The plan finder. Ranks every eligible VHIS plan on what it covers and what it really costs, and returns three explained picks (lowest cost over the period, best coverage for the money, most comprehensive) with a ranked list behind them. Coverage is read from each plan's Benefit Schedule; cost is the published premium for every year from this age, and the same again with the insurer's own filed rate changes applied. Age is the only thing it needs; pass whatever else the person has actually said.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'find_plansArguments', 'required': ['age'], 'properties': {'age': {'type': 'integer', 'title': 'Age', 'maximum': 99, 'minimum': 0, 'description': 'Age last birthday, as the premium schedules state it'}, 'room': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Room', 'default': None, 'description': 'Minimum hospital room class wanted: Ward | Semi-private | Private'}, 'limit': {'type': 'integer', 'title': 'Limit', 'default': 8, 'maximum': 50, 'minimum': 1}, 'needs': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'Needs', 'default': None, 'description': 'Must-haves they named, any of: full_cover, no_annual_limit, mental_health, cancer, outpatient_general, dental, maternity, chinese_medicine, health_check, emergency_assistance, cash_benefit, second_opinion, home_nursing, deductible_waiver'}, 'years': {'type': 'integer', 'title': 'Years', 'default': 10, 'maximum': 30, 'minimum': 1, 'description': 'Period the cost is totalled over'}, 'gender': {'type': 'string', 'title': 'Gender', 'default': 'F', 'pattern': '^[MF]$', 'description': 'M or F, as the schedules rate it'}, 'smoker': {'type': 'boolean', 'title': 'Smoker', 'default': False, 'description': 'True only if the person said they smoke; a few plans rate for it'}, 'currency': {'type': 'string', 'title': 'Currency', 'default': 'HKD', 'pattern': '^(HKD|USD)$'}, 'insurers': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'Insurers', 'default': None, 'description': 'Restrict to these brands, e.g. ["Bupa","AXA"]'}, 'priority': {'type': 'string', 'title': 'Priority', 'default': 'balanced', 'pattern': '^(price|balanced|coverage)$', 'description': 'What matters most to them'}, 'territory': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Territory', 'default': None, 'description': 'Where cover is needed: hong_kong | greater_china | asia | worldwide_ex_us | worldwide'}, 'budget_annual': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Budget Annual', 'default': None, 'description': 'Most they want to pay in the first year, in the plan currency'}, 'max_deductible': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Max Deductible', 'default': None, 'description': '0 for no deductible; leave empty to allow deductible plans, which cost less'}}}
Schéma de sortie
{'type': 'object', 'title': 'find_plansDictOutput', 'additionalProperties': True}
insurer_increases
Insurer and market rate changes
An insurer's rate record across all its VHIS plans since 2021, by year, alongside the market table with every insurer ranked from lowest average annual change to highest.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'insurer_increasesArguments', 'properties': {'brand': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Brand', 'default': None, 'description': 'Brand name, e.g. Bupa, AIA, AXA; omit for the market table'}}}
Schéma de sortie
{'type': 'object', 'title': 'insurer_increasesDictOutput', 'additionalProperties': True}
list_insurers
Insurers on this instance
Every insurer this server can price, with how many certified plans and rate tables each has loaded.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'list_insurersArguments', 'properties': {}}
Schéma de sortie
{'type': 'object', 'title': 'list_insurersDictOutput', 'additionalProperties': True}
plan_coverage
What one plan covers
What one plan actually pays, item by item from its own Benefit Schedule: full cover or the published cap on room and board, hospital charges, surgeon's fee, imaging, cancer treatment and psychiatric care, plus the annual and lifetime limits, room class, territory, extras and a coverage score. Use it for "what does this cover", "is surgery covered in full", "does it include outpatient".
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'plan_coverageArguments', 'required': ['cert'], 'properties': {'cert': {'type': 'string', 'title': 'Cert', 'description': 'VHIS certification number from an earlier result, e.g. F00070 or F00070-06-000-02'}}}
Schéma de sortie
{'type': 'object', 'title': 'plan_coverageDictOutput', 'additionalProperties': True}
plan_options
All options under one plan
Every option sold under one certification number, with its room class, deductible and area, priced at this age when an age is given, plus what the premium becomes every five years to twenty years out.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'plan_optionsArguments', 'required': ['cert'], 'properties': {'age': {'anyOf': [{'type': 'integer', 'maximum': 99, 'minimum': 0}, {'type': 'null'}], 'title': 'Age', 'default': None}, 'cert': {'type': 'string', 'title': 'Cert', 'description': 'VHIS certification number from an earlier result, e.g. F00070 or F00070-06-000-02'}, 'gender': {'type': 'string', 'title': 'Gender', 'default': 'F', 'pattern': '^[MF]$', 'description': 'M or F, as the schedules rate it'}, 'smoker': {'type': 'boolean', 'title': 'Smoker', 'default': False, 'description': 'True only if the person said they smoke; a few plans rate for it'}}}
Schéma de sortie
{'type': 'object', 'title': 'plan_optionsDictOutput', 'additionalProperties': True}
plan_terms
What one plan document states
The plan's terms as filed with the Health Bureau, field by field with the page each came from: guaranteed renewal age, entry ages, pre-existing condition schedule, waiting period, room class and higher-room rule, territory, full cover, limits, deductible basis, coinsurance, outpatient, psychiatric, cancer, extras, cancellation, switching and exclusions beyond the standard list. Use it for "does it cover X", "what is the rule on Y" and terms comparisons; cite the page.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'plan_termsArguments', 'required': ['cert'], 'properties': {'cert': {'type': 'string', 'title': 'Cert', 'description': 'VHIS certification number from an earlier result, e.g. F00070 or F00070-06-000-02'}}}
Schéma de sortie
{'type': 'object', 'title': 'plan_termsDictOutput', 'additionalProperties': True}
premium_history
A plan's premium record
How a plan's premium has moved since 2021: every schedule the insurer filed, the premium at this age under each one with the age held constant, the year-on-year changes and the average. Use it for "has this gone up" and "is this insurer stable".
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'premium_historyArguments', 'required': ['cert'], 'properties': {'age': {'type': 'integer', 'title': 'Age', 'default': 45, 'maximum': 99, 'minimum': 0}, 'cert': {'type': 'string', 'title': 'Cert', 'description': 'VHIS certification number from an earlier result, e.g. F00070 or F00070-06-000-02'}, 'gender': {'type': 'string', 'title': 'Gender', 'default': 'F', 'pattern': '^[MF]$', 'description': 'M or F, as the schedules rate it'}, 'smoker': {'type': 'boolean', 'title': 'Smoker', 'default': False, 'description': 'True only if the person said they smoke; a few plans rate for it'}}}
Schéma de sortie
{'type': 'object', 'title': 'premium_historyDictOutput', 'additionalProperties': True}
price_plans
Price plans
Every matching plan ranked by annual premium alone, with no view on coverage. Use it when someone asks for the cheapest, for a full list, or for one insurer's prices. When what the plan covers matters, use find_plans. Needs a key on the public server; without one it returns key_required and tells the user where to get one.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'price_plansArguments', 'required': ['age'], 'properties': {'age': {'type': 'integer', 'title': 'Age', 'maximum': 99, 'minimum': 0, 'description': 'Age last birthday, as the premium schedules state it'}, 'room': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Room', 'default': None, 'description': 'Ward | Semi-private | Private'}, 'limit': {'type': 'integer', 'title': 'Limit', 'default': 20, 'maximum': 200, 'minimum': 1}, 'gender': {'type': 'string', 'title': 'Gender', 'default': 'F', 'pattern': '^[MF]$', 'description': 'M or F, as the schedules rate it'}, 'smoker': {'type': 'boolean', 'title': 'Smoker', 'default': False, 'description': 'True only if the person said they smoke; a few plans rate for it'}, 'insurers': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'Insurers', 'default': None, 'description': 'Brand names to restrict to'}, 'plan_type': {'anyOf': [{'type': 'string', 'pattern': '^(Standard|Flexi)$'}, {'type': 'null'}], 'title': 'Plan Type', 'default': None}, 'max_deductible': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Max Deductible', 'default': None, 'description': 'Highest deductible acceptable; 0 for none'}, 'one_per_product': {'type': 'boolean', 'title': 'One Per Product', 'default': True, 'description': 'Cheapest matching option per product rather than every option'}}}
Schéma de sortie
{'type': 'object', 'title': 'price_plansDictOutput', 'additionalProperties': True}
search
Search the plan documents
Search every certified plan document and return matching records, each with an id, a title, a page link and the clause text. Call fetch with an id for that plan's full record. search_plan_terms is the same search with richer output; this pair exists because some clients look for tools named search and fetch.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'searchArguments', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'title': 'Limit', 'default': 10, 'maximum': 20, 'minimum': 1}, 'query': {'type': 'string', 'title': 'Query', 'description': 'What to look for, in plain words, e.g. "psychiatric treatment limit"'}}}
Schéma de sortie
{'type': 'object', 'title': 'searchDictOutput', 'additionalProperties': True}
search_plan_terms
Search the plan wording
Search the official Terms and Benefits of the certified plans and return the clauses, each with the plan, Part, Section, page and a link to that page. Use it for exclusions, waiting periods, limits, room class rules, territorial scope, definitions, renewal and cancellation. Never state what a plan says without it.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'search_plan_termsArguments', 'required': ['question'], 'properties': {'cert': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Cert', 'default': None, 'description': 'Scope to one plan when the person is looking at it'}, 'brand': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Brand', 'default': None, 'description': 'Scope to one insurer'}, 'limit': {'type': 'integer', 'title': 'Limit', 'default': 6, 'maximum': 20, 'minimum': 1}, 'question': {'type': 'string', 'title': 'Question', 'description': 'Plain words, e.g. "psychiatric treatment limit", "pre-existing conditions", "treatment in mainland China"'}}}
Schéma de sortie
{'type': 'object', 'title': 'search_plan_termsDictOutput', 'additionalProperties': True}
treatment_cost
What treatment costs and what a plan pays
What Hong Kong private hospitals published they actually billed for a procedure, hospital by hospital, with the doctor's fee and the hospital's charge separately, and what a named plan would pay of it. From the government's price transparency platform, not an estimate. Bills differ several-fold between hospitals, so never quote a single figure for Hong Kong without saying which hospital it belongs to.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'treatment_costArguments', 'properties': {'cert': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Cert', 'default': None, 'description': 'A certification number, to also work out what that plan pays of each bill'}, 'procedure': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Procedure', 'default': None, 'description': 'e.g. "hernia repair", "caesarean section", "knee arthroscopy"; omit for the list of what is published'}}}
Schéma de sortie
{'type': 'object', 'title': 'treatment_costDictOutput', 'additionalProperties': True}
Modifié
fetch
29 September 2026 03:03
Modifié
search
29 September 2026 03:03
Modifié
treatment_cost
29 September 2026 03:03
Modifié
list_insurers
29 September 2026 03:03
Modifié
adviser_notes
29 September 2026 03:03
Modifié
search_plan_terms
29 September 2026 03:03
Modifié
estimate_renewal
29 September 2026 03:03
Modifié
insurer_increases
29 September 2026 03:03
Modifié
premium_history
29 September 2026 03:03
Modifié
compare_plans
29 September 2026 03:03
Modifié
plan_options
29 September 2026 03:03
Modifié
plan_terms
29 September 2026 03:03
Modifié
plan_coverage
29 September 2026 03:03
Modifié
price_plans
29 September 2026 03:03
Modifié
find_plans
29 September 2026 03:03
Ajouté
fetch
25 September 2026 03:03
Ajouté
search
25 September 2026 03:03
Ajouté
treatment_cost
25 September 2026 03:03
Ajouté
create_lead
17 September 2026 12:38
Ajouté
list_insurers
17 September 2026 12:38
Ajouté
adviser_notes
17 September 2026 12:38
Ajouté
search_plan_terms
17 September 2026 12:38
Ajouté
estimate_renewal
17 September 2026 12:38
Ajouté
insurer_increases
17 September 2026 12:38
Ajouté
premium_history
17 September 2026 12:38
Ajouté
compare_plans
17 September 2026 12:38
Ajouté
plan_options
17 September 2026 12:38
Ajouté
plan_terms
17 September 2026 12:38
Ajouté
plan_coverage
17 September 2026 12:38
Ajouté
price_plans
17 September 2026 12:38