Skip to main content
Glama
scampion

eurostat-mcp

by scampion

eurostat-mcp

Eurostat 데이터에 접근하는 MCP 서버로, 로컬 모델용으로 설계되었습니다 (Qwen3.8-27B로 테스트됨): 4개의 도구, 좁은 스키마, 서버 측 검증, 압축된 출력.

아키텍처

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)

모델은 SDMX URL을 결코 구성하지 않습니다. 모든 요청은 query_data를 거치며, 캐시된 DSD에 대해 차원과 코드를 검증하고 실행 가능한 오류를 반환합니다 (Code 'FRA' inconnu. Vouliez-vous : FR ?).

Related MCP server: DuckDB Eurostat MCP Server

설치

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 HTTP

MCP 클라이언트 구성 (stdio):

{
  "mcpServers": {
    "eurostat": {
      "command": "python",
      "args": ["-m", "territorial_mcp.server"],
      "cwd": "/chemin/vers/eurostat-mcp"
    }
  }
}

모델 측 일반적인 시퀀스

  1. search_datasets("GDP quarterly") → 후보 코드

  2. get_structure("namq_10_gdp") → 차원, 잘린 코드

  3. list_codes("namq_10_gdp", "geo", contains="fr") 필요한 경우

  4. query_data("namq_10_gdp", {"geo": "FR+BE", "na_item": "B1GQ", "unit": "CP_MEUR"}, time_from="2022")

Qwen3.8-27B 참고: 중간/낮은 추론 수준을 설정하세요 (기본 xhigh는 단순한 도구 연쇄를 과도하게 생각합니다).

완전 오프라인 모드

# 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.server
  • 데이터: Parquet zstd long format (dims, time, value, flag), 데이터셋별 파일 하나, DuckDB로 조회. query_data는 오프라인 모드가 아니어도 미러를 우선 제공하며, 데이터 날짜를 표시합니다 ("로컬 미러, JJ.MM.AAAA 기준 Eurostat 데이터").

  • 구조 + 카탈로그: 동기화 때마다 업데이트되며, 오프라인 모드에서는 TTL 없이 제공됩니다. Eurostat에 연결할 수 없을 때는 serve-stale-on-error.

  • 무효화는 TTL이 아니라 TOC의 last update of data 열에 의해 제어됩니다. --resync는 수정된 데이터셋만 건드립니다.

골격의 한계와 발전 방향

  • 검색: FTS5/BM25만 사용. 모호한 요청을 위해 임베딩을 활용한 하이브리드 검색(예: sqlite-vec의 bge-m3)을 추가.

  • 구조: Statistics API에서 lastTimePeriod=1 트릭을 통해 가져옴. 매우 큰 데이터셋의 경우 전용 파싱과 함께 SDMX 2.1 datastructure 엔드포인트(XML)로 전환.

  • 데이터 캐시: 구조만 캐시됨. query_data 응답 캐시를 추가 (TTL 24시간 — Eurostat은 11시/23시에 게시).

  • 집계: store.py를 DuckDB로 마이그레이션하여 모델에 원시 데이터를 보내는 대신 서버 측 집계(평균, 성장률)를 제공.

  • HTTP 다중 사용자: streamable HTTP 전송 앞에 인증(bearer)과 rate limiting을 추가.

Available Tools

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

ParametersJSON Schema
NameRequiredDescriptionDefault
zonesYes
time_toNo
time_fromNo
indicatorsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
datasetYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
datasetYes
containsNo
dimensionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelYes
parentNo
containsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
datasetYes
filtersNo
time_toNo
time_fromNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
sourceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

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

  1. 7 tool updatesv0.2.0
    • First observedget_indicators
    • First observedget_structure
    • First observedlist_codes
    • First observedlist_zones
    • First observedquery_data
    • First observedsearch_datasets
    • First observedsearch_indicators

TDQS

A4.1/5.0

Scored across 7 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers