Skip to main content
Glama

Server Details

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

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
cyanheads/eurostat-mcp-server
GitHub Stars
5
Server Listing
eurostat-mcp-server

Available Tools

8 tools
eurostat_browse_themesBrowse Eurostat Theme HierarchyA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
theme_codeNoFolder code to expand (e.g., "economy", "reg"). Omit to list the top-level theme folders.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
itemsNoImmediate children of the requested theme, or the root themes if theme_code was omitted.
nextStepNoSuggested next action based on these results. Populated when there is a clear follow-up call.
itemCountNoNumber of items returned in this level.
themeCodeNoFolder code that was browsed, or omitted for root.
parentPathNoBreadcrumb from root to the requested theme (e.g., ["Database by themes", "Economy and finance"]). Empty when browsing root.
otherPlacementsNoBreadcrumbs 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 has fewer children than the branches named here but can list different ones. theme_code takes a bare code, so those branches cannot be addressed directly — browse down to them from the root instead. Omitted when the code has a single placement — the normal case.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds useful behavioral context by detailing the no-argument top-level behavior and the with-argument child-listing behavior, including what kinds of children to expect (subtheme folders and datasets). It does not describe pagination or limits, but output schema exists and the core navigation behavior is clearly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: behavior first, then parameter semantics, then usage context. Every sentence earns its place, with no redundant restatement of the tool name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-parameter tool with a high-coverage schema and an output schema, the description is complete: it explains both invocation modes, the expected return content, and how the tool fits into the broader discovery workflow. An agent has everything it needs to select and call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds value beyond the schema by explaining the practical consequence of omitting theme_code versus providing it, and gives illustrative examples ('economy', 'reg'). This helps an agent understand the parameter's role in tree navigation without needing to infer it from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action ('Navigate the Eurostat theme tree') and distinguishes the two modes of operation: without a code it returns top-level theme folders, with a code it returns immediate children. It also explicitly positions itself against the sibling keyword search tool, which prevents confusion with eurostat_search_datasets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit use cases: '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.' It also names the complementary tool (eurostat_search_datasets) for keyword-based discovery, giving the agent clear routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eurostat_dataframe_describeDescribe Eurostat DataframesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
canvas_idYesCanvas identifier returned as canvasId by eurostat_query_dataset or eurostat_download_dataset. Identifies the workspace holding the staged tables.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when the canvas holds no tables. Omitted when it holds at least one.
tablesNoTables staged on this canvas. Empty when nothing has been staged yet, or when every staged table has expired.
canvasIdNoCanvas identifier the tables were read from.
expiresAtNoISO 8601 timestamp when the canvas expires. Every call on it slides this forward.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so safety is covered. The description adds valuable behavioral details: it explains the structural differences between stagers (code vs. label columns) and the consistent measure columns, which is beyond annotation scope. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is fairly long but well-structured: it opens with the tool's purpose, then usage, then detailed behavioral distinctions. Every sentence serves a purpose, though some could be condensed. It is not overly verbose given the complexity of Eurostat data structures.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the Eurostat domain, the description thoroughly covers the differences between stagers, the measure columns, and join compatibility. It provides all necessary context for an agent to understand what to expect, and the output schema existence means return values don't need additional explanation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description for canvas_id is already 100% covered, meeting the baseline of 3. The description adds context about where the canvas_id originates (from specific stager responses) and clarifies it identifies the workspace, enhancing the parameter's meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists staged tables on a Eurostat dataframe canvas with row counts and column names/types. It explicitly references the sibling tool eurostat_dataframe_query, distinguishing its role as a preparatory step, and differentiates from other siblings by its specific function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs to call this before eurostat_dataframe_query to learn table and column names, and clarifies that canvas_id comes from eurostat_query_dataset or eurostat_download_dataset responses. It also explains when not to assume column names, providing strong contextual guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eurostat_dataframe_queryQuery Eurostat DataframesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sqlYesA 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' GROUP BY geo, geo_label ORDER BY mean DESC.
canvas_idYesCanvas identifier returned as canvasId by eurostat_query_dataset or eurostat_download_dataset. Identifies the workspace holding the staged tables.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsNoResult 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 to DOUBLE in the SQL if a number is wanted.
errorNoPresent when the call failed. Absent on success.
columnsNoColumn names in projection order.
canvasIdNoCanvas identifier the query ran against.
rowCountNoRows materialized into this response. Equals the full result size unless truncated is true.
truncatedNoTrue 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.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, but the description adds substantial behavioral context beyond that: rejected SQL forms, flat column structure, measure/flag/confidentiality naming conventions, and differences between stagers regarding '_label' companions. This meaningfully informs invocation expectations without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but densely informative; every sentence adds necessary constraints or context for a complex tool. The first sentence is front-loaded with the core purpose, and subsequent sentences expand on restrictions and schema details without being redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description covers purpose, when to use it, prerequisites, query restrictions, column naming conventions, stager differences, and join compatibility. An output schema exists, so not explaining return values is acceptable. The description is effectively complete for an agent to select and use this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds value by providing a concrete SQL example, explaining that table names come from eurostat_dataframe_describe, and clarifying that canvas_id comes from the stager tools. This reinforces and extends the schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Run a read-only SQL SELECT against tables staged on a Eurostat dataframe canvas.' It clearly distinguishes itself from siblings by explaining it reaches past the 5,000-row cap of eurostat_query_dataset and past inline previews, and enables aggregation, grouping, and joins without re-fetching.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use guidance is provided: for data beyond inline caps, for aggregating/grouping/joining staged tables, and for avoiding re-fetching. It also tells the agent to call eurostat_dataframe_describe first for table and column names, and states the hard constraint that only a single SELECT statement is allowed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eurostat_download_datasetDownload Eurostat DatasetA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
filtersNoDimension 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 dimension or pass an empty array to accept every value for it. Do not put "time" here — use since_period/until_period. Naming a dimension the dataset does not have is rejected with the dataset's dimension list rather than silently ignored.
canvas_idNoReuse an existing dataframe canvas so this download lands beside earlier results and can be joined against them. Pass a canvasId from a previous response; omit to start a fresh canvas. Ignored on deployments without a dataframe canvas.
dataset_codeYesDataset code (e.g., "nama_10_gdp"). Required.
since_periodNoStart 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 their cells.
until_periodNoEnd of the period range (e.g., "2024"), sent as endPeriod. Omit for data through the latest available period.
preview_limitNoHow 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.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe preview_limit applied to inline observations.
errorNoPresent when the call failed. Absent on success.
shownNoObservations returned in the inline preview.
noticeNoGuidance 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 applicable.
canvasIdNoDataframe canvas holding the staged download. Pass to eurostat_dataframe_describe, eurostat_dataframe_query, or a later staging call. Omitted when nothing was staged.
rowCountNoObservations expanded from the download — one per populated cell, counting those Eurostat reports as unavailable.
bytesReadNoDecoded TSV bytes read from Eurostat — after gzip decompression when the body arrived compressed, so it measures the payload rather than the wire.
tableNameNoCanvas 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 runs without a dataframe canvas, in which case only the inline preview survives the call.
truncatedNoTrue when the inline observation preview omits rows.
compressedNoTrue 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.
datasetCodeNoDataset code as provided.
periodRangeNoPeriod coverage of the rows actually downloaded. Narrower than the dataset when budgetExceeded is true or a period range was applied.
appliedQueryNoThe bulk request as the server built it.
missingCountNoDownloaded observations carrying no numeric value (obs_value is null).
observationsNoThe first preview_limit observations of the download, in the order Eurostat streamed them. A prefix of the staged table, not a sample.
budgetExceededNoTrue 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.
dimensionsUsedNoDimension 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. The period lives in the separate "time" column.
stagedRowCountNoRows written to the canvas table. Matches rowCount. Omitted alongside tableName.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety (readOnlyHint, idempotentHint), and the description goes well beyond them with non-obvious traits: transfers are bounded by a streaming byte budget where the download stops and budgetExceeded is set, leaving a prefix rather than erroring; the TSV layout expands to one row per observation; only preview_limit rows come back inline. No contradiction with the annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded with purpose and flows logically: purpose → byte-efficiency rationale → filter workflow → period guidance → budget behavior → preview/retention workflow. Two clauses partially repeat the already-detailed schema ('applied server-side by Eurostat' and the per-period TSV column layout), which is minor redundancy, but every sentence otherwise contributes distinct operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 6 parameters, a nested object, 7 siblings, and an output schema, the description covers everything an agent needs: selection criteria vs the slice sibling, prerequisite tool calls, server-side filtering semantics, response-shrinking strategy, partial-download failure mode, preview vs staged-table distinction, and the post-download query workflow. The output schema exists, so explaining return values is unnecessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema itself is unusually rich (filter examples, period-column removal, preview as orientation), so the baseline is 3. The description adds genuine cross-tool meaning on top: filters use the same dimension-code map as eurostat_query_dataset, and the directive to narrow by period range rather than by an N-period request is operational guidance not present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (download in bulk), a precise resource (Eurostat dataset via the SDMX 2.1 TSV endpoint), and a distinctive outcome (staged as a SQL table on the dataframe canvas). It explicitly differentiates itself from the sibling eurostat_query_dataset ('the route to a whole dataset' vs 'the route to a slice of one'), so an agent can select between them from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use and orchestration guidance: call eurostat_get_dataset_info first for dimension codes and eurostat_get_dimension_values for values; use since_period/until_period 'rather than asking for the most recent N periods'; follow up with eurostat_dataframe_describe then eurostat_dataframe_query once a table is staged. It also names the slice alternative (eurostat_query_dataset) and warns that without a canvas rows past the preview are not retained.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eurostat_get_dataset_infoGet Eurostat Dataset InfoA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataset_codeYesDataset code (e.g., "nama_10_gdp"). Use eurostat_search_datasets or eurostat_browse_themes to find codes.

