Skip to main content
Glama

Server Details

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

Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
cyanheads/eurostat-mcp-server
GitHub Stars
5
Server Listing
eurostat-mcp-server

Glama MCP Gateway

Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.

MCP client
Glama
MCP server

Full call logging

Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.

Tool access control

Enable or disable individual tools per connector, so you decide what your agents can and cannot do.

Managed credentials

Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.

Usage analytics

See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.

100% free. Your data is private.
Tool DescriptionsA

Average 4.7/5 across 5 of 5 tools scored.

Server CoherenceA
Disambiguation5/5

Each tool serves a distinct purpose: browse for tree navigation, search for keyword discovery, info for metadata overview, dimension values for full code lists, and query for data retrieval. Even the two discovery tools (browse vs search) are clearly differentiated by their descriptions. No two tools overlap in a way that would cause misselection.

Naming Consistency5/5

All tool names follow the consistent pattern 'eurostat_' + verb_noun in snake_case (browse_themes, get_dataset_info, get_dimension_values, query_dataset, search_datasets). The verbs are all different but appropriate to their actions, and the convention is uniform throughout.

Tool Count5/5

With exactly 5 tools, the set is well-scoped for a Eurostat data access server. Each tool covers a necessary step in the workflow (discover, inspect, verify, query), and there are no redundant or filler tools.

Completeness5/5

The tool surface provides full coverage for the typical workflow: discovering datasets via search or browse, inspecting metadata, listing dimension values, and querying data. There are no obvious dead ends or missing operations for the server's stated purpose.

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
itemsYesImmediate 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.
itemCountYesNumber of items returned in this level.
themeCodeNoFolder code that was browsed, or omitted for root.
parentPathYesBreadcrumb 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.
Behavior5/5

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

Even with readOnlyHint, openWorldHint, and idempotentHint annotations, the description enriches understanding by detailing the exact conditional behavior (top-level folders vs. immediate children) and the nature of the returned items ('subtheme folders and datasets in that branch'). This exceeds annotation coverage without contradicting it.

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 well-organized: a lead sentence, then behavior, then usage guidance, then cross-reference. Every sentence contributes to either understanding or decision-making; there is no redundant or filler content.

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 fairly simple read-only browsing tool with one optional parameter and an output schema, the description covers all necessary operational aspects: what happens with and without the parameter, what the output contains, and how it relates to other tools (search, drill-down). No significant gaps remain.

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?

The input schema already provides a full description for theme_code (100% coverage), including the example values and the 'omit to list top-level' behavior. The description reinforces this by explaining the consequence of providing vs. omitting the parameter in functional terms, adding marginal value rather than repeating 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 starts with a specific verb+resource combination: 'Navigate the Eurostat theme tree.' It clearly distinguishes itself from sibling tools by focusing on structured tree navigation, contrasting with keyword-based search. It also specifies distinct behaviors with and without a theme_code, which adds precision.

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 provides explicit guidance: '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 alternative and pairing tool: 'Pair with eurostat_search_datasets for keyword-based discovery.' This fully addresses when to use this tool versus the sibling.

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
noticeNoGuidance when the canvas holds no tables. Omitted when it holds at least one.
tablesYesTables staged on this canvas. Empty when nothing has been staged yet, or when every staged table has expired.
canvasIdYesCanvas identifier the tables were read from.
expiresAtYesISO 8601 timestamp when the canvas expires. Every call on it slides this forward.
Behavior5/5

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

Annotations already declare readOnlyHint and idempotentHint. The description adds substantial behavioral context: it reveals that the two stagers produce different dimension columns (code+label vs code-only plus time) and that both share five fixed measure columns, enabling cross-stager joins. It also cautions to 'read the columns reported here rather than assuming,' which is valuable beyond 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 four sentences, each conveying a distinct piece of information without redundancy. It is dense but justified given the need to explain the data model differences between stagers. It is front-loaded with the purpose and well organized.

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?

