Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Geo-Parity

REMOTE · GEO-PARITY.COM · SCANNED SEP 21

Cost of living, fair global pay, healthcare costs, nomad visas and tax residency. Free, no key.

Available components

+5 this week 87 Trust /100
Trust breakdown (7 categories)

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. How we score → Why this is hard to score →

Endpoint Security83
Transport & Reachability100
Schema Quality & AI Usability85
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 18248 tokens (~276/item across 66 items; 62 tools + 4 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Tools include usage examples.Pass
Stability & Change Management87
  • Stability observed for 26 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage98
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 92% of tool parameters carry a description.Partial
  • Structured output schemas are declared (98% of tools); any adoption earns full credit.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "compare_occupation_pay" implies "pay" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Fail
  • An AI judge read all 64 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Install

How do I install the Geo-Parity MCP server?

Geo-Parity is a hosted endpoint at https://geo-parity.com/api/mcp, 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.

remote · geo-parity.com

# add to Claude Code
claude mcp add --transport http com-geo-parity-geo-parity 'https://geo-parity.com/api/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "com-geo-parity-geo-parity": {
      "url": "https://geo-parity.com/api/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "com-geo-parity-geo-parity": {
      "type": "http",
      "url": "https://geo-parity.com/api/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.com-geo-parity-geo-parity]
url = "https://geo-parity.com/api/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-geo-parity-geo-parity": {
      "type": "remote",
      "url": "https://geo-parity.com/api/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add com-geo-parity-geo-parity --url 'https://geo-parity.com/api/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  com-geo-parity-geo-parity:
    url: "https://geo-parity.com/api/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "com-geo-parity-geo-parity": {
      "Transport": "http",
      "Url": "https://geo-parity.com/api/mcp"
    }
  }
}
# add to Vellum
assistant mcp add com-geo-parity-geo-parity -t streamable-http -u 'https://geo-parity.com/api/mcp'
// mcp.json
{
  "mcpServers": {
    "com-geo-parity-geo-parity": {
      "type": "http",
      "url": "https://geo-parity.com/api/mcp"
    }
  }
}

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

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 21 Sept 26 +1
    • Tool “list_datasets” rewrote its description, which is the text the model reads security
    • Tool “passport_power” rewrote its description, which is the text the model reads security
  • 20 Sept 26 0
    • New tool “find_country_fit” functional
  • 19 Sept 26 +2
    • Schema quality: fail → pass functional
    • New tool “compare_food_cost” functional
  • 18 Sept 26 +1
    • New tool “banking_access” functional
  • 15 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

  • 14 Sept 26 0
    • Tool “country_dossier” rewrote its description, which is the text the model reads security
    • New tool “driving_rules” functional
    • New tool “employment_rules” functional
  • 13 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

  • 11 Sept 26 +3
    • The server now declares the “prompts” capability functional
    • The server now declares the “resources” capability functional
    • First check of Schema quality: 100 functional
    • New prompt “fair_local_salary” functional
    • New prompt “price_level_provenance” functional
    • New prompt “relocation_brief” functional
    • New prompt “remote_work_setup” functional
    • New prompt “retire_on_budget” functional
    • New resource “countries” functional
    • New resource “datasets” functional
    • New resource “exchange-regimes” functional
    • New resource “methodology-price-levels” functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 21 Sept 2026 · Probed https://geo-parity.com/api/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=geo-parity.com CN=WE1,O=Google Trust Services,C=US 15 Sept 2026 14 Dec 2026 ECDSA 256 ECDSA-SHA256 f5100aa329172f900ed6cd15c6a6291d
SANs: geo-parity.com, *.geo-parity.com
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of geo-parity.com. Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
geo-parity.com. present 2371 13 Verified
geo-parity.com. Verified address RRset verified with the apex keys
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=63072000; includeSubDomains; preload
content-security-policy default-src 'none'; frame-ancestors 'none'
x-content-type-options nosniff
referrer-policy strict-origin-when-cross-origin

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://geo-parity.com/api/mcp Verified 200
http (plaintext) http://geo-parity.com/api/mcp HTTPS enforced 301 https://geo-parity.com/api/mcp
MCP tools · 62 exposed · ~17,916 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
arrival_cost ~347

The cash needed to ARRIVE somewhere, as opposed to what a month costs once you live there: the entry fee for a given passport, the first month's rent, the deposit, and a long-stay visa fee where one has been verified against the issuing government. READ `complete` BEFORE `totalUsd`. Rent covers a subset of the country spine and most visa fees could not be verified, so the total is a FLOOR whenever `complete` is false, and `missing` names every component that could not be priced. The total can legitimately be 0 - visa-free entry into a country with no rent figure sums to nothing known - which is honest arithmetic and a false headline. `depositMonths` is a STATED ASSUMPTION, not a measurement: no free global dataset of deposit norms exists. The entry route itself is derived exactly from passport mobility data, so 'for this passport, this destination is visa-free' is always answered even when no fee is.

NameTypeReqDescription
depositMonthsnumberMonths of rent held as a deposit. Defaults to the site's stated assumption of 1; override it if you know the market.
destinationstringyesISO alpha-2 of the destination. Must be in the PPP country registry; some countries with a verified nomad-visa fee (e.g. BB) are not and appear only in find_nomad_visas.
incomenumberMonthly remote income in USD. Optional; enables housing's income-relative view but is not needed for the arrival total.
passportstringyesISO alpha-2 of the traveller's passport, e.g. 'US'. Determines the entry route and therefore the fee.
NameTypeReqDescription
attributionobject
excludednumber
focusobject
okboolean
rowsarray
updatedstring
{"destination":"GB","passport":"US"}
banking_access ~434

