Skip to main content
Glama

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

country_list

List 44 supported partner countries with ISO2, ISO3, and procurement-model identifiers

iati_status

Check whether an IATI key is configured without returning the key

iati_test_connection

Test IATI authentication with one activity query

iati_query_country

Query IATI activities, transactions, or budgets by country and optional filters

country_data_status

Summarize source freshness, coverage, record counts, errors, and missing-data status

country_hazard_snapshot

Normalize and deduplicate USGS, GDACS, and NASA EONET events

country_humanitarian_context

Summarize HDX HAPI, UNHCR, WHO, ReliefWeb, and World Bank document evidence

country_report_context

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 ci

Configure the IATI subscription key through hidden terminal input:

npm run iati:configure
npm run test:iati

On 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:configure

UNHCR, 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 = true

Generic 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 32

Run the remote server locally:

MCP_AUTH_TOKEN="replace-with-generated-token" \
MCP_ALLOWED_HOSTS="localhost,127.0.0.1" \
npm run start:http

The endpoints are:

  • POST /mcp — stateless Streamable HTTP MCP

  • GET /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-mcp

Set these deployment variables:

Variable

Required

Purpose

MCP_AUTH_TOKEN

yes

Pre-shared bearer token, at least 32 characters

MCP_ALLOWED_HOSTS

yes for public bind

Comma-separated public endpoint hostnames

HOST

no

Bind address; defaults to 127.0.0.1 (0.0.0.0 in .env.example)

PORT

no

Listen port; defaults to 3000

MCP_ALLOWED_ORIGINS

no

Exact comma-separated browser origins; browser requests are rejected when omitted

MCP_RATE_LIMIT_PER_MINUTE

no

Per-client request limit; defaults to 60

MCP_TRUST_PROXY_HOPS

no

Trusted reverse-proxy hop count; set only to the actual proxy topology

ODA_CACHE_DIR

no

Writable data cache path; the container defaults to /tmp/oda-mcp-cache

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=dev

The 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-Key header 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 tools
country_data_status국가 데이터 상태A
Read-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국가 재난 스냅숏A
Read-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국가 인도적·보건 문서 컨텍스트B
Read-onlyIdempotent

HDX HAPI·UNHCR·WHO GHO의 정형 관측치와 ReliefWeb·World Bank 최신 문서 메타데이터를 출처 상태·건수·표본 중심으로 반환합니다.

Inputs: fields, refresh, sampleSize, countryCode. Returns: country, samples, summary, data_status, +4 more

country_list지원 국가 목록A
Read-onlyIdempotent

overseas-procurement-100의 44개 협력국을 ISO2·ISO3·영문명·조달 모델 slug와 함께 반환합니다.

Inputs: no named parameters. Returns: count, countries

country_report_context국가 리포트 컨텍스트B
Read-onlyIdempotent

보고서용 정제 데이터만 반환합니다. 기본은 출처 상태·건수·출처별 표본 3건이며 fields로 필드를 줄일 수 있습니다.

Inputs: fields, refresh, sampleSize, countryCode. Returns: country, profile, samples, summary, +7 more

iati_query_countryIATI 국가별 조회A
Read-onlyIdempotent

IATI 국가별 활동·거래·예산을 조회합니다. 기본은 건수와 표본 3건이며 summary=false일 때 상세 레코드를 반환합니다.

Inputs: rows, start, fields, summary, +8 more.

iati_statusIATI BYOK 상태A
Read-onlyIdempotent

로컬 IATI API 키가 설정됐는지만 확인합니다. 키 값은 읽어오거나 반환하지 않습니다.

Inputs: no named parameters.

iati_test_connectionIATI 연결 시험A
Read-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

    A3.6/5.0

    Scored across 8 tools

    Disambiguation4/5

    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.

    Naming Consistency3/5

    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.

    Tool Count5/5

    Eight tools is an appropriate number for a focused domain like ODA data, providing a reasonable range of operations without overwhelming the user.

    Completeness4/5

    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

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      A 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 consumption
      18
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Read-only Model Context Protocol server for Microsoft SQL Server, enabling safe schema discovery, profiling, and querying with zero risk of data modification.
      14
      5,291 npm
      9
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Read-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.
      7
      1
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Read-only Model Context Protocol server for Microsoft SQL Server. Enables safe schema discovery, profiling, and querying with zero risk of data modification.
      4 npm
      MIT