Query UNHCR refugee, IDP, and stateless populations, asylum decisions, returns, and resettlement.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
One-click editor setup isnβt available for this listing yet β we donβt have a confirmed install command, and weβd rather show nothing than point your editor at the wrong package or host. Follow the projectβs own setup instructions, linked above.
Query UNHCR refugee, IDP, and stateless populations, asylum decisions, returns, and resettlement via MCP. STDIO or Streamable HTTP.
Displacement statistics from the keyless UNHCR Refugee Data Finder API: refugee, asylum-seeker, IDP, and stateless populations by country of origin and asylum from 1951, asylum applications and decisions from 2000, and returns, resettlement, and naturalisation from 1959. Resolve country names to ISO3 codes, pull annual figures with notes on how to read them, and run SQL over results too large to return inline. Runs as a stdio process or a local Streamable HTTP server.
| Tool | Description |
|---|---|
unhcr_list_reference | Decode countries (ISO3, ISO2, and UNHCR codes, names, regions), regional bureaus, dataset coverage years, population types, and asylum codes |
unhcr_get_population | Year-end displacement stocks by origin and/or asylum country from 1951, with UNRWA and IDMC series alongside and an optional current-year nowcast |
unhcr_get_demographics | Year-end stocks by population type, sex, and age band from 2001, with the share UNHCR could disaggregate |
unhcr_get_asylum_applications | Asylum applications lodged per year from 2000, split by application stage by default |
unhcr_get_asylum_decisions | Asylum decisions per year from 2000 by outcome, with the Refugee Recognition Rate and Total Protection Rate |
unhcr_get_solutions | Refugee returns, resettlement, naturalisation, and IDP returns per year from 1959 |
unhcr_dataframe_describe | Describe a staged dataframe by name, or list them all where listing is on, with provenance, expiry, completeness, and column schema |
unhcr_dataframe_query | Run one read-only SQL SELECT across staged dataframes, optionally saving the result as a new one |
unhcr_dataframe_drop | Drop a staged dataframe before its TTL β opt-in, absent from tools/list by default |
unhcr_dataframe_drop is registered only when UNHCR_DATAFRAME_DROP_ENABLED=true; the other eight tools are always advertised.
unhcr_get_* call whose full result exceeds limit, or that sets stage: true, stages every row as a df_XXXXX_XXXXX table and returns its handle in dataset.unhcr_dataframe_describe lists the staged tables with their columns, source call, and expiry. Listing is off over HTTP with MCP_AUTH_MODE=none, so there describe each table by the name in dataset.unhcr_dataframe_query runs one read-only DuckDB SELECT across them; register_as saves the result as a new table for the next query.UNHCR_DATASET_TTL_SECONDS (24 hours by default). With UNHCR_DATAFRAME_DROP_ENABLED=true, unhcr_dataframe_drop removes one sooner. Once a tenant's staged rows pass 1,000,000, the oldest tables are evicted first, and the call that pushed the total over names them in evicted.Dataframes run on DuckDB's native binding, which the npm and Docker installs carry. The Claude Desktop .mcpb bundle ships without it, so there the data tools answer inline only. Set CANVAS_PROVIDER_TYPE=none to turn dataframes off anywhere.
The five unhcr_get_* tools share one contract:
origin and asylum take ISO3 codes, case-insensitive, as a string or a list, up to 50 each. ISO2 codes are rewritten to ISO3; UNHCR's own codes and country names are rejected. Each listed code returns its own rows, and an omitted dimension is summed into one row unless expand (origin, asylum, or both) lists every country. year_from / year_to default to the dataset's span and are clamped to it.sort_by, then cut to limit (1β500, default 100). Where dataframes are on, the full set of a larger result is staged, and stage: true stages a result that fits too.total_rows, complete (false when UNHCR_MAX_ROWS stopped the fetch), measure (stock or flow), applied_scope, latest_year, dataset when staged, data_notes, and attribution.unknown_country_code, invalid_year_window, year_out_of_coverage, conflicting_scope, and the retryable upstream_busy, which carries retryAfter.unhcr_list_reference tooltopic: countries, regions, coverage, population_types, or asylum_codes. With countries, name_contains keeps countries whose names contain every word given, or whose ISO3, ISO2, or UNHCR code equals one; there is no fuzzy matchingcoverage gives each dataset's first_year, latest_year, and measure, plus the month of the current nowcastdocumented: falseunhcr_get_population toolrefugees, asylum_seekers, oip, idps, stateless, ooc, and hst, plus returned_refugees and returned_idps, which are flows during the year; sort_by takes any of them or yearunrwa_refugees (Palestine refugees registered with UNRWA) and idmc_conflict_idps (IDMC's conflict-IDP estimate) sit beside a row when that series has one and are never added into UNHCR's counts. Matching UNHCR footnotes come back too, up to 20, with footnotes_totalinclude_nowcast: true appends UNHCR's current-year monthly estimate of refugees and asylum-seekers by asylum country; it is skipped when origin lists codesunhcr_get_demographics toolpopulation_types filters to REF, ASY, OIP, IDP, STA, OOC, HST, RET, or RDP; sort_by takes year or totaltotal, fourteen sex Γ age bands (female_0_4 β¦ female_60_plus, female_unknown_age, female_total, and the male_* twins), disaggregated, and sex_disaggregated_share (0β1). Bands are null where UNHCR has no breakdownunhcr_get_population; matching footnotes come back as thereunhcr_get_asylum_applications toolsplit_by names which of authority, stage, and decision_level stay separate rows (default ["stage"]; [] gives one total per year, scope, and unit). stages filters before summing, e.g. ["N"] for new applications; sort_by takes year or appliedauthorities, stages, and decision_levels codes summed into it, its unit (persons or cases), and applied. Cases are never added to personsunhcr_get_asylum_decisions toolsplit_by names which of authority and decision_level stay separate rows (default [], all summed, as UNHCR does for its rates). decision_levels filters before summing, e.g. ["FI"] for first instancerecognized, complementary_protection, rejected, otherwise_closed, total_decisions, substantive_decisions, and a unit, plus refugee_recognition_rate and total_protection_rate as percentages of substantive decisions. A rate is null when that denominator is 0 or nullsort_by takes year or a count (total_decisions, substantive_decisions, recognized, rejected); rates are not sortableunhcr_get_solutions toolreturned_refugees, resettlement, naturalisation, and returned_idps; sort_by takes any of them or year. Matching footnotes come back as with populationNo reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/unhcr-refugees-mcp-server)<a href="https://allmcps.com/mcp/unhcr-refugees-mcp-server"><img src="https://allmcps.com/api/badge/unhcr-refugees-mcp-server?style=directory" alt="Unhcr Refugees MCP Server on AllMCPs" /></a>