Whether a newcomer can open a personal bank account in a country (`yes`, `restricted` or `no`) with the documents usually asked for from a fixed vocabulary, the statutory deposit guarantee per depositor per bank in local currency AND converted to USD at the site's FX snapshot, the country's instant payment systems from the World Bank's Project FASTT tracker, the EU basic-account right under Directive 2014/92/EU where it applies, and a FATCA flag where banks commonly decline US citizens — a hand-curated register over all 186 spine countries, added 17 Sep 2026, with the scheme or regulator page and check date per row (`confidence: "secondary"` where the official page could not be fetched, separately on `depositGuarantee` for the figure). A country with no deposit-insurance scheme has NO `depositGuarantee` — never a zero — and a country absent from FASTT has no `instantPayments`, which is not the same as having no instant payments. `country` for one entry, `countries` for a side-by-side; without either, ranks by `metric` (`depositGuaranteeUsd` default, or `instantPaymentsSince`, whose `sort=lowest` lists the longest-running first), optionally narrowed by `access`, with countries lacking the metric in `excluded`. `internationalOptions` describes the kinds of cross-border account and what protects the money — categories only, never a named provider. For information only — not financial advice; banks set their own onboarding policies and every response says so first.

NameTypeReqDescription
accessstringNarrow a ranking to one non-resident access rule.
countriesstringComma-separated ISO alpha-2 codes, at least two, e.g. GB,TH,NG.
countrystringISO alpha-2 code for a single country, e.g. PT.
limitnumberMaximum rows in a ranking.
metricstringRanking metric when no country is given.
sortstringDefaults to highest, or lowest for instantPaymentsSince (longest-running first).
NameTypeReqDescription
attributionobject
caveatsarray
excludedarray
internationalOptionsarray
okboolean
rowsarray
{"country":"PT"}
build_pay_range ~287

Returns a floor, midpoint and ceiling salary for a broad occupation and seniority in a country, anchored on ILO's measured earnings where they exist and on the modelled national wage ladder where they do not — `basis` says which. Built for the employer side of pay transparency: since 7 June 2026 the EU Pay Transparency Directive has required a starting salary or pay range in the job advert. IT IS NOT LEGAL ADVICE AND DOES NOT CERTIFY COMPLIANCE — it is a market range from official statistics, and every response carries a `caveats` array saying so, which should be reproduced alongside any figure quoted from it. Seniority is applied as a percentile offset within the country's own distribution rather than a fixed multiplier, so the same level means the same position locally rather than the same ratio. The gender pay gap for the occupation is reported beside the range and never folded into it. ISCO-08 major groups are broad families of work, not job titles.

NameTypeReqDescription
countrystringyesISO 3166-1 alpha-2 country code (case-insensitive).
occupationstringISCO-08 major group. Defaults to 'total' (all occupations). An unrecognised value is rejected, never widened to the default.
senioritystringDefaults to 'mid'. An unrecognised value is rejected.
NameTypeReqDescription
basisstring'measured' or 'modelled' — never blurred.
caveatsarrayAlways present. Reproduce these with any quoted figure.
ceilingobject
countryobject
floorobject
genderGapPctnumber
midpointobject
occupationobject
occupationMedianMonthlyUsdnumber
okboolean
seniorityobject
yearnumber
{"country":"DE","occupation":"professionals","seniority":"senior"}
calculate_ppp ~352

Given a US-denominated annual income and a target country code, returns the effective local purchasing power (income / pppIndex), the lifestyle equilibrium cost (income * pppIndex), and the purchasing power ratio (1 / pppIndex). Figures use real PPP data (World Bank, IMF, OECD, Penn World Table) relative to a US baseline of 1.0.

NameTypeReqDescription
citystringOptional city slug (e.g. 'london', 'san-francisco') for a sub-national Capital-to-Rural adjustment: multiplies the national price level by a per-city factor (curated overrides / US-metro BEA RPP / po…
incomenumberyesNominal annual income, denominated against the US baseline.
sourcestringPPP dataset to draw figures from. 'consensus' = per-country median across the GDP-based providers (recommended default); 'worldbank' = World Bank GDP price level; 'imf' = IMF WEO implied PPP; 'oecd'…
targetstringyesISO 3166-1 alpha-2 target country code (case-insensitive). Available codes depend on the chosen source.
NameTypeReqDescription
metricsobject
okboolean
sourceobject
targetobject
{"income":100000,"target":"TH"}
calculate_runway ~266

For founders/freelancers stretching savings: computes how many extra months of runway relocating to a cheaper hub buys. Burn is split into fixed (location-independent — subscriptions, debt, insurance) and local; only the local slice scales by the target's cost-of-living ratio (city-level where a curated hub is given, else national, incl. Factbook-only countries). Returns the home baseline plus each hub's monthly burn, runway months, extra months, run-out date and the ×multiplier. Estimates from purchasing-power data, not financial advice.

NameTypeReqDescription
burnnumberyesTotal current monthly burn at home (in `currency`).
currencystringISO code for the money inputs (e.g. GBP). Default USD.
fixednumberLocation-independent slice of burn (0…burn) that won't fall when you move.
homestringHome country alpha-2 code. Default US.
homeCitystringOptional curated home-city slug.
savingsnumberyesTotal savings (in `currency`).
targetsstringyes1–3 hubs, comma-separated: COUNTRY or COUNTRY:citySlug (e.g. TH:chiang-mai,AR:buenos-aires,GE).
NameTypeReqDescription
fixedFloorMonthsnumber|nullRunway cap even at zero local cost (savings ÷ fixed burn).
homeobject
hubsarraySorted by extra months; each has runwayMonths, extraMonths, multiplier, monthlyBurnUsd, runsOut, priceRatio and a coverage note when approximate.
okboolean
{"burn":3000,"currency":"GBP","fixed":800,"home":"GB","savings":20000,"targets":"TH:chiang-mai,GE"}
calculate_wage_bands ~240

Models a country's wage distribution as log-normal, calibrated from World Bank GNI per capita (mean) and the Gini index (spread: sigma = sqrt(2)*normInv((Gini+1)/2)), then returns the survival floor (essentials), statutory minimum (ILOSTAT where available, else curated; null where none exists), median (p50), comfortable (p75), top 10% (p90) and top 1% (p99) bands — each monthly and annual, USD and local currency. Optional `salary` locates a pay figure on the curve (percentile + out-earns %); `percentile` returns that exact threshold wage. Model estimates for benchmarking, not payroll data.

NameTypeReqDescription
countrystringyesISO 3166-1 alpha-2 country code (case-insensitive).
percentilenumberReturn the exact wage threshold at this percentile (e.g. 90 for the top-10% floor).
salarynumberYour salary to locate on the distribution. Values over 20000 are read as annual (÷12), else monthly.
NameTypeReqDescription
atPercentileobject
bandsobject
countryobject
modelobject
okboolean
standingobject
{"country":"PL","percentile":90}
check_residency ~88

Count distinct days of presence per country per calendar year and evaluate the generic 183-day rule, the US Substantial Presence Test (weighted 3-year formula), and the UK 183-day tax-year test. Early-warning day counter — not tax advice.

NameTypeReqDescription
referenceDatestringOptional 'as of' date. Defaults to today (UTC).
staysarrayyes
NameTypeReqDescription
countriesarray
okboolean
{"stays":[{"country":"PT","entry":"2026-01-10","exit":"2026-04-02"}]}
check_schengen ~167

Validate a set of trips against the Schengen Area rule: a non-EU visitor may be present at most 90 days within any rolling 180-day window. Entry and exit days both count as days of presence; overlapping trips are de-duplicated. Returns days used in the current window, days remaining, an overall compliance flag, and the exact first overstay date (if any).

NameTypeReqDescription
plannedEntrystringOptional planned entry date. When set, the response adds plan: { maxStay, latestExit, fullResetDate } — the longest compliant stay starting on that date.
referenceDatestringOptional 'as of' date (ISO YYYY-MM-DD). Defaults to today (UTC).
tripsarrayyesList of Schengen stays.
NameTypeReqDescription
compliantboolean
daysRemainingnumber
daysUsednumber
firstOverstayDatestring|null
maxDaysInWindownumber
okboolean
referenceDatestring
windowStartstring
{"trips":[{"entry":"2025-01-01","exit":"2025-03-01"}]}
check_tax_residency_risk ~214

Remote Worker Tax Trap radar: evaluates how close a stay is to triggering tax residency (183-day rule with per-country variations across 43 tax jurisdictions) and estimates the tax owed on the FULL annual income if the threshold is crossed — comparing the standard resident effective rate against the country's special expat/nomad regime (Spain's Beckham Law 24%, Portugal's IFICI 20%, Italy's impatriati, territorial/remittance systems, …). Optionally computes leave-by/residency dates from an arrival date and warns where the Schengen 90/180 tourist limit bites first. Early-warning estimates — not tax advice.

