@cyanheads/who-gho-mcp-server

v0.1.9 pre-1.0

Query WHO Global Health Observatory data — 3,059 indicators across 194 member states with country, region, year, and sex filters via MCP. STDIO or Streamable HTTP.

@cyanheads/who-gho-mcp-server
claude mcp add --transport http who-gho-mcp-server https://who-gho.caseyjhand.com/mcp
codex mcp add who-gho-mcp-server --url https://who-gho.caseyjhand.com/mcp
{
  "mcpServers": {
    "who-gho-mcp-server": {
      "url": "https://who-gho.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http who-gho-mcp-server https://who-gho.caseyjhand.com/mcp
{
  "mcpServers": {
    "who-gho-mcp-server": {
      "command": "bunx",
      "args": [
        "@cyanheads/who-gho-mcp-server@latest"
      ]
    }
  }
}
{
  "mcpServers": {
    "who-gho-mcp-server": {
      "type": "http",
      "url": "https://who-gho.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://who-gho.caseyjhand.com/mcp \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Tools

6

who_list_dimensions

List all dimension type codes and human-readable titles available in the WHO Global Health Observatory API. Use this to discover valid dimension codes before calling who_list_dimension_values. Common dimensions include COUNTRY, REGION, SEX, WORLDBANKINCOMEGROUP, and AGEGROUP, but many additional types exist — this tool exposes them all.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "who_list_dimensions",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
view source ↗

who_list_dimension_values

List valid codes and labels for a WHO GHO dimension type such as COUNTRY, REGION, SEX, WORLDBANKINCOMEGROUP, or AGEGROUP. Use this to discover valid filter values before calling who_query_indicator_data, or to confirm the correct ISO code for a country. Use who_list_dimensions to discover all available dimension type codes.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "who_list_dimension_values",
    "arguments": {
      "dimension": "<dimension>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "dimension": {
      "type": "string",
      "minLength": 1,
      "description": "Dimension type code. Use who_list_dimensions to discover all available codes. Common values: COUNTRY, REGION, SEX, WORLDBANKINCOMEGROUP, AGEGROUP."
    }
  },
  "required": [
    "dimension"
  ],
  "additionalProperties": false
}
view source ↗

who_search_indicators

Search the WHO Global Health Observatory indicator catalog by keyword in the indicator name. Returns indicator codes and names for use with who_query_indicator_data. The search uses a substring match on indicator names — try terms like "life expectancy", "immunization", "mortality", "diabetes", or "HIV". If results are truncated, refine the query or use who_list_indicators to browse by offset.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "who_search_indicators",
    "arguments": {
      "query": "<query>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "Keyword to search in indicator names, e.g. \"life expectancy\" or \"tuberculosis\"."
    },
    "limit": {
      "default": 20,
      "description": "Maximum number of indicators to return. Default 20, max 100.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "required": [
    "query",
    "limit"
  ],
  "additionalProperties": false
}
view source ↗

who_list_indicators

Browse the WHO Global Health Observatory indicator catalog with pagination. Use when you want to explore indicators without a keyword, or to page through the full catalog. Use who_search_indicators when you have a keyword to narrow the results.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "who_list_indicators",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "limit": {
      "default": 50,
      "description": "Number of indicators to return per page. Default 50, max 500.",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    },
    "offset": {
      "default": 0,
      "description": "Zero-based offset for pagination. Default 0.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "limit",
    "offset"
  ],
  "additionalProperties": false
}
view source ↗

who_get_indicator_metadata

Fetch metadata for one or more WHO GHO indicator codes: the full indicator name and the dimensions it supports (e.g. COUNTRY, REGION, SEX, YEAR, WORLDBANKINCOMEGROUP, AGEGROUP). Call this before querying data with who_query_indicator_data to confirm which filter dimensions are valid for a given indicator. Accepts up to 10 codes per call. Codes with no metadata are reported in the notFound array rather than causing an error.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "who_get_indicator_metadata",
    "arguments": {
      "indicator_codes": "<indicator_codes>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "indicator_codes": {
      "minItems": 1,
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "description": "One to ten indicator codes, e.g. [\"WHOSIS_000001\", \"MDG_0000000026\"]."
    }
  },
  "required": [
    "indicator_codes"
  ],
  "additionalProperties": false
}
view source ↗

