oda-mcp
Provides tools for querying and normalizing disaster events from NASA EONET.
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., "@oda-mcp list supported partner countries"
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.
oda-mcp
Read-only Model Context Protocol tools for evidence-based development cooperation and ODA research.
oda-mcp combines public development, humanitarian, health, disaster, and aid-activity sources into compact, provenance-aware country context. Missing, disabled, or failed data is never converted to zero or “no risk.”
Current status
The server supports both local stdio and remote, stateless Streamable HTTP on Node.js 20 or later. The HTTP entrypoint requires bearer-token authentication and Host validation by default, rejects unapproved browser origins, applies per-IP rate limiting, and exposes a separate health endpoint.
ACLED is intentionally not included. Conflict-event integration remains disabled pending a separate review of access, redistribution, attribution, and multi-user service terms.
Related MCP server: MSSQL MCP Reader
Tools
Tool | Purpose |
| List 44 supported partner countries with ISO2, ISO3, and procurement-model identifiers |
| Check whether an IATI key is configured without returning the key |
| Test IATI authentication with one activity query |
| Query IATI activities, transactions, or budgets by country and optional filters |
| Summarize source freshness, coverage, record counts, errors, and missing-data status |
| Normalize and deduplicate USGS, GDACS, and NASA EONET events |
| Summarize HDX HAPI, UNHCR, WHO, ReliefWeb, and World Bank document evidence |
| Return a compact country evidence package for downstream analysis and reporting |
All tools are read-only. Administrative credentials are configured out of band and are not accepted as tool arguments.
Data sources
IATI Datastore
World Bank Indicators and Documents & Reports
OECD development-finance data
USGS, GDACS, and NASA EONET
HDX HAPI
UNHCR Refugee Statistics
WHO Global Health Observatory
ReliefWeb
See DATA_SOURCES.md for source-specific access, licensing, freshness, attribution, and removal considerations.
Install
npm ciConfigure the IATI subscription key through hidden terminal input:
npm run iati:configure
npm run test:iatiOn macOS the key is stored in the oda-mcp-iati login-keychain item. Other platforms use a Git-ignored local file with mode 0600. Never paste credentials into chat, MCP tool arguments, URLs, logs, or committed configuration.
Optional integrations:
npm run hapi:configure
npm run reliefweb:configureUNHCR, WHO, and World Bank endpoints do not require local user credentials.
MCP configuration
Codex:
[mcp_servers.oda-mcp]
command = "node"
args = ["src/mcp-server.mjs"]
cwd = "/absolute/path/to/oda-mcp"
enabled = trueGeneric MCP configuration:
{
"mcpServers": {
"oda-mcp": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/oda-mcp/src/mcp-server.mjs"]
}
}
}Remote Streamable HTTP
Generate a long random bearer token and keep it in the deployment platform's secret store:
openssl rand -hex 32Run the remote server locally:
MCP_AUTH_TOKEN="replace-with-generated-token" \
MCP_ALLOWED_HOSTS="localhost,127.0.0.1" \
npm run start:httpThe endpoints are:
POST /mcp— stateless Streamable HTTP MCPGET /healthz— unauthenticated liveness check with no source or secret details
Deploy the included container behind an HTTPS reverse proxy:
docker build -t oda-mcp .
docker run --read-only --tmpfs /tmp:rw,noexec,nosuid,size=128m --init -p 3000:3000 \
-e MCP_AUTH_TOKEN="replace-with-generated-token" \
-e MCP_ALLOWED_HOSTS="mcp.example.com" \
-e IATI_API_KEY="optional-iati-key" \
oda-mcpSet these deployment variables:
Variable | Required | Purpose |
| yes | Pre-shared bearer token, at least 32 characters |
| yes for public bind | Comma-separated public endpoint hostnames |
| no | Bind address; defaults to |
| no | Listen port; defaults to |
| no | Exact comma-separated browser origins; browser requests are rejected when omitted |
| no | Per-client request limit; defaults to |
| no | Trusted reverse-proxy hop count; set only to the actual proxy topology |
| no | Writable data cache path; the container defaults to |
For a private server, configure the client with the endpoint URL and an Authorization: Bearer … header. Terminate TLS at the platform load balancer or reverse proxy; do not expose the container directly over plain HTTP.
The pre-shared token mode is intended for a single operator or a small trusted deployment. A public multi-user service still requires MCP OAuth 2.1 authorization, per-user quotas, and a managed audit trail.
Development
npm test
npm audit --omit=devThe test suite covers credential non-disclosure, fixed upstream hosts, request bounds, source normalization, missing-versus-zero handling, stale-cache behavior, disaster deduplication, and the MCP tool contract.
Security and privacy
Secrets are injected at runtime and never belong in Git history.
The data-envelope methodology is versioned independently as
oda-mcp-methodology/1.0.0.The server sends the IATI key only through the
Ocp-Apim-Subscription-Keyheader to the fixed IATI host.External error bodies are sanitized before they reach MCP responses.
Cached source data may outlive upstream removal until the next refresh; operators must implement and document a removal process.
Remote mode validates bearer authentication, Host, and browser Origin and applies per-IP rate limits. Public multi-user deployments must replace the shared token with OAuth 2.1, add per-user quotas and audit logging, and use a managed secret store.
Report vulnerabilities through the process in SECURITY.md.
License
Source code is licensed under the Apache License 2.0. Data returned by upstream sources remains subject to each source and publisher’s applicable terms and licences.
Available Tools
8 toolscountry_data_status국가 데이터 상태ARead-onlyIdempotent
IATI·World Bank·OECD·재난·HAPI·UNHCR·WHO·ReliefWeb·World Bank 문서의 관측일·수집일·캐시일·건수·오류·최신성을 요약합니다.
Inputs: refresh, countryCode. Returns: country, sources, checked_at, decision_gate, +3 more
country_hazard_snapshot국가 재난 스냅숏ARead-onlyIdempotent
USGS·GDACS·NASA EONET 사건을 국가 경계로 거른 뒤 같은 유형·100㎞·48시간 기준으로 중복 제거합니다.
Inputs: fields, refresh, sampleSize, countryCode, +1 more. Returns: sample, country, sources, risk_score, +5 more
country_humanitarian_context국가 인도적·보건 문서 컨텍스트BRead-onlyIdempotent
HDX HAPI·UNHCR·WHO GHO의 정형 관측치와 ReliefWeb·World Bank 최신 문서 메타데이터를 출처 상태·건수·표본 중심으로 반환합니다.
Inputs: fields, refresh, sampleSize, countryCode. Returns: country, samples, summary, data_status, +4 more
country_list지원 국가 목록ARead-onlyIdempotent
overseas-procurement-100의 44개 협력국을 ISO2·ISO3·영문명·조달 모델 slug와 함께 반환합니다.
Inputs: no named parameters. Returns: count, countries
country_report_context국가 리포트 컨텍스트BRead-onlyIdempotent
보고서용 정제 데이터만 반환합니다. 기본은 출처 상태·건수·출처별 표본 3건이며 fields로 필드를 줄일 수 있습니다.
Inputs: fields, refresh, sampleSize, countryCode. Returns: country, profile, samples, summary, +7 more
iati_query_countryIATI 국가별 조회ARead-onlyIdempotent
IATI 국가별 활동·거래·예산을 조회합니다. 기본은 건수와 표본 3건이며 summary=false일 때 상세 레코드를 반환합니다.
Inputs: rows, start, fields, summary, +8 more.
iati_statusIATI BYOK 상태ARead-onlyIdempotent
로컬 IATI API 키가 설정됐는지만 확인합니다. 키 값은 읽어오거나 반환하지 않습니다.
Inputs: no named parameters.
iati_test_connectionIATI 연결 시험ARead-onlyIdempotent
사용자가 터미널에서 설정한 키로 미얀마 활동 1건을 조회해 인증과 연결을 시험합니다. 키는 출력하지 않습니다.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 8 tools
Most tools have distinct purposes, but some overlap exists between country_data_status and country_humanitarian_context, as both aggregate data from multiple sources. iati_status and iati_test_connection are also similar in checking IATI connectivity.
Tool names use a mix of patterns: some are noun-based (country_list), others verb_noun (iati_query_country). The underscore-separated style is consistent, but the semantic pattern varies.
Eight tools is an appropriate number for a focused domain like ODA data, providing a reasonable range of operations without overwhelming the user.
The tool set covers key operations like listing countries, querying IATI, and accessing humanitarian data. Minor gaps exist, such as missing tools for updating or manipulating data, but the scope is appropriate for a read-heavy data access server.
Related MCP Connectors
Read-only OECD trade research for countries, products, corridors, lane risk, and opportunities.
International aid activities (IATI Datastore) — search every published aid and development…
Read-only discovery and bounded access to a finite market briefing with evidence boundaries.
Read-only cited financial datasets, bounded research queries and source diagnostics.
Related MCP Servers
- AlicenseAqualityBmaintenanceA Model Context Protocol (MCP) server for accessing Productive.io API endpoints (projects, tasks, comments, todos), tailored for read-only operations, providing streamlined access to essential data while minimizing token consumption18MIT
- AlicenseAqualityDmaintenanceRead-only Model Context Protocol server for Microsoft SQL Server, enabling safe schema discovery, profiling, and querying with zero risk of data modification.145,291 npm9MIT
- AlicenseAqualityCmaintenanceRead-only Model Context Protocol server for the US National Archives Catalog API, enabling search and retrieval of archival records, child records, extracted text, comments, and tags.71MIT
- AlicenseNot gradedqualityDmaintenanceRead-only Model Context Protocol server for Microsoft SQL Server. Enables safe schema discovery, profiling, and querying with zero risk of data modification.4 npmMIT