@cyanheads/reliefweb-mcp-server
Click 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., "@@cyanheads/reliefweb-mcp-serversearch for recent reports on flooding in Bangladesh"
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.
Public Hosted Server: https://reliefweb.caseyjhand.com/mcp
Overview
Humanitarian reports, disasters, jobs, training opportunities, and country profiles from ReliefWeb, OCHA's information hub for crisis response. Search, fetch, and page through all six ReliefWeb content types from any MCP client. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
Tools
Tool | Description |
| Search humanitarian reports with filtering by country, disaster, format, theme, language, source, and date |
| Fetch a single report by numeric ID with full body text and metadata |
| Search disasters by type, country, status, GLIDE number, and date range |
| Fetch a disaster record with profile, key content links, appeals, and response plans |
| Fetch a country profile by ISO3 code with overview, appeals, and curated links |
| List all countries tracked by ReliefWeb, filterable to active humanitarian situations |
| Search humanitarian job listings by country, organization, career category, and experience level |
| Fetch a job posting by numeric ID with the full vacancy description and application instructions |
| Search training and learning opportunities by format, country, career category, and date — upcoming starts by default |
| Fetch a training listing by numeric ID with the full description, registration instructions, and cost detail |
| Browse contributing organizations by name and type |
Resources
Resource | Description |
| Full report record by numeric ID — metadata, body text, and file URLs. The ID segment must be digits only |
| Disaster record by numeric ID — type, status, GLIDE, description, and content links. The ID segment must be digits only |
| Country profile by ISO3 code — overview, situation summary, and active response plans |
Prompts
Prompt | Description |
| Generate a structured humanitarian briefing for a country or disaster |
Related MCP server: simply-feed-mcp
Capability reference
reliefweb_search_reports tool
Full-text query plus filters: country (ISO3), disaster ID, format, theme, language (ISO 639-1), and source shortname
Date range filtering on source publication date (
date_from/date_to) — a bare2024-01-15works alongside full ISO 8601Format is a closed set:
News and Press Release,Situation Report,Map,Infographic,Analysis,Other,Assessment,Manual and Guideline,Appeal,UN Document,Evaluation and Lessons Learned— matched ignoring case, spacing, and punctuation; anything else is rejected with the listRaw
filterobject for compound conditions the named params don't coverPagination via
offset/limit, up to 1,000 per call (default 10)include_archivedhas no effect — reports carry no archived class, so every report is already in scope
reliefweb_get_report tool
Full body HTML, all metadata, and file attachment URLs
Use after
reliefweb_search_reportsto retrieve content — bodies run 10–100KBOver the response budget, returns a section outline instead;
sections: ["body"]pulls the body back on its ownReturns structured
not_foundwhen the ID doesn't exist
reliefweb_search_disasters tool
Filtering by disaster type, country, status, and GLIDE number for cross-system correlation
Date range filtering on disaster creation date (
date_from/date_to) — a bare2024-01-15works alongside full ISO 8601Status is a closed set:
alert,ongoing,past,alert-archive; comma-separate for multiple, matched ignoring case, spacing, and punctuationalert-archiveis reachable only withinclude_archived=true— the default preset hides itPagination via
offset/limit, up to 1,000 per call (default 10)Returns IDs for
reliefweb_get_disasterand as thedisaster_idfilter inreliefweb_search_reports
reliefweb_get_disaster tool
Full description, profile overview, affected countries, and GLIDE number
Three curated lists —
keyContent,appealsResponsePlans,usefulLinks— each returns only its currently-active entries; archived entries page viaarchive: { list: <name> }Major disasters run to tens of KB; over the response budget the record becomes a section outline, and
sections: ["description"]or["profileOverview"]pulls one narrative at a timesectionsandarchiveare alternative modes — a call supplying both is rejectedReturns structured
not_foundwhen the ID doesn't exist
reliefweb_get_country tool
Situation overview text curated by OCHA editors
Three curated lists —
keyContent,appealsResponsePlans,usefulLinks— each returns only its currently-active entries; archived entries (thousands deep for a long-running crisis) page viaarchive: { list: <name> }sectionsandarchiveare alternative modes — a call supplying both is rejectedCarries the same section-outline behavior as the other detail tools, though an active-only profile is small enough that it rarely reaches the budget
Use
reliefweb_list_countriesto discover valid ISO3 codesReturns structured
not_foundfor an unknown ISO3 code
reliefweb_list_countries tool
Optional
crisis_only=trueto limit to active humanitarian situations (status ongoing)Returns ISO3 codes, status, and canonical URLs — use ISO3 with
reliefweb_get_countryPagination up to 1,000 entries per call (default 100)
reliefweb_search_jobs tool
Filtering by country, organization shortname, career category, theme, and experience level
Returns current open postings by default;
include_archived=truereaches the closed archive, far larger than the open setSortable by newest posting (
date.created:desc, default) or soonest closing (date.closing:asc)Pagination via
offset/limit, up to 1,000 per call (default 10)Returns IDs for
reliefweb_get_job
reliefweb_get_job tool
Full vacancy description and application instructions — neither is in search results
Posting status, indexed / closing / last-modified dates, hiring organization, countries, career category, experience level, and job type
Both canonical URLs (the readable alias and the node URL)
Reaches expired postings as well as open ones
Over the response budget, returns a section outline;
sections: ["howToApply"]pulls the instructions without the whole descriptionReturns structured
not_foundpointing back atreliefweb_search_jobs
reliefweb_search_training tool
Filtering by country, source, format (
on-siteoronline), career category, and languageDate range filtering on training start date (
date_start_from/date_start_to) — a bare2024-06-01works alongside full ISO 8601Scoped to training starting from now when neither date bound is given; supply either one for an explicit range, including a historical one
include_archived=truereaches concluded listings and drops the start-from-now default, so an otherwise unbounded search reaches the whole recordOrdered by soonest start date by default (
date.start:asc, distinct from report date fields); override withsortReturns IDs for
reliefweb_get_training
reliefweb_get_training tool
Full description and registration instructions — neither is in search results
Cost class, the organizer's fee detail, and the organizer's own event URL
Listing status, start / end / registration / indexed dates, host cities, format, type, listing and delivery languages, organizing source, and both canonical URLs
Reaches concluded listings as well as current ones
Over the response budget, returns a section outline;
sections: ["cost", "feeInformation", "howToRegister"]pulls just the practicalitiesReturns structured
not_foundpointing back atreliefweb_search_training
reliefweb_list_sources tool
Optional filtering by name text or organization
type:Government,International Organization,Non-governmental Organization,Academic and Research Institution,Media,Red Cross/Red Crescent Movement,OtherReturns short names, types, organization URLs, and homepage URLs
Pagination via
offset/limit, up to 1,000 per call (default 10)Use
shortnamewith thesourcefilter inreliefweb_search_reports,reliefweb_search_jobs, andreliefweb_search_training
reliefweb://reports/{id} resource
Full report record as
application/json— metadata, body text, and file URLsidmust be digits only, exactly as search returned itAlways returns the whole record — no section selector; use
reliefweb_get_reportfor an oversized report
reliefweb://disasters/{id} resource
Disaster record as
application/json— type, status, GLIDE, description, and curated content linksidmust be digits only, exactly as search returned itAlways returns the whole record — no section selector; use
reliefweb_get_disasterfor an oversized disaster or to page an archive
reliefweb://countries/{iso3} resource
Country profile as
application/json— overview, situation summary, and active response plansEquivalent to calling
reliefweb_get_countryiso3must be a 3-letter ISO 3166-1 alpha-3 code
reliefweb_crisis_briefing prompt
Arguments:
country_or_disasterrequired (name, ISO3 code, or GLIDE number);focusoptional —situation,jobs, orfull(default)Returns one user message instructing the agent to gather data with the ReliefWeb tools, then synthesize a briefing citing report titles and dates
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
ReliefWeb-specific:
Full coverage of all six ReliefWeb content types: reports, disasters, countries, jobs, training, and sources
Compound filter builder supporting nested AND/OR conditions for the ReliefWeb API v2
Vocabulary matching for
formatandstatusfilters normalizes case, spacing, and punctuation instead of requiring exact ReliefWeb spellingRELIEFWEB_APP_NAMEvalidated at startup — required by the API since November 20251,000 calls/day API quota, surfaced in each search and list tool's upstream-error recovery text
Agent-friendly output:
Body text excluded from search results by design — agents fetch it explicitly with the matching
reliefweb_get_*tool to control context budgetOversized records outline rather than truncate, with a section selector to retrieve exactly what's needed
Curated-profile archives are paged rather than dropped, with honest totals and a next offset while more remain
Typed
not_founderror contracts and empty-result notices that echo applied filters and suggest how to broaden
Getting started
Prerequisites
Bun v1.3.2 or higher.
A pre-approved ReliefWeb appname — register at ReliefWeb API and set
RELIEFWEB_APP_NAME. The API has required pre-approved appnames since November 2025; requests without one are rejected.
Public Hosted Instance
A public instance is available at https://reliefweb.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"reliefweb-mcp-server": {
"type": "streamable-http",
"url": "https://reliefweb.caseyjhand.com/mcp"
}
}
}Self-Hosted / Local
Add the following to your MCP client configuration file.
{
"mcpServers": {
"reliefweb-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/reliefweb-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"RELIEFWEB_APP_NAME": "your-app-name"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"reliefweb-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/reliefweb-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"RELIEFWEB_APP_NAME": "your-app-name"
}
}
}
}Or with Docker:
{
"mcpServers": {
"reliefweb-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"-e", "RELIEFWEB_APP_NAME=your-app-name",
"ghcr.io/cyanheads/reliefweb-mcp-server:latest"
]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 RELIEFWEB_APP_NAME=your-app-name bun run start:http
# Server listens at http://localhost:3010/mcpInstallation
Clone the repository:
git clone https://github.com/cyanheads/reliefweb-mcp-server.gitNavigate into the directory:
cd reliefweb-mcp-serverInstall dependencies:
bun installConfigure environment:
cp .env.example .env
# edit .env and set RELIEFWEB_APP_NAMEConfiguration
Variable | Description | Default |
| Required. Pre-approved appname for the ReliefWeb API v2. Register at reliefweb.int/help/api. | — |
| Transport: |
|
| HTTP server port |
|
| HTTP endpoint path where the MCP server is mounted |
|
| Public origin override for TLS-terminating reverse-proxy deployments | none |
| Authentication: |
|
| HTTP session handling: |
|
| Log level ( |
|
| Opt-in Bun-only forced-GC pressure loop (ms). Try |
|
| Directory for log files (Node.js only). |
|
| Storage backend: |
|
| Enable OpenTelemetry |
|
See .env.example for the full list of optional overrides.
Running the server
Local development
Build and run the production version:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdioRun checks and tests:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
Docker
docker build -t reliefweb-mcp-server .
docker run --rm -e RELIEFWEB_APP_NAME=your-app-name -p 3010:3010 reliefweb-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/reliefweb-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
| Tool definitions ( |
| Resource definitions. Report, disaster, and country resources. |
| Prompt definitions. Crisis briefing prompt. |
| ReliefWeb API service layer — HTTP client, filter builder, and response normalizers for all six content types. |
| Server-specific environment variable parsing and validation with Zod. |
| Unit and integration tests, mirroring the |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor logging,ctx.statefor storageRegister new tools and resources in the
createApp()arraysWrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
ReliefWeb MCP — the UN OCHA humanitarian information service.
Public MCP server for discovering open jobs. Search, filter, and get application links.
An MCP server that provides congressional transcripts
An MCP server that through www.gdacs.org provides access to web‐based disaster information systems.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables searching across multiple RSS feed sources simultaneously, with support for extensible feed sources and both STDIO and HTTP modes.MIT
- AlicenseAqualityCmaintenanceAn MCP server for managing and querying RSS/news feeds, enabling real-time fetching, searching, and retrieval of feed items.57 npm1MIT
- FlicenseNot gradedqualityCmaintenanceMCP server providing web search, news search, and X/Twitter search capabilities via HTTP or stdio.-

Off-Nadir Deltaofficial
AlicenseAqualityAmaintenanceAn MCP server for live, geolocated world-event intelligence: query event signals (coordinates, severity, sources), find hotspots, search satellite imagery (Sentinel-1/2, etc), read the AI Daily World Brief, and ask an OSINT/GEOINT analyst. Local stdio proxy to the hosted Off-Nadir Delta server; free tier, token-metered.20393 npmApache 2.0