Prototype · Preview: every server in the official registry, synced every 30 minutes. Reviews and accounts come in a later step.
PopNx MCPMCP servers for people who use AI · explained in plain words

Eurostat MCP Server

by cyanheadsversion 0.11.3i★ –iComputer or cloud
Registry nameio.github.cyanheads/eurostat-mcp-server

Install

Overview

Description from the maker (original English)

Search and query the Eurostat catalogue — EU economy, demography, trade, and NUTS regional data.

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

Install

Pick the AI app you use, then copy the settings.

Before you install

  • Basic checks: 3 of 3 passed
  • Runs on the maker’s server: what you ask it goes through their server.
  • Can do 8 things (tools) eurostat_search_datasets, eurostat_browse_themes, eurostat_get_dataset_info, eurostat_get_dimension_values …
  • You fill in yourself: EUROSTAT_CLAMP_LIMITS, MCP_LOG_LEVEL, EUROSTAT_BASE_URL, EUROSTAT_COMEXT_BASE_URL, EUROSTAT_REQUEST_TIMEOUT_MS, EUROSTAT_METADATA_TIMEOUT_MS, EUROSTAT_TOC_CACHE_TTL_MS, EUROSTAT_BULK_TIMEOUT_MS, EUROSTAT_BULK_MAX_BYTES, CANVAS_PROVIDER_TYPE, CANVAS_TEMP_PATH, CANVAS_TTL_MS, CANVAS_DEFAULT_ROW_LIMIT, EUROSTAT_DATAFRAME_DROP_ENABLED

You need

  • Runs in the cloudNothing to install; it connects over the internet
  • npmNode.js installed (for the npx command)

Which app do you use?

Pick your app above. We remember it, so next time the button says “Install in …”.

Works in Claude on the web, desktop and mobile:

  1. Open Settings → Connectors
  2. Press Add custom connector
  3. Paste the address below and press Add
  4. If it asks you to sign in, sign in with the maker
SettingsConnectors1+ Add2https://…3
https://eurostat.caseyjhand.com/mcp

Or run it on your computer

Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json

{
  "mcpServers": {
    "eurostat": {
      "command": "npx",
      "args": [
        "-y",
        "@cyanheads/eurostat-mcp-server"
      ],
      "env": {
        "EUROSTAT_CLAMP_LIMITS": "your-value",
        "MCP_LOG_LEVEL": "your-value",
        "EUROSTAT_BASE_URL": "your-value",
        "EUROSTAT_COMEXT_BASE_URL": "your-value",
        "EUROSTAT_REQUEST_TIMEOUT_MS": "your-value",
        "EUROSTAT_METADATA_TIMEOUT_MS": "your-value",
        "EUROSTAT_TOC_CACHE_TTL_MS": "your-value",
        "EUROSTAT_BULK_TIMEOUT_MS": "your-value",
        "EUROSTAT_BULK_MAX_BYTES": "your-value",
        "CANVAS_PROVIDER_TYPE": "your-value",
        "CANVAS_TEMP_PATH": "your-value",
        "CANVAS_TTL_MS": "your-value",
        "CANVAS_DEFAULT_ROW_LIMIT": "your-value",
        "EUROSTAT_DATAFRAME_DROP_ENABLED": "your-value"
      }
    }
  }
}

Run this in your terminal

claude mcp add --transport http eurostat https://eurostat.caseyjhand.com/mcp

Or run it on your computer

claude mcp add eurostat --env EUROSTAT_CLAMP_LIMITS=your-value --env MCP_LOG_LEVEL=your-value --env EUROSTAT_BASE_URL=your-value --env EUROSTAT_COMEXT_BASE_URL=your-value --env EUROSTAT_REQUEST_TIMEOUT_MS=your-value --env EUROSTAT_METADATA_TIMEOUT_MS=your-value --env EUROSTAT_TOC_CACHE_TTL_MS=your-value --env EUROSTAT_BULK_TIMEOUT_MS=your-value --env EUROSTAT_BULK_MAX_BYTES=your-value --env CANVAS_PROVIDER_TYPE=your-value --env CANVAS_TEMP_PATH=your-value --env CANVAS_TTL_MS=your-value --env CANVAS_DEFAULT_ROW_LIMIT=your-value --env EUROSTAT_DATAFRAME_DROP_ENABLED=your-value -- npx -y @cyanheads/eurostat-mcp-server

Fill in the empty values before running it.

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "eurostat": {
      "url": "https://eurostat.caseyjhand.com/mcp"
    }
  }
}