NameTypeReqDescription
arrivalstringOptional arrival date — adds leaveBy and residencyDate to the response.
countrystringyesISO 3166-1 alpha-2 country code (case-insensitive).
daysnumberyesDays of presence in the relevant counting period.
incomenumberyesGross annual income (USD) the residency cliff would expose.
NameTypeReqDescription
datesobject
daysRemainingnumber
okboolean
pctOfThresholdnumber
projectionobject
riskstring
schengenWarningstring
thresholdDaysnumber
{"country":"ES","days":120,"income":80000}
check_travel_residency ~234

The comprehensive engine: from one travel itinerary it returns (1) Schengen 90/180 tourist-visa status (days used/remaining, first overstay, longest compliant stay), (2) per-country tax-residency risk on each country's OWN threshold and basis — the 183-day rule, Cyprus's conditional 60-day rule (flagged only when you're not 183+ resident elsewhere), the US Substantial Presence Test and the UK tax-year test — with safe days left, leave-by dates and a safe/warning/triggered rating, and (3) with an optional income, the tax cost of triggering residency at the standard rate vs an expat regime. Supersedes check_schengen / check_residency / check_tax_residency_risk (all still available). Early-warning day math — not tax advice.

NameTypeReqDescription
incomenumberOptional gross annual income (USD) — enables the tax-cost projection for at-risk countries.
referenceDatestringOptional 'as of' date. Defaults to today (UTC).
staysarrayyes
NameTypeReqDescription
countriesarray
okboolean
referenceDatestring
schengenobject|null90/180 status when any Schengen stay exists: daysUsed, daysRemaining, compliant, firstOverstayDate, maxStayFromRef.
summaryobject
{"income":120000,"stays":[{"country":"ES","entry":"2026-01-10","exit":"2026-07-28"}]}
compare_banking_access ~245

Whether adults there can bank: the share of adults (15+) with an account at a bank, another financial institution or a mobile-money provider, from the World Bank's Global Findex — a triennial household survey, so the survey year travels with each figure — plus personal remittances received as a share of GDP. Given `countries` (two or more), side by side; without, the 41-country spine ranked by `metric` (`account` or `remittancesReceived`). Account ownership says whether adults CAN bank, not whether a newcomer can open an account — that depends on residency and documentation rules this tool does not cover. A missing figure is absent and dropped from rankings, never 0.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more (e.g. "GB,NG,IN"). Omit to get a ranking instead.
limitnumberReturn at most this many countries in a ranking.
metricstringRanking metric. Ignored when `countries` is given.
sortstringRanking direction. Ignored when `countries` is given.
NameTypeReqDescription
attributionobject
caveatsarray
metricstring
okboolean
rowsarray
{"countries":"GB,NG,IN"}
compare_business_entry ~304

How long and how much it takes to register a limited company: World Bank B-READY's calendar days and cost to complete company entry for a domestic and a foreign-owned company (cost in local currency with a USD conversion at the site's FX snapshot), whether paid-in minimum capital is required, whether sectors are closed to full private ownership, whether a national-employee quota applies, and whether registration is online with an e-signature, fees payable online and a unique business id assigned — plus the World Bank Entrepreneurship Database's new limited-liability companies per 1,000 working-age adults. B-READY is a rotating cohort: 22 of the 41 spine countries are in the 2025 edition, and a country outside it answers with the new-company rate alone and a caveat naming the gap; a country with neither is NO_DATA. `country` for one, `countries` to compare, neither ranks by `metric` (daysDomestic default; costDomesticUsd, daysForeign, costForeignUsd, density). Published rates and facts on the dates shown, for information only — not tax, legal or immigration advice; every response says so first.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more.
countrystringOne ISO alpha-2 code.
limitnumber
metricstring
sortstringDefault lowest for days and cost, highest for density.
NameTypeReqDescription
activityobject
attributionobject
caveatsarray
entryobject
metricstring
okboolean
rowsarray
{"country":"PT"}
compare_childcare_cost ~256

