{
  "name": "PensionHunter",
  "version": "1.12.0",
  "description": "Building the world's pension identification infrastructure. The read-only PensionHunter research tools as function declarations, for frameworks that call functions rather than MCP. Every fact carries its source and the date we read it. Identification and research only; we do not give advice.",
  "source": "https://pensionhunter.ai/.well-known/openapi.json",
  "documentation": "https://pensionhunter.ai/developers#agent-manifests",
  "endpoint": "https://mcp.pensionhunter.ai",
  "fallbackEndpoint": "https://givkcvqnhbuiprutblom.supabase.co/functions/v1/mcp-connector",
  "call": "POST {endpoint}/tools/{name} with the arguments as a JSON object in the body and Content-Type: application/json. No key and no sign-in.",
  "functionDeclarations": [
    {
      "name": "list_covered_countries",
      "description": "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.",
      "parameters": {
        "type": "object",
        "properties": {
          "language": {
            "type": "string",
            "description": "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, sv, th, tl, tr, zh, vi, uk, bg. Default en. pt is European Portuguese, pt-BR Brazilian, zh Simplified Chinese. Facts, numbers, dates, names and authority answers stay exactly as stored; a fact translation appears only from our committed table, marked translation: true. An unknown code is answered in English with a note.",
            "minLength": 2,
            "maxLength": 35
          }
        }
      }
    },
    {
      "name": "country_pension_facts",
      "description": "One country's facts, the official free routes first: freeOfficialRoute (never empty for a covered country; each route with what it does, the scheme it covers and whether it works from abroad) and contactAbroad (an official contact for people living abroad), then whatIsHardFromAbroad (honest and specific, one fact per scheme and process: tracing, record or payment), what the money is worth and dated obligations. Every fact is labelled by scheme (state, workplace, provident or personal) and carries its source and read date. whyTheFreeRouteFailsFromAbroad is deprecated and carries the first whatIsHardFromAbroad fact for one more version. 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.",
      "parameters": {
        "type": "object",
        "properties": {
          "country": {
            "type": "string",
            "description": "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; Germany, Deutschland, DE.",
            "minLength": 2,
            "maxLength": 200
          },
          "question": {
            "type": "string",
            "description": "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 it is about.",
            "maxLength": 500
          },
          "pensionType": {
            "type": "string",
            "description": "Optional. The kind of pension asked about, when known: state, workplace, provident or personal. Overrides the question.",
            "enum": [
              "state",
              "workplace",
              "provident",
              "personal"
            ]
          },
          "language": {
            "type": "string",
            "description": "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, sv, th, tl, tr, zh, vi, uk, bg. Default en. pt is European Portuguese, pt-BR Brazilian, zh Simplified Chinese. Facts, numbers, dates, names and authority answers stay exactly as stored; a fact translation appears only from our committed table, marked translation: true. An unknown code is answered in English with a note.",
            "minLength": 2,
            "maxLength": 35
          }
        },
        "required": [
          "country"
        ]
      }
    },
    {
      "name": "check_work_history",
      "description": "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) and a reason that fits the years, birth year and employer given (a rule or figure valid only for other dates is never quoted), the free official routes and an official contact abroad first, what is hard from abroad by scheme and process, 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.",
      "parameters": {
        "type": "object",
        "properties": {
          "entries": {
            "type": "array",
            "description": "One entry per period of work in a country.",
            "items": {
              "type": "object",
              "properties": {
                "country": {
                  "type": "string",
                  "description": "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; Germany, Deutschland, DE.",
                  "minLength": 2,
                  "maxLength": 80
                },
                "from": {
                  "type": "integer",
                  "nullable": true,
                  "description": "First year of work there: four digits, or rough words such as \"around 2005\", \"late 1990s\", \"the 1990s\", or \"unknown\". Optional.",
                  "minimum": 1900,
                  "maximum": 2100,
                  "maxLength": 40
                },
                "to": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Last year of work there, in the same forms as from; \"now\" or \"still there\" if still working there; omitted when from alone describes the period, for example \"the 1990s\".",
                  "minimum": 1900,
                  "maximum": 2100,
                  "maxLength": 40
                },
                "employer": {
                  "type": "string",
                  "nullable": true,
                  "description": "Employer name, optional, as the person knows it.",
                  "maxLength": 120
                },
                "status": {
                  "type": "string",
                  "nullable": true,
                  "description": "Optional. The person's status in that country at the time: citizen, permanent_resident, pass_holder (a work pass or permit) or unknown. Decides the verdict where contributions depended on it, such as Singapore CPF.",
                  "enum": [
                    "citizen",
                    "permanent_resident",
                    "pass_holder",
                    "unknown",
                    null
                  ]
                },
                "pensionType": {
                  "type": "string",
                  "description": "Optional. The kind of pension asked about for this period: state, workplace, provident or personal.",
                  "enum": [
                    "state",
                    "workplace",
                    "provident",
                    "personal"
                  ]
                }
              },
              "required": [
                "country"
              ]
            },
            "minItems": 1,
            "maxItems": 60
          },
          "subject": {
            "type": "object",
            "description": "Optional facts about the person, used only to decide which dated obligations apply.",
            "properties": {
              "birthYear": {
                "type": "integer",
                "description": "Year of birth, four digits.",
                "minimum": 1900,
                "maximum": 2100
              },
              "deceased": {
                "type": "boolean",
                "description": "True when the person has died and a relative is asking."
              },
              "pensionInPaymentCountries": {
                "type": "array",
                "description": "Countries already paying the person a pension.",
                "items": {
                  "type": "string",
                  "description": "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; Germany, Deutschland, DE."
                }
              },
              "childrenMentioned": {
                "type": "boolean",
                "description": "True when children are part of the question."
              }
            }
          },
          "question": {
            "type": "string",
            "description": "Optional. The person's question in plain words; used only to tell which kind of pension it is about.",
            "maxLength": 500
          },
          "countryOfResidence": {
            "type": "string",
            "description": "Optional. The country the person lives in now, as a name, alias or ISO code. For a country they still live in, what is hard from abroad is left out (livesHere: true).",
            "maxLength": 80
          },
          "birthYear": {
            "type": "integer",
            "description": "Optional. Year of birth, four digits; the same as subject.birthYear. Used for rules that depend on age, such as German employer pension vesting.",
            "minimum": 1900,
            "maximum": 2100
          },
          "language": {
            "type": "string",
            "description": "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, sv, th, tl, tr, zh, vi, uk, bg. Default en. pt is European Portuguese, pt-BR Brazilian, zh Simplified Chinese. Facts, numbers, dates, names and authority answers stay exactly as stored; a fact translation appears only from our committed table, marked translation: true. An unknown code is answered in English with a note.",
            "minLength": 2,
            "maxLength": 35
          }
        },
        "required": [
          "entries"
        ]
      }
    },
    {
      "name": "resolve_employer",
      "description": "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.",
      "parameters": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "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\".",
            "minLength": 2,
            "maxLength": 200
          },
          "country": {
            "type": "string",
            "description": "Optional. The country the person worked in for this employer, as a name, alias or ISO code. Matches are then taken from that country only, and a name we do not hold there is said to be not found rather than matched elsewhere.",
            "maxLength": 80
          },
          "language": {
            "type": "string",
            "description": "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, sv, th, tl, tr, zh, vi, uk, bg. Default en. pt is European Portuguese, pt-BR Brazilian, zh Simplified Chinese. Facts, numbers, dates, names and authority answers stay exactly as stored; a fact translation appears only from our committed table, marked translation: true. An unknown code is answered in English with a note.",
            "minLength": 2,
            "maxLength": 35
          }
        },
        "required": [
          "name"
        ]
      }
    },
    {
      "name": "authority_answer",
      "description": "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.",
      "parameters": {
        "type": "object",
        "properties": {
          "country": {
            "type": "string",
            "description": "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; Germany, Deutschland, DE.",
            "minLength": 2,
            "maxLength": 200
          },
          "question": {
            "type": "string",
            "description": "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 we hold answers to.",
            "minLength": 2,
            "maxLength": 500
          },
          "language": {
            "type": "string",
            "description": "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, sv, th, tl, tr, zh, vi, uk, bg. Default en. pt is European Portuguese, pt-BR Brazilian, zh Simplified Chinese. Facts, numbers, dates, names and authority answers stay exactly as stored; a fact translation appears only from our committed table, marked translation: true. An unknown code is answered in English with a note.",
            "minLength": 2,
            "maxLength": 35
          }
        },
        "required": [
          "country",
          "question"
        ]
      }
    },
    {
      "name": "deadline_check",
      "description": "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.",
      "parameters": {
        "type": "object",
        "properties": {
          "country": {
            "type": "string",
            "description": "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.",
            "minLength": 2,
            "maxLength": 80
          },
          "event": {
            "type": "string",
            "description": "\"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.",
            "enum": [
              "left",
              "died"
            ]
          },
          "date": {
            "type": "string",
            "description": "The date, YYYY-MM-DD, not after today.",
            "minLength": 10,
            "maxLength": 10
          },
          "language": {
            "type": "string",
            "description": "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, sv, th, tl, tr, zh, vi, uk, bg. Default en. pt is European Portuguese, pt-BR Brazilian, zh Simplified Chinese. Facts, numbers, dates, names and authority answers stay exactly as stored; a fact translation appears only from our committed table, marked translation: true. An unknown code is answered in English with a note.",
            "minLength": 2,
            "maxLength": 35
          }
        },
        "required": [
          "country",
          "date"
        ]
      }
    },
    {
      "name": "gpfr_info",
      "description": "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, as pension funds join, they check it for former 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.",
      "parameters": {
        "type": "object",
        "properties": {
          "language": {
            "type": "string",
            "description": "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 answered in English, with languageNote saying so.",
            "minLength": 2,
            "maxLength": 35
          },
          "country": {
            "type": "string",
            "description": "Optional. A country name or ISO code; returns our fund pages for it.",
            "minLength": 2,
            "maxLength": 80
          }
        }
      }
    },
    {
      "name": "gpfr_fund_count",
      "description": "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.",
      "parameters": {
        "type": "object",
        "properties": {
          "fund": {
            "type": "string",
            "description": "A GPFR fund key (from gpfr_info) or the fund's name.",
            "minLength": 2,
            "maxLength": 160
          },
          "language": {
            "type": "string",
            "description": "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 answered in English, with languageNote saying so.",
            "minLength": 2,
            "maxLength": 35
          }
        },
        "required": [
          "fund"
        ]
      }
    }
  ]
}
