Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.cyanheads/eurostat-mcp-server

REMOTE · EUROSTAT.CASEYJHAND.COM · 2 COMPONENTS · SCANNED SEP 22

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

0 this week 80 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security66
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • Authorisation not fully verified: no authorisation is required to call this server, and 8 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
  • HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
  • The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
  • DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
Schema Quality & AI Usability64
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 3052 tokens (~381/item across 8 items; 8 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 8 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 9 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Install

How do I install the io.github.cyanheads/eurostat-mcp-server server?

io.github.cyanheads/eurostat-mcp-server is a hosted endpoint at https://eurostat.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · eurostat.caseyjhand.com

# add to Claude Code
claude mcp add --transport http cyanheads-eurostat-mcp-server 'https://eurostat.caseyjhand.com/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "cyanheads-eurostat-mcp-server": {
      "url": "https://eurostat.caseyjhand.com/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "cyanheads-eurostat-mcp-server": {
      "type": "http",
      "url": "https://eurostat.caseyjhand.com/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.cyanheads-eurostat-mcp-server]
url = "https://eurostat.caseyjhand.com/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cyanheads-eurostat-mcp-server": {
      "type": "remote",
      "url": "https://eurostat.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add cyanheads-eurostat-mcp-server --url 'https://eurostat.caseyjhand.com/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  cyanheads-eurostat-mcp-server:
    url: "https://eurostat.caseyjhand.com/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "cyanheads-eurostat-mcp-server": {
      "Transport": "http",
      "Url": "https://eurostat.caseyjhand.com/mcp"
    }
  }
}
# add to Vellum
assistant mcp add cyanheads-eurostat-mcp-server -t streamable-http -u 'https://eurostat.caseyjhand.com/mcp'
// mcp.json
{
  "mcpServers": {
    "cyanheads-eurostat-mcp-server": {
      "type": "http",
      "url": "https://eurostat.caseyjhand.com/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 22 Sept 26 0
    • Server version: 0.6.4 → 0.6.5 functional
    • “eurostat_query_dataset” reworded the description of “canvas_id” cosmetic
    • “eurostat_download_dataset” reworded the description of “canvas_id” cosmetic
  • 16 Sept 26 0
    • Server version: 0.6.3 → 0.6.4 functional
  • 9 Sept 26 0
    • Stability: 0.97 → pass security
  • 8 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

  • 7 Sept 26 −1
    • Stability: pass → 0.93 functional
  • 31 Aug 26 0
    • Tool “eurostat_download_dataset” rewrote its description, which is the text the model reads security
    • Tool “eurostat_query_dataset” rewrote its description, which is the text the model reads security
    • Server version: 0.6.1 → 0.6.3 functional
    • “eurostat_query_dataset” added an optional parameter “preview_limit” cosmetic
    • “eurostat_query_dataset” reworded the description of “canvas_id” cosmetic
  • 26 Aug 26 +1
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 25 Aug 26 0
    • Stability: 0.97 → pass security
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 22 Sept 2026 · Probed https://eurostat.caseyjhand.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=caseyjhand.com CN=WE1,O=Google Trust Services,C=US 4 Sept 2026 3 Dec 2026 ECDSA 256 ECDSA-SHA256 a6985204ed51ae050e7738aa6be668e9
SANs: caseyjhand.com, *.caseyjhand.com
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of eurostat.caseyjhand.com. Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
caseyjhand.com. present 2371 13 Verified
eurostat.caseyjhand.com. Verified address RRset verified with the apex keys
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=63072000; includeSubDomains; preload
x-content-type-options nosniff

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://eurostat.caseyjhand.com/mcp Verified 200
http (plaintext) http://eurostat.caseyjhand.com/mcp HTTPS enforced 301 https://eurostat.caseyjhand.com/mcp
MCP tools · 8 exposed · ~2,776 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
eurostat_browse_themes ~135

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 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.

NameTypeReqDescription
theme_codestringFolder code to expand (e.g., "economy", "reg"). Omit to list the top-level theme folders.
NameTypeReqDescription
errorobjectPresent when the call failed. Absent on success.
itemCountnumberNumber of items returned in this level.
itemsarrayImmediate children of the requested theme, or the root themes if theme_code was omitted.
nextStepstringSuggested next action based on these results. Populated when there is a clear follow-up call.
otherPlacementsarrayBreadcrumbs of the other branches that file this same theme_code. Eurostat lists a few folder codes in more than one branch; the items above come from the first one the catalogue lists, which never h…
parentPatharrayBreadcrumb from root to the requested theme (e.g., ["Database by themes", "Economy and finance"]). Empty when browsing root.
themeCodestringFolder code that was browsed, or omitted for root.

No examples provided.

eurostat_dataframe_describe ~241

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_dataset response that reported a staged table. Every observation column is flat, but the two stagers write different dimension columns, so read the columns reported here rather than assuming: eurostat_query_dataset gives each dimension a code column named after the dimension (e.g. "geo") plus a label companion (e.g. "geo_label"); eurostat_download_dataset gives code columns only — the bulk endpoint carries no labels — plus a "time" column. Both write the same five measure columns — obs_value, obs_flag, obs_flag_label, conf_status, conf_status_label — carrying the same codes for the same observation, so tables from the two stagers join on dimension codes and time and compare like with like.

NameTypeReqDescription
canvas_idstringyesCanvas identifier returned as canvasId by eurostat_query_dataset or eurostat_download_dataset. Identifies the workspace holding the staged tables.
NameTypeReqDescription
canvasIdstringCanvas identifier the tables were read from.
errorobjectPresent when the call failed. Absent on success.
expiresAtstringISO 8601 timestamp when the canvas expires. Every call on it slides this forward.
noticestringGuidance when the canvas holds no tables. Omitted when it holds at least one.
tablesarrayTables staged on this canvas. Empty when nothing has been staged yet, or when every staged table has expired.

No examples provided.

eurostat_dataframe_query ~320

Run a read-only SQL SELECT against tables staged on a Eurostat dataframe canvas — the way to reach observations past the 5,000-row inline cap of eurostat_query_dataset and past the inline preview of a eurostat_download_dataset bulk download, and to aggregate, group, or join across staged tables without re-fetching from Eurostat. Call eurostat_dataframe_describe first for the table and column names, which differ between the two stagers. Only a single SELECT statement runs: statement chaining, non-SELECT verbs, and functions that read files or external data are rejected. Columns are flat — every dimension is a code column named after the dimension, the measure is obs_value, the observation flag is obs_flag / obs_flag_label and the confidentiality marker is conf_status / conf_status_label; a "_label" companion per dimension exists only on tables eurostat_query_dataset staged. Both stagers write the same five measure columns with the same codes, so join their tables on dimension codes and time and compare obs_flag or conf_status across them directly.

NameTypeReqDescription
canvas_idstringyesCanvas identifier returned as canvasId by eurostat_query_dataset or eurostat_download_dataset. Identifies the workspace holding the staged tables.
sqlstringyesA single read-only SELECT statement. Reference tables by the names eurostat_dataframe_describe reports. Example: SELECT geo, geo_label, AVG(obs_value) AS mean FROM df_a1b2c3d4 WHERE time >= '2020' GR…
NameTypeReqDescription
canvasIdstringCanvas identifier the query ran against.
columnsarrayColumn names in projection order.
errorobjectPresent when the call failed. Absent on success.
rowCountnumberRows materialized into this response. Equals the full result size unless truncated is true.
rowsarrayResult rows, each keyed by column name. Bounded by the canvas row limit. 64-bit integer results — COUNT(*) among them — arrive as strings so values outside the JSON number range survive intact; cast…
truncatedbooleanTrue when the result exceeded the canvas row limit and was cut short. Add a LIMIT, an aggregate, or a narrower WHERE clause to see the rest.

No examples provided.

eurostat_download_dataset ~603

Download a Eurostat dataset in bulk through the SDMX 2.1 TSV endpoint and stage every observation 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 body eurostat_query_dataset reads, so it reaches datasets that would otherwise time out, and it is expanded here into one row per observation. Filters take the same dimension-code map eurostat_query_dataset uses and are applied server-side by Eurostat; call eurostat_get_dataset_info first for the dimension codes and eurostat_get_dimension_values for their values. Narrow with since_period/until_period rather than asking for the most recent N periods — the TSV layout keeps a column for every period whichever is requested, so a period range is what actually shrinks the response. Transfers are bounded by a byte budget enforced while streaming: when it is spent the download stops and budgetExceeded is set, leaving a prefix of the dataset rather than an error. Only preview_limit rows come back inline. When a table is staged, call eurostat_dataframe_describe first to confirm its columns, then eurostat_dataframe_query; without a canvas, rows past the preview are not retained.

NameTypeReqDescription
canvas_idstringReuse an existing dataframe canvas so this download lands beside earlier results and can be joined against them. Pass the canvasId a previous eurostat_download_dataset or eurostat_query_dataset respo…
dataset_codestringyesDataset code (e.g., "nama_10_gdp"). Required.
filtersobjectDimension filters as a map of dimension code → array of accepted values, applied by Eurostat before the body is sent. Example: {"unit": ["CP_MEUR"], "na_item": ["B1G"], "geo": ["DE", "FR"]}. Omit a d…
preview_limitintegerHow many observations to echo inline, from the start of the download. Caps at 500. The full download is on the canvas table when one was staged; this is orientation, not the result set.
since_periodstringStart of the period range (e.g., "2020", "2023-Q1", "2024-01"), sent as startPeriod. The most effective way to shrink a bulk response: it removes period columns from the TSV rather than blanking thei…
until_periodstringEnd of the period range (e.g., "2024"), sent as endPeriod. Omit for data through the latest available period.
NameTypeReqDescription
appliedQueryobjectThe bulk request as the server built it.
budgetExceededbooleanTrue when the byte budget stopped the transfer before the dataset ended, making the rows a prefix rather than the whole thing. Narrow with filters or a period range, or raise EUROSTAT_BULK_MAX_BYTES.
bytesReadnumberDecoded TSV bytes read from Eurostat — after gzip decompression when the body arrived compressed, so it measures the payload rather than the wire.
canvasIdstringDataframe canvas holding the staged download. Pass to eurostat_dataframe_describe, eurostat_dataframe_query, or a later staging call. Omitted when nothing was staged.
capnumberThe preview_limit applied to inline observations.
compressedbooleanTrue when Eurostat sent the body gzip-compressed. It does so without a Content-Encoding header on large responses, so this reports what the stream actually carried.
datasetCodestringDataset code as provided.
dimensionsUsedarrayDimension codes carried by the downloaded rows, in the order Eurostat keys them (e.g., ["freq", "unit", "na_item", "geo"]). Read from the TSV header, so it reflects the response rather than metadata.…
errorobjectPresent when the call failed. Absent on success.
missingCountnumberDownloaded observations carrying no numeric value (obs_value is null).
noticestringGuidance for every staged result, including the required eurostat_dataframe_describe then eurostat_dataframe_query sequence, composed with byte-budget, no-canvas, or empty-result disclosure when appl…
observationsarrayThe first preview_limit observations of the download, in the order Eurostat streamed them. A prefix of the staged table, not a sample.
periodRangeobjectPeriod coverage of the rows actually downloaded. Narrower than the dataset when budgetExceeded is true or a period range was applied.
rowCountnumberObservations expanded from the download — one per populated cell, counting those Eurostat reports as unavailable.
shownnumberObservations returned in the inline preview.
stagedRowCountnumberRows written to the canvas table. Matches rowCount. Omitted alongside tableName.
tableNamestringCanvas table holding every downloaded observation. Call eurostat_dataframe_describe with canvasId first to confirm the table and columns, then eurostat_dataframe_query. Omitted when this deployment r…
truncatedbooleanTrue when the inline observation preview omits rows.

No examples provided.

eurostat_get_dataset_info ~155

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_dataset builds its positional filter key from this dimension list, so a filter naming a dimension absent here is rejected outright. Returns up to 10 sample values per dimension for orientation; use eurostat_get_dimension_values to list the full set for large dimensions.

NameTypeReqDescription
dataset_codestringyesDataset code (e.g., "nama_10_gdp"). Use eurostat_search_datasets or eurostat_browse_themes to find codes.
NameTypeReqDescription
codestringDataset code as provided.
dimensionsarrayAll dimensions of the dataset with their valid codes and labels.
errorobjectPresent when the call failed. Absent on success.
labelstringHuman-readable dataset title.
lastUpdatedstringISO 8601 timestamp of the most recent data update. Omitted when Eurostat does not report it.
metadataUrlstringURL to the ESMS HTML metadata page for this dataset. Omitted when not provided by Eurostat.
obsCountnumberTotal number of observations in the full dataset (all periods). Omitted when Eurostat does not report it — an omitted count is unknown, not zero.
timeRangeobjectOverall data coverage period for this dataset. Each bound is omitted when Eurostat does not report it — an omitted bound is unknown, not empty.

No examples provided.

eurostat_get_dimension_values ~271

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 silently return no data from eurostat_query_dataset, and are rejected by Eurostat as a fault on eurostat_download_dataset; use this tool to verify codes first.

NameTypeReqDescription
dataset_codestringyesDataset code (e.g., "nama_10_gdp").
dimensionstringyesDimension code to retrieve values for (e.g., "unit", "na_item", "geo"). Use eurostat_get_dataset_info to see available dimensions.
geo_levelstringNUTS hierarchy level filter — applies only when dimension is "geo"; passing it with any other dimension is rejected. Options: "aggregate" (EU/EA codes), "country" (2-letter codes, default), "nuts1" (…
NameTypeReqDescription
dimensionCodestringThe dimension code that was queried.
dimensionLabelstringHuman-readable dimension name.
errorobjectPresent when the call failed. Absent on success.
geoLevelstringEffective NUTS hierarchy level for the geo value set. Present only for the geo dimension; country is reported when geo_level was omitted.
totalCountnumberTotal number of distinct values returned, after geoLevel filtering for geo.
valuesarrayAll dataset-available values for this dimension. For geo, this is the subset at geoLevel.

No examples provided.

eurostat_query_dataset ~743

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 confidentiality marker (e.g., "C" = confidential, which is usually why a value is null). preview_limit controls only that prefix; filters and period controls reduce the matched result itself. 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. Matches above 5,000 observations are staged whole when this deployment runs a dataframe canvas: call eurostat_dataframe_describe first, then eurostat_dataframe_query. Matches at or below 5,000 are never staged. When the target is a whole dataset rather than a slice, eurostat_download_dataset reads the SDMX bulk endpoint instead and is the cheaper route.

NameTypeReqDescription
canvas_idstringReuse an existing dataframe canvas, so a result staged by this call lands beside earlier ones and can be joined against them. Pass the canvasId a previous eurostat_query_dataset or eurostat_download_…
dataset_codestringyesDataset code (e.g., "nama_10_gdp"). Required.
filtersobjectDimension filters as a map of dimension code → array of valid values. Example: {"unit": ["CP_MEUR"], "na_item": ["B1GQ"], "geo": ["DE", "FR"]}. An empty array is treated as no filter for that dimensi…
geo_levelstringFilter 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…
langstringLanguage for labels in the response. Default is "EN". Options: "EN", "FR", "DE".
last_n_periodsintegerReturn only the N most recent periods. Mutually exclusive with since_period and until_period.
preview_limitintegerHow many matched observations to return inline, from the deterministic start of the JSON-stat cell order. Default 50; maximum 500. This changes only the inline prefix: it does not reduce obsCount, mi…
since_periodstringStart of time range (e.g., "2020", "2023-Q1", "2024-01"). Mutually exclusive with last_n_periods.
until_periodstringEnd of time range (e.g., "2024"). Omit for data through the latest available period. Mutually exclusive with last_n_periods.
NameTypeReqDescription
appliedFiltersobjectEffective query parameters applied to the Eurostat API.
canvasIdstringDataframe canvas holding the staged result. Pass to eurostat_dataframe_describe, eurostat_dataframe_query, or a later eurostat_query_dataset call. Omitted when nothing was staged.
datasetCodestringDataset code as provided.
datasetLabelstringHuman-readable dataset title.
dimensionsUsedarrayOrdered list of dimension codes present in the response (e.g., ["freq", "unit", "na_item", "geo", "time"]).
errorobjectPresent when the call failed. Absent on success.
missingObsCountnumberNumber of matched observations carrying no numeric value, counted across everything matched rather than only the returned rows. Covers both unavailable and withheld cells — a slice can be wholly conf…
noticestringGuidance when preview_limit omits matched rows or the match was staged — distinguishes the inline prefix from filters that reduce the match and, when staged, gives the describe-then-query sequence. O…
obsCountnumberTotal number of observations matched (before any cap).
observationsarrayThe first preview_limit decoded observations in deterministic JSON-stat cell order — the leading combinations of the dataset dimensions, neither a sample nor necessarily the most recent periods. This…
stagedRowCountnumberRows written to the canvas table. Matches obsCount. Omitted alongside tableName when nothing was staged.
tableNamestringCanvas table holding every matched observation in flat form — one code column per dimension plus a "_label" companion, then obs_value, obs_flag, obs_flag_label, conf_status, conf_status_label. Call e…
timeRangeobjectTime coverage of everything matched — the same set obsCount counts, so it can reach periods absent from observations when truncated is true. Each bound is omitted when neither the match nor Eurostat…
truncatedbooleanTrue only when the match exceeded the 5,000-observation staging threshold. Independent of preview_limit: observations can be a shorter prefix while truncated is false. When tableName is set, call eur…

No examples provided.

eurostat_search_datasets ~308

Search the Eurostat catalogue 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, then eurostat_query_dataset for a slice of a dataset or eurostat_download_dataset for the whole of one. Results are limited to datasets and predefined tables — folders are excluded.

NameTypeReqDescription
cursorstringOpaque pagination cursor from a previous call's nextCursor. Omit for the first page; pass it back — with the same query — to fetch the next page of matches over a stable order. A cursor is bound to t…
limitintegerPage size — maximum datasets returned per page (1–100). Default is 20. To retrieve matches beyond one page, pass the returned nextCursor back as cursor; the page size is fixed by this first call.
querystringyesSearch terms — at least one non-whitespace token is required. Split on whitespace into tokens; every token must match (AND), case-insensitively, somewhere across the dataset label, theme breadcrumb,…
NameTypeReqDescription
datasetsarrayMatching datasets for the current page, up to the requested limit.
errorobjectPresent when the call failed. Absent on success.
nextCursorstringOpaque cursor for the next page of matches. Pass it back as cursor with the same query; it stops working once the catalogue refreshes. Omitted on the last page.
nextStepstringSuggested next action based on these results. Populated when there is a clear follow-up call.
querystringSearch terms as submitted.
totalMatchesnumberTotal distinct dataset codes matching the query across all pages, before the page limit.
truncatedbooleanTrue when more matches remain beyond this page — pass nextCursor as cursor to fetch them.

No examples provided.

Common questions

What is the io.github.cyanheads/eurostat-mcp-server server?

io.github.cyanheads/eurostat-mcp-server is listed in the public MCP registry as io.github.cyanheads/eurostat-mcp-server. Search and query the Eurostat catalogue, EU economy, demography, trade, and NUTS regional data. This page covers its hosted endpoint (https://eurostat.caseyjhand.com/mcp).

Is the io.github.cyanheads/eurostat-mcp-server server safe to use?

io.github.cyanheads/eurostat-mcp-server scores 80 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.cyanheads/eurostat-mcp-server server expose?

io.github.cyanheads/eurostat-mcp-server exposes 8 tools: eurostat_search_datasets, eurostat_browse_themes, eurostat_get_dataset_info, eurostat_get_dimension_values, eurostat_query_dataset, and 3 more. Their descriptions and schemas cost roughly 2,776 tokens of context every time the server is loaded.

Does the io.github.cyanheads/eurostat-mcp-server server require authentication?

No. We connected to io.github.cyanheads/eurostat-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the io.github.cyanheads/eurostat-mcp-server server still maintained?

io.github.cyanheads/eurostat-mcp-server is still listed as active in the MCP registry. We last reached this channel on 22 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.