What full-time centre-based childcare costs a family after benefits and tax, from OECD's tax-benefit model (two children aged 2 and 3, no social assistance or rent supplement): a couple both earning 100% of the average wage and a single parent earning 67%, each as a share of household disposable income, of the average wage, and in local currency per year. OECD members only — 22 of the 41 spine countries at the vintage floor; the rest return NO_DATA naming the gap, never a modelled figure. `country` for one, `countries` to compare, neither ranks by `household` (couple default; singleParent) and `unit` (pctDisposableIncome default; pctAverageWage), cheapest first unless `sort=highest`. Published cost figures, for information only; every response says so first.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more, for a side-by-side.
countrystringOne ISO alpha-2 code.
householdstring
limitnumberReturn at most this many countries.
sortstring
unitstring
NameTypeReqDescription
attributionobject
caveatsarray
coupleobject
okboolean
rowsarray
singleParentobject
yearnumber
{"country":"GB"}
compare_climate ~313

Monthly climate normals from ERA5 reanalysis (2015-2024) via Open-Meteo: mean daily maximum and minimum temperature, average monthly rainfall, and a count of comfortable days. Pass `city` (slug) or `country` (alpha-2) for one place's twelve months — a country answers through a named representative city, because a country does not have one climate. Otherwise cities are ranked by comfortable days, for a single `month` (1-12) or across the year; the seasonal question is the one people actually have, and an annual total hides it. A comfortable day has a maximum between 18 and 27 C with under 1 mm of rain — a STATED PREFERENCE, not an objective measure: it is temperate-biased and scores hot destinations low on terms they did not agree to, so mean maximum and rainfall travel with every row for callers who want to rank on those instead. ERA5 is reanalysis rather than station observation, which makes it complete and comparable across countries.

NameTypeReqDescription
citystringCity slug (e.g. "lisbon"). Returns that city's twelve months.
countrystringISO alpha-2. Returns the representative city's months, naming which city.
limitnumberReturn at most this many cities.
minComfortDaysnumberFilter: minimum comfortable days in the ranked window.
monthnumberRank a single month. Omit to rank on the whole year.
NameTypeReqDescription
cityobject
monthnumber|null
okboolean
rowsarray
updatedstring
{"limit":15,"month":1}
compare_connectivity ~227

Measured connection quality per country from Cloudflare Radar: median download and upload (Mbps), median idle latency and jitter (ms), and a call-quality verdict derived from latency and jitter rather than bandwidth — a video call fails on latency and jitter long before it fails on throughput, which is why a download figure alone cannot answer “can I work from here”. Aggregated from real connections over a 28-day window, not crowdsourced or self-reported. Coverage is wider than the site's country pages (~200 locations), so this answers for places with no page here. A country Radar has too little data for is absent, never zero.

NameTypeReqDescription
limitnumberReturn at most this many countries.
maxLatencynumberFilter: maximum median idle latency, ms (e.g. 100).
minDownloadnumberFilter: minimum median download, Mbps (e.g. 50).
sortstringMetric to rank by. Bandwidth sorts high-to-low; latency and jitter sort low-to-high, because “better” runs in opposite directions.
NameTypeReqDescription
okboolean
rowsarray
sortstring
updatedstring
{"maxLatency":100,"sort":"latency"}
compare_contract ~276

Compute gross-to-net parity between a self-employed contractor hourly rate and an employee (W2/EOR) hourly rate, accounting for self-employment/income tax and self-paid health insurance, and return the break-even contractor rate. Uses transparent effective-rate tax presets per country, all overridable. Estimates only — not tax advice.

NameTypeReqDescription
contractorRatenumberyesSelf-employed hourly rate (USD).
contractorWeeksnumberContractor paid/billable weeks (default 48).
countrystringCountry code for tax presets.
ctRatenumberOverride contractor effective tax rate, percent (e.g. 32).
empRatenumberOverride employee effective tax rate, percent (e.g. 24).
employeeRatenumberyesEmployee/W2/EOR hourly rate (USD).
employeeWeeksnumberEmployee paid weeks (default 52).
expensesnumberAnnual business expenses (USD, default 0).
healthnumberAnnual self-paid health insurance (USD); defaults to the country preset.
hoursnumberHours per week (default 40).
taxModestring'brackets' uses progressive 2025 schedules (US and GB only; falls back to flat elsewhere — response echoes the mode).
NameTypeReqDescription
breakevenRatenumber
contractorobject
contractorProfitableboolean
employeeobject
netDifferencenumber
okboolean
{"contractorRate":100,"country":"US","employeeRate":70}
compare_countries ~104

Side-by-side comparison of two countries: US-relative price levels across every dataset (World Bank, IMF, OECD, Penn World Table, consumption basket), the consensus ratio, percent difference, and $100k salary equivalence in both directions.

NameTypeReqDescription
astringyesFirst ISO 3166-1 alpha-2 country code (case-insensitive).
bstringyesSecond ISO 3166-1 alpha-2 country code (must differ from a).
NameTypeReqDescription
okboolean
pctDifferencenumber
ratioAtoBnumber
salary100kobject
{"a":"DE","b":"TH"}
compare_country_risk ~255

INFORM Risk from the European Commission's Joint Research Centre: a 0-10 composite where HIGHER IS WORSE, plus the three dimensions behind it — hazard (exposure to earthquakes, floods, cyclones, drought, conflict), vulnerability (how exposed the population is) and copingCapacity (whether institutions and infrastructure could respond). The last is usually the one that matters when choosing where to live: two countries can face the same earthquake and have completely different outcomes. Safest-first by default. Covers 191 countries, far wider than this site's country pages. A country INFORM does not score is ABSENT, never zero — zero is the safest possible value and would rank an unassessed country first. Deliberately not folded into any other ranking here: risk flags, it never silently reweights a cost or livability score.

