Skip to main content
Glama

GoodbyeMatrix Residency & Citizenship Index

Get CBI cost estimate

get_cbi_quote
Read-onlyIdempotent

Answers how much citizenship by investment or a second passport costs for a person or family, or compares programmes by total cost. Calculates the indicative cost for a family: government contribution, investment, fees, professional fees, payment phases and total in USD, plus which family members are eligible, processing time, page links and quoteRequestUrl. With one programme it returns that programme; without program it compares all 9 programmes (St Kitts and Nevis, Antigua and Barbuda, Dominica, Grenada, Saint Lucia, Vanuatu, Sao Tome and Principe, Nauru, Argentina). Nationality and country of birth count for every person in the family, not only for the main applicant. Figures are calculated live at request time from the current GoodbyeMatrix price and rule data; the data status is the date of the response (updatedAt), not an older date. Figures are rounded indicative figures (total to the nearest 1,000 USD), binding only after a pre-check; the user receives the exact amounts by requesting the cost breakdown through quoteRequestUrl. Read-only: it only retrieves and computes from the GoodbyeMatrix data set, stores nothing, sends nothing and calls no external services.

Input Schema

NameRequiredDescriptionDefault
familyYesEveryone who applies together. The first person is the main applicant (role "main"); only the first person has the role "main". Defaults: a partner counts as married and not same-sex unless stated; a child under 18 counts as dependent. Nationalities and country of birth are relevant for every person in the list (partner, children, parents), not only for the main applicant, because exclusions apply per person.
programNoProgramme key: sao_tome (Sao Tome and Principe), vanuatu, dominica, st_lucia (Saint Lucia), st_kitts (St. Kitts and Nevis), grenada, antigua (Antigua and Barbuda), nauru, argentina. Without a programme, the figures cover all programmes at once.
languageNoResponse language: "en" (English, default) or "de" (German).en

Output Schema

NameRequiredDescriptionDefault
okYes
pagesNo
routeNo
scopeYes
totalNoTotal in USD, rounded to the nearest 1,000.
noticeNo
schemaYes
statusNook, partial, review_required, fees_on_request or not_eligible (main applicant excluded by nationality or country of birth: no figures, no link).
programNoProgramme key.
variantNo
currencyNo
languageYes
programsNo
roundingNo
updatedAtNoData status: the date of the response (UTC, YYYY-MM-DD). Prices and rules are maintained continuously and every response is calculated live, so the data status is the date of the response in every case, not an older date.
dataStatusNoNote on the data status in German and English: calculated live, status = date of the response.
totalScopeNototal, or known_costs when professional fees are on request.
costSummaryNocontribution, investment and professionalFees as published; fees = total minus the other three.
eligibilityNo
generatedAtNo
overviewUrlNoPortfolio only: overview page of all programmes with the family filled in.
programLabelNo
paymentPhasesNo
pricingNoticeNo
processingTimeNo
rulesChangedAtNoLast change to prices or rules (UTC date, YYYY-MM-DD).
quoteRequestUrlNoLink to the calculator page of the programme on goodbyematrix.com with the family already filled in; there the user requests the detailed cost breakdown with the exact amounts. null when not_eligible.
restrictionNoteNoOnly with status not_eligible: why the programme is not possible.
websiteEstimateNoThe figure the website calculator shows.
restrictionsCheckedNotrue when nationalities or a country of birth were given and checked.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changed
    • changedInput schema / properties / family / description
      Previous value: -"Everyone who applies together. The first person is the main applicant (role \"main\"); only the first person has the role \"main\". Defaults: a partner counts as married and not same-sex unless stated; a child under 18 counts as dependent."New value: +"Everyone who applies together. The first person is the main applicant (role \"main\"); only the first person has the role \"main\". Defaults: a partner counts as married and not same-sex unless stated; a child under 18 counts as dependent. Nationalities and country of birth are relevant for every person in the list (partner, children, parents), not only for the main applicant, because exclusions apply per person."
    • changedInput schema / properties / family / items / properties / birthplace / description
      Previous value: -"Optional: country of birth as ISO 3166-1 alpha-2 code, as mentioned by the user."New value: +"Optional, per person (not only the main applicant): country of birth as ISO 3166-1 alpha-2 code, as mentioned by the user."
    • changedInput schema / properties / family / items / properties / nationalities / description
      Previous value: -"Optional: every citizenship of this person as ISO 3166-1 alpha-2 codes (for example [\"DE\"] or [\"RU\", \"GE\"] for dual citizens), as mentioned by the user."New value: +"Optional, per person (partner, children and parents included, not only the main applicant): every citizenship of this person as ISO 3166-1 alpha-2 codes (for example [\"DE\"] or [\"RU\", \"GE\"] for dual citizens), as mentioned by the user."
    • addedOutput schema / properties / dataStatus
      Added value: +{
      +  "description": "Note on the data status in German and English: calculated live, status = date of the response.",
      +  "properties": {
      +    "de": {
      +      "type": "string"
      +    },
      +    "en": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / rulesChangedAt
      Added value: +{
      +  "description": "Last change to prices or rules (UTC date, YYYY-MM-DD).",
      +  "type": "string"
      +}
    • addedOutput schema / properties / updatedAt
      Added value: +{
      +  "description": "Data status: the date of the response (UTC, YYYY-MM-DD). Prices and rules are maintained continuously and every response is calculated live, so the data status is the date of the response in every case, not an older date.",
      +  "type": "string"
      +}
  2. First observed

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: figures are computed live from current price/rule data, updatedAt reflects the response date, amounts are rounded to the nearest 1,000 USD, and figures are only binding after a pre-check via quoteRequestUrl. The closing 'stores nothing, sends nothing, calls no external services' sentence largely restates the readOnly/closed-world annotations, slightly diluting the added value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and both operating modes are front-loaded and the sentences are information-dense. Some waste remains: the parenthetical list of all 9 programme names duplicates the enum descriptions in the schema, and the read-only sentence duplicates the annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers inputs, both modes, computation freshness, rounding/binding caveats, and the follow-up path (quoteRequestUrl) for exact figures. With an output schema present, no return-value documentation is owed, and nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so baseline is 3, but the description adds genuinely load-bearing semantics: nationality and country of birth apply to every family member, not just the main applicant, and exclusions apply per person. This flags a non-obvious input requirement that agents could easily miss otherwise.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the concrete question it answers ('how much citizenship by investment or a second passport costs') plus the second mode (comparing programmes by total cost), with a specific verb+resource. It is clearly distinguishable from siblings like compare_programs and get_program.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly defines the two modes: with a programme it returns that programme, without one it covers all 9 programmes. However, it never mentions the sibling compare_programs, which plausibly overlaps with the 'compare all programmes' mode, and gives no explicit when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources