# PensionHunter (remote · mcp.pensionhunter.ai)

Cross-border pension facts: country coverage, sourced rules, dated deadlines and employer lookups.

- Trust score: 72/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-16

## Components

- remote · `mcp.pensionhunter.ai`: 72/100 (this document), [markdown](https://verifymcp.io/servers/ai-pensionhunter-pensionhunter/mcp.md), [page](https://verifymcp.io/servers/ai-pensionhunter-pensionhunter/mcp)

## Channel facts

- Endpoint: `https://mcp.pensionhunter.ai`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.10.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-16.

- **Endpoint Security**: 80/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 59/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4065 tokens (~369/item across 11 items; 11 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 10/100
  - Stability observed for 3 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 11 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 12 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the PensionHunter MCP server?

PensionHunter is a hosted endpoint at https://mcp.pensionhunter.ai/, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http ai-pensionhunter-pensionhunter 'https://mcp.pensionhunter.ai/'
```

### Cursor

```json
{
  "mcpServers": {
    "ai-pensionhunter-pensionhunter": {
      "url": "https://mcp.pensionhunter.ai/"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "ai-pensionhunter-pensionhunter": {
      "type": "http",
      "url": "https://mcp.pensionhunter.ai/"
    }
  }
}
```

### Codex

```toml
[mcp_servers.ai-pensionhunter-pensionhunter]
url = "https://mcp.pensionhunter.ai/"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ai-pensionhunter-pensionhunter": {
      "type": "remote",
      "url": "https://mcp.pensionhunter.ai/",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add ai-pensionhunter-pensionhunter --url 'https://mcp.pensionhunter.ai/' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  ai-pensionhunter-pensionhunter:
    url: "https://mcp.pensionhunter.ai/"
```

### Netclaw

```json
{
  "McpServers": {
    "ai-pensionhunter-pensionhunter": {
      "Transport": "http",
      "Url": "https://mcp.pensionhunter.ai/"
    }
  }
}
```

### Vellum

```bash
assistant mcp add ai-pensionhunter-pensionhunter -t streamable-http -u 'https://mcp.pensionhunter.ai/'
```

### Other

```json
{
  "mcpServers": {
    "ai-pensionhunter-pensionhunter": {
      "type": "http",
      "url": "https://mcp.pensionhunter.ai/"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-16 (score 72, +1)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “check_work_history” rewrote its description, which is the text the model reads
- [security] Tool “country_pension_facts” rewrote its description, which is the text the model reads
- [security] Tool “resolve_employer” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 2235 → 4065
- [functional] Schema quality: good → excellent
- [functional] Server version: 1.8.0 → 1.10.0
- [functional] New tool “deadline_check”
- [functional] New tool “gpfr_fund_count”
- [functional] New tool “gpfr_info”
- [functional] New tool “gpfr_register”
- [functional] New tool “gpfr_status”
- [cosmetic] “check_work_history” added an optional parameter “question”
- [cosmetic] “country_pension_facts” added an optional parameter “pensionType”
- [cosmetic] “country_pension_facts” added an optional parameter “question”

### 2026-10-15 (score 71, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “list_covered_countries” rewrote its description, which is the text the model reads
- [cosmetic] “authority_answer” reworded the description of “language”
- [cosmetic] “check_work_history” reworded the description of “language”
- [cosmetic] “country_pension_facts” reworded the description of “language”
- [cosmetic] “create_order_link” reworded the description of “language”
- [cosmetic] “list_covered_countries” reworded the description of “language”
- [cosmetic] “resolve_employer” reworded the description of “language”

### 2026-10-14 (score 71, −2)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “authority_answer” rewrote its description, which is the text the model reads
- [security] Tool “create_order_link” rewrote its description, which is the text the model reads
- [security] Tool “check_work_history” rewrote its description, which is the text the model reads
- [security] Tool “country_pension_facts” rewrote its description, which is the text the model reads
- [security] Tool “list_covered_countries” rewrote its description, which is the text the model reads
- [security] Tool “resolve_employer” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: pass → fail
- [functional improvement] Stability: unverified → 0.03
- [functional] Server version: 1.6.0 → 1.8.0
- [functional] Server version: 1.1.1 → 1.6.0
- [functional] New tool “authority_answer”
- [functional] New tool “create_order_link”
- [cosmetic] “check_work_history” added an optional parameter “language”
- [cosmetic] “country_pension_facts” added an optional parameter “language”
- [cosmetic] “list_covered_countries” added an optional parameter “language”
- [cosmetic] “resolve_employer” added an optional parameter “language”
- [cosmetic] “create_order_link” reworded the description of “tier”

### 2026-10-13 (score 73)

First indexed and scored.

## MCP tools (11)

### `list_covered_countries` (~222 tokens)

List covered countries

The countries PensionHunter covers, each with its ISO code and one sourced line on what exists there, and separately the countries we have mapped but not yet researched, each with the institution that pays its old age pension. Takes one optional input, language, for our own sentences in any of 27 languages.

Input parameters:

- `language` (string): Optional. The language for our own sentences (notes, offer, labels, gap and register sentences), as an ISO 639-1 code: en, ar, da, de, es, fa, fr, hi, id, it, ja, ko, nb, nl, pl, pt, pt-BR, ro, ru, s…

Output parameters:

- `countries` (array)
- `countryCount` (integer)
- `language` (object): Present when language was sent: the language served, its own name, and labels for source, read date, translation and original in that language. Our sentences in this result are translations of our ow…
- `mapped` (array): Countries we have mapped but not researched; not counted in countryCount. Mapped: we name the institution and the official route; we have not yet researched this country in depth.

### `country_pension_facts` (~448 tokens)

Country pension facts

One country's stored facts: what the money is worth, why the free route fails from abroad, and dated obligations, each with source and read date, then the free official route: the official bodies with website, email and phone read from their own contact pages. Pass the person's question, or pensionType, and the answer is about that kind of pension (state, workplace, provident or personal): facts about another kind are left out and named. Accepts names, native names, aliases and ISO codes. A mapped country returns tier: mapped with its institution, official route and agreements, and no next step. Any other country outside our coverage returns covered: false with a note.

Input parameters:

- `country` (string, required): One country, as an English name, a native name, a common alias or an ISO 3166 alpha-2 or alpha-3 code, in any case. Examples: Netherlands, Nederland, Holland, NL, NLD; United Kingdom, UK, GB, Britain…
- `language` (string): Optional. The language for our own sentences (notes, offer, labels, gap and register sentences), as an ISO 639-1 code: en, ar, da, de, es, fa, fr, hi, id, it, ja, ko, nb, nl, pl, pt, pt-BR, ro, ru, s…
- `pensionType` (string): Optional. The kind of pension asked about, when known: state, workplace, provident or personal. Overrides the question.
- `question` (string): Optional. The person's question in plain words, for example "Where is my workplace pension from Merrill Lynch?" or "Do I still have money in my EPF account?". Used only to tell which kind of pension…

Output parameters:

- `answersFor` (object): The kind of pension this answer is about: state, workplace, provident (a provident fund account such as EPF or CPF) or personal, read from pensionType, the question, or a named employer.
- `contactAbroad` (object|null): A contact route for people abroad that the institution has told us in writing we may publish, with that written reply as its source. Null otherwise.
- `country` (string): The country it was read as.
- `covered` (boolean)
- `datedObligations` (array)
- `freeOfficialRoute` (array): The free official route first: the official bodies for this country and this kind of pension, with website, email, phone and the date we read their contact page. Our report is only what we add on top.
- `iso2` (string|null)
- `language` (object): Present when language was sent: the language served, its own name, and labels for source, read date, translation and original in that language. Our sentences in this result are translations of our ow…
- `localName` (string): The country name in the language served, from Unicode CLDR. Present only for a language other than English.
- `mapped` (object): For a mapped country only: the institution that pays the contributory old age pension, its website as a bare domain, its official route to contact it from abroad, and which researched countries it ha…
- `next_step` (object): What we add to the free official route, as one structured field built from the finding: one line to pass on, the pre-filled order link with a source tag, the tier, the country and the fee from our pr…
- `note` (string)
- `pending` (string)
- `query` (string): The country string as sent.
- `recognised` (boolean): False when the string is not a country we can read.
- `schemeRegister` (object|null): For a workplace pension question: where the country lists occupational pension funds.
- `tier` (string): Present for a mapped country: one we have mapped but not yet researched in depth.
- `whatTheMoneyIsWorth` (object|null): A stored fact with the source it came from and the date we read that source. Null when we hold no sourced line.
- `whyTheFreeRouteFailsFromAbroad` (object|null): A stored fact with the source it came from and the date we read that source. Null when we hold no sourced line.

### `check_work_history` (~393 tokens)

Check a work history

For each country in a work history: whether a pension is likely to exist and why, with a verdict that says what it depends on (Singapore CPF depends on citizen, permanent resident or pass holder status), why self service fails from abroad, a dated obligation only where it applies, the dates that would change the answer, where dormant money moves to an unclaimed money body, the workplace pension plan for an employer we researched, and the free official route with contact details. Years may be exact, rough ("around 2005", "late 1990s", "the 1990s") or unknown; we never refuse for missing years. A mapped country carries its institution and official route instead, and a call with only mapped countries carries no next step. Countries accept names, native names, aliases and ISO codes. Nothing sent is stored.

Input parameters:

- `entries` (array, required): One entry per period of work in a country.
- `language` (string): Optional. The language for our own sentences (notes, offer, labels, gap and register sentences), as an ISO 639-1 code: en, ar, da, de, es, fa, fr, hi, id, it, ja, ko, nb, nl, pl, pt, pt-BR, ro, ru, s…
- `question` (string): Optional. The person's question in plain words; used only to tell which kind of pension it is about.
- `subject` (object): Optional facts about the person, used only to decide which dated obligations apply.

Output parameters:

- `countries` (array)
- `language` (object): Present when language was sent: the language served, its own name, and labels for source, read date, translation and original in that language. Our sentences in this result are translations of our ow…
- `next_step` (object): What we add to the free official route, as one structured field built from the finding: one line to pass on, the pre-filled order link with a source tag, the tier, the country and the fee from our pr…

### `resolve_employer` (~397 tokens)

Place an employer in a country

Three things about an employer name, typed however the person remembers it. First, the country it implies, from evidence in the name: a country name, a city (from our sourced city table, so "London" places it in the United Kingdom and "Kuala Lumpur" in Malaysia), a nationality word or a national legal form. Second, the employers we hold that the name may mean, matched after setting aside city, legal form (Ltd, plc, International, Sdn Bhd, Pte, GmbH, B.V., N.V.), punctuation and case, each with a confidence from 0 to 1, across every country when the name carries none. Third, what the employer is called now, from official registers, and for employers we researched by hand, the group it became and its workplace pension plan, each fact with its source page, verbatim quote and read date, the plan's published contact, and the free official route. Legal entities only, never people.

Input parameters:

- `language` (string): Optional. The language for our own sentences (notes, offer, labels, gap and register sentences), as an ISO 639-1 code: en, ar, da, de, es, fa, fr, hi, id, it, ja, ko, nb, nl, pl, pt, pt-BR, ro, ru, s…
- `name` (string, required): The employer name as the person knows it, ideally with its legal form and city, for example "Shell Nederland B.V." or "Deutsche Bank Frankfurt".

Output parameters:

- `candidates` (array): Countries the evidence allows when it does not settle on one.
- `citySource` (object): The cities read in the name and where we read their country.
- `country` (string|null)
- `covered` (boolean): True when the country is one we cover.
- `currentEntity` (object): What the employer is called now, read from official registers (the Global LEI Index, then a national register): renamed, merged, unchanged, ambiguous when several entities carry exactly that name, no…
- `evidence` (array)
- `freeOfficialRoute` (array): The free official route first: the official bodies for this country and this kind of pension, with website, email, phone and the date we read their contact page. Our report is only what we add on top.
- `iso2` (string|null)
- `language` (object): Present when language was sent: the language served, its own name, and labels for source, read date, translation and original in that language. Our sentences in this result are translations of our ow…
- `localName` (string): The country name in the language served, from Unicode CLDR. Present only for a language other than English.
- `matches` (array): Employers we hold that the name may mean, best first, each with its confidence and the register facts it carries.
- `name` (string)
- `next_step` (object): What we add to the free official route, as one structured field built from the finding: one line to pass on, the pre-filled order link with a source tag, the tier, the country and the fee from our pr…
- `normalisedName` (string): The name as we compare it: no city, country, legal form, punctuation or case. The name sent is kept as sent.
- `reason` (string)
- `resolved` (boolean)
- `schemeRegister` (object|null): Where the employer's country lists occupational pension funds, or that it has no such public register. Null when the country is not settled.
- `workplacePension` (object): For an employer we researched by hand: what the employer became and the workplace pension plan for its people, each fact with its source page, verbatim quote and read date, the plan's published conta…

### `authority_answer` (~426 tokens)

Authority answers on the record

What a national pension institution told us in writing, as published on our answers page: the institution, its answer exactly as published, any translation marked as ours, the date of the reply and the link to that answer on pensionhunter.ai/answers. The question is free text, matched to the questions we hold answers to for that country; when nothing matches, the result lists those questions. When we wrote to the country and hold no answer yet, the status says so with the date we asked, from our record of letters sent. Institutions only, never a person. A passage that gives a contact detail stays on the answers page and is returned with its link and the reason. Accepts names, native names, aliases and ISO codes.

Input parameters:

- `country` (string, required): One country, as an English name, a native name, a common alias or an ISO 3166 alpha-2 or alpha-3 code, in any case. Examples: Netherlands, Nederland, Holland, NL, NLD; United Kingdom, UK, GB, Britain…
- `language` (string): Optional. The language for our own sentences (notes, offer, labels, gap and register sentences), as an ISO 639-1 code: en, ar, da, de, es, fa, fr, hi, id, it, ja, ko, nb, nl, pl, pt, pt-BR, ro, ru, s…
- `question` (string, required): The question in plain words, for example "Can I deal with this without travelling there?", "What do heirs need?" or "Do they publish figures on unpaid pensions?". Matched by keywords to the questions…

Output parameters:

- `answers` (array)
- `answersPage` (string): Our answers page, https://pensionhunter.ai/answers.
- `askedInstitution` (string|null): The institution that letter went to. Never a person. Null when none.
- `askedOn` (string|null): ISO date of our most recent dated letter to the country, or null.
- `country` (string)
- `iso2` (string|null)
- `language` (object): Present when language was sent: the language served, its own name, and labels for source, read date, translation and original in that language. Our sentences in this result are translations of our ow…
- `localName` (string): The country name in the language served, from Unicode CLDR. Present only for a language other than English.
- `matched` (boolean): True when the question matched at least one published answer.
- `next_step` (object): What we add to the free official route, as one structured field built from the finding: one line to pass on, the pre-filled order link with a source tag, the tier, the country and the fee from our pr…
- `note` (string)
- `query` (string): The country string as sent.
- `question` (string): The question as sent.
- `questionKey` (string|null): The question topic matched.
- `questions` (array): When nothing matched: the questions we hold answers to for this country.
- `recognised` (boolean): False when the string is not a country we can read.
- `status` (string|null): Where our written questions to the country stand: answered when our answers page publishes an answer from an institution there; asked_no_answer_yet when asked on askedOn, no answer yet; asked_no_answ…

### `deadline_check` (~383 tokens)

When does a departure deadline run out

For a country the person left, and the date they left or, where the clock runs from a death, the date of death: the date our deadline register's rule gives, by adding the period stated in the register row to that date. The free official route comes first, with the official source page, the verbatim quote and the date we read it. Rows whose start event is not stated, or is not the date given, are returned as rules without a date. Send only the country and the date; nothing is stored. Identification only: we do not advise, and the official body decides.

Input parameters:

- `country` (string, required): The country left: ISO 3166 alpha-2 code or English name, for example "JP" or "Japan". Call with any value to get the list of countries we hold.
- `date` (string, required): The date, YYYY-MM-DD, not after today.
- `event` (string): "left": the date the person left that country. "died": the date of death, for clocks that run from a death. Optional when the country has only one.
- `language` (string): Optional. The language for our own sentences (notes, offer, labels, gap and register sentences), as an ISO 639-1 code: en, ar, da, de, es, fa, fr, hi, id, it, ja, ko, nb, nl, pl, pt, pt-BR, ro, ru, s…

Output parameters:

- `arithmetic` (string): How the date is worked out.
- `clocks` (array): Dates computed from register rows that state both the start event and the period.
- `country` (string)
- `date` (string): The date sent, YYYY-MM-DD.
- `event` (string)
- `iso2` (string)
- `language` (object): Present when language was sent: the language served, its own name, and labels for source, read date, translation and original in that language. Our sentences in this result are translations of our ow…
- `next_step` (object): What we add to the free official route, as one structured field built from the finding: one line to pass on, the pre-filled order link with a source tag, the tier, the country and the fee from our pr…
- `note` (string): Identification only; the official body decides.
- `rulesWithoutDate` (array): Rules we hold for this country and event whose start is not stated or is not the date given: shown with their source, no date.
- `today` (string): The day the result was computed, UTC, YYYY-MM-DD.

### `create_order_link` (~551 tokens)

Open a checkout for a report

Opens a secure Stripe checkout for one of our reports, for the countries the person chose, and returns its link, which works for about 24 hours. Call it only when the person asks to order. Send only the countries and the tier, never a name, email address or any other personal detail; Stripe asks for the email at checkout. Prices: Country Pension Identification Report $99 per country, one report covering every country you tick; Enhanced Pension Identification Report $199 for one country; Global Pension Identification Report $299 for two or more, in one report. The Country report: Identification only: we name who holds each pension in every country you tick, with the sourced contact route. The Enhanced report: For one country: every fund identified, a complete, ready-to-send information request for each one, and our team of experts with you until the end, through every reply. The Global report: For every country you worked in, in one report: every fund identified, a complete, ready-to-send information request for each one, and our team of experts with you until the end, through every reply. You send each request to the pension body yourself; we never contact a fund for you. Only countries we cover can be ordered. If a checkout cannot be opened, the result is our order page with the same choices filled in.

Input parameters:

- `countries` (array, required): The countries to order for, each a name, native name, alias or ISO code, for example ["NL", "United Kingdom"]. Only countries we cover; call list_covered_countries when unsure.
- `language` (string): Optional. The language for our own sentences (notes, offer, labels, gap and register sentences), as an ISO 639-1 code: en, ar, da, de, es, fa, fr, hi, id, it, ja, ko, nb, nl, pl, pt, pt-BR, ro, ru, s…
- `tier` (string, required): The report to order. "country": the Country Pension Identification Report, $99 per country, one report covering every country you tick, one or more countries. "enhanced": the Enhanced Pension Identif…

Output parameters:

- `checkoutUrl` (string|null): The Stripe checkout link, or null when none could be opened.
- `countries` (array): ISO 3166 alpha-2 codes of the countries ordered.
- `expiresAt` (string|null): When the checkout link stops working, ISO 8601 UTC, or null.
- `fee` (string): The fee, from our published prices.
- `language` (object): Present when language was sent: the language served, its own name, and labels for source, read date, translation and original in that language. Our sentences in this result are translations of our ow…
- `note` (string): One line to pass on to the person.
- `offer` (string): The report offer, with the fee and refund terms.
- `orderUrl` (string): Our order page with the same tier and countries filled in. It never carries personal data.
- `product` (string): The report name.
- `status` (string): checkout_opened when checkoutUrl is a live Stripe checkout; order_page when a checkout could not be opened and orderUrl is the way to order.
- `tier` (string)

### `gpfr_info` (~227 tokens)

GPFR: what it is and the consent text

What GPFR, the Global Pension Finding Register is, in the caller's language: a free register where people who worked abroad add themselves once and pension funds look for the members they cannot reach. Free for people; funds and trustees pay per confirmed match. Nothing is shared unless the person and the fund both say yes. Returns the register page in that language, the consent text and its version (show it to the person before gpfr_register), and, with a country, the pension fund pages we publish for it. Read only.

Input parameters:

- `country` (string): Optional. A country name or ISO code; returns our fund pages for it.
- `language` (string): Optional. ISO 639-1 code for our sentences and the consent text: en, ar, da, de, es, fa, fr, hi, id, it, ja, ko, nb, nl, pl, pt, pt-BR, ro, ru, sv, th, tl, tr, zh. Default en. Any other language is a…

Output parameters:

- `agentRule` (string)
- `ambition` (string): An ambition, stated as one.
- `consent` (object)
- `consentFlow` (string)
- `country` (string|null)
- `emailPromise` (string)
- `free` (string)
- `fundPages` (array)
- `language` (string)
- `languageNote` (string): Present only when the language asked for is not a GPFR language: why the answer and the consent text are in English.
- `live` (string): What is live, exactly as it stands.
- `matching` (string)
- `name` (string)
- `registerUrl` (string)
- `trust` (string)
- `what` (string)

### `gpfr_register` (~502 tokens)

GPFR: register a person who said yes

Registers a person in GPFR. First show the person the consent sentence from gpfr_info (consent.text), word for word, in their language, and ask whether they agree. Call this only after they say yes, with consent.consent_text_version equal to the consent.version you showed and person_said_yes: true. Send their email, full name, date of birth, work periods (country, years, optional employer and fund), optional earlier names and national number, and the consent object {consent_text_version, person_said_yes: true, timestamp, client: {name, version}}. Without the consent object, without the yes, or with a version we did not issue, the call is refused and nothing is stored. Name, earlier names, date of birth, national number and employer names reach our server as text; we turn them into codes on receipt and keep only the codes, never the text; nothing is logged or returned. The registration stays pending until the person clicks the link in the one confirmation email we send. You never give the second yes: sharing with a fund is agreed only through the link in our match email. The result is a status and a reference, never a personal detail.

Input parameters:

- `consent` (object, required): Required. The yes the person gave after you showed them the gpfr_info consent sentence in their language.
- `date_of_birth` (string, required): YYYY-MM-DD. Hashed on receipt.
- `earlier_names` (array): Optional earlier full names (maiden or former). Hashed on receipt.
- `email` (string, required): The person's email address. We send one email to confirm it; nothing happens until they click it.
- `language` (string): Optional. ISO 639-1 code for our sentences and the consent text: en, ar, da, de, es, fa, fr, hi, id, it, ja, ko, nb, nl, pl, pt, pt-BR, ro, ru, sv, th, tl, tr, zh. Default en. Any other language is a…
- `name` (string, required): The person's full name, as an employer or fund would hold it. Hashed on receipt.
- `national_number` (object): Optional national number and its issuing country. Hashed on receipt.
- `periods` (array, required): Where the person worked: country, years, optional employer and fund.

Output parameters:

- `language` (string)
- `languageNote` (string): Present only when the language asked for is not a GPFR language: why the answer and the consent text are in English.
- `note` (string)
- `reference` (string): R-XXXX-XXXX-XXXX, for gpfr_status. Not personal data.
- `status` (string)

### `gpfr_status` (~226 tokens)

GPFR: status, with a one-time code

The status of a GPFR registration. Call it with the reference from gpfr_register: we email a one-time code to the registered address, and the answer is the same whether the reference exists or not. Call again with the reference and the code the person reads out: the answer is one of pending_email_confirmation, registered, possible_match_awaiting_your_yes or confirmed_by_fund. Nothing else is returned. The yes to a fund is never given here.

Input parameters:

- `code` (string): Optional. The six-digit code from our email to the registered address.
- `language` (string): Optional. ISO 639-1 code for our sentences and the consent text: en, ar, da, de, es, fa, fr, hi, id, it, ja, ko, nb, nl, pl, pt, pt-BR, ro, ru, sv, th, tl, tr, zh. Default en. Any other language is a…
- `reference` (string, required): The reference gpfr_register returned.

Output parameters:

- `codeSent` (boolean)
- `language` (string)
- `languageNote` (string): Present only when the language asked for is not a GPFR language: why the answer and the consent text are in English.
- `note` (string)
- `status` (string)

### `gpfr_fund_count` (~168 tokens)

GPFR: people registered for a fund

For fund-side agents: how many confirmed, plausible people are registered for a pension fund, shown from 10 upwards, otherwise "fewer than 10". An aggregate only: no registrant is ever listed or identifiable.

Input parameters:

- `fund` (string, required): A GPFR fund key (from gpfr_info) or the fund's name.
- `language` (string): Optional. ISO 639-1 code for our sentences and the consent text: en, ar, da, de, es, fa, fr, hi, id, it, ja, ko, nb, nl, pl, pt, pt-BR, ro, ru, sv, th, tl, tr, zh. Default en. Any other language is a…

Output parameters:

- `count` (integer|null)
- `fund` (string)
- `key` (string|null)
- `language` (string)
- `languageNote` (string): Present only when the language asked for is not a GPFR language: why the answer and the consent text are in English.
- `note` (string)
- `shown` (string)
- `threshold` (integer)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/ai-pensionhunter-pensionhunter/mcp#diagnostics

## Score history

- 2026-10-16: 72
- 2026-10-15: 71
- 2026-10-14: 71
- 2026-10-13: 73

## Common questions

### What is the PensionHunter MCP server?

PensionHunter is an MCP server listed in the public MCP registry as ai.pensionhunter/pensionhunter. Cross-border pension facts: country coverage, sourced rules, dated deadlines and employer lookups. This page covers its hosted endpoint (https://mcp.pensionhunter.ai).

### Is the PensionHunter MCP server safe to use?

PensionHunter scores 72 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the PensionHunter MCP server expose?

PensionHunter exposes 11 tools: list_covered_countries, country_pension_facts, check_work_history, resolve_employer, authority_answer, and 6 more. Their descriptions and schemas cost roughly 3,943 tokens of context every time the server is loaded.

### Does the PensionHunter MCP server require authentication?

No. We connected to PensionHunter without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the PensionHunter MCP server still maintained?

PensionHunter is still listed as active in the MCP registry. We last reached this channel on 16 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://mcp.pensionhunter.ai/
- Repository: https://github.com/PensionHunter/pensionhunter-claude-plugin
- Website: https://pensionhunter.ai/mcp
- Changelog RSS feed: https://verifymcp.io/servers/ai-pensionhunter-pensionhunter/mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/ai-pensionhunter-pensionhunter/mcp.json
- HTML version of this page: https://verifymcp.io/servers/ai-pensionhunter-pensionhunter/mcp
