Malja MCP
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Malja MCPWhat were the top refugee-hosting countries per capita in 2023?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Malja MCP — ملجأ
ملجأ (malja', "refuge") — بيانات اللاجئين والنزوح والأزمات الإنسانية الموثّقة، في متناول مساعدك الذكي.
Trusted humanitarian data — refugees, conflict, hunger, funding — as one clean, citable interface for AI assistants and research code.

What is Malja MCP?
Malja MCP is an open-source server that gives AI assistants and analysis scripts reliable, normalized, read-only access to trusted humanitarian datasets: 75 years of UNHCR displacement statistics, World Bank context indicators, HDX crisis data (conflict events, food security, humanitarian funding, internal displacement), and ReliefWeb situation reports.
MCP in one paragraph: the Model Context Protocol is an open standard — think "USB for AI tools" — that lets any AI application (Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, custom agents) plug into external systems through one protocol. A server like this one exposes tools the model can call, resources it can read, and prompts it can reuse. Connect it once, and every question your assistant answers about displacement is grounded in the real numbers instead of its training data. New to MCP? Read docs/how-mcp-works.md.
Humanitarian data is public but hostile to programmatic use — different country-code schemes, different schemas, silent failure modes (details below). This project normalizes multiple humanitarian datasets into one consistent record shape, one country-code scheme (ISO3), one interface, with the citation attached to every payload.
Related MCP server: Globalpulse-MCP
Why this project exists
Every trap below is real, encoded in this codebase, and covered by tests:
Problem | Example | What this server does |
Country-code chaos | UNHCR's internal codes disagree with ISO3 for 99 of 232 countries. Egypt is | Everything speaks ISO3. Names resolve fuzzily in English and Arabic («مصر», «الأردن», «السودان»). |
Schema babel | UNHCR returns | One |
Dirty cells | Numeric values arrive as numbers, numeric strings, or | Cleaned once, at the provider layer. Missing stays missing — never silently zero. |
Silent empties | Most query mistakes return an empty list, not an error. An AI confidently reports "no data". | Errors come back as actionable text: "No country matched 'Atlantis'. Try search_country first." |
Aggregation traps | IDP assessment rounds must not be summed (double-counts people); funding coverage must be recomputed, never averaged; IPC projections must not be mixed with current analyses. | Each dataset's aggregation semantics are encoded and unit-tested. |
Misleading absolute numbers | Lebanon and Germany host similar refugee counts. Per 1,000 residents, they are worlds apart. |
|
Missing citations | Models paraphrase numbers with no provenance. | Every payload carries its source; exports attach a reproducible extraction manifest and optional codebook. |
Without a trusted middleware, an LLM pointed at raw humanitarian APIs re-discovers these traps every session — and the failure mode is not a crash, it is a plausible-looking wrong number. This server exists so that never happens.
Architecture
flowchart TD
U["You"] --> C["Claude Desktop · Claude Code · Cursor · VS Code · Windsurf<br/>or your own MCP agent"]
C -->|"MCP (stdio or Streamable HTTP)"| S["Malja MCP<br/>24 tools · 19 resources · 8 prompts"]
S --> R["Provider registry<br/>(tools never see provider internals)"]
R --> P1["UNHCR provider<br/>displacement · demographics · asylum"]
R --> P2["World Bank provider<br/>population · GDP · poverty"]
R --> P3["HDX/HAPI provider<br/>conflict · food security · funding · IDPs"]
R --> P4["ReliefWeb provider<br/>situation reports · narrative context"]
P1 & P2 & P3 & P4 --> H["Shared HTTP layer<br/>retry · backoff · rate limit · ETag · cache · offline mode"]
H --> A1[("api.unhcr.org")]
H --> A2[("api.worldbank.org")]
H --> A3[("hapi.humdata.org")]
H --> A4[("api.reliefweb.int")]Three invariants hold everywhere: (1) nothing provider-specific leaks outside src/providers/<id>/; (2) every tool is read-only and annotated as such; (3) errors reach the model as actionable text, never stack traces. Deep dive: docs/architecture.md.
Two ways to use it
TL;DR — researchers and organizations who care about control: self-host. Everyone who just wants answers: use the hosted endpoint.
🖥️ Self-hosted | ☁️ Hosted endpoint | |
Setup | Install Node/Docker, run the server | None — paste one URL |
Who runs it | You, on your machine or infra | Maintainer-operated at |
Privacy | Queries never leave your machine (except to the public data APIs) | Queries pass through the hosted server |
Offline / fieldwork | ✅ full offline mode with a warmed cache | ❌ needs internet |
Configuration | Every knob: providers, cache, rate limits | Fixed server-side |
Updates | You pull releases | Updated for you (caching, normalization, rate limiting, source fixes, monitoring handled) |
Version | Always the latest release | Rolling; may briefly lag the newest release — check |
Guarantees | Yours to make | Best-effort community service, no SLA today |
Cost | Free (MIT) | Free today; free and paid plans may be introduced later |
Best for | Researchers, NGOs with data policies, enterprises, air-gapped fieldwork | Quick starts, demos, journalists, students |
Mode 1 — Self-hosted
You install and run the server yourself. You own everything: the process, the cache, the configuration. Your MCP client talks to it over stdio (desktop) or HTTP (remote/containers). Full instructions in Installation below.
// Claude Desktop — claude_desktop_config.json
{
"mcpServers": {
"malja": {
"command": "node",
"args": ["/absolute/path/to/malja-mcp/dist/index.js"],
},
},
}Mode 2 — Hosted endpoint
TODO (Malja MCP): the hosted Malja endpoint is not live yet.
malja-mcp.example.combelow is a placeholder — replace it with the real URL once deployed.
No infrastructure. Connect any Streamable-HTTP-capable MCP client to:
https://malja-mcp.example.com/mcpclaude.ai / Claude Desktop (remote connector): add a custom connector with that URL.
Claude Code:
claude mcp add --transport http malja https://malja-mcp.example.com/mcpAnything that speaks HTTP: see examples/http-client.md — the endpoint is stateless JSON-RPC, no session juggling.
No API key is required today. The service is operated on a best-effort basis by the maintainer; free and paid tiers may be introduced in the future — nothing beyond what you see here is promised. If you need guarantees, self-host: it is the same code.
Features
Data access
24 semantic, read-only tools — full reference: country profiles, comparisons, yearly series, demographics, asylum applications/decisions with recognition rates, conflict events, food security (IPC), humanitarian funding, situation reports, rankings, trend analysis with anomaly detection, (loudly caveated) naive forecasts
19 MCP resources — 13 fixed + 6 templates (
country://EGY,report://SDN,chart://UGA,solutions://SYR,metadata://providers…) with URI autocompletionDurable solutions (
durable_solutions,solutions://SYR): refugee returns, resettlement, naturalisation and IDP returns per year — reported as flows (period totals are meaningful; "not reported" is never shown as 0), from the origin or the host/resettlement-country side, withnormalize_bysupport8 built-in prompts (situation summary, donor briefing, crisis overview, anomaly hunt…)
Country intelligence
Fuzzy name resolution in English and Arabic — «مصر», "egypt",
EGY, "DRC", "ivory coast" all land correctly; Arabic matching folds hamza/alef forms, taa marbuta and the definite article («الأردن» = «الاردن» = «اردن»)The UNHCR↔ISO3 code mismatch (99/232 countries) handled invisibly
Arabic output — ملجأ بالعربية
Every tool takes
locale: "ar"(or setMALJA_LOCALE=arserver-wide): reports, tables, captions, caveats, errors, chart labels and codebooks come back in Modern Standard Arabic with standard humanitarian terminology (لاجئون، طالبو لجوء، نازحون داخلياً، عديمو الجنسية) and UN Arabic country names — whilestructuredContent, ISO3 codes and dataset ids stay English for machine consumers. Western digits by default, Arabic-Indic (٠–٩) withMALJA_DIGITS=arab. Details: docs/tools.md.
Analytics
normalize_by: per-capita (per 1,000 residents) and per-GDP (per US$1bn) comparisons, rankings and charts, with per-year denominator matchingRegression, year-over-year, CAGR, z-score anomaly detection
Changepoint detection (exact penalised segmentation, piecewise-linear cost, robust noise estimate) and 80%/95% prediction intervals on forecasts — pure TypeScript, no dependencies; charts draw interval bands and break markers
Charts as Chart.js / Vega-Lite / Mermaid / SVG; maps as GeoJSON
Research reproducibility
Extraction manifest on every export: exact arguments, timestamp, server version, citation — a repeatable recipe for a paper's appendix
Optional variable-level codebook matching exactly the exported columns
CSV / JSON / Markdown / GeoJSON export; CSV manifests ride in
#comment lines (pd.read_csv(..., comment="#"))export_report: print-ready, self-contained HTML and PDF reports — RTL-correct Arabic with an embedded Arabic font, inline SVG charts, citations and the extraction manifest kept. PDF uses a locally installed Chrome/Chromium (no new dependency, no API key); without one you get the HTML to print. DetailsRunnable Python & R notebooks reproducing four research workflows
CITATION.cff + JOSS paper draft in paper/
Monitoring
monitor_changes: what changed for a country since the previous year and since the last check — new data releases, revisions of past years, significant jumps (percentage or unusual for the series), threshold crossings you define, record highs/lows. Alert-ready events with stable ids and severities; baselines kept in the server cache or passed back by the caller. No key, read-only. Details
Operations
Two transports: stdio (desktop) and stateless Streamable HTTP (remote) + a built-in dashboard with a query playground
Serious caching: memory or SQLite (zero native deps), TTL + ETag revalidation, stale-while-revalidate, full offline mode for fieldwork
Polite by design: token-bucket rate limiting, retries with backoff, identified User-Agent, strictly read-only
Docker image + compose for organizational self-hosting
Live data sources
Provider | Datasets | What it contributes | Key |
UNHCR Refugee Statistics (default) | population, demographics, asylum-applications, asylum-decisions, solutions | The displacement backbone: refugees, asylum-seekers, IDPs, stateless and others of concern, 1951–present, by origin and asylum country; age/sex breakdowns; asylum decisions with recognition rates; durable solutions (returns, resettlement, naturalisation) | none |
World Bank Indicators (default) | context-indicators | The denominators: national population, GDP, GDP per capita, extreme-poverty rates — what turns "how many" into "how heavy a burden" | none |
HDX HAPI (opt-in) | conflict-events, food-security, humanitarian-funding, idps | The crisis context, citing original producers: conflict events & fatalities (ACLED), IPC food-insecurity phases (IPC), appeal requirements vs funding (OCHA FTS), IDP stocks (IOM DTM) | free app identifier (.env.example) |
ReliefWeb (opt-in) | situation-reports | The narrative context: situation-report counts per country-year plus the latest report titles, publishers and links (UN OCHA / ReliefWeb) — what grounds trends and anomalies in published reporting | pre-approved appname (.env.example) |
Example questions
Real prompts, real production numbers (extracted 2026-07-10 — figures are revised upstream over time):
"What are the top refugee-hosting countries per capita?" → Lebanon 130.7 per 1,000 residents, Chad 63.0, Moldova 56.6, Jordan 55.7 — a very different list than the absolute ranking.
"Was there anything unusual in Sudan's displacement data?" → 2023 flagged as an anomaly (z ≈ +2.6, +78.8% YoY), coinciding with the April 2023 war.
"Relate Sudan's conflict to its displacement since 2022." → conflict fatalities 2,770 → 21,020 → 22,987 (2022–2024, ACLED) alongside IDPs 3.78M → 9.05M → 11.56M (IOM DTM).
"How well is Sudan's humanitarian response funded?" → 58.5% of requirements in 2023, 76.4% in 2024 (OCHA FTS).
"«قارن بين عدد اللاجئين في مصر والأردن»" → works — country resolution is bilingual.
"Export Jordan's series as citation-ready CSV with a codebook." →
export_data({..., include_codebook: true}).
More worked conversations with tool traces: examples/conversations.md.
Why researchers like it
Citable: GitHub's Cite this repository button (CITATION.cff); a JOSS paper is drafted in paper/.
Reproducible: every export carries a manifest (exact call, timestamp, server version, source citation) — paste it in your appendix and anyone can re-run the extraction.
Documented data:
include_codebook: truegenerates variable-level documentation (meaning, unit, derivation — including how recognition rates and funding coverage are computed) for exactly the columns you exported.Join-ready: every row carries ISO3, so merges against World Bank / V-Dem / UCDP panels need no country-name crosswalk.
Honest methods: end-year stock semantics, denominator years, truncation and forecast naivety are stated in the output, not hidden.
Fieldwork-ready: warm the SQLite cache once, then
MALJA_OFFLINE=1gives the full toolset with zero connectivity.
Start here: docs/for-researchers.md · notebooks.
Installation
Requires Node.js ≥ 20 for source installs (SQLite cache uses built-in node:sqlite on Node ≥ 22.5; older Nodes fall back to memory automatically). Docker route needs only Docker.
From npm — no clone needed
Note: the
malja-mcpnpm package has not been published yet (releases are disabled untilMALJA_RELEASE_ENABLED=true). Until then, install from source (below).
npx malja-mcp --version # → malja-mcp 0.7.0Register it with Claude Code in one line:
claude mcp add malja -- npx -y malja-mcpClaude Desktop — one click (no terminal)
Download malja-mcp.mcpb from the latest release and double-click it. Done.
From source
git clone https://github.com/marsaplatform/malja-mcp
cd malja-mcp
npm install
npm run build
node dist/index.js --version # → malja-mcp 0.7.0Docker
docker run -p 8642:8642 -v malja-cache:/data ghcr.io/marsaplatform/malja-mcp
# → MCP endpoint at http://localhost:8642/mcp + dashboard at http://localhost:8642Or docker compose up -d with the provided compose.yaml.
Connect your client (self-hosted, stdio)
{
"mcpServers": {
"malja": {
"command": "node",
"args": ["/absolute/path/to/malja-mcp/dist/index.js"]
}
}
}Sample with cache tuning: examples/claude-desktop-config.json.
claude mcp add malja -- node /absolute/path/to/malja-mcp/dist/index.js{
"mcpServers": {
"malja": {
"command": "node",
"args": ["/absolute/path/to/malja-mcp/dist/index.js"]
}
}
}{
"servers": {
"malja": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/malja-mcp/dist/index.js"]
}
}
}{
"mcpServers": {
"malja": {
"command": "node",
"args": ["/absolute/path/to/malja-mcp/dist/index.js"]
}
}
}Then ask: "What are the top refugee-hosting countries this year?"
Enable the HDX crisis datasets (optional)
# one-time: generate a free identifier (base64 of app-name:email — not a secret)
curl 'https://hapi.humdata.org/api/v2/encode_app_identifier?application=<your-app>&email=<your-email>'
MALJA_PROVIDERS=unhcr,worldbank,hdx MALJA_HDX_APP_ID=<identifier> node dist/index.jsEnable ReliefWeb situation reports (optional)
# one-time: request a pre-approved appname (short form, reviewed by ReliefWeb)
# https://apidoc.reliefweb.int/parameters#appname
MALJA_PROVIDERS=unhcr,worldbank,reliefweb MALJA_RELIEFWEB_APPNAME=<appname> node dist/index.jsAll configuration knobs: .env.example.
Verify without any client
npm run dashboard # → http://localhost:8642 — providers, health, live logs, query playground
npm run inspect # → official MCP InspectorIn --http mode, GET /health is a dependency-free liveness probe for uptime
monitors, and every other route is rate limited per client IP
(MALJA_HTTP_RATE_LIMIT_RPM, default 120/min) so a public endpoint cannot be
used to exhaust the upstream quotas all providers share.
Repository tour
Path | What lives there |
The server. | |
tools.md (tool reference) · architecture.md · for-researchers.md · how-mcp-works.md (MCP primer) · adding-providers.md · development.md · | |
Client configs, worked conversations with tool traces, HTTP client recipes, runnable Python/R notebooks | |
259 tests: MCP compliance suite (official SDK client ↔ real server), fixture-based provider suites (no network), unit tests | |
JOSS paper draft ( | |
Launch kit: platform-native announcement drafts | |
Organizational self-hosting (image published to GHCR on every release) | |
CI (Node 20/22/24), release automation (npm + |
Development
npm run dev # stdio server via tsx
npm run dev:http # HTTP + dashboard on :8642
npm test # vitest — unit + integration + MCP compliance
npm run check # typecheck + lint + format + tests (run before pushing)
npm run build # emit dist/Releases: bump the version, tag v*, push — CI publishes the GitHub release with the .mcpb bundle, the Docker image to GHCR, and (once the npm token is configured) the npm package. Full guide: docs/development.md · adding a data source: docs/adding-providers.md.
Roadmap
✅ Completed
v0.1.0 — UNHCR provider, 17 tools, resources, prompts, caching/offline, dashboard, compliance suite
v0.2.0 — release automation (npm workflow +
.mcpb), CITATION.cff, Arabic country names, reproducible extraction manifestsv0.3.0 — World Bank provider +
normalize_byper-capita / per-GDP analyticsv0.4.0 — HDX/HAPI provider (conflict, food security, funding, IDPs) + 3 crisis tools + Docker/GHCR
v0.5.0 — codebooks, Python/R notebooks, JOSS paper draft
v0.5.1 — HDX fixes from the first live verification round (per-theme admin levels, server-side year windows, pagination)
v0.6.0 — ReliefWeb provider (situation reports + latest report links),
situation_reportstool,crisis_overviewprompt, hardened public HTTP mode (per-IP rate limiting,GET /health), bilingual landing pagePublished to npm as
humanitarian-mcp(pre-rebrand);malja-mcppackage pending
🚧 In progress
Zenodo DOI per release
JOSS paper review & submission
npm provenance signing on future releases (via the release workflow once its token is configured)
🔭 Future (contributions welcome)
ReliefWeb disasters dataset (the situation-reports pipeline already shipped)
UNHCR Operational Data Portal situations
Redis cache backend
FAQ
No. MCP (Model Context Protocol) is the plumbing standard that connects AI apps to tools. You paste a config or double-click the .mcpb file; your assistant does the rest. Curious anyway? docs/how-mcp-works.md.
No — UNHCR and World Bank need none. Only the optional HDX datasets need a free "app identifier" (base64 of your app name + email, generated in one curl; not a secret).
No. It is an independent open-source project. All data is © its original producers (UNHCR, World Bank, ACLED, IPC, OCHA, IOM via HDX), and every payload carries that attribution.
Because the failure mode is silent wrong answers: UNHCR's ARE is Egypt, but ISO's ARE is the UAE; empty results look like "no data"; "-" cells break math. This server encodes those traps once, with 259 tests. See Why this project exists.
It is as fresh as the sources: UNHCR publishes end-year (and mid-year) statistics, the World Bank annual indicators, HDX themes on their producers' cadence. The server caches responses (default 1 h fresh, stale-while-revalidate after) — it never makes data older than the source.
Usually one of: news quotes flows ("X arrived this month") while these are stocks ("X present at year-end"); different population categories (refugees vs all people of concern); or upstream revisions — UNHCR revises series retroactively. Record your extraction date (the manifest does it for you).
Each category is a separate metric (refugees, idps, asylum_seekers, stateless…), and the codebook defines every one. The population headline per dataset is documented in docs/tools.md and in generated codebooks.
asylum = people hosted in the country (default); origin = people displaced from it. Mixing them up is the most common analysis error — the server's instructions teach connected models this convention up front.
normalize_by: "population" divides by the country's population of the same year (World Bank), scales per 1,000 residents, re-sorts the ranking, and discloses the denominator year on every row. "gdp" does the same per US$1bn. Countries lacking denominator data are counted, never silently dropped.
Yes — in both directions. Country resolution covers official UN Arabic names for 100% of countries served, plus common variants, with spelling-variant folding («الأردن» = «الاردن» = «اردن»). And every tool can answer in Arabic: pass locale: "ar" (or set MALJA_LOCALE=ar). For example, refugee_population with { "country": "مصر", "year_from": 2023, "year_to": 2023, "locale": "ar" } returns (recorded UNHCR data):
أرقام النزوح — **مصر** (بحسب بلد اللجوء)، 2023
| السنة | اللاجئون | طالبو اللجوء | النازحون داخلياً | عديمو الجنسية | إجمالي المشمولين بالاهتمام |
| --- | --- | --- | --- | --- | --- |
| 2023 | 240,507 | 232,244 | 0 | 10 | 472,761 |
_المصدر: المفوضية السامية للأمم المتحدة لشؤون اللاجئين (UNHCR) — UNHCR Refugee Data Finder, https://www.unhcr.org/refugee-statistics/_Structured output (structuredContent, ISO3 codes, dataset ids) stays in English so scripts keep working. See docs/tools.md for digits and right-to-left details.
Yes. npm run dashboard gives you a query playground and a plain HTTP bridge (POST /api/call) — the Python/R notebooks use exactly that. The /mcp endpoint is also plain JSON-RPC (examples/http-client.md).
Self-host if you need control, privacy guarantees, offline mode, or custom configuration (it's the same MIT-licensed code). Use the hosted endpoint to be running in 30 seconds. Full comparison: Two ways to use it.
The hosted instance runs this open-source code, which keeps in-memory usage counters (per-tool call counts/latency for its dashboard) and standard server logs. It has no accounts, no API keys, and stores no personal data by design. If that is still too much, self-host.
Yes (self-hosted): run once online with MALJA_CACHE=sqlite to warm the cache, then MALJA_OFFLINE=1 serves everything from cache and fails loudly on misses.
Anything that speaks MCP: Claude Desktop & claude.ai, Claude Code, Cursor, VS Code, Windsurf, and custom agents via the official SDKs (stdio or Streamable HTTP). Config snippets are in Installation.
All three — plain Node with zero native dependencies (the SQLite cache uses Node's built-in node:sqlite). The Docker image covers anything that runs containers.
Two runtime dependencies (the MCP SDK and zod), no database server required, and the Docker image is a slim multi-stage Node build. It runs comfortably on the smallest VPS tier.
They are deliberately naive (OLS extrapolation) and say so in their own output. Use them as a baseline sanity check, never as planning figures — UNHCR publishes no such projections through this API.
The server rate-limits itself (token bucket, default 4 req/s per provider), retries with backoff, and serves stale cache when a source is down — your session degrades gracefully instead of erroring.
See Citation below — BibTeX/APA/Chicago provided, plus GitHub's "Cite this repository" button. Cite the data as its original producers (the manifests include the right citation string per dataset).
One directory, one interface, fixture-based tests — the full worked guide is docs/adding-providers.md, and there's a provider-request issue template. IOM DTM and UNHCR ODP situations are the most-wanted next providers.
Yes — that's what the Docker image and compose file are for. MIT license, commercial use fine. Keep the HTTP endpoint behind your reverse proxy/VPN (it is unauthenticated by design — see SECURITY.md).
No. Everything is aggregate national statistics from public sources. Still: these numbers represent people — present them with the care they deserve (see Data & responsibility).
Contributing
Contributions welcome — most wanted: new providers (IOM DTM, UNHCR ODP situations), country-alias corrections, and documentation in more languages. Start with CONTRIBUTING.md; the golden rules: read-only always, provider isolation, no network in tests, attribution is not optional.
Citation
Software (also available via GitHub's "Cite this repository" button — CITATION.cff; a Zenodo DOI per release is being set up):
BibTeX
@software{nabil_malja_mcp_2026,
author = {Nabil, Ahmed},
title = {malja-mcp: a Model Context Protocol server for humanitarian open data},
year = {2026},
version = {0.7.0},
url = {https://github.com/marsaplatform/malja-mcp},
license = {MIT}
}APA — Nabil, A. (2026). malja-mcp: A Model Context Protocol server for humanitarian open data (Version 0.7.0) [Computer software]. https://github.com/marsaplatform/malja-mcp
Chicago — Nabil, Ahmed. malja-mcp: A Model Context Protocol Server for Humanitarian Open Data. V. 0.7.0. Computer software, 2026. https://github.com/marsaplatform/malja-mcp.
Cite the data as its producers: UNHCR Refugee Data Finder; World Bank World Development Indicators (CC BY 4.0); ACLED / IPC / OCHA FTS / IOM DTM via HDX HAPI — every export's manifest carries the exact citation string for its dataset. Method notes: docs/for-researchers.md.
Data, attribution & responsibility
Data © its original producers: UNHCR (Refugee Data Finder), World Bank (CC BY 4.0), and via HDX HAPI: ACLED, IPC, OCHA FTS, IOM DTM. This project is unofficial and unaffiliated.
The server is strictly read-only and respects upstream rate limits.
Figures are end-year stocks; recent years may be preliminary; series get revised — record extraction dates (manifests do).
Forecasts are naive extrapolations, clearly labelled.
These numbers represent people. Present them with the care they deserve.
License
MIT — free for research, NGO, commercial and government use.
Available Tools
24 toolsasylum_applicationsAsylum applicationsARead-only
Individual asylum applications lodged per year. role "asylum" (default) = applications filed IN the country; "origin" = filed BY nationals of the country abroad.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | "asylum" = people hosted IN the country; "origin" = people displaced FROM the country | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| country | Yes | Country name or ISO3 code, e.g. "Egypt", "EGY", "syria" | |
| year_to | No | Last year of the range (default: latest available) | |
| year_from | No | First year of the range (default: 10 years back) |
Output Schema
| Name | Required | Description |
|---|---|---|
| role | Yes | |
| source | Yes | |
| yearly | Yes | |
| country | Yes | |
| country_code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered and the bar is lower. The description adds the role-scoping semantics but nothing about data source (e.g. UNHCR), reporting periodicity, gaps in coverage, or time lag that would help an agent interpret results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the core metric front-loaded and the parameter distinction second. Slightly dense quote-wrapped phrasing ('role "asylum" (default)') but no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the schema documents all five parameters. What is missing is the routing information an agent needs in a 23-tool family: when this dataset is the right one versus asylum_decisions or refugee_population, and any caveats about availability across countries and years.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description genuinely refines the 'role' enum by recasting it as applications 'filed IN' vs 'filed BY nationals abroad', which differs from the schema's 'people hosted/displaced' framing and better matches the metric. It adds little for locale and the year range, which the schema already handles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific metric and its unit of analysis ('Individual asylum applications lodged per year') and defines the two modes of the 'role' parameter inline, which is more precise than a generic 'get asylum data'. It does not, however, explicitly contrast itself with close siblings such as asylum_decisions or refugee_population, so an agent still has to infer which of the family it wants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: describing what 'role' means effectively tells the agent when to use each mode, but there is no explicit statement of when to call this tool rather than asylum_decisions, refugee_population, or latest_statistics, and no prerequisites or data-coverage caveats are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
asylum_decisionsAsylum decisionsBRead-only
Decisions on individual asylum applications per year — recognized, complementary protection, rejected, otherwise closed — plus the recognition rate. role "asylum" (default) = decided IN the country.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | "asylum" = people hosted IN the country; "origin" = people displaced FROM the country | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| country | Yes | Country name or ISO3 code, e.g. "Egypt", "EGY", "syria" | |
| year_to | No | Last year of the range (default: latest available) | |
| year_from | No | First year of the range (default: 10 years back) |
Output Schema
| Name | Required | Description |
|---|---|---|
| role | Yes | |
| source | Yes | |
| yearly | Yes | |
| country | Yes | |
| country_code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds meaningful context on what is returned (recognized, complementary protection, rejected, otherwise closed, plus recognition rate) and the default role semantics, but says nothing about coverage limitations, granularity, or rate/source caveats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact clauses with the core output being front-loaded; every part contributes. Minor duplication of the role semantics that already appears in the schema description, but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety and open-world behavior, the description need not explain returns. It supplies the category breakdown and role default, leaving only minor gaps around applicability relative to siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters including year_from/year_to defaults and the role enum are already documented. The description's restatement of the default role adds little beyond the schema, meriting the 3 baseline for a well-covered schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("decisions on individual asylum applications per year") and enumerates the outcome categories plus the recognition rate, which is more informative than a bare name restatement. It does not explicitly name the sibling it differs from (e.g., asylum_applications), so the distinction is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clarifies the default of role ("asylum" = decided IN the country) but gives no explicit when-to-use guidance or routing against alternatives like asylum_applications, refugee_population, or durable_solutions. Usage is only weakly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_countriesCompare countriesARead-only
Compare a displacement metric across 2–5 countries over a year range. Defaults to refugees hosted (role "asylum") over the last 10 years. Set normalize_by to compare per 1,000 residents or per US$1bn GDP instead of absolute numbers.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | "asylum" = people hosted IN the country; "origin" = people displaced FROM the country | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| metric | No | Metric to compare, e.g. refugees, asylum_seekers, idps (default: refugees) | |
| year_to | No | Last year of the range (default: latest available) | |
| countries | Yes | Two to five countries to compare | |
| year_from | No | First year of the range (default: 10 years back) | |
| normalize_by | No | Normalize values by a denominator: "population" → per 1,000 residents, "gdp" → per US$1bn GDP. Requires the worldbank provider. |
Output Schema
| Name | Required | Description |
|---|---|---|
| role | Yes | |
| unit | Yes | |
| metric | Yes | |
| series | Yes | |
| source | Yes | |
| denominator | No | |
| normalize_by | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description consolidates the default behavior (role "asylum", 10-year window) into one readable sentence, which is genuinely useful, but most of its content (normalization options, worldbank requirement) is already documented in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and scope, then defaults, then the advanced normalization option. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description covers action, scope, defaults, and the key optional mode. It could be slightly stronger by pointing to which sibling tools handle adjacent needs (e.g. single-country profiles or rankings).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including enum meanings and defaults, so the schema carries parameter semantics. The description restates country count, the default metric, and normalize_by targets, adding no format or syntax beyond what the schema already documents — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (compare) and resource (a displacement metric) with explicit scope: 2–5 countries over a year range. The multi-country comparison framing distinguishes it from per-country siblings like country_profile and search_country without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear default context (refugees hosted, role "asylum", last 10 years) and explains when to reach for normalize_by (to compare per-capita/per-GDP rather than absolute counts). It stops short of naming alternative tools or stating when not to use this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conflict_eventsConflict eventsARead-only
Annual conflict event counts and fatalities for a country (ACLED via HDX). Pairs with refugee_population/trend_analysis to relate violence and displacement.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| country | Yes | Country name or ISO3 code, e.g. "Egypt", "EGY", "syria" | |
| year_to | No | Last year of the range (default: latest available) | |
| year_from | No | First year of the range (default: 10 years back) |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes | |
| country | Yes | |
| records | Yes | |
| country_code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and open-world behavior are covered. The description adds genuine context — dataset provenance (ACLED via HDX) and annual granularity, which is non-obvious given year_from/year_to — but says nothing about coverage gaps, lag, or update cadence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core purpose front-loaded and the source in parentheses; no filler. The pairing sentence is slightly tangential but earns its place as routing guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is unnecessary, and the schema fully documents all four parameters. Purpose, source, granularity, and a sibling-pairing cue are present; only the explicit alternative conditions are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including locale semantics and year-range defaults, so the schema carries the parameter burden. The description adds no syntax or format detail beyond implying an annual time range; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb/resource pair — annual conflict event counts and fatalities scoped to a country — and names the data source (ACLED via HDX). It does not explicitly contrast itself with neighbors like situation_reports or latest_statistics, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives a pairing hint (use alongside refugee_population/trend_analysis to relate violence and displacement), which implies a workflow context. However, there is no explicit when-to-use/when-not or differentiation from the other data-retrieval siblings, so guidance remains implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
country_profileCountry profileARead-only
One-call humanitarian snapshot of a country: latest displaced population hosted (by category), population displaced FROM the country, and its top origin countries.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| country | Yes | Country name or ISO3 code, e.g. "Egypt", "EGY", "syria" |
Output Schema
| Name | Required | Description |
|---|---|---|
| year | No | |
| hosted | Yes | Latest people-of-concern figures hosted in the country |
| region | No | |
| source | Yes | |
| country | Yes | |
| top_origins | Yes | |
| country_code | Yes | |
| displaced_abroad | Yes | Latest figures for people displaced FROM the country |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered by structured data. The description adds useful content about which datasets are merged and that figures are 'latest', but says nothing about rate limits, data recency lag, or coverage caveats. Baseline 3 is appropriate with annotations carrying the safety burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the scope front-loaded ('One-call humanitarian snapshot of a country') and the returned contents listed after a colon. Every clause earns its place; no filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value shape need not be explained, and the description adequately frames a read-only aggregate. It stops short of noting staleness of the 'latest' data or the comparative use case versus compare_countries, which would make it fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only 2 parameters, and the schema itself documents the ISO3/name acceptance pattern and the locale enum in detail. The description adds no syntax, format or default information beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the resource (a country) and enumerates the three payloads returned: hosted displaced population by category, population displaced FROM the country, and top origin countries. This clearly distinguishes it from siblings like search_country, compare_countries and refugee_population, though the verb is implicit ('snapshot') rather than an explicit retrieval verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'one-call' implies this consolidates data that siblings such as refugee_population, top_host_countries and demographics expose separately, so a reader can infer when to prefer it. However, there is no explicit when-to-use/when-not-to-use statement nor a named alternative, leaving the routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
demographicsDemographicsARead-only
Latest age/sex breakdown of displaced people connected to a country (role "asylum" = hosted there, default; "origin" = from there). UNHCR publishes demographics for recent years only.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | "asylum" = people hosted IN the country; "origin" = people displaced FROM the country | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| country | Yes | Country name or ISO3 code, e.g. "Egypt", "EGY", "syria" |
Output Schema
| Name | Required | Description |
|---|---|---|
| male | Yes | |
| year | Yes | |
| total | Yes | |
| female | Yes | |
| source | Yes | |
| country | Yes | |
| country_code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered by structured data. The description adds a genuine data-availability caveat (recent years only), but says nothing about coverage gaps across countries or what happens when no breakdown exists. Useful but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler; the core purpose comes first and the role semantics and data caveat follow. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the country/role/locale parameters plus the data-recency constraint are covered. Only the behavior when data is unavailable for a given country is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the role semantics already in the schema and adds the default value ('asylum') and the recency limitation, which is a modest increment rather than new syntax or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: the latest age/sex breakdown of displaced people linked to a country, with the role filter spelled out. It is distinguishable from prose-heavy siblings like refugee_population or country_profile, though it does not explicitly name an alternative tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage condition via the role semantics and the default ('asylum'), plus an implicit when-not: UNHCR only publishes demographics for recent years, so historical queries won't work. No sibling tool is named as the alternative for related questions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
durable_solutionsDurable solutionsARead-only
UNHCR durable solutions per year: refugee returns, resettlement, naturalisation and IDP returns. These are FLOWS during each year (not end-year stocks), so a period total is reported. role "origin" (default) = solutions for people FROM the country (returns home, resettled/naturalised abroad); role "asylum" = refugees who left the country to return home, people resettled TO it, naturalised IN it. Optional other_country cross-filter and normalize_by ("population" → per 1,000 residents of the country).
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | "origin" (default) = solutions for people from the country; "asylum" = solutions in / departures from the country as host or resettlement country | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| country | Yes | Country name or ISO3 code, e.g. "Egypt", "EGY", "syria" | |
| year_to | No | Last year of the range (default: latest available) | |
| year_from | No | First year of the range (default: 10 years back) | |
| normalize_by | No | Normalize values by a denominator: "population" → per 1,000 residents, "gdp" → per US$1bn GDP. Requires the worldbank provider. | |
| other_country | No | Optional second country for the opposite role, e.g. country="Syria", other_country="Lebanon" → Syrians returning from Lebanon |
Output Schema
| Name | Required | Description |
|---|---|---|
| role | Yes | |
| unit | Yes | |
| years | Yes | |
| source | Yes | |
| country | Yes | |
| measure | Yes | |
| year_to | Yes | |
| year_from | Yes | |
| country_code | Yes | |
| normalize_by | Yes | |
| period_total | Yes | |
| period_totals | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint and openWorldHint, so the description carries real weight: it discloses that values are period totals rather than point-in-time stocks, and that normalize_by requires the worldbank provider. It stops short of describing pagination or coverage limits, but the flow semantics are the key non-obvious trait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core concept (flows vs stocks) is front-loaded and the three dense sentences are mostly load-bearing. The role parenthetical duplicates schema content and makes it slightly heavier than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with an output schema, the description covers the unusual semantics (flows, role inversion, cross-country filtering, normalization) that an agent could otherwise misread. Return values are properly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter is already documented in the schema. The description's role explanation and the other_country example largely restate the enum descriptions, adding only marginal value beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (UNHCR durable solutions) and enumerates its components (refugee returns, resettlement, naturalisation, IDP returns). The explicit 'FLOWS during each year (not end-year stocks)' note distinguishes it from stock-oriented siblings like refugee_population without the agent needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly frames the tool's domain by contrasting annual flows against end-year stocks, which steers the agent away from refugee_population. It explains role=origin vs asylum selection, but names no explicit when-not conditions or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_dataExport dataARead-only
Export normalized records from any dataset as csv, json, markdown or geojson (geojson only makes sense with group_by set, so rows map to countries). Use this when the user wants raw data to download or paste elsewhere.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | "asylum" = people hosted IN the country; "origin" = people displaced FROM the country | |
| limit | No | Max rows (default 500) | |
| format | Yes | Serialization format | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| country | No | Filter by country (name or ISO3) | |
| dataset | Yes | population | demographics | asylum-applications | asylum-decisions | context-indicators | idps | conflict-events | humanitarian-funding | food-security | |
| year_to | No | Last year of the range (default: latest available) | |
| group_by | No | Break rows down per asylum or origin country instead of aggregating | |
| year_from | No | First year of the range (default: 10 years back) | |
| include_codebook | No | Attach a codebook documenting every exported variable (meaning, unit, derivation) — ready for a paper's data appendix. Default false. | |
| include_manifest | No | Attach an extraction manifest (exact arguments, timestamp, server version, citation) for reproducibility. Default true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| format | Yes | |
| dataset | Yes | |
| codebook | No | |
| manifest | No | |
| row_count | Yes | |
| truncated | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds a genuinely useful behavioral constraint not in the schema: geojson only makes sense when group_by is set because rows map to countries. It omits other non-obvious behaviors (e.g., manifest attached by default), so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. The format list and the geojson caveat come first, then the usage trigger, so the most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 11 parameters, an output schema, and readOnly/openWorld annotations, the description only needs to resolve format choice, the geojson caveat, and the usage context, which it does. Defaults (limit 500, manifest true) and all field semantics live in the schema, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description exceeds that by documenting a cross-parameter interaction — the geojson/group_by coupling — that the schema does not express, adding real meaning beyond the field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Export') plus the resource ('normalized records from any dataset') and enumerates the output formats, including a real caveat about geojson. It does not name or differentiate against the obvious sibling export_report, so an agent must infer the raw-vs-formatted distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this when the user wants raw data to download or paste elsewhere" gives a clear usage trigger. However it provides no explicit when-not or names the alternative (export_report), leaving the raw-vs-report boundary to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_reportExport formatted report (HTML / PDF)ARead-only
Export a print-ready, self-contained document: the full country report (pass country) or any tool’s markdown output (pass markdown, e.g. from trend_analysis or durable_solutions). format "html" (default) = one file with embedded Arabic/Latin font, inline SVG charts, citations and the extraction manifest; "pdf" = the same rendered by a local headless Chrome/Chromium/Edge (falls back to HTML with an explanation if none is available). Arabic output (locale "ar") is right-to-left. Returns a resource link (export://…) unless inline is true.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Document title (markdown mode) | |
| format | No | Output format (default html) | |
| inline | No | Embed the file in the result instead of returning a resource link (default false) | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| country | No | Country for a full country report (name or ISO3). Omit when passing markdown. | |
| year_to | No | Last year of the range (default: latest available) | |
| markdown | No | Markdown to format instead of a country report (e.g. a tool’s text output) | |
| year_from | No | First year of the range (default: 10 years back) | |
| include_manifest | No | Append the extraction manifest (default true) |
Output Schema
| Name | Required | Description |
|---|---|---|
| uri | Yes | |
| bytes | Yes | |
| title | Yes | |
| format | Yes | |
| locale | Yes | |
| sha256 | Yes | |
| filename | Yes | |
| manifest | No | |
| mime_type | Yes | |
| pdf_engine | No | |
| fallback_reason | No | |
| requested_format | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and open-world, and the description adds substantial behavior beyond them: HTML is one self-contained file with embedded Arabic/Latin fonts, inline SVG charts, citations and the manifest; PDF is rendered by local headless Chrome/Chromium/Edge and silently degrades to HTML with an explanation if unavailable; Arabic locale is right-to-left. It also discloses the return shape (a resource link unless `inline` is true).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph, but it is front-loaded with the core purpose followed by format, locale, and return semantics in a sensible order. Every clause carries information; it is slightly long and clause-heavy but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, no-required-parameter tool with an output schema, the description covers the input modes, format trade-offs and fallbacks, locale/RTL behavior, and the return mechanism. Nothing an agent needs to invoke it correctly is missing, and return-value detail is rightly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema does not: `country` and `markdown` are mutually exclusive inputs, and `inline` toggles between an inline file and an `export://` resource link. It also restates the html default and the PDF fallback behavior, which enriches `format` beyond its enum description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (export) and a precisely scoped resource (a print-ready, self-contained document), then names the two input modes: a full country report via `country`, or another tool's markdown via `markdown`. This distinguishes it cleanly from `generate_country_report` (which produces the report) and `export_data` (which exports data, not a formatted document).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: pass `country` for a full report, pass `markdown` for output from tools like `trend_analysis` or `durable_solutions` (and says to omit `country` in that case). It does not, however, explicitly contrast itself with the closest sibling, `generate_country_report`, or state when not to export (e.g. for machine-readable data).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
food_securityFood security (IPC)ARead-only
Latest IPC food-insecurity phase breakdown for a country: people per phase 1–5, with phase 3+ ("crisis or worse") as the headline. Data: IPC via HDX.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Analysis year (default: latest available) | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| country | Yes | Country name or ISO3 code, e.g. "Egypt", "EGY", "syria" |
Output Schema
| Name | Required | Description |
|---|---|---|
| year | Yes | |
| phases | Yes | |
| source | Yes | |
| country | Yes | |
| country_code | Yes | |
| people_crisis_or_worse | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real value with data provenance ('IPC via HDX'), the 'latest available' default, and the definitional note that phase 3+ is the headline, but says nothing about rate limits, coverage gaps, or whether a country can lack an IPC analysis.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler; the metric and scope are front-loaded, and the trailing provenance tag ('Data: IPC via HDX') is short and earns its place by signaling the open-world source.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required, and annotations plus a 100%-described 3-param schema cover the rest. The description supplies the interpretive context (phase scale, headline phase 3+) an agent needs to call and explain results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — year (default latest), locale (en/ar with RTL note), and country (name or ISO3) are all documented in the schema itself. The description adds no parameter-level syntax or format detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (IPC food-insecurity phase breakdown) with the exact output shape (people per phase 1–5) and the headline metric (phase 3+ 'crisis or worse'). This is unambiguous and clearly separable from generic siblings like latest_statistics or country_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The trigger context is implied by 'Latest ... for a country' — an agent can infer this is the tool for food-insecurity questions about a specific country. However, there is no explicit when-to-use/when-not guidance and no sibling is named as the alternative (e.g., for non-IPC hunger indicators or cross-country comparison).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forecastForecast (naive, with prediction intervals)ARead-only
Naive linear projection of a displacement metric 1–5 years ahead, based on the last 10 years, with 80% and 95% OLS prediction intervals. Structural breaks in the history are detected and reported; since_break=true fits only the data after the latest break. Optional chart (svg / chartjs / vega-lite) with the interval band. This is a statistical extrapolation, NOT a UNHCR planning figure — always present it with that caveat.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | "asylum" = people hosted IN the country; "origin" = people displaced FROM the country | |
| chart | No | Also return a chart of observed + projected values with the interval band | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| metric | No | Metric to project (default refugees) | |
| country | Yes | Country name or ISO3 code, e.g. "Egypt", "EGY", "syria" | |
| since_break | No | Fit only the years since the latest detected structural break (needs ≥3 years after it). Default false. | |
| years_ahead | No | Horizon (default 3) |
Output Schema
| Name | Required | Description |
|---|---|---|
| chart | No | |
| caveat | Yes | |
| fit_to | Yes | |
| method | Yes | |
| metric | Yes | |
| country | Yes | |
| fit_from | Yes | |
| intervals | Yes | |
| projected | Yes | |
| historical | Yes | |
| changepoints | Yes | |
| country_code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint, openWorldHint), lowering the bar, and the description adds substantial method transparency: OLS prediction intervals at 80%/95%, automatic detection and reporting of structural breaks, and the since_break fitting behavior. It does not mention data source, computational cost, or fallback when history is insufficient, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the core purpose front-loaded, followed by statistical detail and the caveat. Every sentence carries weight, though the density of clauses makes it slightly heavier than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, read-only forecasting tool with an output schema already covering return structure, the description supplies the semantic framing an agent needs: method, interval semantics, break handling, and an explicit caveat. Nothing critical is missing, though failure/edge-case behavior is not mentioned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage the schema already documents every parameter, so baseline is 3. The description's references to since_break, chart types and the horizon largely restate what the schema already says, adding little new syntax or format meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with method and scope: 'Naive linear projection of a displacement metric 1–5 years ahead, based on the last 10 years.' This clearly separates it from siblings like trend_analysis (historical description) and latest_statistics. It does not name any sibling explicitly, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives genuine usage context for one parameter ('since_break=true fits only the data after the latest break') and a presentation rule ('always present it with that caveat'). However it never states when to reach for this tool versus trend_analysis or other forecasting-adjacent siblings, so the guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_chartGenerate chartARead-only
Render a displacement metric for one or more countries as a chart specification. Formats: "chartjs" (Chart.js v4 config JSON), "vega-lite" (v5 spec), "mermaid" (xychart block), "svg" (standalone image markup). Set normalize_by to plot per 1,000 residents or per US$1bn GDP. show_changepoints=true marks detected structural breaks (svg, vega-lite; Chart.js via chartjs-plugin-annotation).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Chart type (default line) | |
| role | No | "asylum" = people hosted IN the country; "origin" = people displaced FROM the country | |
| format | Yes | Output format | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| metric | No | Metric to plot (default refugees) | |
| year_to | No | Last year of the range (default: latest available) | |
| countries | Yes | Countries to plot | |
| year_from | No | First year of the range (default: 10 years back) | |
| normalize_by | No | Normalize values by a denominator: "population" → per 1,000 residents, "gdp" → per US$1bn GDP. Requires the worldbank provider. | |
| show_changepoints | No | Mark detected changepoints (structural breaks) per series. Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| spec | Yes | |
| unit | Yes | |
| title | Yes | |
| format | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds useful behavioral detail beyond the schema: the per-format rendering of changepoints (svg, vega-lite; Chart.js via chartjs-plugin-annotation) and the normalize_by scaling behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action before format/option details. Little waste, though the format list partially duplicates schema enum descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema covering return values and annotations covering the safety profile, the description supplies the remaining context (formats, normalization, changepoints). Nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all ten parameters with enums and ranges. The description largely restates format and normalize_by semantics rather than adding new meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Render a displacement metric for one or more countries as a chart specification.' The purpose is unmistakable and clearly distinct from generate_map or generate_country_report, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the task ('render ... as a chart specification') and format choices are enumerated, but there is no explicit when-to-use vs when-not guidance or named alternative tool. An agent must infer that this is the charting tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_country_reportGenerate country reportBRead-only
Compose a full markdown humanitarian situation report for a country: key figures, refugee trend with an embedded chart, origins of hosted refugees, asylum decisions and demographics. Reports progress while assembling.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| country | Yes | Country name or ISO3 code, e.g. "Egypt", "EGY", "syria" | |
| year_to | No | Last year of the range (default: latest available) | |
| year_from | No | First year of the range (default: 10 years back) |
Output Schema
| Name | Required | Description |
|---|---|---|
| country | Yes | |
| year_to | Yes | |
| markdown | Yes | |
| year_from | Yes | |
| country_code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, covering the safety profile. The description adds that it 'Reports progress while assembling,' a useful behavioral trait (long-running with progress updates), but it does not disclose auth needs, rate limits, or performance characteristics beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and content list, followed by a progress note. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-section report generator with an output schema, the description sufficiently conveys the content and the progress behavior. It omits any caveats about data availability or runtime, but those are minor given the annotations and schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents all four parameters (locale, country, year_from, year_to). The description adds no parameter-level meaning beyond what is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Composes a full markdown humanitarian situation report for a country and enumerates its sections (key figures, refugee trend with chart, origins, asylum decisions, demographics). The verb and resource are specific, though it does not explicitly distinguish itself from siblings like situation_reports or export_report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance or alternatives are provided. The description states what the tool does but not when an agent should choose it over country_profile, situation_reports, or export_report.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_mapGenerate map (GeoJSON)ARead-only
GeoJSON FeatureCollection of country centroid points sized by a displacement metric — drop it into any GeoJSON viewer (geojson.io, Leaflet, Kepler). by="asylum" maps host countries, by="origin" maps origins.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | "asylum" = people hosted IN the country; "origin" = people displaced FROM the country | |
| year | No | Year (default: latest) | |
| limit | No | Top-N countries (default 25) | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| metric | No | Metric for point properties (default refugees) |
Output Schema
| Name | Required | Description |
|---|---|---|
| year | Yes | |
| metric | Yes | |
| geojson | Yes | |
| feature_count | Yes | |
| skipped_countries | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds genuinely new behavioral context: the output is a static FeatureCollection of centroids with point size as the encoding channel, which tells the agent what can and cannot be done with the result. It omits any note on limits or cost, but nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the most decision-relevant fact (the output format) is front-loaded before the viewer hints and the parameter note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be spelled out, and all five optional params are fully documented in the schema. The description covers the conceptual shape of the output and the by semantics; it could go slightly further on defaults (latest year, top 25) but those live in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already defines all five parameters including the by enum and locale. The description restates the by semantics ('asylum' maps host countries, 'origin' maps origins) without adding syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the precise artifact produced (a GeoJSON FeatureCollection of country centroid points, sized by a displacement metric), which is a specific verb+resource rather than a restatement of the name. That output form also implicitly separates it from sibling generators like generate_chart and generate_country_report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives downstream consumption guidance ('drop it into any GeoJSON viewer — geojson.io, Leaflet, Kepler') and disambiguates the by enum, but never states when to pick this over generate_chart or compare_countries. Usage is implied by the output type rather than stated as a selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metadataGet metadataARead-only
Describe the connected data providers: datasets served, metrics available, attribution and terms. Call this to learn what data exists before querying.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. |
Output Schema
| Name | Required | Description |
|---|---|---|
| providers | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and scope are covered. The description adds the content categories returned, but says nothing about auth needs, rate limits, or caching. With annotations carrying the safety profile, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the resource and return contents front-loaded before the usage instruction. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description already sketches the payload categories. For a zero-required-param discovery tool this is close to complete, though it could note the relationship to provider_health.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single locale parameter is fully documented in the schema, including enum semantics and RTL behavior. The description never mentions locale, so it adds nothing beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (describe) and resource (connected data providers), then enumerates what is returned: datasets served, metrics available, attribution and terms. This clearly separates it from the data-querying siblings like search_country or country_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Call this to learn what data exists before querying" gives an explicit trigger condition and sequencing relative to the query tools. It does not name a specific alternative such as provider_health, so the routing is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
humanitarian_fundingHumanitarian fundingARead-only
Humanitarian appeal requirements vs funding received per year for a country, with coverage percentage (OCHA FTS via HDX).
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| country | Yes | Country name or ISO3 code, e.g. "Egypt", "EGY", "syria" | |
| year_to | No | Last year of the range (default: latest available) | |
| year_from | No | First year of the range (default: 10 years back) |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes | |
| country | Yes | |
| records | Yes | |
| country_code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful context on the data provenance and what the payload compares, but says nothing about granularity of rows, missing-data behavior for countries without appeals, or volume of results returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the resource and its key derived metric front-loaded, and no filler. It is slightly telegraphic (no leading verb), but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-shape explanation is unnecessary, and annotations cover the read-only profile. The description supplies the source and the two quantities being compared, which is enough for an agent to call this correctly; only usage routing and data-coverage caveats are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema documents country formats, the locale enum, and the year_from/year_to defaults, so the description is not needed for parameter meaning. It adds only the implicit notion of a per-year series, which is baseline-level value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the exact resource and comparison ('appeal requirements vs funding received per year') plus the derived metric (coverage percentage) and the upstream source (OCHA FTS via HDX). This is clearly distinguishable from siblings like food_security, refugee_population, or country_profile without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what the data is but never when to reach for this tool over alternatives such as country_profile or latest_statistics, nor any prerequisite or scope caveat. Usage is only inferable from the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
latest_statisticsLatest statisticsBRead-only
Most recent displacement figures. With a country: its latest hosted figures. Without: the latest global totals.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | "asylum" = people hosted IN the country; "origin" = people displaced FROM the country | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| country | No | Country name or ISO3; omit for global totals |
Output Schema
| Name | Required | Description |
|---|---|---|
| year | Yes | |
| scope | Yes | |
| source | Yes | |
| figures | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds the useful behavioral fact that output scope depends on whether country is supplied, but it omits data freshness/update cadence and says nothing about the return structure or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short front-loaded fragments with no filler, and the global-vs-country distinction is stated up front. Slight redundancy with the schema's country parameter description keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. However, for a tool whose selling point is being the 'most recent' figures, the description never states what 'latest' means (reference date, update frequency, dataset vintage), and the role=origin case is silently unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the role, locale, and country parameters are already fully documented in the schema, which sets the baseline at 3. The description only partially reinforces this—'latest hosted figures' loosely matches role=asylum and arguably understates role=origin (displaced FROM the country), which the schema covers far better.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Most recent displacement figures') and immediately narrows scope by country presence/absence. It does not name or differentiate itself from close siblings such as refugee_population, country_profile, or trend_analysis, so the agent must infer which one to choose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives the two invocation shapes (with country vs. without) but frames them as parameter behavior rather than as when-to-use guidance against alternatives. No exclusions or sibling routing are provided, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monitor_changesMonitor changesARead-only
Check a country's UNHCR displacement figures for changes worth attention: compares the latest year with the previous one (significant jumps, threshold crossings, record highs/lows) and, against an earlier snapshot, detects new data releases and revisions of past years. Returns alert-ready events with stable ids and severities plus a snapshot to compare against next time. Read-only: never contacts anyone; the snapshot is kept in the server cache and/or returned to the caller.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | "asylum" = people hosted IN the country; "origin" = people displaced FROM the country | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| country | Yes | Country name or ISO3 code, e.g. "Egypt", "EGY", "syria" | |
| metrics | No | Metrics to watch (default: refugees, asylum_seekers, idps, returned_refugees, returned_idps, stateless, ooc, oip — those with data) | |
| snapshot | No | A `snapshot` returned by an earlier call — compare against it (takes precedence over the server-stored one) | |
| min_change | No | Ignore changes smaller than this many people (default 1000) | |
| thresholds | No | Alert when a metric crosses a level between the previous and latest year | |
| history_years | No | Years of history to load for records and unusual-change scoring (default 10) | |
| store_snapshot | No | Save this result as the stored baseline for the next call (default true) | |
| jump_threshold_pct | No | Year-over-year change (%) flagged as a significant jump (default 25) | |
| use_stored_snapshot | No | Compare against the snapshot stored by the previous call (default true) |
Output Schema
| Name | Required | Description |
|---|---|---|
| role | Yes | |
| events | Yes | |
| source | Yes | |
| country | Yes | |
| dataset | Yes | |
| metrics | Yes | |
| summary | Yes | |
| baseline | Yes | |
| citation | Yes | |
| snapshot | Yes | |
| latest_year | Yes | |
| country_code | Yes | |
| previous_year | Yes | |
| snapshot_stored | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true. The description adds value beyond that: it confirms no one is contacted, explains that a snapshot baseline is persisted in server cache and/or returned to the caller, and notes the output carries stable ids and severities. The storage side effect and id stability are behavioral details the annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core comparison purpose before the output and read-only notes. The first sentence is dense but every clause earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter tool with an output schema and annotations, the description covers the comparison logic, the snapshot lifecycle, and the read-only guarantee adequately. Because a return-value schema exists, it need not describe outputs in detail. Minor gap: no explicit routing to sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 11 parameters including enums (role, locale), defaults, and the snapshot object structure. The description's comparison semantics (latest vs previous year, thresholds, revisions) add narrative context but no parameter-level syntax or format beyond what the schema provides. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it checks a country's UNHCR displacement figures for changes, comparing the latest year to the previous one and detecting releases/revisions against a snapshot. The scope is clear and concrete. It does not, however, explicitly differentiate itself from siblings like trend_analysis or latest_statistics, leaving that to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly conveys the context of use ('changes worth attention', comparing against a stored or passed snapshot) and explains the round-trip baseline mechanism for repeated calls. There is no explicit statement of when NOT to use it or a named alternative to prefer, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
provider_healthProvider healthARead-only
Liveness check of every connected data provider (latency, reachability). Use when queries fail to distinguish upstream outages from bad parameters.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. |
Output Schema
| Name | Required | Description |
|---|---|---|
| healthy | Yes | |
| providers | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral scope beyond that by specifying that it checks every connected provider and includes latency and reachability, though it does not discuss failure modes, performance cost, or partial-outage semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences: one defines the operation and its scope, the second supplies the diagnostic use case. Nothing is wasted and the purpose is front-loaded before the usage condition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, rich annotations, full schema descriptions, and existing output schema, the description provides everything an agent needs to select and invoke the tool correctly. It covers what is checked and the situation that calls for it without needing to restate return values or optional locale details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage for the single optional locale parameter, including enum values and output-language behavior. The description adds no parameter-level information, so the baseline of 3 is appropriate because the schema already carries the full explanatory burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific operation: a liveness check across every connected data provider, with latency and reachability called out as checked dimensions. It is distinguishable from the data-retrieval and export siblings in substance, but it does not explicitly name or contrast itself against any sibling tool, keeping it at a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete condition for use: when queries fail and the agent needs to tell upstream outages apart from bad parameters. This is clear and actionable, but it does not state when not to use the tool or name an alternative diagnostic path, so it falls short of the 5-level rubric.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refugee_populationRefugee populationARead-only
Yearly displacement figures for a country: refugees, asylum-seekers, IDPs, stateless and others. role "asylum" (default) = hosted in the country; role "origin" = displaced from it. Optionally cross-filter by a second country (e.g. Syrians hosted in Egypt). Paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1) | |
| role | No | "asylum" = people hosted IN the country; "origin" = people displaced FROM the country | |
| limit | No | Rows per page (default 100) | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| country | Yes | Country name or ISO3 code, e.g. "Egypt", "EGY", "syria" | |
| year_to | No | Last year of the range (default: latest available) | |
| year_from | No | First year of the range (default: 10 years back) | |
| other_country | No | Optional second country for the opposite role, e.g. country="Egypt", role="asylum", other_country="Syria" → Syrians in Egypt |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes | |
| records | Yes | |
| page_info | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered elsewhere; the description still adds real context the annotations do not: the result set is yearly series across five displacement categories, role inverts the direction of the data, results are paginated, and a second country can be cross-filtered. It stops short of noting coverage caveats, rate limits, or data vintage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what the tool returns, then the role switch and cross-filter, then pagination. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters, an output schema, and an open-world read annotation, the description covers the essentials an agent needs to call it correctly. It omits only secondary context such as the data source/vintage or the fact that year_from/year_to default to a 10-year window rather than the full history.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's role and other_country explanations largely restate what the schema already documents in detail (including the same Egypt/Syria example), adding little semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Yearly displacement figures for a country: refugees, asylum-seekers, IDPs, stateless and others" gives a concrete resource and enumerates the metric families returned, so an agent knows exactly what data comes back. It never names a sibling (e.g. asylum_applications, top_host_countries) to disambiguate against, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The role semantics are spelled out with the default stated ("asylum" (default) = hosted in the country; "origin" = displaced from it) and a worked cross-filter example is given, so the agent knows which mode to pick for a given question. There is no guidance on when to prefer this tool over the related asylum/durable_solutions tools, so no exclusions or alternatives are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_countrySearch countryARead-only
Resolve a free-text country query ("egypt", "DRC", "syria") to canonical names and ISO3 codes. Use this first when unsure how a country is spelled in the data.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max matches (default 5) | |
| query | Yes | Country name fragment, ISO2/ISO3 code or alias | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. |
Output Schema
| Name | Required | Description |
|---|---|---|
| matches | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that resolution yields canonical names plus ISO3 codes, but says nothing about matching behavior (fuzzy vs exact), multiple-match/disambiguation handling, or ranking — useful context that would lower ambiguity for a resolver tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. The resolution behavior is front-loaded and the usage cue follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and all three parameters plus annotations are documented. The one gap is disambiguation behavior when a query matches several countries, which an agent calling a resolver would benefit from knowing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, documenting query, limit (max 20, default 5), and locale (en/ar with RTL note), so the baseline is 3. The description's examples ("egypt", "DRC", "syria") loosely illustrate that query accepts fragments and abbreviations, but add no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (resolve) and resource (free-text country query) and names the output form — canonical names and ISO3 codes — with three concrete query examples. It does not explicitly differentiate itself from country-consuming siblings like country_profile or compare_countries, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this first when unsure how a country is spelled in the data" gives a clear triggering condition and positions the tool as a pre-step. It names no alternatives or when-not conditions (e.g., when an ISO3 is already known), so it stops short of explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
situation_reportsSituation reportsARead-only
Situation reports published about a country: yearly counts plus the most recent report titles and links (ReliefWeb). Use it to ground trends and anomalies from other tools in what was actually reported at the time.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Free-text filter for the listed reports (e.g. "cholera") — yearly counts stay unfiltered | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| country | Yes | Country name or ISO3 code, e.g. "Egypt", "EGY", "syria" | |
| year_to | No | Last year of the range (default: latest available) | |
| year_from | No | First year of the range (default: 10 years back) | |
| max_reports | No | How many of the most recent reports to list (default 5) |
Output Schema
| Name | Required | Description |
|---|---|---|
| latest | Yes | |
| source | Yes | |
| country | Yes | |
| records | Yes | |
| country_code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile and external-source nature are partly covered. The description adds the provenance (ReliefWeb) and the fact that the returned titles/links are 'most recent', which is useful context, but says nothing about rate limits, coverage gaps, or freshness lag beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler: the first front-loads what is returned and the second supplies the usage rationale. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and annotations cover the read-only/open-world profile. It states source and purpose adequately; only the relationship to the many sibling analysis tools remains slightly underspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all six parameters, including the locale enum and the year/max_reports bounds, are documented in the schema itself. The description adds no additional parameter meaning (e.g. it never clarifies the query filter or the year defaults), so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource ('situation reports published about a country') and precisely enumerates the payload ('yearly counts plus the most recent report titles and links'), even citing the source (ReliefWeb). It does not explicitly contrast itself with any sibling tool, so it stops short of the top tier, but an agent can still tell what it returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it to ground trends and anomalies from other tools in what was actually reported at the time' gives a clear situational trigger and implies it complements rather than replaces analysis tools like trend_analysis or conflict_events. It gives no explicit when-not or named alternative, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_host_countriesTop host / origin countriesARead-only
Rank countries by a displacement metric for a year. by="asylum" (default) ranks host countries; by="origin" ranks countries people fled from. Set normalize_by="population" to rank per 1,000 residents (or "gdp" per US$1bn) — the ranking that shows Lebanon and Chad ahead of large economies.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | Rank hosts ("asylum") or origins ("origin") | |
| year | No | Year to rank (default: latest available) | |
| limit | No | How many rows (default 10) | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| metric | No | Metric to rank by (default refugees) | |
| normalize_by | No | Normalize values by a denominator: "population" → per 1,000 residents, "gdp" → per US$1bn GDP. Requires the worldbank provider. |
Output Schema
| Name | Required | Description |
|---|---|---|
| by | Yes | |
| unit | Yes | |
| year | Yes | |
| metric | Yes | |
| source | Yes | |
| ranking | Yes | |
| normalize_by | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the agent knows this is a safe, external-data read. The description adds the normalization semantics (population/gdp denominators) and a concrete example of the ranking effect, but says nothing about pagination, ranking ties, or the normalize_by worldbank provider dependency beyond what the schema already notes. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core operation before the parameter nuances. The closing example ('Lebanon and Chad ahead of large economies') is illustrative but borderline flourish rather than essential instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be described, and annotations cover the safety profile. The description covers the main parameter-driven modes; only the metric parameter's accepted values and the worldbank provider requirement for normalization rely entirely on the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description restates much of what the schema already says ('asylum' ranks hosts, 'origin' ranks origins) and adds only the default for by and the illustration of normalization; it does not explain metric, limit, or locale beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Rank countries by a displacement metric') and immediately clarifies the two modes via the by parameter, so an agent distinguishes this from siblings like refugee_population or compare_countries. The title and description align, with no tautology.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly tells the agent when to use by="asylum" versus by="origin" and when to set normalize_by. It gives clear context for the parameter-driven use cases but does not compare against sibling tools (e.g. when to prefer compare_countries or trend_analysis), so no explicit alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trend_analysisTrend analysisARead-only
Analyse how a displacement metric evolved for a country: yearly series, year-over-year changes, linear trend (slope, R²), CAGR, statistically anomalous years (z-scores of yearly changes) and changepoints (structural breaks in level/slope, exact penalised segmentation). Default: refugees hosted, last 10 years — widen year_from for better changepoint power.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | "asylum" = people hosted IN the country; "origin" = people displaced FROM the country | |
| locale | No | Language of the human-readable text output: "en" (default) or "ar" (Modern Standard Arabic, right-to-left). Structured JSON fields, ISO3 codes and dataset ids stay in English either way. | |
| metric | No | Metric: refugees, asylum_seekers, idps, stateless... (default refugees) | |
| country | Yes | Country name or ISO3 code, e.g. "Egypt", "EGY", "syria" | |
| year_to | No | Last year of the range (default: latest available) | |
| year_from | No | First year of the range (default: 10 years back) |
Output Schema
| Name | Required | Description |
|---|---|---|
| role | Yes | |
| trend | Yes | |
| metric | Yes | |
| series | Yes | |
| source | Yes | |
| country | Yes | |
| segments | Yes | |
| anomalies | Yes | |
| changepoints | Yes | |
| country_code | Yes | |
| year_over_year | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, covering the safety profile. Beyond those, the description adds a genuine methodological caveat — that changepoint power depends on extending year_from — but the rest of the sentence just enumerates returned statistics, which duplicates the output schema, and nothing is said about cost or data coverage limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence, front-loaded with the core action followed by the output enumeration and the one actionable tip. Every clause carries information, though the long list of statistics partially duplicates what the output schema already declares.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a 100%-covered schema and an existing output schema, the description need not explain return values, yet it still sketches them for orientation and adds the changepoint-window caveat. Nothing essential for invoking the tool correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description goes further by linking the year_from parameter to the analytical quality of changepoint detection, a relationship the schema does not express, and by restating the metric/role defaults in prose context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Analyse how a displacement metric evolved for a country') and enumerates the exact analytical outputs: yearly series, YoY changes, linear trend with slope/R², CAGR, z-score anomalies, and changepoints. This is clearly distinct from siblings like forecast (prediction) or monitor_changes (short-term deltas).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives default operating behaviour ('Default: refugees hosted, last 10 years') and one conditional tip ('widen year_from for better changepoint power'), which implies when the tool is appropriate. However it never names an alternative sibling (forecast, compare_countries, monitor_changes) or states when NOT to use this tool, so routing guidance is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
24 tool updates
v0.7.0- First observed
asylum_applications - First observed
asylum_decisions - First observed
compare_countries - First observed
conflict_events - First observed
country_profile - First observed
demographics - First observed
durable_solutions - First observed
export_data - First observed
export_report - First observed
food_security - First observed
forecast - First observed
generate_chart - First observed
generate_country_report - First observed
generate_map - First observed
get_metadata - First observed
humanitarian_funding - First observed
latest_statistics - First observed
monitor_changes - First observed
provider_health - First observed
refugee_population - First observed
search_country - First observed
situation_reports - First observed
top_host_countries - First observed
trend_analysis
TDQS
Scored across 24 tools
Each tool targets a distinct dataset or operation, and descriptions clarify role parameters. Minor overlap between country_profile/latest_statistics and between generate_chart/generate_country_report/export_report could cause hesitation, but boundaries are generally clear.
All names use snake_case and are readable, but the set mixes verb-first (search_country, generate_chart) and noun-first (refugee_population, asylum_decisions) conventions without a single predictable pattern.
24 tools is heavy for a single server; while many are justified by distinct data sources and output formats, the surface is large enough to raise discovery burden and overlaps.
The surface covers country resolution, many displacement/context metrics, comparison/trend/forecast/monitoring, chart/map/report generation, export, metadata and health. Explicit list_countries or dataset-discovery helpers are missing, but get_metadata and search_country mostly compensate.
Maintenance
Related MCP Connectors
Official statistics for AI agents: Eurostat, World Bank, OECD, IMF and WHO data for 150+ countries.
Query UNHCR refugee, IDP, and stateless populations, asylum decisions, returns, and resettlement.
Normalized official data with provenance, aggregations, insights, free samples and agent access.
Normalized official data with provenance, aggregations, insights, free samples and agent access.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceExposes World Bank development data and country information via MCP resources and tools, enabling AI agents to query historical indicators and live API data.-
- AlicenseAqualityDmaintenanceA Model Context Protocol server that provides real-world intelligence including macroeconomics, climate, disasters, aviation, trade, and country data from globally trusted open APIs with no proprietary subscriptions required.1112 npm1MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to discover, retrieve, and compare official international development indicators from sources such as the World Bank, FAOSTAT, WHO, UNICEF, and IMF, while preserving source identifiers, units, and citations.102MIT
- AlicenseNot gradedqualityBmaintenanceEnables searching and retrieving Humanitarian Data Exchange datasets, locations, and publishing organizations via CKAN, supporting discovery of data on displacement, refugees, food security, conflict, disasters, health, and population.12 npmMIT