eurostat-mcp
This server provides offline MCP access to European territorial data—unified Eurostat/Copernicus/OSM indicators plus raw Eurostat datasets—via seven tools.
Search indicators: find socio-economic, environmental, or infrastructure indicators across Eurostat, Copernicus, and OSM sources.
List geographic zones: browse NUTS0–3 and CITY levels, optionally filtered by parent or name.
Get indicator values: retrieve multi-indicator, multi-zone pivoted tables (max 5 indicators, 100 zones, 3 latest periods by default).
Search Eurostat datasets: full-text catalogue search returning dataset codes, titles, and time coverage.
Inspect dataset structure: list dimensions and truncated codelists before querying.
List codes: explore individual dimension codes of a dataset, filterable by substring.
Query raw Eurostat data: run arbitrary dataset queries at full grain with dimension filters and time ranges, capped at 400 cells.
Cross-source territorial analysis is possible by chaining search_indicators → list_zones → get_indicators, while search_datasets → get_structure → list_codes → query_data exposes the full native Eurostat grain.
Provides access to OpenStreetMap-based territorial indicators, such as counts of POIs (e.g. train stations, hospitals) aggregated by European NUTS and city zones, with completeness flags and snapshot dating.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@eurostat-mcpFind quarterly GDP data for France and Belgium since 2020."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
eurostat-mcp
MCP server for accessing Eurostat data, designed for local models (tested for Qwen3.8-27B): 4 tools, narrow schemas, server-side validation, compacted outputs.
Architecture
Modèle (Qwen3.8-27B via vLLM / llama.cpp + harness MCP)
│ tool calls
▼
server.py 4 tools : search_datasets, get_structure, list_codes, query_data
│ validation DSD + suggestions difflib + plafond 400 cellules
▼
store.py SQLite : catalogue en FTS5 (TTL 24h), structures DSD (TTL 24h)
▼
eurostat_client.py API dissémination Eurostat (catalogue TSV + Statistics JSON-stat)The model never builds SDMX URLs. Every request goes through
query_data, which validates dimensions and codes against the cached DSD and
returns actionable errors (Code 'FRA' unknown. Did you mean: FR ?).
Related MCP server: DuckDB Eurostat MCP Server
Installation
pip install "mcp>=1.2" httpx pyarrow duckdb # SDK mcp 1.x et 2.x
python -m territorial_mcp.server # stdio
MCP_TRANSPORT=http python -m territorial_mcp.server # streamable HTTPMCP client config (stdio):
{
"mcpServers": {
"eurostat": {
"command": "python",
"args": ["-m", "territorial_mcp.server"],
"cwd": "/chemin/vers/eurostat-mcp"
}
}
}Typical model-side sequence
search_datasets("GDP quarterly")→ candidate codesget_structure("namq_10_gdp")→ dimensions, truncated codeslist_codes("namq_10_gdp", "geo", contains="fr")if neededquery_data("namq_10_gdp", {"geo": "FR+BE", "na_item": "B1GQ", "unit": "CP_MEUR"}, time_from="2022")
Note for Qwen3.8-27B: force a medium/low reasoning level
(the default xhigh over-thinks simple tool chains).
Full offline mode
# 1. (en ligne) construire le miroir — TOC-driven, idempotent
python -m territorial_mcp.mirror --datasets nama_10_gdp,une_rt_m
python -m territorial_mcp.mirror --all # tout le catalogue, ~24 Go compressés
python -m territorial_mcp.mirror --resync # cron quotidien : ne retélécharge
# que ce que le TOC signale comme modifié
# 2. (hors ligne) servir uniquement depuis le miroir + caches
EUROSTAT_OFFLINE=1 python -m territorial_mcp.serverData: Parquet zstd long format (dims, time, value, flag), one file per dataset, queried via DuckDB.
query_dataserves the mirror first even outside offline mode, and displays the data date ("local mirror, Eurostat data from DD.MM.YYYY").Structures + catalog: updated at each sync, served without TTL in offline mode; serve-stale-on-error when Eurostat is unreachable.
Invalidation is driven by the
last update of datacolumns of the TOC, not by a TTL:--resynconly touches modified datasets.
Skeleton limits and future work
Search: FTS5/BM25 only. Add hybrid search with embeddings (e.g., bge-m3 in sqlite-vec) for vague queries.
Structures: retrieved via the
lastTimePeriod=1trick on the Statistics API. For very large datasets, switch to the SDMX 2.1datastructureendpoint (XML) with dedicated parsing.Data cache: only structures are cached. Add a cache for
query_dataresponses (TTL 24h — Eurostat publishes at 11am/11pm).Aggregations: migrate store.py to DuckDB to offer server-side aggregations (averages, growth) instead of returning raw data to the model.
Multi-user HTTP: add auth (bearer) and rate limiting in front of the streamable HTTP transport.
Available Tools
7 toolsget_indicatorsA
Valeurs d'indicateurs pour des zones, une colonne par indicateur.
Croise plusieurs sources en un seul tableau. Maximum 5 indicateurs et 100 zones ; sans time_from/time_to, les 3 dernières périodes. Les ids viennent de search_indicators, les codes de zone de list_zones.
| Name | Required | Description | Default |
|---|---|---|---|
| zones | Yes | ||
| time_to | No | ||
| time_from | No | ||
| indicators | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses output format and the default time window, but does not mention side effects (e.g., read-only nature), error behavior, or performance considerations. While likely a read query, this is not stated explicitly, so the transparency is incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (three sentences) and front-loaded with the core purpose. It efficiently conveys the output format, limits, default behavior, and parameter sourcing without repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, parameter sourcing, limits, and default time behavior. An output schema exists, so return structure is standard. It lacks explicit error handling or permission notes, but for a query tool, this is acceptable given the schema and described constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must add meaning. It explains that indicators come from search_indicators and zones from list_zones, which is critical for correct usage. It also clarifies the default behavior of time_from/time_to, adding value beyond the schema's minimal property titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns indicator values for zones in a tabular format, with one column per indicator. It specifies it crosses multiple sources into a single table, which differentiates it from single-source tools. However, it does not explicitly distinguish it from the sibling query_data tool, so it doesn't reach a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context on how to populate parameters (IDs from search_indicators, zone codes from list_zones) and notes the default behavior without time filters. It implies usage for multi-source aggregation but does not explicitly state when to use this tool versus alternatives like query_data, nor when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_structureA
Dimensions et codes d'un dataset (codelists tronquées).
À appeler avant query_data. Si une dimension affiche '… et N autres', utiliser list_codes pour la parcourir.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description bears full responsibility. It discloses the key behavioral trait that codelists are truncated (important for agent expectations) and mentions the ellipsis indicator. It doesn't state return format or error behavior, but for a simple structure tool with an output schema, this is acceptable coverage. No contradiction with any annotations since none exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two short sentences plus a conditional instruction. Every sentence earns its place: the first defines purpose, the second provides usage order and alternative routing. No fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter, an output schema, and explicit sibling references, the description is quite complete. It covers purpose, usage order, and truncation behavior. Minor gaps: doesn't explain what 'structure' exactly includes (only mentions dimensions and codes), but that's sufficient. The output schema likely provides return details. This nearly fully equips the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It does: 'dataset' is implicitly the dataset identifier, and the description explains that the tool returns dimensions/codes of that dataset. It also explains behavior around truncation. It doesn't specify the format of the dataset parameter, but the schema already declares it as a string. Overall, the description provides enough meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns the dimensions and codes of a dataset, with a specific verb ('get') and resource ('structure'). It also distinguishes itself from siblings by noting that codelists are truncated and that list_codes should be used for full exploration. This effectively differentiates it from query_data and list_codes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to call this tool before query_data, establishing a clear usage order. It also provides a conditional rule: if a dimension shows '… et N autres', use list_codes to browse it. This directly tells the agent when to use alternatives, which is exactly what this dimension requires.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_codesA
Liste les codes d'une dimension, filtrable par sous-chaîne.
Exemple : list_codes("nama_10_gdp", "geo", contains="fr").
| Name | Required | Description | Default |
|---|---|---|---|
| dataset | Yes | ||
| contains | No | ||
| dimension | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided (readOnlyHint, destructiveHint, etc.), so the description carries the disclosure burden. The verb 'list' implies a read-only operation, which is helpful, but there's no mention of external network behavior, potential rate limits, or whether results are cached—reasonable context for a tool that queries Eurostat data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, with the key information front-loaded and a minimal working example. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so the return value is documented. The description covers the essentials for a simple listing tool. The main gap is that it doesn't mention edge cases, such as what happens for a dimension with many values or whether the result is paginated/limited, but the example is solid enough to prevent basic misuse.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The example `contains="fr"` indirectly clarifies the `contains` parameter, and using `"nama_10_gdp"` for `dataset` and `"geo"` for `dimension` gives meaning to all three params. However, the description doesn't explicitly say datasets are Eurostat datasets or that dimensions are named fields like 'geo', 'time', 'unit', so an agent must infer this from the example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the operation: list codes of a dimension with optional substring filtering. The concrete example with "nama_10_gdp" and "geo" makes the tool's purpose immediately understandable, even without documentation of the sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied through the dimension and filter semantics, and the example shows how to use it. However, there's no explicit guidance on when to choose this over alternatives like query_data or search_datasets, nor does it clarify what a dimension is in the Eurostat context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_zonesA
Liste les zones d'un niveau NUTS0-3 ou CITY, sous un parent ou par nom.
Exemple : list_zones("NUTS2", parent="FR"). Les codes obtenus alimentent get_indicators.
| Name | Required | Description | Default |
|---|---|---|---|
| level | Yes | ||
| parent | No | ||
| contains | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that the tool lists zones and that it can filter by parent or name, but it doesn't mention any side effects, performance implications, or limitations (e.g., pagination, rate limits). For a read-only listing tool, this is acceptable but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with a clear first sentence and a helpful example. It front-loads the core purpose and then provides a usage example. The only minor issue is that the 'contains' parameter is not mentioned, but the overall structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is an output schema (not shown but indicated), the description doesn't need to explain return values. However, it doesn't clarify the exact format of the 'level' values (e.g., are they strings like 'NUTS2'?) or the 'contains' parameter semantics. For a tool with 3 parameters and a clear workflow, it's adequate but could be more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the 'level' parameter (NUTS0-3 or CITY) and the 'parent' parameter via the example, but it doesn't explain the 'contains' parameter at all. The description adds some meaning beyond the schema (which only has titles and defaults), but it's incomplete for one of the three parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists zones for a given NUTS level or CITY, with optional parent or name filtering. It distinguishes itself from siblings like get_indicators and search_indicators by specifying its role in the workflow (feeding codes into get_indicators). However, it doesn't explicitly contrast with list_codes, which might be a similar listing tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a concrete example (list_zones("NUTS2", parent="FR")) and states that the output codes feed into get_indicators, giving clear context for when to use this tool. It doesn't explicitly mention when not to use it or alternatives, but the example and workflow hint are strong guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_dataA
Interroge un dataset Eurostat au grain complet. filters = {dim: "A+B"}.
Exemple : query_data("nama_10_gdp", {"geo": "FR+BE", "na_item": "B1GQ", "unit": "CP_MEUR"}, time_from="2020"). Réponse plafonnée à 400 cellules. Pour croiser avec des indicateurs environnementaux ou d'infrastructure, préférer get_indicators.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset | Yes | ||
| filters | No | ||
| time_to | No | ||
| time_from | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full behavioral burden. It does reveal an important trait: the response is capped at 400 cells. It does not explicitly state read-only behavior, stability, or any pagination/error behavior, though the verb 'Interroge' nudges the read-only interpretation. The 400-cell cap is real transparency, but more behavioral context would be needed for the description to be a strong standalone guide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description stays compact, bundles the syntax rule, gives an instructive example, and finishes with a clear alternative in one sentence. The example adds token length but earns its place because it disambiguates the filter syntax. The 'Réponse plafonnée à 400 cellules' detail is appropriately placed near the example.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema is present, so the return value shape does not need to be described. The description provides the essential context: what the tool queries, how filters are written, what the cell limit is, and which sibling is better suited for a certain use case. A small gap is the lack of explicit advice to use search_datasets to find valid dataset codes, but the example partially fills that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter descriptions in the schema are absent (0% coverage), so the description reasonably compensates: it defines the filters syntax (dim: 'A+B') and offers a complete example covering dataset, filters, and time_from. time_to is not directly explained, but the example makes the time-range convention easy to infer. This is meaningful added value beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb-resource pair: 'Interroge un dataset Eurostat au grain complet' (queries a Eurostat dataset at full grain). This conveys the core function distinctly from search-oriented siblings like search_datasets, and the example with nama_10_gdp reinforces the resource type. It could be a 5, but full differentiation from get_indicators is only implicit, not fully stated in the purpose line.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear routing rule: for combining with environmental or infrastructure indicators, prefer get_indicators instead. This is a useful when/not-when signal relative to a sibling. It does not cover all comparison scenarios against other siblings, but the example and framing make the main intended call pattern understandable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_datasetsA
Recherche full-text dans le catalogue Eurostat (~7000 datasets).
Renvoie code, titre et période couverte. Utiliser ensuite get_structure(code) avant toute requête de données.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of describing behavior. It does disclose the return fields (code, title, period) and signals that this is only a precursor to get_structure, but it does not mention limit behavior, pagination, or failure cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences front-load the purpose, state the returned fields, and give the required next step. There is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides the essential purpose, return fields, and follow-up call, but it omits the meaning of limit and does not disambiguate from search_indicators. This is adequate for a simple search tool with an output schema but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description only clarifies that query is a full-text search term. The limit parameter is not explained anywhere, so the description does not compensate for the missing parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Recherche full-text dans le catalogue Eurostat (~7000 datasets)', giving a specific verb, resource, and scope. It also states what the tool returns, but it does not explicitly differentiate from the sibling search_indicators.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear workflow guidance by instructing the agent to call get_structure(code) before requesting data. The catalogue-focused scope makes the intended use case clear, but it does not explicitly state when not to use this tool or compare it with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_indicatorsA
Cherche un indicateur (socio-économique, environnemental, infrastructure).
Point d'entrée de toute analyse territoriale croisée. source filtre sur eurostat, copernicus ou osm. Utiliser ensuite list_zones puis get_indicators.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| source | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It does not disclose potential side effects, rate limits, or behaviors beyond search. The lack of annotation context means the description should explicitly state that this is a read-only search operation. It partially does by implying searching, but it doesn't state whether results are limited, order, or any constraints. A 3 is fair because the description adds some context but not rich behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: three sentences. The first states what it does, the second positions it as entry point and gives source values, the third gives a workflow. It is well-structured and not verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is fairly complete for the tool's role. It explains the purpose, gives source filter values, and directs to the next steps in the workflow. The main gaps are: 'limit' parameter semantics, potential return shape (though output schema exists), and explicit read-only clarification. With an output schema present, the tool's return format is addressed, so the description's gap on limit is the most notable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description has the burden to explain parameters. It mentions 'source' with allowed values (eurostat, copernicus, osm) and implicitly explains query as the search term, but it does not mention 'limit' at all. The description adds meaning for 'source' but leaves 'limit' undefined. With 0% coverage, the description should compensate more fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear purpose: searching for an indicator (socio-economic, environmental, infrastructure), and positions it as the entry point for territorial analysis. It is differentiated from siblings by naming the downstream tools (list_zones, get_indicators) and clarifying it's the starting point.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use it ('Point d'entrée de toute analyse territoriale croisée'), what filters exist (source on eurostat, copernicus, or osm), and gives a clear sequence of usage: use search_indicators, then list_zones, then get_indicators. This is strong usage guidance that helps the agent understand the workflow.
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.
7 tool updates
v0.2.0- First observed
get_indicators - First observed
get_structure - First observed
list_codes - First observed
list_zones - First observed
query_data - First observed
search_datasets - First observed
search_indicators
TDQS
Scored across 7 tools
Each tool has a clearly distinct purpose: search_indicators for finding indicators, list_zones for geographic zones, get_indicators for cross-source indicator values, search_datasets for dataset catalog search, get_structure for dataset dimensions, list_codes for browsing dimension codes, and query_data for raw dataset queries. No two tools overlap in function, and the descriptions explicitly guide the intended workflow.
All tools follow a consistent verb_noun snake_case pattern: search_indicators, list_zones, get_indicators, search_datasets, get_structure, list_codes, query_data. The verbs (search, list, get, query) and nouns are distinct and meaningful, with no mixed conventions or abbreviations.
With 7 tools, the set is well-scoped for a Eurostat MCP server. It covers two clear workflows (indicator-based territorial analysis and raw dataset exploration) without excessive overlap or unnecessary additions. The count is ideal for the described functionality.
The tools cover the full lifecycle for both workflows: searching for indicators/datasets, exploring structure (zones, dimensions, codes), and retrieving data (indicators or raw queries). No obvious gaps exist; the separation between get_indicators and query_data is clearly explained, and helper tools (list_codes) fill potential needs.
Maintenance
Related MCP Connectors
Search and query the Eurostat catalogue — EU economy, demography, trade, and NUTS regional data.
Access European statistics: GDP, unemployment, inflation, population data.
Eurostat MCP — wraps Eurostat Statistical Data API (no auth required)
Search and query 1,500+ OECD statistical datasets via SDMX. Keyless.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceExposes the Eurostat Statistics API, enabling LLMs to discover, explore, and retrieve official EU statistical data through search, dimension inspection, and data retrieval tools.3-
- AlicenseNot gradedqualityDmaintenanceEnables querying Eurostat data using natural language, powered by DuckDB for optimized performance.MIT
- AlicenseNot gradedqualityCmaintenanceEnables querying Eurostat statistical data through natural language or direct MCP tools, wrapping the Eurostat API without authentication.9 npmMIT
- AlicenseNot gradedqualityAmaintenanceSearch and query the Eurostat catalogue — EU economy, demography, trade, health, and NUTS regional data via MCP with 5 tools and 1 resource.341 npm5Apache 2.0