NameTypeReqDescription
countrystringISO alpha-2 for a single country's scores.
descendingbooleanTrue lists the most dangerous first.
limitnumberReturn at most this many countries.
maxRisknumberKeep only countries at or below this composite score.
sortstringDimension to sort by. maxRisk always filters on the composite.
NameTypeReqDescription
entryobject
okboolean
releasestring
rowsarray
updatedstring
{"limit":20,"maxRisk":3}
compare_effective_tax ~268

What a company's investment is actually taxed at: OECD's forward-looking effective average tax rate (EATR), effective marginal rate (EMTR) and cost of capital for a composite investment under fixed interest and inflation, beside the statutory combined corporate rate from the Rules hub, with the gap in points — what allowances and incentives are worth. `country` for one, `countries` for a side-by-side, neither ranks by `metric` (eatr default; emtr, costOfCapital, gap), lowest first unless `sort=highest`. 39 of the 41 spine countries are modelled; the Philippines and the UAE keep their statutory rate with a caveat and never a borrowed effective rate. A property of the tax system, not any company's bill. Published rates and facts on the dates shown, for information only — not tax, legal or immigration advice; every response says so first.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more, for a side-by-side.
countrystringOne ISO alpha-2 code.
limitnumberReturn at most this many countries.
metricstringRanking metric when neither `country` nor `countries` is given.
sortstring
NameTypeReqDescription
attributionobject
caveatsarray
effectiveobject
gapPctnumber
metricstring
okboolean
rowsarray
statutoryCombinedPctnumber
{"country":"DE"}
compare_egov ~237

How much of government can be done online: the UN E-Government Development Index (0–1) and its three components — Online Service Index, Telecommunication Infrastructure Index, Human Capital Index — for all 41 spine countries, read from the UN E-Government Knowledgebase's country pages because no data file is published. The index measures what government provides online and the infrastructure and skills to use it, not whether a newcomer can use it (most services need a national id or residence first). The survey is biennial and the caveat names its year. `country`, `countries`, or a ranking by `index` (egdi default; osi, tii, hci), highest first unless `sort=lowest`. Published figures, for information only; every response says so first.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more, for a side-by-side.
countrystringOne ISO alpha-2 code.
indexstring
limitnumberReturn at most this many countries.
sortstring
NameTypeReqDescription
attributionobject
caveatsarray
egdinumber
hcinumber
indexstring
okboolean
osinumber
rowsarray
tiinumber
yearnumber
{"country":"KR"}
compare_food_cost ~370

What eating a healthy diet costs per person per day, MEASURED: the World Bank's Food Prices for Nutrition series (the cheapest locally available foods that meet a healthy-diet standard, from International Comparison Program retail prices), 165 of the 186 spine countries. Returns the cost in local currency (dailyLocal) and USD (dailyUsd, monthlyUsd), the share of people who cannot afford it (unaffordable.pct, on its own year), the diet's split across six food groups as percentage shares for the single year published, and how this site's MODELLED grocery prices compare: vsUsMeasured and vsUsModelled are each a multiple of the US, and modelError = modelled ÷ measured (below 1, the model understates food there). A ranking also returns modelErrorSummary for the whole site. Where the local figure does not convert consistently at the site's exchange rate (a parallel market, a recent devaluation, a currency change) the dollar figure and the comparison are withheld and a caveat says why; a country with no survey is NO_DATA, never zero. It is a least-cost diet, not what a typical or expat household spends, and it feeds no total. `country` for one, `countries` to compare, neither ranks by `metric` (dailyUsd default, or unaffordablePct), cheapest first unless `sort=highest`. Published cost figures, for information only; every response says so first.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more, for a side-by-side.
countrystringOne ISO alpha-2 code.
limitnumberMaximum rows in a ranking.
metricstring
sortstring
NameTypeReqDescription
attributionobject
caveatsarray
dailyLocalnumber
dailyUsdnumber
excludedarray
modelErrornumber
modelErrorSummaryobject
okboolean
rowsarray
{"country":"TH"}
compare_health_capacity ~243

How much health system there is per person: medical doctors and nursing and midwifery personnel per 10,000 (WHO Global Health Observatory) and hospital beds per 10,000 (WHO, or OECD where newer — the row names its source), beside the UHC service-coverage index. Density is not access: it says how much exists, not whether a visitor can use it or what it costs. Newest observation at the site's vintage floor; 36 of the 41 spine countries carry doctors and nurses, 31 beds; an older figure is absent, never served as current. `country` for one, `countries` to compare, neither ranks by `metric` (doctors default; nurses, beds), highest first unless `sort=lowest`. Published figures, for information only; every response says so first.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more, for a side-by-side.
countrystringOne ISO alpha-2 code.
limitnumberReturn at most this many countries.
metricstring
sortstring
NameTypeReqDescription
attributionobject
bedsPer10kobject
caveatsarray
doctorsPer10kobject
metricstring
nursesPer10kobject
okboolean
rowsarray
uhcIndexnumber
{"country":"DE"}
compare_healthcare ~403

Healthcare cost and financial exposure across 41 countries: out-of-pocket spend per person per year (US$), out-of-pocket as a share of all health spending, total health spend per capita (PPP international $), government funding share, physicians per 1,000 and dentists per 10,000. Figures are MEASURED from World Bank and WHO Global Health Observatory series, never derived from a price index: scaling healthcare by a country's general price level overstates costs abroad by 1.2x-5.4x, because health prices do not track the price level (the US is an outlier and several countries deliberately price healthcare below their own economies). Share and burden are separate facts and both are returned - the US pays only ~11% out of pocket, a low share, but the highest absolute amount. Dental is reported as ACCESS (dentist density), not price: no free citable source publishes procedure prices. National averages, not a quote for any individual's care. Not medical, insurance or financial advice.

NameTypeReqDescription
countrystringOptional ISO 3166-1 alpha-2 country code (case-insensitive). Echoes that country's row and its rank under the active sort.
maxOutOfPocketPctnumberOptional filter: keep only countries where households pay at most this percentage of health spending directly.
minPhysiciansPer1000numberOptional filter: keep only countries with at least this many physicians per 1,000 people.
sortstringMetric to rank by. 'outOfPocket' = out-of-pocket spend per person per year (default, the figure a person actually pays); 'spend' = total health spend per capita; 'exposure' = out-of-pocket as a share…
NameTypeReqDescription
attributionobjectSources, a quotable citation and a permalink.
excludednumberCountries removed by filters or missing the sorted metric.
focusobjectThe requested country's row, when `country` was given.
okboolean
rowsarrayCountries under the active sort, best first.
updatedstringISO date the underlying data was last refreshed.
{"country":"TH","sort":"outOfPocket"}
compare_housing ~445