Or run it on your computer

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "eurostat": {
      "command": "npx",
      "args": [
        "-y",
        "@cyanheads/eurostat-mcp-server"
      ],
      "env": {
        "EUROSTAT_CLAMP_LIMITS": "your-value",
        "MCP_LOG_LEVEL": "your-value",
        "EUROSTAT_BASE_URL": "your-value",
        "EUROSTAT_COMEXT_BASE_URL": "your-value",
        "EUROSTAT_REQUEST_TIMEOUT_MS": "your-value",
        "EUROSTAT_METADATA_TIMEOUT_MS": "your-value",
        "EUROSTAT_TOC_CACHE_TTL_MS": "your-value",
        "EUROSTAT_BULK_TIMEOUT_MS": "your-value",
        "EUROSTAT_BULK_MAX_BYTES": "your-value",
        "CANVAS_PROVIDER_TYPE": "your-value",
        "CANVAS_TEMP_PATH": "your-value",
        "CANVAS_TTL_MS": "your-value",
        "CANVAS_DEFAULT_ROW_LIMIT": "your-value",
        "EUROSTAT_DATAFRAME_DROP_ENABLED": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "eurostat": {
      "type": "http",
      "url": "https://eurostat.caseyjhand.com/mcp"
    }
  }
}

Or run it on your computer

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "eurostat": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@cyanheads/eurostat-mcp-server"
      ],
      "env": {
        "EUROSTAT_CLAMP_LIMITS": "your-value",
        "MCP_LOG_LEVEL": "your-value",
        "EUROSTAT_BASE_URL": "your-value",
        "EUROSTAT_COMEXT_BASE_URL": "your-value",
        "EUROSTAT_REQUEST_TIMEOUT_MS": "your-value",
        "EUROSTAT_METADATA_TIMEOUT_MS": "your-value",
        "EUROSTAT_TOC_CACHE_TTL_MS": "your-value",
        "EUROSTAT_BULK_TIMEOUT_MS": "your-value",
        "EUROSTAT_BULK_MAX_BYTES": "your-value",
        "CANVAS_PROVIDER_TYPE": "your-value",
        "CANVAS_TEMP_PATH": "your-value",
        "CANVAS_TTL_MS": "your-value",
        "CANVAS_DEFAULT_ROW_LIMIT": "your-value",
        "EUROSTAT_DATAFRAME_DROP_ENABLED": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

ChatGPT connects only to servers on the internet:

  1. Open ChatGPT on the web → Settings → Connectors (Apps)
  2. Press Create or Add (some plans need Developer mode under Advanced first)
  3. Paste the address below, give it a name and save
  4. If it asks you to sign in, sign in with the maker
SettingsConnectors1+ Create2https://…3
https://eurostat.caseyjhand.com/mcp

Menu names can differ slightly by plan and over time.

Your choice stays on this device in a cookie; no account needed.

Values you fill in

  • EUROSTAT_CLAMP_LIMITS env
    Clamp positive integer preview/search/dimension limits to 500/100/1000 with a notice. False restores schemas rejecting over-cap inputs.
  • MCP_LOG_LEVEL env
    Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').
  • EUROSTAT_BASE_URL env
    Eurostat API base URL. Override when using a mirror or proxy.
  • EUROSTAT_COMEXT_BASE_URL env
    Base URL of the Comext dissemination host, which serves every DS-* dataset code (detailed trade and PRODCOM). Override when using a mirror or proxy.
  • EUROSTAT_REQUEST_TIMEOUT_MS env
    Total allowance for one Eurostat request across retries, backoff and body consumption, in milliseconds.
  • EUROSTAT_METADATA_TIMEOUT_MS env
    Total allowance for one dataset's SDMX dataflow structure across retries, backoff and body consumption, in milliseconds. Defaults to 120000; separate from EUROSTAT_REQUEST_TIMEOUT_MS for large struct…
  • EUROSTAT_TOC_CACHE_TTL_MS env
    How long a fetched catalogue TOC stays usable before the next catalogue call refreshes it, in milliseconds. Defaults to 12 hours.
  • EUROSTAT_BULK_TIMEOUT_MS env
    Total allowance for one eurostat_download_dataset transfer across request retries, backoff and streaming body consumption, and for each download that builds the dimension value index, in milliseconds…
  • EUROSTAT_BULK_MAX_BYTES env
    Byte budget for one eurostat_download_dataset transfer, counted on the decoded TSV rather than on the wire. Eurostat sends the body chunked with no Content-Length, so the budget is enforced while str…
  • CANVAS_PROVIDER_TYPE env
    Dataframe canvas backend. The default, 'duckdb', lists eurostat_dataframe_describe and eurostat_dataframe_query, stages query matches with stage=true or above 5,000 observations, and retains bulk dow…
  • CANVAS_TEMP_PATH env
    Parent directory for DuckDB canvas spill files: a private 'mcp-canvas-XXXXXX' directory is created inside it, so it must be writable by the server process. Defaults to the OS temp directory.
  • CANVAS_TTL_MS env
    Sliding lifetime of a staged dataframe canvas in milliseconds; every call against it extends the window. Defaults to 24 hours.
  • CANVAS_DEFAULT_ROW_LIMIT env
    Maximum complete rows a single eurostat_dataframe_query returns before reporting truncated.
  • EUROSTAT_DATAFRAME_DROP_ENABLED env
    Set to 'true' to list eurostat_dataframe_drop, which removes one staged table from a dataframe canvas and leaves its other tables in place. Off by default because a drop cannot be undone; staged tabl…

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

What it can do

Tool names and descriptions exactly as the server reported them on Nov 9, 2026. The maker wrote them, not us; we show them as plain text.

  • eurostat_search_datasets

    Search the Eurostat catalogue by keyword. Returns matching datasets with codes, descriptions, period coverage, and theme breadcrumbs. Matches are ordered by where the words were found: first datasets whose label contains the query as a phrase beginning at the start of a word, the

  • eurostat_browse_themes

    Navigate the Eurostat theme tree. Without theme_code returns the 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

  • eurostat_get_dataset_info

    Fetch metadata for a Eurostat dataset: dimensions with valid values, time range, observation count, and last-update date. Call this before eurostat_query_dataset or eurostat_download_dataset to discover what dimension codes are valid (unit, na_item, geo, etc.); eurostat_download_

  • eurostat_get_dimension_values

    List the valid values for a dimension in a Eurostat dataset, preserving value codes and labels exactly. Use this when eurostat_get_dataset_info returns more values than its sample, or to confirm exact filter codes before querying. Dimension identifiers match exactly first, then c

  • eurostat_query_dataset

    Fetch statistical data from a Eurostat dataset with dimension filters. Returns a deterministic inline prefix of decoded observations with dimension codes and labels, numeric values, an OBS_FLAG status (e.g., "p" = provisional, "e" = estimated) and a separate CONF_STATUS confident

  • eurostat_download_dataset

    Download a Eurostat dataset in bulk through the SDMX 2.1 TSV endpoint and stage it as a SQL table on the dataframe canvas — the route to a whole dataset, where eurostat_query_dataset is the route to a slice of one. The TSV wire format is roughly half the bytes of the JSON-stat bo

  • eurostat_dataframe_describe

    List the tables staged on a Eurostat dataframe canvas, with their row counts and column names and types. Call this before eurostat_dataframe_query to learn the table and column names to write SQL against. The canvas_id comes from a eurostat_query_dataset or eurostat_download_data

  • eurostat_dataframe_query

    Run a read-only SQL SELECT against tables staged on a Eurostat dataframe canvas, reaching observations beyond an inline preview and aggregating or joining tables without re-fetching Eurostat. Call eurostat_dataframe_describe first for table and column names. Only a single SELECT

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 9, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified with the GitHub account cyanheads, which owns the repo

  • … Not checked yet

    Still maintained

    We have not read this repo from GitHub yet

  • … Not checked yet

    Has a licence

    We have not read this repo from GitHub yet

  • ✓ Pass

    Endpoint responds

    Responded in 219 ms (HTTP 200)

  • – Not applicable

    Sign-in with OAuth

    No sign-in needed

  • ✓ Pass

    No hidden instructions in tool descriptions

    Read 8 tool descriptions and found no hidden instructions to the AI

Compared with others in Search & AI memoryi

  • More stars than 0% of the other 5755 servers in this category
  • Published to the registry more recently than 99% of the other 5755 servers in this category
  • Basic checks equal to or better than 100% of the other 5755 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is Eurostat MCP Server safe?

It passed 3 of 3 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

The registry does not list a required key, though some servers ask you to sign in on first use.

Does it run on my computer or in the cloud?

Either way works: install it on your computer or connect to the cloud version.

Is it still maintained?

The GitHub repo last changed –, and the latest version (0.11.3) reached the registry today.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. It connects by URL, so apps that accept remote MCP servers work too, such as ChatGPT in developer mode.

What can I use instead?

In the same category: Context7, Codebase Memory, Exa

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:↓ Downloads per weeki★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

Context7

Feeds AI the latest docs for libraries and frameworks before it answers, so code it writes does not use outdated, removed functions.

by upstashWidely used↓ 972.7K/wk★ 64.2KUpdated 3 days ago

Computer or cloud

Codebase Memory

Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.

by DeusDataWidely used↓ 18K/wk★ 48.1KUpdated 23 days ago

Runs on your computer

Exa

Connect AI agents to Exa for web search, content fetching, and multi-step research.

by exa-labsWidely used★ 5.2KUpdated 2 months ago

Runs in the cloud✓ exa.ai

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

@cyanheads/eurostat-mcp-server Search and query the Eurostat catalogue — EU economy, demography, trade, health, and NUTS regional data via MCP. STDIO or Streamable HTTP. 6 Tools (up to 9 with the dataframe canvas) • 2 Resources • 1 Skill

Public Hosted Server: https://eurostat.caseyjhand.com/mcp


Overview

EU statistics from Eurostat: economy, demography, trade, health, and NUTS regional data, including detailed Comext trade and PRODCOM industrial production. Search or browse the catalogue, inspect a dataset's dimensions, then query a slice or bulk-download the whole thing.

Tools

The three eurostat_dataframe_* tools need the dataframe canvas, which is on by default and off with CANVAS_PROVIDER_TYPE=none; eurostat_dataframe_drop also needs EUROSTAT_DATAFRAME_DROP_ENABLED=true.

ToolDescription
eurostat_search_datasetsSearch the Eurostat catalogue by keyword — returns codes, descriptions, period coverage, and theme breadcrumbs
eurostat_browse_themesNavigate the Eurostat theme hierarchy — list root themes or drill into subthemes and datasets
eurostat_get_dataset_infoFetch dataset metadata: dimensions with sample values, time range, observation count, and last-update date
eurostat_get_dimension_valuesList all valid codes for one dataset dimension, paged, with a code/label word filter and NUTS hierarchy filtering for geo
eurostat_query_datasetFetch a bounded preview of decoded observations with dimension filters, NUTS geo-level, and time-range controls
eurostat_download_datasetDownload a whole dataset via the SDMX bulk endpoint and stage every row on the dataframe canvas
eurostat_dataframe_describeList the tables staged on a dataframe canvas, with row counts and column types
eurostat_dataframe_queryRun a read-only SQL SELECT across staged tables
eurostat_dataframe_dropRemove one staged table from a dataframe canvas, leaving its other tables in place (opt-in)
Resources
ResourceDescription
eurostat://dataset/{dataset_code}Dataset metadata (dimensions, time range, observation count, last-updated) by URI
skill://eurostat-guide/SKILL.mdStatistical comparison gates, identifier provenance, and SQL analysis workflows

The same metadata is available through eurostat_get_dataset_info for tool-only clients.

Agent skill

eurostat-guide covers country and regional comparisons, Comext aggregation, missing-data interpretation, and SQL joins over staged observations. It ships with plugin, npm, Docker, and MCPB installs and is served over MCP at skill://eurostat-guide/SKILL.md; supporting SQL examples are included under the skill's references/ directory.

Capability reference

eurostat_search_datasets tool
  • query words are ANDed case-insensitively across each dataset's label, theme breadcrumb, and code, ignoring spacing beside punctuation (Rev.2 finds Rev. 2); limit is a positive integer (default 20), clamped to 100 with a notice. Page by passing nextCursor back as cursor; cursor calls ignore limit
  • Results carry code, label, type (dataset / table), period coverage, obsCount, lastUpdated, and themePath, with totalMatches across every page; fails as no_match (naming the words whose removal finds matches or, when none does, the words that match no dataset), invalid_cursor, or a retryable upstream_fault when no catalogue is loaded and Eurostat's table of contents is unreachable
  • If the Comext dataflow list cannot be loaded, results carry comextListMissing and a notice; a catalogue that could not be refreshed carries catalogueLoadedAt

eurostat_browse_themes tool
  • Omit theme_code for the top-level theme folders; pass a folder code for its immediate children. Codes resolve exact-first, then case-insensitively. The Comext collections sit under ext_go_detail (detailed trade, in ext_go) and prom (PRODCOM, in icts)
  • Items carry code, label, type (folder / dataset / table), and hasChildren, with a parentPath breadcrumb and otherPlacements for a folder filed in several branches; fails as not_found for an unknown code, not_a_folder for a dataset or table code, or a retryable upstream_fault when no catalogue is loaded and Eurostat's table of contents is unreachable
  • If the Comext dataflow list cannot be loaded, ext_go and icts carry comextListMissing and a notice; a catalogue that could not be refreshed carries catalogueLoadedAt

eurostat_get_dataset_info tool
  • One dataset_code; returns every dimension with valuesCount and up to 10 sampleValues, plus timeRange, obsCount, lastUpdated, and the ESMS metadataUrl
  • Fails as not_found for an unknown dataset, or upstream_fault when Eurostat returns a structure the server cannot read (retryable when the endpoint is down)

eurostat_get_dimension_values tool
  • dataset_code plus dimension, resolved exact-first then case-insensitively (TIME_PERIOD aliases time); returned value codes and labels stay unchanged. For geo, geo_level picks a NUTS level (aggregate, country by default, nuts1, nuts2, nuts3). filter keeps values whose code and label contain every word given, ignoring case and accents (palma frankfurt finds DE_EDDF_ES_LEPA), counted in matchCount
  • limit defaults to 25 and clamps to 1,000 with a notice. Pages contain that many values, fewer at the end, with totalCount for the full list; a page with more after it carries truncated, nextCursor (pass back as cursor), and a notice. Continuations retain the effective count and ignore a new limit; older cursors above 1,000 normalize to 1,000 with disclosure. Fails as not_found, no_results, conflicting_params, invalid_cursor, upstream_fault (retryable when the endpoint is down), or canvas_not_found
  • canvas_id stages every value on that canvas as a code / label table (canvasId / tableName / stagedRowCount) that labels a download's code columns through a join; it never starts a canvas of its own

eurostat_query_dataset tool
  • dataset_code plus filters ({dimension_code: [values]}), geo_level, and either since_period / until_period (2020, 2020-Q1, 2020-01, down to YYYY-Wnn and YYYY-Dnnn) or last_n_periods; preview_limit is a positive integer (default 25), clamped to 500 with a notice; lang is EN, FR, or DE
  • stage: true stages the whole match on an available canvas, regardless of size; reuse canvas_id or omit it to create one. Without it, automatic staging starts above 5,000 observations. truncated still describes that threshold; tableName identifies a staged result. Canvas-disabled deployments disclose an explicit staging request as unavailable
  • last_n_periods counts dataset time positions, which can include periods with no populated cells. A notice names gaps across the full match (up to the newest 24, with an omitted count); increase N or replace it with until_period to reach earlier observations
  • Eurostat keeps only periods wholly inside since_period–until_period, per frequency. A notice names a period a bound falls inside and the bound that includes it. A one-day range goes out as time= , because Eurostat ignores one-day bounds
  • Each observation carries code/label pairs per dimension, a nullable value, status (OBS_FLAG), and confStatus (CONF_STATUS); obsCount, missingObsCount, absentCellCount (periods a matched series lacks, which are not observations and are never staged), and timeRange cover the whole match, truncated is true above 5,000 observations, and unmatchedValues names filter values that matched nothing
  • Fails as not_found, no_results (naming the unmatched values, the periods with no value, why a range selected no period, or geo_level as the likely cause when Eurostat's reply says nothing more), invalid_dimension, invalid_period, conflicting_params, a non-retryable async_response for a query too large to serve, canvas_not_found, or a retryable upstream_fault when the Statistics API is down

eurostat_download_dataset tool
  • dataset_code plus the same filters map and since_period / until_period (no last_n_periods: the TSV keeps a column per period unless a range drops it); preview_limit is a positive integer (default 25), clamped to 500 with a notice
  • The wholly-inside rule and its notice apply here too. A one-day range requests that day and the next, and the later day's column is dropped before anything is counted or staged
  • Stages one row per non-blank TSV cell. A row with null obs_value and no flag, status or text (an unflagged :) is not an observation: it is a period the series lacks, or a period of a frequency the series has no observation of (the padding of a mixed-frequency slice)
  • Returns rowCount (echoed as totalCount), missingCount, absentCellCount (the unflagged rows at periods of a frequency the series carries), periodRange (bounded by rows carrying a value, flag, status, or text), and bytesRead for the whole download; fails as not_found, invalid_dimension, invalid_period, filter_arity, a non-retryable async_queued or extraction_too_big, no_results, upstream_fault (retryable when the SDMX endpoint is down), or canvas_not_found
  • The EUROSTAT_BULK_MAX_BYTES budget (default 50 MiB decoded) retains complete rows within the permitted prefix and returns budgetExceeded: true. A budget too small for a complete header and usable row fails as byte_budget_exceeded, with the configured limit and narrowing guidance. bytesRead counts accepted decoded bytes, never more than the

Only the beginning is shown; read the rest in the repo

Ask PopNx