io. github. cyanheads/ unhcr-refugees-mcp-server
by cyanheads · remote · local (npm) · no sign-in to list tools · v0.2.0 · published by GitHub user cyanheads
Query UNHCR refugee, IDP, and stateless populations, asylum decisions, returns, and resettlement.
8 tools: 1 change things and 7 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things1Claude Code: ask: see these tools
- Only reads7Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http unhcr-refugees https://unhcr-refugees.caseyjhand.com/mcpFindings
Matches of fixed checks, with the text they matched.
The server marks "unhcr_dataframe_query" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false}; The name "unhcr_dataframe_query" says "query": a word for reading.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
8 tools
Changes things 1Claude Code: ask
unhcr_dataframe_queryRun a single-statement SELECT against the dataframes staged by the unhcr_get_* tools.1 finding
Why it is in this group
- The name "unhcr_dataframe_query" says "query": a word for reading.
- The description's first verb is "run": a word for a change.
- The input takes a statement or command to run (input.sql), which can change anything it can reach.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "unhcr_dataframe_query" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false}; The name "unhcr_dataframe_query" says "query": a word for reading.
Description, as the server wrote it Run a single-statement SELECT against the dataframes staged by the unhcr_get_* tools. Check a dataframe’s columns with unhcr_dataframe_describe first. Writes, DDL, DROP, COPY, PRAGMA, ATTACH, file references, external-data functions, engine introspection, dynamic table lookup, and system catalogs are rejected; query() accepts only a single SQL string literal, checked by the same gate. Optional register_as saves the result as a new dataframe with a fresh TTL. Recompute rates from summed counts rather than averaging rate columns.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
Only reads 7Claude Code: allow
unhcr_dataframe_describeDescribe a dataframe (df_XXXXX_XXXXX) staged by the unhcr_get_* tools — any response carrying a dataset handle staged its full result here — or list them all where this deployment …No findings
Why it is in this group
- The name "unhcr_dataframe_describe" says "describe": a word for reading.
Description, as the server wrote it Describe a dataframe (df_XXXXX_XXXXX) staged by the unhcr_get_* tools — any response carrying a dataset handle staged its full result here — or list them all where this deployment allows listing. Each entry gives the source tool, query parameters, creation and expiry time, row count, whether the upstream fetch was complete, and the column schema. Read the columns here before writing SQL for unhcr_dataframe_query.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
unhcr_get_asylum_applicationsGet asylum applications lodged per year (2000 to the latest year) by country of origin and/or asylum, split by default into application stage — new, repeat, appeal, and the combine…No findings
Why it is in this group
- The name "unhcr_get_asylum_applications" says "get": a word for reading.
Description, as the server wrote it Get asylum applications lodged per year (2000 to the latest year) by country of origin and/or asylum, split by default into application stage — new, repeat, appeal, and the combined stages some countries report — so new claims are not added to appeals of old ones. Counts given as cases are never added to counts of persons; each row states its unit. Decode stage, authority, and decision-level codes with unhcr_list_reference (topic asylum_codes).
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
unhcr_get_asylum_decisionsGet asylum decisions per year (2000 to the latest year) by country of origin and/or asylum: recognized as refugees, complementary protection, rejected, and otherwise closed, with U…No findings
Why it is in this group
- The name "unhcr_get_asylum_decisions" says "get": a word for reading.
Description, as the server wrote it Get asylum decisions per year (2000 to the latest year) by country of origin and/or asylum: recognized as refugees, complementary protection, rejected, and otherwise closed, with UNHCR's Refugee Recognition Rate and Total Protection Rate computed over substantive decisions (otherwise-closed cases excluded). By default all decision levels are summed and each row lists the levels it includes; appeal-stage decisions can concern people already decided at first instance, so split_by decision_level or filter decision_levels to FI for first-instance rates. Cases and persons are never added together.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
unhcr_get_demographicsGet UNHCR year-end stocks (2001 to the latest year) broken down by population type, sex, and age band (0–4, 5–11, 12–17, 18–59, 60+, unknown age), by country of origin and/or asylu…No findings
Why it is in this group
- The name "unhcr_get_demographics" says "get": a word for reading.
Description, as the server wrote it Get UNHCR year-end stocks (2001 to the latest year) broken down by population type, sex, and age band (0–4, 5–11, 12–17, 18–59, 60+, unknown age), by country of origin and/or asylum. Coverage is partial: each row gives the share of its total that UNHCR could disaggregate by sex, and age bands are null where no breakdown exists. These totals come from a separate collection and need not match unhcr_get_population.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
unhcr_get_populationGet UNHCR year-end displacement stocks (1951 to the latest year) by country of origin and/or asylum: refugees, asylum-seekers, other people in need of international protection, IDP…No findings
Why it is in this group
- The name "unhcr_get_population" says "get": a word for reading.
Description, as the server wrote it Get UNHCR year-end displacement stocks (1951 to the latest year) by country of origin and/or asylum: refugees, asylum-seekers, other people in need of international protection, IDPs, stateless people, others of concern, and host communities, plus refugees and IDPs who returned during the year. Stocks count people in a situation on 31 December, not arrivals. Palestine refugees under UNRWA's mandate and IDMC's conflict-IDP estimate are separate series shown beside each row. Set include_nowcast for UNHCR's current-year estimate by asylum country; for sex and age breakdowns, use unhcr_get_demographics.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
unhcr_get_solutionsGet durable solutions per year (1959 to the latest year) by country of origin and/or asylum: refugees who returned home, refugees resettled to a third country, refugees naturalised…No findings
Why it is in this group
- The name "unhcr_get_solutions" says "get": a word for reading.
Description, as the server wrote it Get durable solutions per year (1959 to the latest year) by country of origin and/or asylum: refugees who returned home, refugees resettled to a third country, refugees naturalised, and IDPs who returned. The asylum country means something different per column: the country refugees returned from, the country they were resettled to, the country that naturalised them; IDP returns sit on the origin country itself. Null means the figure was not collected for that country and year, not zero.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
unhcr_list_referenceDecode the vocabulary the unhcr_* tools take as input: countries (ISO3, ISO2, UNHCR code, names, UNHCR and UN regions), UNHCR’s regional bureaus, each dataset’s first and latest ye…No findings
Why it is in this group
- The name "unhcr_list_reference" says "list": a word for reading.
Description, as the server wrote it Decode the vocabulary the unhcr_* tools take as input: countries (ISO3, ISO2, UNHCR code, names, UNHCR and UN regions), UNHCR’s regional bureaus, each dataset’s first and latest year, population-type definitions, and the asylum authority, stage, decision-level, and unit codes. Filter countries with name_contains to turn a country name into the ISO3 code that origin and asylum take.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 0.2.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http unhcr-refugees https://unhcr-refugees.caseyjhand.com/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__unhcr-refugees__unhcr_list_reference",
"mcp__unhcr-refugees__unhcr_get_population",
"mcp__unhcr-refugees__unhcr_get_demographics",
"mcp__unhcr-refugees__unhcr_get_asylum_applications",
"mcp__unhcr-refugees__unhcr_get_asylum_decisions",
"mcp__unhcr-refugees__unhcr_get_solutions",
"mcp__unhcr-refugees__unhcr_dataframe_describe"
],
"ask": [
"mcp__unhcr-refugees__unhcr_dataframe_query"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as unhcr-refugees. Review it before you use it.