Housing cost and affordability across countries, built for remote workers. Returns monthly rent plus TWO ratios that together answer the real question: rent as a share of the LOCAL median wage (are locals priced out?) and as a share of YOUR remote income (can you afford it?). The gap between them - `arbitrageGap`, in percentage points - is the single number saying whether a place is cheap FOR YOU; pass `remoteIncome` to get it. Also returns price-to-income and price-to-rent as a percentage of each country's OWN long-run average (OECD), and mortgage rates (ECB, euro area only; absent elsewhere rather than estimated). IMPORTANT: those affordability percentages compare a country with its own history, NOT with other countries - 127 for Spain means 27% less affordable than Spain's norm, not 27% dearer than Germany. Every rent carries `rentBasis`: 'measured' where a real Eurostat city figure exists (Spain, Portugal, Switzerland only) or 'modelled' from the site's price basket, which understates housing by up to ~40% where housing has decoupled from the general price level. National averages; not financial advice.

NameTypeReqDescription
countrystringOptional ISO 3166-1 alpha-2 code; echoes that country's row and rank.
flatM2numberFlat size in m² used to convert measured per-m² rents. Default 70; echoed back so the assumption is visible.
maxRentPctOfIncomenumberOptional filter: keep only countries where rent is at most this percentage of your remote income. Requires remoteIncome.
remoteIncomenumberYour monthly income in USD, earned remotely. Enables rentPctOfYourIncome and arbitrageGap; omit for the local-only view.
sortstring'affordability' = rent as a share of your remote income, lowest first (falls back to raw rent when no income given); 'rent' = monthly rent; 'localBurden' = rent as a share of the local median wage; '…
NameTypeReqDescription
attributionobject
excludednumber
focusobject
okboolean
rowsarray
updatedstring
{"remoteIncome":6000,"sort":"affordability"}
compare_inflation ~282