With annotations covering safety, a full schema for the single parameter, and an output schema present, the description completes the picture by explaining prerequisites, usage timing, schema differences between stagers, and join semantics. No critical gaps are apparent.

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 schema already provides 100% coverage for canvas_id, stating its source and purpose. The description reiterates this and adds the qualifier 'that reported a staged table,' but does not significantly extend the schema's meaning. 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 clearly states the tool's function: 'List the tables staged on a Eurostat dataframe canvas, with their row counts and column names and types.' It also explicitly distinguishes it from siblings by positioning it as a prerequisite for eurostat_dataframe_query, making its role unambiguous.

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 direct guidance: 'Call this before eurostat_dataframe_query to learn the table and column names to write SQL against.' It also explains the canvas_id provenance from the two staging tools and warns about the differing dimension columns, providing clear context on when and how to use it.

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
rowsYesResult 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.
columnsYesColumn names in projection order.
canvasIdYesCanvas identifier the query ran against.
rowCountYesRows materialized into this response. Equals the full result size unless truncated is true.
truncatedYesTrue 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.
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 context: limitations on SQL statements, column structure (obs_value, obs_flag, conf_status), and differences between stagers. This goes well beyond the annotations without contradiction.

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 long but every sentence earns its place, conveying purpose, constraints, schema details, and cross-tool differences without redundancy. It is front-loaded with the main purpose and progressively details constraints and data model.

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 output schema exists, and annotations cover safety, the description is complete. It explains usage, constraints, column semantics, and relationships to sibling stagers, covering all necessary context for an agent to invoke it correctly.

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

Parameters5/5

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

Schema coverage is 100% and the sql parameter already has an example, but the description adds critical semantics: the single-SELECT constraint, the need to reference table names from describe, and the flat-column structure with dimension code columns and measure columns. This meaningfully enriches parameter understanding.

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 runs read-only SQL SELECT on staged dataframes, with a specific purpose: to bypass the 5,000-row cap and to aggregate/join without re-fetching. It explicitly distinguishes from sibling tools like eurostat_query_dataset and eurostat_download_dataset.

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 guidance (bypassing caps, aggregating/joining) and when-not-to-use (non-SELECT verbs, chaining, external data functions rejected). Also instructs to call eurostat_dataframe_describe first for table/column names.

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; the rest are reachable with eurostat_dataframe_query when this deployment runs a canvas, and are not retained when it does not.

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
noticeNoGuidance when the download was cut short by the byte budget, when nothing could be staged, or when it returned no observations. Omitted otherwise.
canvasIdNoDataframe canvas holding the staged download. Pass to eurostat_dataframe_describe, eurostat_dataframe_query, or a later staging call. Omitted when nothing was staged.
rowCountYesObservations expanded from the download — one per populated cell, counting those Eurostat reports as unavailable.
bytesReadYesDecoded 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. Omitted when this deployment runs without a dataframe canvas, in which case only the inline preview survives the call.
compressedYesTrue 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.
datasetCodeYesDataset code as provided.
periodRangeYesPeriod coverage of the rows actually downloaded. Narrower than the dataset when budgetExceeded is true or a period range was applied.
appliedQueryYesThe bulk request as the server built it.
missingCountYesDownloaded observations carrying no numeric value (obs_value is null).
observationsYesThe first preview_limit observations of the download, in the order Eurostat streamed them. A prefix of the staged table, not a sample.
budgetExceededYesTrue 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.
dimensionsUsedYesDimension 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.
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, but the description adds critical behavioral context beyond that: '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.' It also explains that only preview_limit rows come back inline and the rest are available only on canvas deployments. No contradiction with 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?

The description is long but every sentence adds essential information: main purpose, comparison, HTTP format rationale, filter usage, period advice, byte budget behavior, and preview semantics. It is front-loaded with the primary action and structured logically from general to specific. No filler or repetition.

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 (bulk download, streaming, canvas staging, byte budgets), the description covers all key aspects: what it does, wire format, prerequisites, filtering, period handling, transfer limits, and how to access the full data. The presence of an output schema reduces the need to explain return values, and the description still mentions the budgetExceeded flag and preview_limit behavior. It is comprehensive and sufficient.

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?

