Koskamo

VHIS Hong Kong MCP

An MCP server providing access to 579 certified Voluntary Health Insurance Scheme plans in Hong Kong. It allows agents and users to price plans, read filed terms and benefit schedules, view premium increase history since 2021, and compare options across 28 insurers including AIA, AXA, and Bupa.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

VHIS Hong Kong MCP logo, by VHIS Hong KongVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by VHIS Hong Kong
You need:Open tier needs no keyA free key adds the ranked price list, comparison and renewal estimates
MCP endpoint (Streamable HTTP)
https://mcp.vhishongkong.com/mcp
Vendor documentation

What its tools do

16 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

Can change data (1)

16 of 16 have a description · 16 of 16 declare behavior hints · 7 of 15 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to vhishongkong.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Price all 579 VHIS certified plans
  • Read filed terms and benefit schedules
  • View premium increase history since 2021
  • Compare plans and get renewal estimates

Source and maintenance

Vendor evidenceRegistry 1.0.0
Maintenance checked

Protocol and capabilities

Server
vhis-hongkong 1.27.0
MCP protocol negotiated in check
2025-11-25
Tools
16 advertised
Resources
2 advertised
Resource templates
0 advertised
Prompts
1 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "subscribe": false,
    "listChanged": false
  },
  "experimental": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Voluntary Health Insurance Scheme (VHIS) plans certified in Hong Kong, priced from the insurers' own published premium schedules and read from their own Benefit Schedules and Terms and Benefits. Start with find_plans: people decide on coverage and price, and it ranks on both, returning three explained picks. On the public server the open tier covers coverage, plan wording, the filed rate record and those three picks; the ranked market table, the plain price list and comparison need a free key. The adviser hand-off is open to everyone: a person who asks to be put in touch should never be stopped by a key. price_plans is the plain price list when someone only wants the cheapest. plan_coverage says what one plan pays, search_plan_terms quotes the wording, premium_history and insurer_increases give the filed rate record. treatment_cost says what a procedure actually bills in each private hospital and what a plan pays of it. Rules that matter: quote only figures a tool returned, never invent a premium, a benefit or an insurer, and if a tool returns nothing say so. Premiums are annual, in the plan currency, excluding the Insurance Authority levy. Rate history is a track record, never a forecast. Do not tell anyone whether they will be accepted or which plan to buy; underwriting is decided at issue and the choice is theirs.

Tools

16 advertised

find_plans — Find plans on coverage and price
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

find_plans input schema
{
  "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": null,
      "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": null,
      "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": null,
      "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": null,
      "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": null,
      "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": null,
      "description": "0 for no deductible; leave empty to allow deductible plans, which cost less"
    }
  }
}
find_plans output schema
{
  "type": "object",
  "title": "find_plansDictOutput",
  "additionalProperties": true
}
find_plans annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
price_plans — Price plans
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

price_plans input schema
{
  "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": null,
      "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": null,
      "description": "Brand names to restrict to"
    },
    "plan_type": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^(Standard|Flexi)$"
        },
        {
          "type": "null"
        }
      ],
      "title": "Plan Type",
      "default": null
    },
    "max_deductible": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Max Deductible",
      "default": null,
      "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"
    }
  }
}
price_plans output schema
{
  "type": "object",
  "title": "price_plansDictOutput",
  "additionalProperties": true
}
price_plans annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
plan_coverage — What one plan covers
Advertised by the server during the last successful anonymous check.
Advertised read-only

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".

plan_coverage input schema
{
  "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"
    }
  }
}
plan_coverage output schema
{
  "type": "object",
  "title": "plan_coverageDictOutput",
  "additionalProperties": true
}
plan_coverage annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
plan_terms — What one plan document states
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

plan_terms input schema
{
  "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"
    }
  }
}
plan_terms output schema
{
  "type": "object",
  "title": "plan_termsDictOutput",
  "additionalProperties": true
}
plan_terms annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
plan_options — All options under one plan
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

plan_options input schema
{
  "type": "object",
  "title": "plan_optionsArguments",
  "required": [
    "cert"
  ],
  "properties": {
    "age": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 99,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Age",
      "default": null
    },
    "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"
    }
  }
}
plan_options output schema
{
  "type": "object",
  "title": "plan_optionsDictOutput",
  "additionalProperties": true
}
plan_options annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
compare_plans — Compare two or three plans
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

compare_plans input schema
{
  "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"
    }
  }
}
compare_plans output schema
{
  "type": "object",
  "title": "compare_plansDictOutput",
  "additionalProperties": true
}
compare_plans annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
premium_history — A plan's premium record
Advertised by the server during the last successful anonymous check.
Advertised read-only

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".

premium_history input schema
{
  "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"
    }
  }
}
premium_history output schema
{
  "type": "object",
  "title": "premium_historyDictOutput",
  "additionalProperties": true
}
premium_history annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
insurer_increases — Insurer and market rate changes
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

insurer_increases input schema
{
  "type": "object",
  "title": "insurer_increasesArguments",
  "properties": {
    "brand": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Brand",
      "default": null,
      "description": "Brand name, e.g. Bupa, AIA, AXA; omit for the market table"
    }
  }
}
insurer_increases output schema
{
  "type": "object",
  "title": "insurer_increasesDictOutput",
  "additionalProperties": true
}
insurer_increases annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
estimate_renewal — What a plan may cost at renewal
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

estimate_renewal input schema
{
  "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"
    }
  }
}
estimate_renewal output schema
{
  "type": "object",
  "title": "estimate_renewalDictOutput",
  "additionalProperties": true
}
estimate_renewal annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search_plan_terms — Search the plan wording
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