who_query_indicator_data

Query data rows for a single WHO GHO indicator with optional spatial, temporal, and dimension filters. Returns rows with numeric values, uncertainty intervals (Low/High), and spatial/time metadata. This is the primary data-fetching tool in the find-then-query workflow: use who_search_indicators to find the indicator code, optionally call who_get_indicator_metadata to confirm which filter dimensions are valid, then call this tool. Spatial filters are mutually exclusive per call: provide only one of country_codes, region_codes, or income_group_codes — mixing them triggers an error. Omitting all spatial filters returns all geographies (may be large; use limit to cap). The sex filter only applies when the indicator uses SEX as its first cross-cutting dimension — if not, the filter returns empty rows; check who_get_indicator_metadata first if uncertain.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "who_query_indicator_data",
    "arguments": {
      "indicator_code": "<indicator_code>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "indicator_code": {
      "type": "string",
      "minLength": 1,
      "description": "Indicator code to query, e.g. \"WHOSIS_000001\". Use who_search_indicators to find codes."
    },
    "country_codes": {
      "description": "ISO 3166-1 alpha-3 country codes to filter on, e.g. [\"JPN\",\"USA\",\"BRA\"]. Mutually exclusive with region_codes and income_group_codes.",
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      }
    },
    "region_codes": {
      "description": "WHO region codes to filter on, e.g. [\"AFR\",\"EUR\",\"AMR\",\"EMR\",\"SEAR\",\"WPR\"]. Returns the aggregate row for each named WHO region — not per-country rows within it. To get country-level data for a region, use who_list_dimension_values with dimension=\"COUNTRY\" and filter by parentCode to retrieve the ISO codes for countries in that region, then pass those to country_codes. Use who_list_dimension_values with dimension=\"REGION\" to see all valid region codes. Mutually exclusive with country_codes and income_group_codes.",
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      }
    },
    "income_group_codes": {
      "description": "World Bank income group codes, e.g. [\"WB_HI\",\"WB_LMI\",\"WB_LI\",\"WB_UMI\"]. Use who_list_dimension_values with dimension=\"WORLDBANKINCOMEGROUP\" to see all valid codes. Mutually exclusive with country_codes and region_codes.",
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      }
    },
    "year_from": {
      "description": "Start year (inclusive) for the time range filter, e.g. 2015.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "year_to": {
      "description": "End year (inclusive) for the time range filter, e.g. 2023.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "sex": {
      "description": "Filter on sex dimension: SEX_BTSX (both sexes), SEX_FMLE (female), SEX_MLE (male). Only applies when the indicator uses SEX as its first cross-cutting dimension.",
      "type": "string",
      "enum": [
        "SEX_BTSX",
        "SEX_FMLE",
        "SEX_MLE"
      ]
    },
    "dim1_value": {
      "description": "Value filter for indicators whose first cross-cutting dimension is not SEX (e.g. an AGEGROUP code like \"YEARS05-14\"). Ignored when sex is also provided.",
      "type": "string"
    },
    "include_uncertainty": {
      "default": true,
      "description": "Include Low and High uncertainty interval bounds in output. Default true.",
      "type": "boolean"
    },
    "limit": {
      "default": 200,
      "description": "Maximum number of data rows to return. Default 200, max 1000.",
      "type": "integer",
      "minimum": 1,
      "maximum": 1000
    }
  },
  "required": [
    "indicator_code",
    "include_uncertainty",
    "limit"
  ],
  "additionalProperties": false
}
view source ↗

Resources

2

Metadata for a single WHO GHO indicator: full name and the dimension types it supports for filtering. Stable and suitable as injectable context before calling who_query_indicator_data.

uri who://indicator/{indicatorCode}/metadata mime application/json

All valid values for a WHO GHO dimension type. Stable and useful as injectable context when building queries with who_query_indicator_data. Use who_list_dimensions to discover valid dimension type codes.

uri who://dimension/{dimensionCode}/values mime application/json