The input schema already covers all parameters (100% coverage), providing a solid baseline. The description adds extra meaning by explaining relationships: filters are 'the same dimension-code map eurostat_query_dataset uses,' since_period/until_period 'removes period columns from the TSV rather than blanking their cells,' and preview_limit is 'orientation, not the result set.' This is valuable beyond the schema, but not all parameters need extra description.

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 '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,' which is a specific verb+resource+scope. It explicitly distinguishes from sibling eurostat_query_dataset by calling it 'the route to a whole dataset' versus 'a slice of one.'

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 states when to use this tool vs alternatives, naming eurostat_query_dataset for slices. It gives concrete prerequisites ('call eurostat_get_dataset_info first for the dimension codes and eurostat_get_dimension_values for their values') and advises to 'Narrow with since_period/until_period rather than asking for the most recent N periods,' explaining the reason. It also describes fallback usage via eurostat_dataframe_query.

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
codeYesDataset code as provided.
labelYesHuman-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.
timeRangeYesOverall data coverage period for this dataset. Each bound is omitted when Eurostat does not report it — an omitted bound is unknown, not empty.
dimensionsYesAll 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.
Behavior4/5

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

Annotations already declare read-only, open-world, and idempotent behavior. The description adds important runtime behavior beyond that: it returns up to 10 sample values per dimension, and it notes that eurostat_download_dataset builds its positional filter key from this dimension list, so invalid dimension names are rejected. This enriches the agent's understanding 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.

Conciseness5/5

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

The description is three sentences long, front-loaded with the primary purpose, and each sentence adds distinct value: what it returns, when to call it, and limitations (sample values vs. full set). No filler or redundancy.

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?

With one well-described parameter, an output schema present, and thorough annotations, the description still manages to cover the key contextual aspects: the return contents, the recommended usage order, the sample-limit behavior, and alternatives. The tool is simple enough that no further context is needed.

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 schema covers 100% of parameter descriptions (dataset_code includes its own help text with examples and pointers to search tools), so the baseline is 3. The tool description itself does not add further parameter semantics beyond what the schema already provides, but it also doesn't need to given the high schema coverage.

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 identifies the tool's function with a specific verb ('Fetch') and resource ('metadata for a Eurostat dataset'), outlining the key pieces of metadata (dimensions, time range, observation count, last-update date). It also distinguishes itself from siblings by explaining its role as an exploratory step before querying or downloading, and contrasts with eurostat_get_dimension_values for full dimension lists.

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 usage guidance is provided: 'Call this before eurostat_query_dataset or eurostat_download_dataset' and 'use eurostat_get_dimension_values to list the full set for large dimensions.' This clearly states when to use this tool and when to use an alternative, making the appropriate context unmistakable.

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
valuesYesAll valid values for this dimension in the dataset.
totalCountYesTotal number of distinct values returned.
dimensionCodeYesThe dimension code that was queried.
dimensionLabelYesHuman-readable dimension name.
Behavior4/5

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

Annotations declare readOnly, openWorld, and idempotent, so the safety profile is covered. The description adds behavioral context about geo_level filtering and the consequences of invalid codes in sibling tools, which is informative beyond the structured fields.

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?

Four sentences, each serving a distinct purpose: core listing, usage triggers, geo_filter guidance, and validation rationale. The final sentence is complex but remains coherent and front-loaded with the main action.

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

Completeness4/5

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

The description covers purpose, usage, and validation context. With an output schema present and annotations covering safety, no major gaps remain. Minor details like response ordering are not critical for this listing tool.

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 coverage is 100% with each parameter described. The description adds examples and reinforces the geo_level restriction but doesn't introduce new semantic meaning beyond the schema, so the baseline of 3 applies.

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 clear verb+resource: 'List all valid values for a specific dimension in a Eurostat dataset.' It differentiates from siblings by focusing on dimension values, with examples like 'all unit codes for nama_10_gdp', making its purpose unmistakable.

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?

It explicitly states when to use: 'Use this when eurostat_get_dataset_info returns more values than the 10-item sample, or to confirm exact codes before querying.' It also contrasts with eurostat_query_dataset and eurostat_download_dataset regarding invalid codes, providing clear selection criteria.

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 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), capped at 5,000 inline rows. 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. This tool fetches a slice: past the inline cap, either narrow the filters, or — on a deployment that runs a dataframe canvas — read the staged SQL table this response names in tableName with eurostat_dataframe_query rather than re-querying Eurostat. 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 result fits inline and nothing is staged.
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.
last_n_periodsNoReturn only the N most recent periods. Mutually exclusive with since_period and until_period.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noticeNoGuidance 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.
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.
obsCountYesTotal 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. 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.
timeRangeYesTime 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.
truncatedYesTrue 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.
datasetCodeYesDataset code as provided.
datasetLabelYesHuman-readable dataset title.
observationsYesDecoded 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.
appliedFiltersYesEffective query parameters applied to the Eurostat API.
dimensionsUsedYesOrdered 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.
missingObsCountYesNumber 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.
Behavior5/5

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