Output Schema

ParametersJSON Schema
NameRequiredDescription
codeNoDataset code as provided.
errorNoPresent when the call failed. Absent on success.
labelNoHuman-readable dataset title.
obsCountNoTotal number of observations in the full dataset (all periods). Omitted when Eurostat does not report it — an omitted count is unknown, not zero.
timeRangeNoOverall data coverage period for this dataset. Each bound is omitted when Eurostat does not report it — an omitted bound is unknown, not empty.
dimensionsNoAll dimensions of the dataset with their valid codes and labels.
lastUpdatedNoISO 8601 timestamp of the most recent data update. Omitted when Eurostat does not report it.
metadataUrlNoURL to the ESMS HTML metadata page for this dataset. Omitted when not provided by Eurostat.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds useful behavioral context: it returns up to 10 sample values per dimension, names the metadata fields (time range, observation count, last-update), and explains the downstream consequence of using invalid dimensions. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler. It front-loads the core purpose and return contents, then provides usage context and an alternative. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has only one required parameter, a rich output schema, and annotations covering read-only and idempotent behavior. The description fills in the remaining context an agent needs: why to call it, what it returns, and when to use a sibling instead. Nothing important is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage for dataset_code, including an example and guidance to find codes via eurostat_search_datasets or eurostat_browse_themes. The description adds context about dimension codes (unit, na_item, geo) but does not add substantive parameter syntax beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Fetch metadata') and resource ('a Eurostat dataset'), and enumerates the return contents: dimensions with valid values, time range, observation count, and last-update date. It also distinguishes itself from siblings like eurostat_get_dimension_values and eurostat_query_dataset, so an agent can tell what this tool is for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to call this tool before eurostat_query_dataset or eurostat_download_dataset, and explains why: eurostat_download_dataset builds its positional filter key from this dimension list, and filters naming absent dimensions are rejected. It also names eurostat_get_dimension_values as the alternative when the full set of dimension values is needed. This is clear when-to-use guidance with alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eurostat_get_dimension_valuesGet Eurostat Dimension ValuesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dimensionYesDimension code to retrieve values for (e.g., "unit", "na_item", "geo"). Use eurostat_get_dataset_info to see available dimensions.
geo_levelNoNUTS 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" (3-char), "nuts2" (4-char), "nuts3" (5-char).
dataset_codeYesDataset code (e.g., "nama_10_gdp").

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
valuesNoAll dataset-available values for this dimension. For geo, this is the subset at geoLevel.
geoLevelNoEffective NUTS hierarchy level for the geo value set. Present only for the geo dimension; country is reported when geo_level was omitted.
totalCountNoTotal number of distinct values returned, after geoLevel filtering for geo.
dimensionCodeNoThe dimension code that was queried.
dimensionLabelNoHuman-readable dimension name.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/openWorld/idempotent annotations, the description reveals important behaviors: geo_level filtering only works for the 'geo' dimension, and invalid dimension_value codes behave differently across sibling tools (silent empty results vs. faults). This extra context helps the agent anticipate failure modes and choose the tool correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then layers usage guidance, special geo dimension behavior, and failure-mode warnings without redundancy. Each sentence adds distinct value, and the length is appropriate for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich input schema, annotations, and output schema, the description covers all essential aspects: what the tool returns, when to use it over siblings, how geo_level works, and why validation matters. There are no obvious gaps that would prevent an agent from selecting or invoking this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds useful semantic context by giving real-world examples like 'nama_10_gdp', clarifying NUTS hierarchy levels for geo_level, and explaining why verifying codes matters. It enriches the parameters beyond the schema's short descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a clear verb-object statement: 'List all valid values for a specific dimension in a Eurostat dataset' and gives concrete examples ('all unit codes for nama_10_gdp'). It clearly distinguishes this from sibling tools by focusing on dimension-value enumeration rather than data querying, browsing themes, or downloading.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool: when eurostat_get_dataset_info returns more values than the 10-item sample, or to confirm exact codes before querying. It also warns about the consequences of invalid codes in eurostat_query_dataset and eurostat_download_dataset, which makes the usage context concrete and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eurostat_query_datasetQuery Eurostat DatasetA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoLanguage for labels in the response. Default is "EN". Options: "EN", "FR", "DE".EN
filtersNoDimension 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 dimension and is dropped from the request. Do not include "geo" here if using geo_level. Invalid dimension values silently return no data — verify with eurostat_get_dimension_values first.
canvas_idNoReuse an existing dataframe canvas, so a result staged by this call lands beside earlier ones and can be joined against them. Pass a canvasId from a previous response; omit to start a fresh canvas. Ignored on deployments without a dataframe canvas and when the match is at or below 5,000 observations.
geo_levelNoFilter 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).
dataset_codeYesDataset code (e.g., "nama_10_gdp"). Required.
since_periodNoStart of time range (e.g., "2020", "2023-Q1", "2024-01"). Mutually exclusive with last_n_periods.
until_periodNoEnd of time range (e.g., "2024"). Omit for data through the latest available period. Mutually exclusive with last_n_periods.
preview_limitNoHow 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, missingObsCount, timeRange, the upstream response, or the rows staged when the match exceeds 5,000. Use filters or period controls to reduce the match itself.
last_n_periodsNoReturn only the N most recent periods. Mutually exclusive with since_period and until_period.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance 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. Omitted when the preview contains the whole match.
canvasIdNoDataframe 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.
obsCountNoTotal number of observations matched (before any cap).
tableNameNoCanvas 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 eurostat_dataframe_describe with canvasId first to confirm the table and columns, then eurostat_dataframe_query. Omitted when nothing was staged: either the match was at or below 5,000 observations, or this deployment runs without a dataframe canvas.
timeRangeNoTime 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 report it — an omitted bound is unknown, not empty.
truncatedNoTrue 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 eurostat_dataframe_describe first and then eurostat_dataframe_query; when it is absent, use filters or period controls to reduce the match.
datasetCodeNoDataset code as provided.
datasetLabelNoHuman-readable dataset title.
observationsNoThe 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 prefix is independent of the 5,000-observation staging threshold. When tableName is set, the table holds every matched row; otherwise use filters or a period range to reduce the match itself.
appliedFiltersNoEffective query parameters applied to the Eurostat API.
dimensionsUsedNoOrdered list of dimension codes present in the response (e.g., ["freq", "unit", "na_item", "geo", "time"]).
stagedRowCountNoRows written to the canvas table. Matches obsCount. Omitted alongside tableName when nothing was staged.
missingObsCountNoNumber 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 confidential, so this equalling obsCount does not mean the data is absent.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the bar is lower, yet the description adds substantial behavior: deterministic inline prefix with OBS_FLAG and CONF_STATUS semantics, preview_limit affecting only the prefix, the 5,000 staging threshold, and the potential async response error for large unfiltered queries. All disclosed behavior is consistent with the read-only and idempotent annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Though long, the description is front-loaded with purpose and return format, and every sentence carries distinct information: return structure, preview semantics, prerequisites, filter guidance, error risk, staging threshold, and sibling routing. There is no repetition or filler relative to the complexity of the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers prerequisites, parameter semantics, error conditions, staging behavior, and alternative routing. The output schema exists, so return values need not be spelled out further, and nothing needed to invoke the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, and the description adds meaning by clarifying that preview_limit only controls the inline prefix while filters and period controls reduce the matched result, that geo_level is mutually exclusive with a 'geo' filter key, and that last_n_periods handles unknown end dates. This goes beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Fetch statistical data from a Eurostat dataset with dimension filters') and immediately distinguishes it from eurostat_download_dataset, which reads the SDMX bulk endpoint for whole datasets. This allows an agent to tell it apart from siblings without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: call eurostat_get_dataset_info first for valid dimensions, use filters.geo vs geo_level, use last_n_periods when the end date is unknown, and route to eurostat_download_dataset for whole datasets. It also names the exact alternatives (eurostat_dataframe_describe, eurostat_dataframe_query) for matches above 5,000 observations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eurostat_search_datasetsSearch Eurostat DatasetsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage 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.
queryYesSearch 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, or code. Word order does not matter, so "business demography NUTS 3" or "regional economic accounts" resolve without naming a label verbatim.
cursorNoOpaque 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 the query that produced it and to the catalogue snapshot in effect at that time, so reusing one with a different query, or after the catalogue refreshes, is rejected rather than silently paging a different result set.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
queryNoSearch terms as submitted.
datasetsNoMatching datasets for the current page, up to the requested limit.
nextStepNoSuggested next action based on these results. Populated when there is a clear follow-up call.
truncatedNoTrue when more matches remain beyond this page — pass nextCursor as cursor to fetch them.
nextCursorNoOpaque 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.
totalMatchesNoTotal distinct dataset codes matching the query across all pages, before the page limit.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so no safety contradiction exists. The description adds valuable behavioral context by specifying the result scope: only datasets/predefined tables matched by keyword, with codes, descriptions, period coverage, and theme breadcrumbs returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three focused sentences: what the tool does, how to use it in the wider workflow, and its boundary of results. Every sentence contributes and no content is redundant with the annotations or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a search/discovery tool with an output schema, strong parameter schema, and safe/read-only annotations, this description covers purpose, return contents, workflow ordering, and scope limitations. An agent knows exactly when to invoke it, how it relates to siblings, and what to do after it returns dataset codes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already clearly documents query, limit, and cursor semantics, including cursor staleness and pagination binding rules. The description itself adds little new parameter-level meaning, but no extra help is needed because the schema is already strong.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Search the Eurostat catalogue by keyword' and lists what it returns. It also distinguishes itself from sibling tools by explaining this is the discovery step before eurostat_get_dataset_info, eurostat_query_dataset, and eurostat_download_dataset, and by explicitly excluding folders.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit workflow: search to discover dataset codes, then call get_dataset_info, and then either query a slice or download the whole dataset. It also reminds the agent that results are limited to datasets/predefined tables and folders are excluded, which prevents using this tool for non-dataset browsing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 5 tool updates
    • Changedeurostat_browse_themes2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: The provided theme_code does not exist as a folder in the TOC. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: The provided theme_code does not exist in the TOC. `not_a_folder`: The provided theme_code identifies a dataset or table entry instead of a folder. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "not_found"
        -]New value: +[
        +  "not_found",
        +  "not_a_folder"
        +]
    • Changedeurostat_download_dataset2 fields changed
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when the download was cut short by the byte budget, when nothing could be staged, or when it returned no observations. Omitted otherwise."New value: +"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 applicable."
      • changedOutput schema / properties / tableName / description
        Previous value: -"Canvas table holding every downloaded observation. Omitted when this deployment runs without a dataframe canvas, in which case only the inline preview survives the call."New value: +"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 runs without a dataframe canvas, in which case only the inline preview survives the call."
    • Changedeurostat_get_dataset_info2 fields changed
      • changedOutput schema / properties / dimensions / items / properties / sampleValues / description
        Previous value: -"First 10 dimension values for orientation. Use eurostat_get_dimension_values for the full list. Omitted alongside valuesCount when the value set could not be measured."New value: +"First 10 dataset-available values for orientation. Use eurostat_get_dimension_values for the full constrained list. Omitted alongside valuesCount when Eurostat does not supply a measurable value set."
      • changedOutput schema / properties / dimensions / items / properties / valuesCount / description
        Previous value: -"Number of distinct values in this dimension. For \"time\" this is the dataset's full period count; every other dimension is counted from the most recent period. Omitted when the value set could not be measured — only \"time\" can be, and an omitted count is unknown, not one. Call eurostat_get_dimension_values for that dimension to obtain it."New value: +"Number of dataset-available values in this dimension, taken from the dataset content constraint. For \"time\" this is the full period count. Omitted only when Eurostat does not supply a measurable value set."
    • Changedeurostat_get_dimension_values5 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: The dataset code or dimension code does not exist. `async_response`: Eurostat returned an async warning — the dimension query matched too many observations. `conflicting_params`: geo_level was combined with a dimension other than \"geo\", where it has no effect. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: The dataset code or dimension code does not exist. `async_response`: Eurostat returned an asynchronous-response condition. `no_results`: The dataset has no geo values at the effective geo_level. `conflicting_params`: geo_level was combined with a dimension other than \"geo\", where it has no effect. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "not_found",
        -  "async_response",
        -  "conflicting_params"
        -]New value: +[
        +  "not_found",
        +  "async_response",
        +  "no_results",
        +  "conflicting_params"
        +]
      • addedOutput schema / properties / geoLevel
        Added value: +{
        +  "description": "Effective NUTS hierarchy level for the geo value set. Present only for the geo dimension; country is reported when geo_level was omitted.",
        +  "enum": [
        +    "aggregate",
        +    "country",
        +    "nuts1",
        +    "nuts2",
        +    "nuts3"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total number of distinct values returned."New value: +"Total number of distinct values returned, after geoLevel filtering for geo."
      • changedOutput schema / properties / values / description
        Previous value: -"All valid values for this dimension in the dataset."New value: +"All dataset-available values for this dimension. For geo, this is the subset at geoLevel."
    • Changedeurostat_query_dataset7 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"Reuse an existing dataframe canvas, so a result staged by this call lands beside earlier ones and can be joined against them. Pass a canvasId from a previous response; omit to start a fresh canvas. Ignored on deployments without a dataframe canvas, and when the result fits inline and nothing is staged."New value: +"Reuse an existing dataframe canvas, so a result staged by this call lands beside earlier ones and can be joined against them. Pass a canvasId from a previous response; omit to start a fresh canvas. Ignored on deployments without a dataframe canvas and when the match is at or below 5,000 observations."
      • addedInput schema / properties / preview_limit
        Added value: +{
        +  "default": 50,
        +  "description": "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, missingObsCount, timeRange, the upstream response, or the rows staged when the match exceeds 5,000. Use filters or period controls to reduce the match itself.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: The dataset code does not exist (HTTP 404, Eurostat error id 100). `no_results`: The query matched no observation cells — valid dataset, but no cell carries a value or a status flag for that filter combination and period range. `async_response`: Eurostat returned an async warning — the query matched too many observations. `invalid_dimension`: A dimension code in filters does not exist in this dataset (HTTP 400, Eurostat error id 150). `conflicting_params`: Mutually exclusive parameters were combined: \"geo\" filter + geo_level, or since_period/until_period + last_n_periods. `canvas_not_found`: A canvas_id was supplied for staging but is unknown or its lifetime has elapsed. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: The dataset code does not exist (HTTP 404 carrying Eurostat error id 100). `no_results`: The query matched no observation cells — including Eurostat HTTP-200 error id 100. The dataset is valid, but no cell carries a value or a status flag for that filter combination and period range. `async_response`: Eurostat returned an async warning or HTTP-413 error array — the query matched too many observations. `invalid_dimension`: A dimension code in filters does not exist in this dataset (HTTP 400, Eurostat error id 150). `conflicting_params`: Mutually exclusive parameters were combined: \"geo\" filter + geo_level, or since_period/until_period + last_n_periods. `canvas_not_found`: A canvas_id was supplied for staging but is unknown or its lifetime has elapsed. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when the result was capped at 5,000 rows — where the rest of the match is, or how to narrow the query. Omitted for uncapped results."New value: +"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. Omitted when the preview contains the whole match."
      • changedOutput schema / properties / observations / description
        Previous value: -"Decoded observations, capped at 5,000 rows. Past the cap these are the first 5,000 the response enumerates — the leading combinations of the dataset dimensions, neither a sample nor the most recent periods. When tableName is set, these same rows and every row past the cap are staged on the dataframe canvas; when it is absent, narrow the query with dimension filters or a period range to choose which observations you get, or switch to eurostat_download_dataset when the whole dataset is what is wanted."New value: +"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 prefix is independent of the 5,000-observation staging threshold. When tableName is set, the table holds every matched row; otherwise use filters or a period range to reduce the match itself."
      • changedOutput schema / properties / tableName / description
        Previous value: -"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. The five measure columns match the ones eurostat_download_dataset stages, so the two tables join on dimension codes and time and compare like with like. Omitted when nothing was staged: either the result fit under the cap, or this deployment runs without a dataframe canvas."New value: +"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 eurostat_dataframe_describe with canvasId first to confirm the table and columns, then eurostat_dataframe_query. Omitted when nothing was staged: either the match was at or below 5,000 observations, or this deployment runs without a dataframe canvas."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the result exceeded 5,000 observations, so the returned rows are a prefix of the match rather than all of it. When tableName is set, the whole match is on the canvas and reachable with eurostat_dataframe_query; when it is absent, narrowing the query with dimension filters, or downloading the dataset with eurostat_download_dataset, is what brings the rest into reach."New value: +"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 eurostat_dataframe_describe first and then eurostat_dataframe_query; when it is absent, use filters or period controls to reduce the match."
  2. 8 tool updates
    • Changedeurostat_browse_themes6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "items",
        +      "parentPath",
        +      "itemCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: The provided theme_code does not exist as a folder in the TOC. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "items",
        -  "parentPath",
        -  "itemCount"
        -]
    • Changedeurostat_dataframe_describe6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "canvasId",
        +      "expiresAt",
        +      "tables"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_disabled`: This deployment runs without a dataframe canvas, so there is nothing to describe. `canvas_not_found`: The canvas_id is unknown or its lifetime has elapsed. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_disabled",
        +            "canvas_not_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "canvasId",
        -  "expiresAt",
        -  "tables"
        -]
    • Changedeurostat_dataframe_query6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "canvasId",
        +      "columns",
        +      "rows",
        +      "rowCount",
        +      "truncated"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_disabled`: This deployment runs without a dataframe canvas, so there is nothing to query. `canvas_not_found`: The canvas_id is unknown or its lifetime has elapsed. `missing_table`: The SQL names a table that is not staged on this canvas, or that has expired. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_disabled",
        +            "canvas_not_found",
        +            "missing_table"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "canvasId",
        -  "columns",
        -  "rows",
        -  "rowCount",
        -  "truncated"
        -]
    • Changedeurostat_download_dataset9 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "datasetCode",
        +      "dimensionsUsed",
        +      "rowCount",
        +      "missingCount",
        +      "periodRange",
        +      "bytesRead",
        +      "compressed",
        +      "budgetExceeded",
        +      "observations",
        +      "appliedQuery"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The preview_limit applied to inline observations.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: The dataset code is not available for dissemination (HTTP 404, SDMX faultcode 100). `invalid_dimension`: A filter names a dimension the dataset does not have, or a value or period range Eurostat rejects (SDMX faultcode 150). `filter_arity`: Eurostat rejected the positional dimension key because it carried the wrong number of positions (SDMX faultcode 140), meaning the dataset structure has changed since the metadata call. `async_queued`: Eurostat answered HTTP 200 with a SOAP syncResponse queue ticket (status SUBMITTED) instead of data, because the extraction was too costly to serve synchronously. `no_results`: The download completed but carried no populated observation cells. `upstream_fault`: The SDMX endpoint returned a fault this server does not model, or a body that is not a TSV table. `canvas_not_found`: A canvas_id was supplied for staging but is unknown or its lifetime has elapsed. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "invalid_dimension",
        +            "filter_arity",
        +            "async_queued",
        +            "no_results",
        +            "upstream_fault",
        +            "canvas_not_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Observations returned in the inline preview.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the inline observation preview omits rows.",
        +  "type": "boolean"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "datasetCode",
        -  "dimensionsUsed",
        -  "rowCount",
        -  "missingCount",
        -  "periodRange",
        -  "bytesRead",
        -  "compressed",
        -  "budgetExceeded",
        -  "observations",
        -  "appliedQuery"
        -]
    • Changedeurostat_get_dataset_info6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "code",
        +      "label",
        +      "dimensions",
        +      "timeRange"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: The dataset code does not exist or is not available for dissemination. `async_response`: Eurostat returned an async response (query too large for the API). Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "async_response"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "code",
        -  "label",
        -  "dimensions",
        -  "timeRange"
        -]
    • Changedeurostat_get_dimension_values6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "dimensionCode",
        +      "dimensionLabel",
        +      "values",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: The dataset code or dimension code does not exist. `async_response`: Eurostat returned an async warning — the dimension query matched too many observations. `conflicting_params`: geo_level was combined with a dimension other than \"geo\", where it has no effect. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "async_response",
        +            "conflicting_params"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "dimensionCode",
        -  "dimensionLabel",
        -  "values",
        -  "totalCount"
        -]
    • Changedeurostat_query_dataset6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "datasetCode",
        +      "datasetLabel",
        +      "dimensionsUsed",
        +      "observations",
        +      "obsCount",
        +      "truncated",
        +      "timeRange",
        +      "missingObsCount",
        +      "appliedFilters"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: The dataset code does not exist (HTTP 404, Eurostat error id 100). `no_results`: The query matched no observation cells — valid dataset, but no cell carries a value or a status flag for that filter combination and period range. `async_response`: Eurostat returned an async warning — the query matched too many observations. `invalid_dimension`: A dimension code in filters does not exist in this dataset (HTTP 400, Eurostat error id 150). `conflicting_params`: Mutually exclusive parameters were combined: \"geo\" filter + geo_level, or since_period/until_period + last_n_periods. `canvas_not_found`: A canvas_id was supplied for staging but is unknown or its lifetime has elapsed. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "no_results",
        +            "async_response",
        +            "invalid_dimension",
        +            "conflicting_params",
        +            "canvas_not_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "datasetCode",
        -  "datasetLabel",
        -  "dimensionsUsed",
        -  "observations",
        -  "obsCount",
        -  "truncated",
        -  "timeRange",
        -  "missingObsCount",
        -  "appliedFilters"
        -]
    • Changedeurostat_search_datasets6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "datasets",
        +      "query",
        +      "totalMatches",
        +      "truncated"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `no_match`: No datasets matched the query string. `invalid_cursor`: The cursor is malformed, came from a different query, or came from a catalogue snapshot that has since refreshed. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "no_match",
        +            "invalid_cursor"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "datasets",
        -  "query",
        -  "totalMatches",
        -  "truncated"
        -]
  3. 1 tool update
    • Changedeurostat_query_dataset7 fields changed
      • changedOutput schema / properties / missingObsCount / description
        Previous value: -"Number of matched observations with null value (missing data points in the source), counted across everything matched rather than only the returned rows."New value: +"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 confidential, so this equalling obsCount does not mean the data is absent."
      • changedOutput schema / properties / observations / items / description
        Previous value: -"A single decoded observation with dimension values, numeric value, and optional status."New value: +"A single decoded observation with dimension values, numeric value, and the optional OBS_FLAG and CONF_STATUS markers."
      • addedOutput schema / properties / observations / items / properties / confStatus
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Eurostat CONF_STATUS for this observation — a different codelist from status. Present when Eurostat restricts the cell, which is usually why value is null. Omitted otherwise.",
        +  "properties": {
        +    "code": {
        +      "description": "CONF_STATUS code: \"C\", \"N\", or \"P\".",
        +      "type": "string"
        +    },
        +    "label": {
        +      "description": "Confidentiality description (e.g., \"confidential\", \"not for publication\").",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "label"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / observations / items / properties / status / description
        Previous value: -"Status flag for this observation. Omitted for normal observations."New value: +"Eurostat OBS_FLAG for this observation. Omitted for unflagged observations, and never carries a confidentiality code — that arrives in confStatus."
      • changedOutput schema / properties / observations / items / properties / status / properties / code / description
        Previous value: -"Status flag code (e.g., \"p\", \"e\", \"d\")."New value: +"OBS_FLAG code (e.g., \"p\", \"e\", \"d\")."
      • changedOutput schema / properties / observations / items / properties / value / description
        Previous value: -"Numeric observation value, or null when missing (flagged as unavailable in the source data)."New value: +"Numeric observation value, or null when Eurostat reports none — either unavailable in the source data or withheld, in which case confStatus says so."
      • changedOutput schema / properties / tableName / description
        Previous value: -"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. Omitted when nothing was staged: either the result fit under the cap, or this deployment runs without a dataframe canvas."New value: +"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. The five measure columns match the ones eurostat_download_dataset stages, so the two tables join on dimension codes and time and compare like with like. Omitted when nothing was staged: either the result fit under the cap, or this deployment runs without a dataframe canvas."
  4. 7 tool updates
    • Changedeurostat_dataframe_describe1 field changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"Canvas identifier returned by eurostat_query_dataset as canvasId. Identifies the workspace holding the staged tables."New value: +"Canvas identifier returned as canvasId by eurostat_query_dataset or eurostat_download_dataset. Identifies the workspace holding the staged tables."
    • Changedeurostat_dataframe_query1 field changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"Canvas identifier returned by eurostat_query_dataset as canvasId. Identifies the workspace holding the staged tables."New value: +"Canvas identifier returned as canvasId by eurostat_query_dataset or eurostat_download_dataset. Identifies the workspace holding the staged tables."
    • Addedeurostat_download_dataset
    • Changedeurostat_get_dataset_info1 field changed
      • changedOutput schema / properties / dimensions / items / properties / code / description
        Previous value: -"Dimension code (e.g., \"unit\", \"geo\", \"na_item\"). Use these as filter keys in eurostat_query_dataset."New value: +"Dimension code (e.g., \"unit\", \"geo\", \"na_item\"). Use these as filter keys in eurostat_query_dataset and eurostat_download_dataset."
    • Changedeurostat_get_dimension_values1 field changed
      • changedOutput schema / properties / values / items / properties / code / description
        Previous value: -"Dimension value code. Use these as filter values in eurostat_query_dataset."New value: +"Dimension value code. Use these as filter values in eurostat_query_dataset and eurostat_download_dataset."
    • Changedeurostat_query_dataset2 fields changed
      • changedOutput schema / properties / observations / description
        Previous value: -"Decoded observations, capped at 5,000 rows. Past the cap these are the first 5,000 the response enumerates — the leading combinations of the dataset dimensions, neither a sample nor the most recent periods. When tableName is set, these same rows and every row past the cap are staged on the dataframe canvas; when it is absent, narrow the query with dimension filters or a period range to choose which observations you get."New value: +"Decoded observations, capped at 5,000 rows. Past the cap these are the first 5,000 the response enumerates — the leading combinations of the dataset dimensions, neither a sample nor the most recent periods. When tableName is set, these same rows and every row past the cap are staged on the dataframe canvas; when it is absent, narrow the query with dimension filters or a period range to choose which observations you get, or switch to eurostat_download_dataset when the whole dataset is what is wanted."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the result exceeded 5,000 observations, so the returned rows are a prefix of the match rather than all of it. When tableName is set, the whole match is on the canvas and reachable with eurostat_dataframe_query; when it is absent, narrowing the query with dimension filters is what brings the rest into reach."New value: +"True when the result exceeded 5,000 observations, so the returned rows are a prefix of the match rather than all of it. When tableName is set, the whole match is on the canvas and reachable with eurostat_dataframe_query; when it is absent, narrowing the query with dimension filters, or downloading the dataset with eurostat_download_dataset, is what brings the rest into reach."
    • Changedeurostat_search_datasets1 field changed
      • changedOutput schema / properties / datasets / items / properties / code / description
        Previous value: -"Dataset code (e.g., \"nama_10_gdp\"). Use this in eurostat_get_dataset_info and eurostat_query_dataset."New value: +"Dataset code (e.g., \"nama_10_gdp\"). Use this in eurostat_get_dataset_info, eurostat_query_dataset, and eurostat_download_dataset."
  5. 3 tool updates
    • Addedeurostat_dataframe_describe
    • Addedeurostat_dataframe_query
    • Changedeurostat_query_dataset7 fields changed
      • addedInput schema / properties / canvas_id
        Added value: +{
        +  "description": "Reuse an existing dataframe canvas, so a result staged by this call lands beside earlier ones and can be joined against them. Pass a canvasId from a previous response; omit to start a fresh canvas. Ignored on deployments without a dataframe canvas, and when the result fits inline and nothing is staged.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / canvasId
        Added value: +{
        +  "description": "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.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when the result was truncated at 5,000 rows. Omitted for normal results."New value: +"Guidance when the result was capped at 5,000 rows — where the rest of the match is, or how to narrow the query. Omitted for uncapped results."
      • changedOutput schema / properties / observations / description
        Previous value: -"Decoded observations, capped at 5,000 rows. Past the cap these are the first 5,000 the response enumerates — the leading combinations of the dataset dimensions, neither a sample nor the most recent periods — so narrow the query with dimension filters or a period range to choose which observations you get."New value: +"Decoded observations, capped at 5,000 rows. Past the cap these are the first 5,000 the response enumerates — the leading combinations of the dataset dimensions, neither a sample nor the most recent periods. When tableName is set, these same rows and every row past the cap are staged on the dataframe canvas; when it is absent, narrow the query with dimension filters or a period range to choose which observations you get."
      • addedOutput schema / properties / stagedRowCount
        Added value: +{
        +  "description": "Rows written to the canvas table. Matches obsCount. Omitted alongside tableName when nothing was staged.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / tableName
        Added value: +{
        +  "description": "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. Omitted when nothing was staged: either the result fit under the cap, or this deployment runs without a dataframe canvas.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the result exceeded 5,000 observations and was capped. Apply dimension filters to get the full result."New value: +"True when the result exceeded 5,000 observations, so the returned rows are a prefix of the match rather than all of it. When tableName is set, the whole match is on the canvas and reachable with eurostat_dataframe_query; when it is absent, narrowing the query with dimension filters is what brings the rest into reach."
  6. 3 tool updates
    • Changedeurostat_browse_themes1 field changed
      • addedOutput schema / properties / otherPlacements
        Added value: +{
        +  "description": "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 has fewer children than the branches named here but can list different ones. theme_code takes a bare code, so those branches cannot be addressed directly — browse down to them from the root instead. Omitted when the code has a single placement — the normal case.",
        +  "items": {
        +    "description": "Breadcrumb from root to one other folder carrying the requested code.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "type": "array"
        +}
    • Changedeurostat_get_dataset_info3 fields changed
      • changedOutput schema / properties / dimensions / items / properties / sampleValues / description
        Previous value: -"First 10 dimension values for orientation. Use eurostat_get_dimension_values for the full list."New value: +"First 10 dimension values for orientation. Use eurostat_get_dimension_values for the full list. Omitted alongside valuesCount when the value set could not be measured."
      • changedOutput schema / properties / dimensions / items / properties / valuesCount / description
        Previous value: -"Number of distinct values in this dimension. For \"time\" this is the dataset's full period count; every other dimension is counted from the most recent period."New value: +"Number of distinct values in this dimension. For \"time\" this is the dataset's full period count; every other dimension is counted from the most recent period. Omitted when the value set could not be measured — only \"time\" can be, and an omitted count is unknown, not one. Call eurostat_get_dimension_values for that dimension to obtain it."
      • changedOutput schema / properties / dimensions / items / required
        Previous value: -[
        -  "code",
        -  "label",
        -  "valuesCount",
        -  "sampleValues"
        -]New value: +[
        +  "code",
        +  "label"
        +]
    • Changedeurostat_query_dataset5 fields changed
      • changedOutput schema / properties / missingObsCount / description
        Previous value: -"Number of observations with null value (missing data points in the source)."New value: +"Number of matched observations with null value (missing data points in the source), counted across everything matched rather than only the returned rows."
      • changedOutput schema / properties / observations / description
        Previous value: -"Decoded observations, capped at 5,000 rows. When truncated is true, apply dimension filters to narrow the result."New value: +"Decoded observations, capped at 5,000 rows. Past the cap these are the first 5,000 the response enumerates — the leading combinations of the dataset dimensions, neither a sample nor the most recent periods — so narrow the query with dimension filters or a period range to choose which observations you get."
      • changedOutput schema / properties / timeRange / description
        Previous value: -"Time coverage of the returned observations. Each bound is omitted when neither the observations nor Eurostat report it — an omitted bound is unknown, not empty."New value: +"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 report it — an omitted bound is unknown, not empty."
      • changedOutput schema / properties / timeRange / properties / end / description
        Previous value: -"Most recent period in this result. Omitted when the observations carry no time dimension and Eurostat reports no overall period."New value: +"Most recent period matched. Omitted when the match carries no time dimension and Eurostat reports no overall period."
      • changedOutput schema / properties / timeRange / properties / start / description
        Previous value: -"Earliest period in this result. Omitted when the observations carry no time dimension and Eurostat reports no overall period."New value: +"Earliest period matched. Omitted when the match carries no time dimension and Eurostat reports no overall period."
  7. 3 tool updates
    • Changedeurostat_get_dataset_info8 fields changed
      • changedOutput schema / properties / dimensions / items / properties / valuesCount / description
        Previous value: -"Number of distinct values in this dimension for the most recent period."New value: +"Number of distinct values in this dimension. For \"time\" this is the dataset's full period count; every other dimension is counted from the most recent period."
      • changedOutput schema / properties / lastUpdated / description
        Previous value: -"ISO 8601 timestamp of the most recent data update."New value: +"ISO 8601 timestamp of the most recent data update. Omitted when Eurostat does not report it."
      • changedOutput schema / properties / obsCount / description
        Previous value: -"Total number of observations in the full dataset (all periods)."New value: +"Total number of observations in the full dataset (all periods). Omitted when Eurostat does not report it — an omitted count is unknown, not zero."
      • changedOutput schema / properties / timeRange / description
        Previous value: -"Overall data coverage period for this dataset."New value: +"Overall data coverage period for this dataset. Each bound is omitted when Eurostat does not report it — an omitted bound is unknown, not empty."
      • changedOutput schema / properties / timeRange / properties / end / description
        Previous value: -"Most recent available period (e.g., \"2024\")."New value: +"Most recent available period (e.g., \"2024\"). Omitted when Eurostat does not report it."
      • changedOutput schema / properties / timeRange / properties / start / description
        Previous value: -"Earliest available period (e.g., \"1975\")."New value: +"Earliest available period (e.g., \"1975\"). Omitted when Eurostat does not report it."
      • removedOutput schema / properties / timeRange / required
        Removed value: -[
        -  "start",
        -  "end"
        -]
      • changedOutput schema / required
        Previous value: -[
        -  "code",
        -  "label",
        -  "dimensions",
        -  "timeRange",
        -  "obsCount",
        -  "lastUpdated"
        -]New value: +[
        +  "code",
        +  "label",
        +  "dimensions",
        +  "timeRange"
        +]
    • Changedeurostat_get_dimension_values1 field changed
      • changedInput schema / properties / geo_level / description
        Previous value: -"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)."New value: +"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\" (3-char), \"nuts2\" (4-char), \"nuts3\" (5-char)."
    • Changedeurostat_query_dataset6 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"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."New value: +"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 dimension and is dropped from the request. Do not include \"geo\" here if using geo_level. Invalid dimension values silently return no data — verify with eurostat_get_dimension_values first."
      • changedOutput schema / properties / appliedFilters / properties / filters / description
        Previous value: -"Dimension filters that were applied."New value: +"Dimension filters actually sent to Eurostat. Empty arrays from the request are dropped and do not appear here."
      • changedOutput schema / properties / timeRange / description
        Previous value: -"Time coverage of the returned observations."New value: +"Time coverage of the returned observations. Each bound is omitted when neither the observations nor Eurostat report it — an omitted bound is unknown, not empty."
      • changedOutput schema / properties / timeRange / properties / end / description
        Previous value: -"Most recent period in this result."New value: +"Most recent period in this result. Omitted when the observations carry no time dimension and Eurostat reports no overall period."
      • changedOutput schema / properties / timeRange / properties / start / description
        Previous value: -"Earliest period in this result."New value: +"Earliest period in this result. Omitted when the observations carry no time dimension and Eurostat reports no overall period."
      • removedOutput schema / properties / timeRange / required
        Removed value: -[
        -  "start",
        -  "end"
        -]
  8. 2 tool updates
    • Changedeurostat_browse_themes2 fields changed
      • changedInput schema / properties / theme_code / description
        Previous value: -"Folder code to expand (e.g., \"econ\", \"reg\"). Omit to list the top-level theme folders."New value: +"Folder code to expand (e.g., \"economy\", \"reg\"). Omit to list the top-level theme folders."
      • changedOutput schema / properties / parentPath / description
        Previous value: -"Breadcrumb from root to the requested theme (e.g., [\"Economy and finance\", \"National accounts\"]). Empty when browsing root."New value: +"Breadcrumb from root to the requested theme (e.g., [\"Database by themes\", \"Economy and finance\"]). Empty when browsing root."
    • Changedeurostat_search_datasets6 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Opaque pagination cursor from a previous call's nextCursor. Omit for the first page; pass it back to fetch the next page of matches over a stable order."New value: +"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 the query that produced it and to the catalogue snapshot in effect at that time, so reusing one with a different query, or after the catalogue refreshes, is rejected rather than silently paging a different result set."
      • changedInput schema / properties / query / description
        Previous value: -"Search terms. Split on whitespace into tokens; every token must match (AND), case-insensitively, somewhere across the dataset label, theme breadcrumb, or code. Word order does not matter, so \"business demography NUTS 3\" or \"regional economic accounts\" resolve without naming a label verbatim."New value: +"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, or code. Word order does not matter, so \"business demography NUTS 3\" or \"regional economic accounts\" resolve without naming a label verbatim."
      • addedInput schema / properties / query / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / datasets / items / properties / themePath / description
        Previous value: -"Breadcrumb path from root theme to this dataset (e.g., [\"Economy and finance\", \"National accounts\"]). Empty for top-level entries."New value: +"Breadcrumb path from root theme to this dataset (e.g., [\"Database by themes\", \"Economy and finance\"]). Eurostat files some datasets under several branches; this is the first branch that matched the query. Empty for top-level entries."
      • changedOutput schema / properties / nextCursor / description
        Previous value: -"Opaque cursor for the next page of matches. Pass it back as cursor. Omitted on the last page."New value: +"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."
      • changedOutput schema / properties / totalMatches / description
        Previous value: -"Total datasets matching the query across all pages, before the page limit."New value: +"Total distinct dataset codes matching the query across all pages, before the page limit."
  9. 2 tool updates
    • Changedeurostat_browse_themes3 fields changed
      • changedInput schema / properties / theme_code / description
        Previous value: -"Folder code to expand (e.g., \"econ\", \"reg\"). Omit to list the 11 top-level theme folders."New value: +"Folder code to expand (e.g., \"econ\", \"reg\"). Omit to list the top-level theme folders."
      • changedOutput schema / properties / items / description
        Previous value: -"Immediate children of the requested theme, or the 11 root themes if theme_code was omitted."New value: +"Immediate children of the requested theme, or the root themes if theme_code was omitted."
      • addedOutput schema / properties / nextStep
        Added value: +{
        +  "description": "Suggested next action based on these results. Populated when there is a clear follow-up call.",
        +  "type": "string"
        +}
    • Changedeurostat_search_datasets9 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Opaque pagination cursor from a previous call's nextCursor. Omit for the first page; pass it back to fetch the next page of matches over a stable order.",
        +  "type": "string"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return (1–100). Default is 20."New value: +"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."
      • changedInput schema / properties / query / description
        Previous value: -"Search terms — case-insensitive substring match against dataset labels."New value: +"Search terms. Split on whitespace into tokens; every token must match (AND), case-insensitively, somewhere across the dataset label, theme breadcrumb, or code. Word order does not matter, so \"business demography NUTS 3\" or \"regional economic accounts\" resolve without naming a label verbatim."
      • changedOutput schema / properties / datasets / description
        Previous value: -"Matching datasets, up to the requested limit."New value: +"Matching datasets for the current page, up to the requested limit."
      • addedOutput schema / properties / nextCursor
        Added value: +{
        +  "description": "Opaque cursor for the next page of matches. Pass it back as cursor. Omitted on the last page.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / nextStep
        Added value: +{
        +  "description": "Suggested next action based on these results. Populated when there is a clear follow-up call.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / totalMatches / description
        Previous value: -"Total datasets matching the query before the limit."New value: +"Total datasets matching the query across all pages, before the page limit."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when more matches remain beyond this page — pass nextCursor as cursor to fetch them.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "datasets",
        -  "query",
        -  "totalMatches"
        -]New value: +[
        +  "datasets",
        +  "query",
        +  "totalMatches",
        +  "truncated"
        +]
  10. 3 tool updates
    • Changedeurostat_browse_themes3 fields changed
      • addedOutput schema / properties / itemCount
        Added value: +{
        +  "description": "Number of items returned in this level.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / themeCode
        Added value: +{
        +  "description": "Folder code that was browsed, or omitted for root.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "items",
        -  "parentPath"
        -]New value: +[
        +  "items",
        +  "parentPath",
        +  "itemCount"
        +]
    • Changedeurostat_query_dataset3 fields changed
      • addedOutput schema / properties / appliedFilters
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Effective query parameters applied to the Eurostat API.",
        +  "properties": {
        +    "filters": {
        +      "additionalProperties": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "description": "Dimension filters that were applied.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "geoLevel": {
        +      "description": "NUTS geo level filter applied, if any.",
        +      "type": "string"
        +    },
        +    "lastNPeriods": {
        +      "description": "Last N periods filter applied, if any.",
        +      "type": "number"
        +    },
        +    "sincePeriod": {
        +      "description": "Start of time range applied, if any.",
        +      "type": "string"
        +    },
        +    "untilPeriod": {
        +      "description": "End of time range applied, if any.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "filters"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when the result was truncated at 5,000 rows. Omitted for normal results.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "datasetCode",
        -  "datasetLabel",
        -  "dimensionsUsed",
        -  "observations",
        -  "obsCount",
        -  "truncated",
        -  "timeRange",
        -  "missingObsCount"
        -]New value: +[
        +  "datasetCode",
        +  "datasetLabel",
        +  "dimensionsUsed",
        +  "observations",
        +  "obsCount",
        +  "truncated",
        +  "timeRange",
        +  "missingObsCount",
        +  "appliedFilters"
        +]
    • Changedeurostat_search_datasets3 fields changed
      • addedOutput schema / properties / query
        Added value: +{
        +  "description": "Search terms as submitted.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / totalMatches / description
        Previous value: -"Total number of datasets matching the query before the limit is applied."New value: +"Total datasets matching the query before the limit."
      • changedOutput schema / required
        Previous value: -[
        -  "datasets",
        -  "totalMatches"
        -]New value: +[
        +  "datasets",
        +  "query",
        +  "totalMatches"
        +]
  11. 1 tool update
    • Changedeurostat_query_dataset4 fields changed
      • changedOutput schema / properties / obsCount / description
        Previous value: -"Number of observations returned."New value: +"Total number of observations matched (before any cap)."
      • changedOutput schema / properties / observations / description
        Previous value: -"Decoded observations. Each entry has one dimension entry per dimension in dimensionsUsed, plus value and optional status."New value: +"Decoded observations, capped at 5,000 rows. When truncated is true, apply dimension filters to narrow the result."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the result exceeded 5,000 observations and was capped. Apply dimension filters to get the full result.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "datasetCode",
        -  "datasetLabel",
        -  "dimensionsUsed",
        -  "observations",
        -  "obsCount",
        -  "timeRange",
        -  "missingObsCount"
        -]New value: +[
        +  "datasetCode",
        +  "datasetLabel",
        +  "dimensionsUsed",
        +  "observations",
        +  "obsCount",
        +  "truncated",
        +  "timeRange",
        +  "missingObsCount"
        +]

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.7/5.0
Disambiguation5/5

Each tool has a clearly distinct role: discovery, metadata lookup, dimension value lookup, inline query, bulk download, dataframe staging, and dataframe SQL. The two data-fetching tools are explicitly differentiated as slice vs. whole-dataset routes, and the dataframe tools are clearly separate from direct Eurostat queries.

Naming Consistency4/5

Six of eight tools follow a consistent eurostat_verb_noun pattern, e.g., search_datasets, get_dataset_info, query_dataset. The two dataframe tools invert this to eurostat_dataframe_describe and eurostat_dataframe_query, which is a minor deviation but still readable and predictable.

Tool Count5/5

Eight tools is a well-scoped count for the Eurostat data-access domain. Each tool covers a distinct stage in the workflow from discovery, metadata inspection, targeted querying, bulk download, and post-query analysis.

Completeness5/5

The toolset covers the full expected lifecycle: browse and search to find datasets, get metadata and dimension values to construct queries, query or download data, and stage/query results for further analysis. No significant dead ends or missing operations are evident for the stated purpose.