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.
Available components
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
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
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
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
claude mcp add --transport http cyanheads-eurostat-mcp-server 'https://eurostat.caseyjhand.com/mcp'
{
"mcpServers": {
"cyanheads-eurostat-mcp-server": {
"url": "https://eurostat.caseyjhand.com/mcp"
}
}
} {
"servers": {
"cyanheads-eurostat-mcp-server": {
"type": "http",
"url": "https://eurostat.caseyjhand.com/mcp"
}
}
} [mcp_servers.cyanheads-eurostat-mcp-server] url = "https://eurostat.caseyjhand.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cyanheads-eurostat-mcp-server": {
"type": "remote",
"url": "https://eurostat.caseyjhand.com/mcp",
"enabled": true
}
}
} openclaw mcp add cyanheads-eurostat-mcp-server --url 'https://eurostat.caseyjhand.com/mcp' --transport streamable-http
mcp_servers:
cyanheads-eurostat-mcp-server:
url: "https://eurostat.caseyjhand.com/mcp" {
"McpServers": {
"cyanheads-eurostat-mcp-server": {
"Transport": "http",
"Url": "https://eurostat.caseyjhand.com/mcp"
}
}
} assistant mcp add cyanheads-eurostat-mcp-server -t streamable-http -u 'https://eurostat.caseyjhand.com/mcp'
{
"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.
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
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 |
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 →
eurostat_browse_themes Browse Eurostat Theme Hierarchy ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| theme_code | string | – | Folder code to expand (e.g., "economy", "reg"). Omit to list the top-level theme folders. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| itemCount | number | – | Number of items returned in this level. |
| items | array | – | Immediate children of the requested theme, or the root themes if theme_code was omitted. |
| nextStep | string | – | Suggested next action based on these results. Populated when there is a clear follow-up call. |
| otherPlacements | array | – | Breadcrumbs 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… |
| parentPath | array | – | Breadcrumb from root to the requested theme (e.g., ["Database by themes", "Economy and finance"]). Empty when browsing root. |
| themeCode | string | – | Folder code that was browsed, or omitted for root. |
No examples provided.
eurostat_dataframe_describe Describe Eurostat Dataframes ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | yes | Canvas identifier returned as canvasId by eurostat_query_dataset or eurostat_download_dataset. Identifies the workspace holding the staged tables. |
| Name | Type | Req | Description |
|---|---|---|---|
| canvasId | string | – | Canvas identifier the tables were read from. |
| error | object | – | Present when the call failed. Absent on success. |
| expiresAt | string | – | ISO 8601 timestamp when the canvas expires. Every call on it slides this forward. |
| notice | string | – | Guidance when the canvas holds no tables. Omitted when it holds at least one. |
| tables | array | – | Tables staged on this canvas. Empty when nothing has been staged yet, or when every staged table has expired. |
No examples provided.
eurostat_dataframe_query Query Eurostat Dataframes ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | yes | Canvas identifier returned as canvasId by eurostat_query_dataset or eurostat_download_dataset. Identifies the workspace holding the staged tables. |
| sql | string | yes | A 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… |
| Name | Type | Req | Description |
|---|---|---|---|
| canvasId | string | – | Canvas identifier the query ran against. |
| columns | array | – | Column names in projection order. |
| error | object | – | Present when the call failed. Absent on success. |
| rowCount | number | – | Rows materialized into this response. Equals the full result size unless truncated is true. |
| rows | array | – | Result 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… |
| truncated | boolean | – | True 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 Download Eurostat 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.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | Reuse 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_code | string | yes | Dataset code (e.g., "nama_10_gdp"). Required. |
| filters | object | – | Dimension 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_limit | integer | – | How 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_period | string | – | Start 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_period | string | – | End of the period range (e.g., "2024"), sent as endPeriod. Omit for data through the latest available period. |
| Name | Type | Req | Description |
|---|---|---|---|
| appliedQuery | object | – | The bulk request as the server built it. |
| budgetExceeded | boolean | – | True 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. |
| bytesRead | number | – | Decoded TSV bytes read from Eurostat — after gzip decompression when the body arrived compressed, so it measures the payload rather than the wire. |
| canvasId | string | – | Dataframe canvas holding the staged download. Pass to eurostat_dataframe_describe, eurostat_dataframe_query, or a later staging call. Omitted when nothing was staged. |
| cap | number | – | The preview_limit applied to inline observations. |
| compressed | boolean | – | True 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. |
| datasetCode | string | – | Dataset code as provided. |
| dimensionsUsed | array | – | Dimension 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.… |
| error | object | – | Present when the call failed. Absent on success. |
| missingCount | number | – | Downloaded observations carrying no numeric value (obs_value is null). |
| notice | string | – | Guidance 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… |
| observations | array | – | The first preview_limit observations of the download, in the order Eurostat streamed them. A prefix of the staged table, not a sample. |
| periodRange | object | – | Period coverage of the rows actually downloaded. Narrower than the dataset when budgetExceeded is true or a period range was applied. |
| rowCount | number | – | Observations expanded from the download — one per populated cell, counting those Eurostat reports as unavailable. |
| shown | number | – | Observations returned in the inline preview. |
| stagedRowCount | number | – | Rows written to the canvas table. Matches rowCount. Omitted alongside tableName. |
| tableName | string | – | Canvas 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… |
| truncated | boolean | – | True when the inline observation preview omits rows. |
No examples provided.
eurostat_get_dataset_info Get Eurostat 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.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_code | string | yes | Dataset code (e.g., "nama_10_gdp"). Use eurostat_search_datasets or eurostat_browse_themes to find codes. |
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | – | Dataset code as provided. |
| dimensions | array | – | All dimensions of the dataset with their valid codes and labels. |
| error | object | – | Present when the call failed. Absent on success. |
| label | string | – | Human-readable dataset title. |
| lastUpdated | string | – | ISO 8601 timestamp of the most recent data update. Omitted when Eurostat does not report it. |
| metadataUrl | string | – | URL to the ESMS HTML metadata page for this dataset. Omitted when not provided by Eurostat. |
| obsCount | number | – | Total number of observations in the full dataset (all periods). Omitted when Eurostat does not report it — an omitted count is unknown, not zero. |
| timeRange | object | – | Overall 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 Get Eurostat 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.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_code | string | yes | Dataset code (e.g., "nama_10_gdp"). |
| dimension | string | yes | Dimension code to retrieve values for (e.g., "unit", "na_item", "geo"). Use eurostat_get_dataset_info to see available dimensions. |
| geo_level | string | – | NUTS 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" (… |
| Name | Type | Req | Description |
|---|---|---|---|
| dimensionCode | string | – | The dimension code that was queried. |
| dimensionLabel | string | – | Human-readable dimension name. |
| error | object | – | Present when the call failed. Absent on success. |
| geoLevel | string | – | Effective NUTS hierarchy level for the geo value set. Present only for the geo dimension; country is reported when geo_level was omitted. |
| totalCount | number | – | Total number of distinct values returned, after geoLevel filtering for geo. |
| values | array | – | All dataset-available values for this dimension. For geo, this is the subset at geoLevel. |
No examples provided.
eurostat_query_dataset Query Eurostat 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.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | Reuse 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_code | string | yes | Dataset code (e.g., "nama_10_gdp"). Required. |
| filters | object | – | Dimension 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_level | string | – | 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… |
| lang | string | – | Language for labels in the response. Default is "EN". Options: "EN", "FR", "DE". |
| last_n_periods | integer | – | Return only the N most recent periods. Mutually exclusive with since_period and until_period. |
| preview_limit | integer | – | How 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_period | string | – | Start of time range (e.g., "2020", "2023-Q1", "2024-01"). Mutually exclusive with last_n_periods. |
| until_period | string | – | End of time range (e.g., "2024"). Omit for data through the latest available period. Mutually exclusive with last_n_periods. |
| Name | Type | Req | Description |
|---|---|---|---|
| appliedFilters | object | – | Effective query parameters applied to the Eurostat API. |
| canvasId | string | – | Dataframe 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. |
| datasetCode | string | – | Dataset code as provided. |
| datasetLabel | string | – | Human-readable dataset title. |
| dimensionsUsed | array | – | Ordered list of dimension codes present in the response (e.g., ["freq", "unit", "na_item", "geo", "time"]). |
| error | object | – | Present when the call failed. Absent on success. |
| missingObsCount | number | – | Number 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… |
| notice | string | – | Guidance 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… |
| obsCount | number | – | Total number of observations matched (before any cap). |
| observations | array | – | The 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… |
| stagedRowCount | number | – | Rows written to the canvas table. Matches obsCount. Omitted alongside tableName when nothing was staged. |
| tableName | string | – | Canvas 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… |
| timeRange | object | – | Time 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… |
| truncated | boolean | – | True 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 Search Eurostat 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.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Opaque 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… |
| limit | integer | – | Page 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. |
| query | string | yes | Search 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,… |
| Name | Type | Req | Description |
|---|---|---|---|
| datasets | array | – | Matching datasets for the current page, up to the requested limit. |
| error | object | – | Present when the call failed. Absent on success. |
| nextCursor | string | – | Opaque 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. |
| nextStep | string | – | Suggested next action based on these results. Populated when there is a clear follow-up call. |
| query | string | – | Search terms as submitted. |
| totalMatches | number | – | Total distinct dataset codes matching the query across all pages, before the page limit. |
| truncated | boolean | – | True when more matches remain beyond this page — pass nextCursor as cursor to fetch them. |
No examples provided.
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.