What money earns or loses in real terms. Given `countries` (two or more ISO alpha-2 codes), returns side by side: consumer-price inflation (World Bank, latest annual, plus the IMF's monthly year-on-year figure where available), the central-bank policy rate (BIS, newest month; the ECB's single rate for euro-area members, flagged `viaEuroArea`), deposit and lending rates (World Bank, where published), and the real rates the engine computes from them by the exact Fisher relation — only when the nominal rate and the inflation figure are within a year of each other. Without `countries`, ranks the 41-country spine by one `metric`. A country missing a metric lacks the key and is dropped from a ranking, never scored 0. Real rates are ex post (last year's inflation), not expectations; a projection at the latest rate is flat, not a forecast.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more (e.g. "GB,DE,TR"). Omit to get a ranking instead.
limitnumberReturn at most this many countries in a ranking.
metricstringRanking metric. Ignored when `countries` is given.
sortstringRanking direction. Ignored when `countries` is given.
NameTypeReqDescription
attributionobject
caveatsarray
metricstring
okboolean
rowsarray
{"countries":"GB,DE,TR"}
compare_occupation_pay ~255

MEASURED gross monthly earnings of employees by ISCO-08 major occupation group, from ILOSTAT — median and mean, in USD, PPP dollars and local currency, for 35 countries (a median is published for most of them). This is the site's only measured wage series; calculate_wage_bands is MODELLED, and the two are not interchangeable. Each row also carries the female-vs-male pay gap for that occupation (positive means women earn less; negative values are real and are kept) and where the occupation's median sits on the country's modelled national wage ladder. Employees only — excludes the self-employed and informal workers, which is why these diverge most from GNI-derived estimates in countries with large informal sectors. Before tax. The ten ISCO-08 major groups are broad families of work, not job titles: one group covers a surgeon and a junior developer alike. Countries with no ILO data return NO_DATA rather than a modelled substitute.

NameTypeReqDescription
countrystringyesISO 3166-1 alpha-2 country code (case-insensitive).
occupationstringNarrow the response to one ISCO-08 major group. Omit for the whole table.
NameTypeReqDescription
basisstringAlways 'measured' on success.
countryobject
measuredMedianMonthlyUsdnumber
modelRationumbermeasured / modelled for the country. Above 1: the model understates local pay.
modelledMedianMonthlyUsdnumber
okboolean
rowsarray
yearnumberILO reference year — one year across every occupation in the country.
{"country":"GB","occupation":"professionals"}
compare_pension_systems ~373

What the state pension system looks like there, from OECD Pensions at a Glance (members and G20 partners, 33 of the 41 spine countries). Give `country` for one: normal retirement age now and for a 22-year-old entering today, by sex; net and gross replacement rates for a full-career average earner at 50/100/200% of the average wage under mandatory schemes; expected years after leaving work; the share of pensioners below half of median income; the average tax rate on an average pension; the old-age to working-age ratio and public pension spending; plus World Bank life expectancy and the 65+ share for all 41 — and WBL's statutory retirement age beside them, which stands alone for the eight countries OECD does not cover (no replacement rate is ever borrowed). Give `countries` (two or more) for a side-by-side, or neither for the spine ranked by `metric`. Projection rows (2060+) are excluded. A country missing a metric lacks the key and is dropped from a ranking, never scored 0. Published rules and modelled figures on the dates shown, for information only — entitlements depend on a person's record and consulates decide; every response says so first.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more, for a side-by-side. Ignored when `country` is given.
countrystringOne ISO alpha-2 code for the full profile (e.g. "DE").
limitnumberReturn at most this many countries in a ranking.
metricstringRanking metric when neither `country` nor `countries` is given.
sortstringRanking direction. Ignored otherwise.
NameTypeReqDescription
attributionobject
caveatsarray
metricstring
okboolean
replacementobject
retirementAgeobject
rowsarray
statutoryRetirementAgeobject
{"country":"DE"}
compare_public_holidays ~254

Two questions in one. Given `countries` (two or more), returns the working days those places genuinely SHARE in a year — weekdays on which nobody is on a public holiday — which is the number a distributed team actually plans against and the half of the question timezone-overlap tools never answer: a London/Tokyo team loses roughly three working weeks a year to non-overlapping holidays. Without `countries`, ranks countries by nationwide public holidays. Weekend holidays are excluded (they cost nobody a working day) and regional holidays are counted separately from national ones. Covers 204 countries, but NOT India, Thailand, Malaysia, the UAE or Saudi Arabia — those return NO_DATA rather than an empty calendar, because “no data” and “no holidays” are opposite claims.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more (e.g. "GB,JP"). Omit to get a ranking instead of an overlap.
limitnumberReturn at most this many countries in a ranking.
sortstringRanking direction. Ignored when `countries` is given.
yearnumberCalendar year. Defaults to the first year in the dataset.
NameTypeReqDescription
countriesarray
lostDatesarray
lostDaysnumber
okboolean
rowsarray
sharedWorkingDaysnumber
weekdaysnumber
yearnumber
{"countries":"GB,JP"}
compare_safety_stats ~313

Measured danger once there. Given `countries` (two or more ISO alpha-2 codes), returns side by side: intentional homicides per 100,000 (UNODC via World Bank WDI) and mean annual PM2.5 exposure in µg/m³ (WDI), each with its observation year, and the INFORM disaster-risk score and band composed for context. Without `countries`, ranks the 41-country spine by one `metric` (`homicide` default, `pm25`), lowest first. Only observations at or after the newest WDI vintage are held; a country whose newest figure is older lacks the key and is dropped from the ranking, never scored 0 — the UK's newest homicide observation predates the floor, so it has no homicide figure here. Homicide counts intentional killings only, not petty crime or road deaths; PM2.5 is a national population-weighted mean. Official sources on the dates shown, for information only — conditions change; check the source before travelling. Every response says so first.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more (e.g. "DE,BR,ZA"). Omit to get a ranking instead.
limitnumberReturn at most this many countries in a ranking.
metricstringRanking metric. Ignored when `countries` is given.
sortstringRanking direction. Ignored when `countries` is given.
NameTypeReqDescription
attributionobject
caveatsarray
metricstring
okboolean
rowsarray
{"countries":"DE,BR,ZA"}
compare_tax_burden ~270

How much work paying tax is, from World Bank B-READY's Taxation topic (firm surveys in the largest business city): median hours spent on tax compliance a year, the share of firms filing and paying electronically, weeks to a final audit report and to a VAT refund, the share citing a too-long refund process, the share of social-security taxes in labour cost, and the effective income-based rate firms REPORT paying — which is neither the statutory rate (Rules hub) nor OECD's modelled effective rate (Business hub's tax tab), and the caveat keeps the three apart. 22 of the 41 spine countries; outside the cohort is NO_DATA. `country`, `countries`, or a ranking by `metric` (complianceHours default; vatRefundWeeks, auditWeeks, reportedEffectiveRatePct), lowest first unless `sort=highest`. Published rates and facts, for information only — not tax or legal advice; every response says so first.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more, for a side-by-side.
countrystringOne ISO alpha-2 code.
limitnumberReturn at most this many countries.
metricstring
sortstring
NameTypeReqDescription
attributionobject
caveatsarray
complianceHoursnumber
metricstring
okboolean
reportedEffectiveRatePctnumber
rowsarray
vatRefundWeeksnumber
{"country":"PT"}
compare_tax_rates ~310

Statutory tax schedules from the OECD, compared or ranked. Given `countries` (two or more ISO alpha-2 codes), returns side by side the corporate income-tax rate (combined central plus average sub-national, central only, and a small-business rate where one exists; OECD Corporate Tax Statistics, all 41 spine countries) and, for OECD members, the top personal income-tax rate with the earnings threshold at which it starts as a multiple of the average wage, plus the marginal rate with employee social contributions at that point (OECD Tax Database, 26 of the spine). Without `countries`, ranks the spine by one `metric`. A country OECD's PIT flow does not cover has no `personal` block and is dropped from a PIT ranking, never scored 0. Rates are statutory, not effective: incentives, surtaxes and special regimes are outside the data, and this does not replace the blended take-home profiles behind `compare_contract`. Statutory figures for information only — not legal or tax advice; every response says so first.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more (e.g. "DE,IE,TH"). Omit to get a ranking instead.
limitnumberReturn at most this many countries in a ranking.
metricstringRanking metric. Ignored when `countries` is given.
sortstringRanking direction. Ignored when `countries` is given.
NameTypeReqDescription
attributionobject
caveatsarray
metricstring
okboolean
rowsarray
{"countries":"DE,IE,TH"}
compare_total_cost ~287

What a month actually costs in each of 41 countries on a stated income, and what is left over. Sums four lines that are kept from overlapping: rent (measured Eurostat city rents, HUD Fair Market Rents, or the price basket where neither covers a country), the everyday basket EXCLUDING rent (the basket normally contains rent — roughly half of it — so adding a separate housing figure to the full basket would overstate a total by ~60%), out-of-pocket healthcare, and income tax plus employee social contributions on that income. VAT is already inside the basket prices (purchasing-power data derives from surveyed purchaser prices) and is therefore never added. Tax assumes you become tax-resident and are taxed locally, single filer, no deductions; special regimes such as Portugal's IFICI are reported separately where they would be cheaper. Estimates for comparison — not a quote and not tax advice.

NameTypeReqDescription
countrystringISO 3166-1 alpha-2; echoes that country's row and rank as `focus`.
incomenumberyesMonthly income in USD. Required — the tool is a subtraction.
maxPctOfIncomenumberKeep only countries whose total is at or below this share of income (%).
sortstringRanking. 'remaining' = most left over first; 'share' = smallest share of your income.

No output schema declared.

{"income":6000,"sort":"remaining"}
compare_trade_customs ~244

How long goods take to clear the border and what compliance costs, from World Bank B-READY's International Trade topic (firm-survey averages in the largest business city): days for exported and imported goods to clear all border agencies, the typical cost of complying with export and import requirements as a share of goods value, and the share of firms exporting by parcel. B-READY is a rotating cohort — 22 of the 41 spine countries in the 2025 edition — and a country outside it is NO_DATA, never a borrowed figure. `country`, `countries`, or a ranking by `metric` (importDays default; exportDays, importCostPct, exportCostPct), lowest first unless `sort=highest`. Published rates and facts, for information only — not tax, legal or customs advice; every response says so first.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more, for a side-by-side.
countrystringOne ISO alpha-2 code.
limitnumberReturn at most this many countries.
metricstring
sortstring
NameTypeReqDescription
attributionobject
caveatsarray
exportCostPctnumber
exportDaysnumber
importCostPctnumber
importDaysnumber
metricstring
okboolean
rowsarray
{"country":"PT"}
compare_vat ~293

Standard and reduced VAT/GST rates for the 41-country spine, hand-curated from each national tax authority's published page and served with that page's URL and the date it was checked, so a figure can be verified rather than trusted. Given `countries` (two or more ISO alpha-2 codes), returns each country's tax kind and name, standard rate, reduced rates where the authority lists them, registration threshold where known, and its source; an entry read from a secondary source because the authority's page could not be fetched is marked `confidence: "secondary"`. Without `countries`, ranks standard rates lowest first. Countries with no single national rate — the US (state sales taxes), Brazil (state and federal taxes in transition to a dual VAT) and Malaysia (sales and service tax) — are described by `kind`, excluded from the ranking and named in `excluded`, never given 0%. Reviewed at least yearly; not a live feed. Statutory figures for information only — not legal or tax advice; every response says so first.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more (e.g. "GB,US,DE"). Omit to get a ranking instead.
limitnumberReturn at most this many countries in a ranking.
sortstringRanking direction. Ignored when `countries` is given.
NameTypeReqDescription
attributionobject
caveatsarray
excludedarray
okboolean
rowsarray
{"countries":"GB,US,DE"}
compare_working_time ~322

Two questions in one. Given `countries` (two or more ISO alpha-2 codes), returns side by side: mean weekly hours actually worked per employed person (ILOSTAT, newest year from 2023), average annual hours actually worked (OECD, members only), and the paid leave the law gives mothers and fathers in calendar days with who pays (World Bank Women, Business and the Law 2026). Without `countries`, ranks the 41-country spine by one `metric` — weeklyHours, annualHours, maternityDays or paternityDays; `sort=fewest` inverts. A country missing a metric lacks the key, and is dropped from a ranking rather than scored zero. OECD's annual-hours series is NOT comparable across countries, by OECD's own statement — the wording travels with every response that carries the figure. Weekly hours average full- and part-time workers together. Leave is what the law provides, not take-up; a legal score below 1 marks a partial provision. Statutory minimum ANNUAL leave is deliberately absent: no citable structured source exists.

NameTypeReqDescription
countriesstringComma-separated ISO alpha-2 codes, two or more (e.g. "DE,US,TH"). Omit to get a ranking instead.
limitnumberReturn at most this many countries in a ranking.
metricstringRanking metric. Ignored when `countries` is given.
sortstringRanking direction. Ignored when `countries` is given.
NameTypeReqDescription
attributionobject
caveatsarray
metricstring
okboolean
rowsarray
{"countries":"DE,US,TH"}
country_dossier ~596

The three to six headline figures each hub owns for one country, in one call: price level vs the US and datasets covering it (compare); monthly essentials, health out-of-pocket spending and — with `income` — what is left after costs (costs); modelled median and minimum wage, ILOSTAT measured median, pension replacement rate (earn); safety and healthcare-access scores, rule of law, disaster risk, comfortable days, tax-residency threshold, passport rank, nomad-visa programmes (move); public holidays, latency and download speed, employer contribution loading, weekly hours, paid maternity leave (work); inflation, policy rate, banked adults, remittance corridors surveyed (money); combined corporate tax rate, top income-tax rate and where it starts, standard VAT rate (absent for the US — state sales taxes are not a 0% VAT), the Women, Business and the Law index and retirement ages for men and women (rules); FCDO and US State Department advice levels, the yellow-fever certificate position, homicide rate and PM2.5 exposure with their years (safety); retirement ages for men and women (OECD, else WBL), the net replacement rate, life expectancy and the kind of retiree visa (retire). Effective average corporate tax rate, standard withholding on dividends, days to register a company (absent outside the B-READY cohort) and the kind of founder visa (business). Since 5 Sep 2026 the sections also carry doctors per 10,000 (safety), the couple's net childcare cost as a share of income (costs), days for imports to clear customs and hours on tax compliance (business), the E-Government index (work), and the foreign-ownership band for property and the kind of student visa (move) — each absent where its source does not cover the country. Every figure carries the id of the source that produced it, `tools` names the MCP tool to call for detail per section, and `sources` lists only what was actually included. A section or figure the site has no data for is ABSENT, never null — Thailand has n…

NameTypeReqDescription
countrystringyesISO alpha-2 code (e.g. "PT").
incomenumberGross monthly income in USD. Optional; unlocks the total-cost figures.
NameTypeReqDescription
attributionobject
countryobject
okboolean
sectionsobject
sourcesarray
toolsobject
updatedstring
{"country":"PT","income":5000}
Common questions

What is the Geo-Parity MCP server?

Geo-Parity is an MCP server listed in the public MCP registry as com.geo-parity/geo-parity. Cost of living, fair global pay, healthcare costs, nomad visas and tax residency. Free, no key. This page covers its hosted endpoint (https://geo-parity.com/api/mcp).

Is the Geo-Parity MCP server safe to use?

Geo-Parity scores 87 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 Geo-Parity MCP server expose?

Geo-Parity exposes 62 tools: compare_total_cost, calculate_ppp, localize_salary, calculate_wage_bands, compare_occupation_pay, and 57 more. Their descriptions and schemas cost roughly 17,916 tokens of context every time the server is loaded.

Does the Geo-Parity MCP server require authentication?

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

Is the Geo-Parity MCP server still maintained?

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