While annotations already declare readOnlyHint, idempotentHint, and openWorldHint, the description adds substantial behavioral context: the 5,000 inline row cap, the OBS_FLAG and CONF_STATUS markers (including why values may be null), the async response error for large unfiltered queries, and the silent-return behavior for invalid dimension values. It also discloses mutual exclusivity constraints among parameters. These are meaningful traits not visible in 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?

The description is dense but well-structured: it leads with the core action and return format, then prerequisites, filter strategy, period handling, cap handling, and sibling alternatives. Every sentence adds operational value—no filler or repetition. It is front-loaded with the most important information and organized as a logical sequence of decision points for the agent.

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 (8 parameters, nested objects, rich output schema, and 7 siblings), the description is exceptionally complete. It covers purpose, return shape, row caps, error conditions, parameter relationships, prerequisites, and explicit fallback paths. The presence of an output schema removes the need to document return values in detail, but the description still explains domain-specific markers (OBS_FLAG, CONF_STATUS) and staging behavior, fully equipping the agent to select and invoke the tool correctly.

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

Parameters5/5

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

Schema description coverage is 100%, giving a baseline of 3, but the description enriches parameter understanding considerably. It explains the semantic difference between filters.geo and geo_level, the purpose of last_n_periods (N most recent periods without knowing end date), mutual exclusivity of since_period/until_period with last_n_periods, and the canvas_id reuse pattern for staging. It also warns that invalid dimension values silently return no data, which schema descriptions don't convey.

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+resource: 'Fetch statistical data from a Eurostat dataset with dimension filters.' It clearly distinguishes itself from siblings by explicitly stating this tool 'fetches a slice' while 'eurostat_download_dataset reads the SDMX bulk endpoint instead' for a whole dataset. The return format is specified (decoded observations with codes, labels, values, statuses), making the tool's purpose unambiguous.

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 to discover valid dimension codes, use filters.geo for country codes or geo_level for NUTS hierarchy (mutually exclusive), and use last_n_periods for recent periods without a known end date. It also states when NOT to use the tool: for whole datasets, eurostat_download_dataset is 'the cheaper route'; past the inline cap, read the staged table with eurostat_dataframe_query rather than re-querying. This goes beyond implied usage to clear alternatives and exclusions.

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
queryYesSearch terms as submitted.
datasetsYesMatching 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.
truncatedYesTrue 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.
totalMatchesYesTotal distinct dataset codes matching the query across all pages, before the page limit.
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 meaningful behavioral context beyond annotations: results are limited to datasets and predefined tables (folders excluded) and that it returns period coverage and breadcrumbs. It does not detail pagination behavior, but that is covered in the input schema's cursor description, so no contradiction or major gap.

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 four sentences, each earning its place: what the tool does, what it returns, how it fits into the sibling workflow, and its scope limitation. It is front-loaded with the core purpose and contains no redundant or vague phrasing.

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 (all parameters documented), the presence of an output schema, and annotations covering safety and openness, the description is complete enough for an agent to select and correctly invoke the tool. It explains the discovery workflow, return contents, and scope limitations; remaining details like pagination mechanics are already in the structured schema.

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 coverage is 100%, and each parameter already has a detailed description explaining semantics (e.g., query tokenization, AND matching, pagination cursor). The description merely says 'by keyword' and does not add parameter-level meaning beyond the schema, so the baseline 3 applies.

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 action ('Search the Eurostat catalogue by keyword') and specifies the resource and return contents (codes, descriptions, period coverage, theme breadcrumbs). It also distinguishes the tool from siblings by positioning it as the discovery step before eurostat_get_dataset_info, eurostat_query_dataset, or eurostat_download_dataset.

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 lays out the recommended workflow: use this to discover dataset codes, then call get_dataset_info, and then query or download for data. It also notes an exclusion ('folders are excluded') which implies the alternative browse_themes for folder navigation, satisfying when-not guidance.

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

Discussions

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

Related MCP Servers

View all MCP Servers

Try in Browser

Your Connectors

Sign in to create a connector for this server.