search_plan_terms input schema
{
  "type": "object",
  "title": "search_plan_termsArguments",
  "required": [
    "question"
  ],
  "properties": {
    "cert": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Cert",
      "default": null,
      "description": "Scope to one plan when the person is looking at it"
    },
    "brand": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Brand",
      "default": null,
      "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\""
    }
  }
}
search_plan_terms output schema
{
  "type": "object",
  "title": "search_plan_termsDictOutput",
  "additionalProperties": true
}
search_plan_terms annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
adviser_notes — Adviser and scheme notes
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

adviser_notes input schema
{
  "type": "object",
  "title": "adviser_notesArguments",
  "properties": {
    "brand": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Brand",
      "default": null
    },
    "topic": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^(underwriting|claims|scheme|insurer|renewal)$"
        },
        {
          "type": "null"
        }
      ],
      "title": "Topic",
      "default": null
    },
    "question": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Question",
      "default": null
    }
  }
}
adviser_notes output schema
{
  "type": "object",
  "title": "adviser_notesDictOutput",
  "additionalProperties": true
}
adviser_notes annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_insurers — Insurers on this instance
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every insurer this server can price, with how many certified plans and rate tables each has loaded.

list_insurers input schema
{
  "type": "object",
  "title": "list_insurersArguments",
  "properties": {}
}
list_insurers output schema
{
  "type": "object",
  "title": "list_insurersDictOutput",
  "additionalProperties": true
}
list_insurers annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
treatment_cost — What treatment costs and what a plan pays
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

treatment_cost input schema
{
  "type": "object",
  "title": "treatment_costArguments",
  "properties": {
    "cert": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Cert",
      "default": null,
      "description": "A certification number, to also work out what that plan pays of each bill"
    },
    "procedure": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Procedure",
      "default": null,
      "description": "e.g. \"hernia repair\", \"caesarean section\", \"knee arthroscopy\"; omit for the list of what is published"
    }
  }
}
treatment_cost output schema
{
  "type": "object",
  "title": "treatment_costDictOutput",
  "additionalProperties": true
}
treatment_cost annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search — Search the plan documents
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

search input schema
{
  "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\""
    }
  }
}
search output schema
{
  "type": "object",
  "title": "searchDictOutput",
  "additionalProperties": true
}
search annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
fetch — Fetch one plan record
Advertised by the server during the last successful anonymous check.
Advertised read-only

The full record behind a search id: what the plan pays and every term as filed, with the page of each clause.

fetch input schema
{
  "type": "object",
  "title": "fetchArguments",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "title": "Id",
      "description": "An id from search, e.g. F00070-06-000-02"
    }
  }
}
fetch output schema
{
  "type": "object",
  "title": "fetchDictOutput",
  "additionalProperties": true
}
fetch annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_lead — Hand over to a licensed adviser
Advertised by the server during the last successful anonymous check.
Open-world

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.

create_lead input schema
{
  "type": "object",
  "title": "create_leadArguments",
  "required": [
    "name"
  ],
  "properties": {
    "age": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 99,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Age",
      "default": null
    },
    "name": {
      "type": "string",
      "title": "Name",
      "maxLength": 120
    },
    "note": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 1000
        },
        {
          "type": "null"
        }
      ],
      "title": "Note",
      "default": null,
      "description": "What they asked for. Never any health detail."
    },
    "email": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 160
        },
        {
          "type": "null"
        }
      ],
      "title": "Email",
      "default": null
    },
    "phone": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 60
        },
        {
          "type": "null"
        }
      ],
      "title": "Phone",
      "default": null
    },
    "gender": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^[MF]$"
        },
        {
          "type": "null"
        }
      ],
      "title": "Gender",
      "default": null
    },
    "option_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Option Id",
      "default": null,
      "description": "The plan they want to talk about"
    },
    "preferred_contact": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^(WhatsApp|Phone|Email)$"
        },
        {
          "type": "null"
        }
      ],
      "title": "Preferred Contact",
      "default": null
    }
  }
}
create_lead output schema
{
  "type": "object",
  "title": "create_leadDictOutput",
  "additionalProperties": true
}
create_lead annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}

Prompts

1 advertised

shortlist — Shortlist a plan for a client

Advertised by the server during the last successful anonymous check.

A working brief: find, explain and check the wording for one person.

age
No description (required)
notes
No description

Resources

2 advertised

res_insurers — Certified insurers

Advertised by the server during the last successful anonymous check.

res_insurers URI
vhis://insurers

MIME type: application/json

res_increases — Market rate changes since 2021

Advertised by the server during the last successful anonymous check.

res_increases URI
vhis://market/increases

MIME type: application/json

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (3 of 3 answered).

  1. 2026-11-06: 1 of 1 checks answered
  2. 2026-11-07: 2 of 2 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
6620 ms
95th percentile latency
6620 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 6620 ms · metadata changed · 16 tool(s), 2 resource(s), 0 resource template(s), 1 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http vhis-hong-kong-mcp https://mcp.vhishongkong.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add vhis-hong-kong-mcp --url https://mcp.vhishongkong.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable vhis-hong-kong-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "vhis-hong-kong-mcp": {
      "url": "https://mcp.vhishongkong.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "vhis-hong-kong-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.vhishongkong.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start vhis-hong-kong-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "vhis-hong-kong-mcp": {
      "type": "http",
      "url": "https://mcp.vhishongkong.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http vhis-hong-kong-mcp https://mcp.vhishongkong.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.vhishongkong.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "vhis-hong-kong-mcp": {
      "serverUrl": "https://mcp.vhishongkong.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like VHIS Hong Kong MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run VHIS Hong Kong MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing