@cyanheads/eurostat-mcp-server

v0.1.11 pre-1.0

Search and query 8,933 Eurostat datasets — EU economy, demography, trade, health, and NUTS regional data via MCP. STDIO or Streamable HTTP.

@cyanheads/eurostat-mcp-server
claude mcp add --transport http eurostat-mcp-server https://eurostat.caseyjhand.com/mcp
codex mcp add eurostat-mcp-server --url https://eurostat.caseyjhand.com/mcp
{
  "mcpServers": {
    "eurostat-mcp-server": {
      "url": "https://eurostat.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http eurostat-mcp-server https://eurostat.caseyjhand.com/mcp
{
  "mcpServers": {
    "eurostat-mcp-server": {
      "command": "bunx",
      "args": [
        "@cyanheads/eurostat-mcp-server@latest"
      ]
    }
  }
}
{
  "mcpServers": {
    "eurostat-mcp-server": {
      "type": "http",
      "url": "https://eurostat.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://eurostat.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

5

eurostat_search_datasets

Search the Eurostat catalogue (8,933 datasets) by keyword. Returns matching datasets with codes, descriptions, period coverage, and theme breadcrumbs. Use this to discover dataset codes before calling eurostat_get_dataset_info or eurostat_query_dataset. Results are limited to datasets and predefined tables — folders are excluded.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "eurostat_search_datasets",
    "arguments": {
      "query": "<query>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "Search terms — case-insensitive substring match against dataset labels."
    },
    "limit": {
      "default": 20,
      "description": "Maximum number of results to return (1–100). Default is 20.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "required": [
    "query",
    "limit"
  ],
  "additionalProperties": false
}
view source ↗

eurostat_browse_themes

Navigate the Eurostat theme tree. Without theme_code returns the 11 top-level theme folders (Economy, Population, Transport, etc.) — the practical starting points. With a theme_code returns its immediate children: subtheme folders and datasets in that branch. Use this for structured discovery when you know the domain but not the dataset code, or to drill down from a broad topic to a specific dataset. Pair with eurostat_search_datasets for keyword-based discovery.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "eurostat_browse_themes",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "theme_code": {
      "description": "Folder code to expand (e.g., \"econ\", \"reg\"). Omit to list the 11 top-level theme folders.",
      "type": "string"
    }
  },
  "additionalProperties": false
}
view source ↗

eurostat_get_dataset_info

open-world

Fetch metadata for a Eurostat dataset: dimensions with valid values, time range, observation count, and last-update date. Call this before eurostat_query_dataset to discover what dimension codes are valid (unit, na_item, geo, etc.). Returns up to 10 sample values per dimension for orientation; use eurostat_get_dimension_values to list the full set for large dimensions.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "eurostat_get_dataset_info",
    "arguments": {
      "dataset_code": "<dataset_code>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "dataset_code": {
      "type": "string",
      "minLength": 1,
      "description": "Dataset code (e.g., \"nama_10_gdp\"). Use eurostat_search_datasets or eurostat_browse_themes to find codes."
    }
  },
  "required": [
    "dataset_code"
  ],
  "additionalProperties": false
}
view source ↗

eurostat_get_dimension_values

open-world

List all valid values for a specific dimension in a Eurostat dataset (e.g., all unit codes for nama_10_gdp, all geo codes for a regional dataset). Use this when eurostat_get_dataset_info returns more values than the 10-item sample, or to confirm exact codes before querying. For the "geo" dimension, use geo_level to filter by NUTS hierarchy (country, nuts1, nuts2, nuts3). Invalid dimension_value codes passed to eurostat_query_dataset silently return no data; use this tool to verify codes first.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "eurostat_get_dimension_values",
    "arguments": {
      "dataset_code": "<dataset_code>",
      "dimension": "<dimension>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "dataset_code": {
      "type": "string",
      "minLength": 1,
      "description": "Dataset code (e.g., \"nama_10_gdp\")."
    },
    "dimension": {
      "type": "string",
      "minLength": 1,
      "description": "Dimension code to retrieve values for (e.g., \"unit\", \"na_item\", \"geo\"). Use eurostat_get_dataset_info to see available dimensions."
    },
    "geo_level": {
      "description": "NUTS hierarchy level filter — only relevant when dimension is \"geo\". Options: \"aggregate\" (EU/EA codes), \"country\" (2-letter codes, default), \"nuts1\" (3-char), \"nuts2\" (4-char), \"nuts3\" (5-char).",
      "type": "string",
      "enum": [
        "aggregate",
        "country",
        "nuts1",
        "nuts2",
        "nuts3"
      ]
    }
  },
  "required": [
    "dataset_code",
    "dimension"
  ],
  "additionalProperties": false
}
view source ↗

eurostat_query_dataset

open-world

Fetch statistical data from a Eurostat dataset with dimension filters. Returns decoded observations with dimension codes and labels, numeric values, and status flags (e.g., "p" = provisional, "e" = estimated). Call eurostat_get_dataset_info first to discover valid dimension codes and values. Apply filters to keep the result set manageable — large unfiltered queries may trigger an async response error. Use filters.geo for specific country/region codes, or geo_level for NUTS hierarchy filtering (mutually exclusive). Use last_n_periods for the N most recent periods without knowing the end date.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "eurostat_query_dataset",
    "arguments": {
      "dataset_code": "<dataset_code>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "dataset_code": {
      "type": "string",
      "minLength": 1,
      "description": "Dataset code (e.g., \"nama_10_gdp\"). Required."
    },
    "filters": {
      "default": {},
      "description": "Dimension filters as a map of dimension code → array of valid values. Example: {\"unit\": [\"CP_MEUR\"], \"na_item\": [\"B1GQ\"], \"geo\": [\"DE\", \"FR\"]}. Do not include \"geo\" here if using geo_level. Invalid dimension values silently return no data — verify with eurostat_get_dimension_values first.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "array",
        "items": {
          "type": "string"
        }
      }
    },
    "geo_level": {
      "description": "Filter by NUTS hierarchy level. Mutually exclusive with a \"geo\" key in filters. Options: \"aggregate\" (EU/EA totals), \"country\" (41 member/candidate states), \"nuts1\" (127 major regions), \"nuts2\" (309 basic regions), \"nuts3\" (1,343 small regions).",
      "type": "string",
      "enum": [
        "aggregate",
        "country",
        "nuts1",
        "nuts2",
        "nuts3"
      ]
    },
    "since_period": {
      "description": "Start of time range (e.g., \"2020\", \"2023-Q1\", \"2024-01\"). Mutually exclusive with last_n_periods.",
      "type": "string"
    },
    "until_period": {
      "description": "End of time range (e.g., \"2024\"). Omit for data through the latest available period. Mutually exclusive with last_n_periods.",
      "type": "string"
    },
    "last_n_periods": {
      "description": "Return only the N most recent periods. Mutually exclusive with since_period and until_period.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "lang": {
      "default": "EN",
      "description": "Language for labels in the response. Default is \"EN\". Options: \"EN\", \"FR\", \"DE\".",
      "type": "string",
      "enum": [
        "EN",
        "FR",
        "DE"
      ]
    }
  },
  "required": [
    "dataset_code",
    "filters",
    "lang"
  ],
  "additionalProperties": false
}
view source ↗

Resources

1

Dataset metadata for a Eurostat dataset — dimensions, time range, observation count, and last-updated date. Equivalent to eurostat_get_dataset_info but accessible as a resource URI for cache-injectable context.

uri eurostat://dataset/{dataset_code} mime application/json