Skip to main content
Glama
Spain Open Data MCP

Spain Open Data MCP

by gabicuesta

Spain Open Data MCP

Give AI agents reliable access to Spanish public data: INE statistics, the BOE and the Catastro.

CI Python MCP License

🇪🇸 Versión en español más abajo

Ask your assistant things like:

  • "What was the annual CPI change in Spain in each of the last 6 months?"

  • "Did the BOE publish anything about housing today?"

  • "What's at 40.4168, -3.7038? How old is the building and how big is it?"

  • "Write a renovation-oriented report for cadastral reference 9872023VH5797S0001WX."

The model picks the right tools, chains them and cites the source of every figure.

Why this exists

Spanish public data is excellent but scattered across three very different APIs: INE's JSON, the BOE's XML-shaped JSON and Catastro's legacy web services. Each one has its own conventions, casing and error formats. An agent that talks to them directly wastes tokens on parsing and gets things wrong.

This server hides those differences behind 8 small, typed, read-only tools designed for LLMs: they return clean, structured output, they let the model limit how much it pulls into its context, and they turn upstream failures into short messages it can act on.

Related MCP server: MCP-BOE

Tools

Source

Tool

What it does

INE

ine_search_operations

Find statistical operations (IPC, EPA, IPV…). Accent-insensitive.

INE

ine_list_tables

List the tables of an operation.

INE

ine_get_table

Latest N values of the series in a table, filterable by series name.

INE

ine_get_series

Latest N values of one series.

BOE

boe_daily_summary

What the BOE published on a day, filterable by keyword and section, with HTML/PDF links.

Catastro

catastro_reference_from_coordinates

Parcel and address at a point. On a street or square, the nearest parcels within ~50 m.

Catastro

catastro_coordinates_from_reference

Address and coordinates of a cadastral reference.

Catastro

catastro_property_details

Use, built area, year built and units of a property.

It also includes a property_report prompt that chains Catastro, INE and the BOE into a short, sourced report about a property.

All tools are marked readOnlyHint / openWorldHint, so clients can auto-approve them safely.

Quick start

# Run it without installing anything permanent (requires uv)
uvx --from git+https://github.com/gabicuesta/spain-open-data-mcp spain-open-data-mcp

Claude Desktop / Claude Code

{
  "mcpServers": {
    "spain-open-data": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/gabicuesta/spain-open-data-mcp", "spain-open-data-mcp"]
    }
  }
}
# Claude Code
claude mcp add spain-open-data -- uvx --from git+https://github.com/gabicuesta/spain-open-data-mcp spain-open-data-mcp

Remote (Streamable HTTP)

spain-open-data-mcp --transport streamable-http --host 0.0.0.0 --port 8000
# endpoint: http://localhost:8000/mcp

Architecture

flowchart LR
    A[AI client<br/>Claude, IDE, agent] -- MCP stdio / HTTP --> S[server.py<br/>tools · prompt · errors]
    S --> I[ine.py]
    S --> B[boe.py]
    S --> C[catastro.py]
    I & B & C --> H[http.py<br/>shared client · TTL cache · timeouts]
    H --> INE[(INE Tempus3 API)]
    H --> BOE[(BOE open data API)]
    H --> CAT[(Catastro OVC services)]
  • server.py only does wiring: tool schemas, descriptions written for the model, and translating errors.

  • One module per source with pure async functions and Pydantic models. They're testable without MCP.

  • http.py holds one shared httpx client, timeouts, a 10-minute in-memory cache and readable errors.

Design decisions

The full records are in docs/adr.

  1. Few, composable tools instead of one per endpoint. Fewer tools means better tool selection by the model. (ADR 0001)

  2. The model controls output size. Every tool has limit, last_n or query, and the defaults are small. Context is a budget. (ADR 0001)

  3. Tolerant parsing. These APIs serialise XML to JSON: one element comes back as a dict, many as a list, and key casing varies. Parsers search generically instead of following fixed paths. (ADR 0002)

  4. Errors are part of the UX. "Catastro: NO HAY NINGUNA PARCELA EN ESA UBICACION" lets the model recover. A stack trace doesn't.

  5. Privacy by construction. Only non-protected Catastro data exists in these services. No owners and no cadastral values.

Development

git clone https://github.com/gabicuesta/spain-open-data-mcp && cd spain-open-data-mcp
uv venv && uv pip install -e ".[dev]"
pytest              # offline: fixtures + in-process MCP client
pytest -m live      # smoke tests against the real APIs
ruff check . && ruff format --check .

Try it interactively with the MCP Inspector:

npx @modelcontextprotocol/inspector uv run spain-open-data-mcp

The offline tests have two layers. Unit tests check each parser against recorded responses. Protocol tests call the tools through a real MCP client in-process: tool listing, annotations, structured output and error paths. The live tests catch upstream schema drift. CI runs them weekly.

Roadmap

  • More INE helpers: geographic filters and pre-selected housing and construction tables

  • BOE consolidated legislation search

  • Catastro: buildings within a radius, cartography (WMS) as images

  • Optional persistent cache (SQLite) for heavy use

  • Evals: a set of questions with expected answers to measure tool selection across models

License

MIT. Data © INE, Agencia Estatal BOE and Dirección General del Catastro, under their respective reuse terms. This project is not affiliated with any of them.


🇪🇸 En español

Servidor MCP que da a los agentes de IA acceso fiable a datos públicos españoles: estadísticas del INE, el BOE y el Catastro.

Los datos públicos españoles son muy buenos, pero están repartidos en tres APIs muy distintas, cada una con sus convenciones, sus formatos y sus errores. Este servidor los unifica en 8 herramientas pequeñas, tipadas y de solo lectura, pensadas para modelos de lenguaje: devuelven datos estructurados, dejan al modelo limitar cuánto contexto consume y convierten los fallos en mensajes accionables.

Ejemplos de preguntas:

  • "¿Cuál fue la variación anual del IPC en España en cada uno de los últimos 6 meses?"

  • "¿Ha publicado hoy el BOE algo sobre vivienda?"

  • "¿Qué hay en 40.4168, -3.7038? ¿De qué año es el edificio y qué superficie tiene?"

  • "Prepara un informe orientado a reforma para la referencia catastral 9872023VH5797S0001WX."

Instalación: usa la configuración de Quick start. Funciona con Claude Desktop, Claude Code y cualquier cliente MCP.

Decisiones clave:

  • Pocas herramientas que se combinan bien.

  • Salida acotada por defecto.

  • Parsing tolerante a las rarezas de cada API.

  • Errores legibles.

  • Solo datos no protegidos del Catastro: ni titulares ni valores catastrales.

Las decisiones completas están en docs/adr.

Available Tools

8 tools
boe_daily_summaryBOE: daily summaryA
Read-onlyIdempotent

List what the BOE published on a given day, with links to HTML and PDF.

NameRequiredDescriptionDefault
dayNoYYYY-MM-DD. Defaults to today in Madrid
limitNo
queryNoWords that must appear in the title
sectionNoFilter by section name, e.g. 'Disposiciones generales'

Output Schema

NameRequiredDescription
dateYes
itemsYes
returnedYes
total_itemsYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds useful output context by mentioning HTML and PDF links, but it does not disclose pagination behavior, rate limits, or authorization requirements.

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?

It is a single, front-loaded sentence with no wasted words. The core action and scope are immediately clear.

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 exists, so return values need not be explained, and annotations cover the safety profile. The description is complete enough for basic invocation, though it omits any mention of the optional query, section, or limit filters that the schema supports.

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 75%, and the schema already documents day, query, and section. The description only implies a day-based listing and does not add syntax or filtering meaning beyond what the schema provides, so it stays at the baseline level.

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 gives a specific verb and resource: 'List what the BOE published on a given day.' It also adds output detail ('with links to HTML and PDF'), so an agent can immediately understand the tool's scope without opening the schema.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool versus alternatives, nor any exclusions or prerequisite information. The purpose implies a daily BOE listing, but routing guidance is absent.

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

catastro_coordinates_from_referenceCatastro: locate a referenceB
Read-onlyIdempotent

Get the address and coordinates of a cadastral reference.

NameRequiredDescriptionDefault
cadastral_referenceYes14 or 20 character cadastral reference

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety and idempotency profile is covered by structured data. The description adds nothing on top of that: no note on external-service dependency or latency, no handling of invalid/unmatched references, and no behavioral nuance beyond what the annotations and output schema already convey.

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?

One short sentence with the verb, output, and input all front-loaded; there is no filler, hedging, or redundancy to trim.

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?

An output schema exists, so return-value explanation is not required, and the single parameter is fully documented in the schema. What is missing for this one-param tool is the disambiguation from its inverse sibling, which the description never addresses; otherwise it is adequate for such a simple lookup.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter already documents the '14 or 20 character cadastral reference' format, so the schema carries the burden. The description adds no syntax, normalization, or format guidance beyond restating 'cadastral reference', which is the baseline-3 case.

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 specific verb ('Get') and two concrete resources ('address and coordinates') scoped to a 'cadastral reference' input, so the direction of the lookup is unambiguous. It does not name its exact inverse sibling, catastro_reference_from_coordinates, so an agent must infer the distinction from the phrasing alone.

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?

Usage is only implied: the phrasing signals a forward lookup (reference in, address/coordinates out), which is the natural counterpart to the coordinate-to-reference sibling. There is no explicit statement of when to prefer this over catastro_reference_from_coordinates or catastro_property_details, and no prerequisites or exclusions are given.

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

catastro_property_detailsCatastro: property detailsA
Read-onlyIdempotent

Use, built area, year built and units of a property. A 14-char parcel reference with several properties returns candidates; call again with one of them.

NameRequiredDescriptionDefault
cadastral_referenceYes14 or 20 character cadastral reference

Output Schema

NameRequiredDescription
useNo
kindNo'UR' urban or 'RU' rural
unitsNo
addressNo
candidatesNoWhen the parcel holds several properties, their 20-char references
year_builtNo
built_area_m2No
cadastral_referenceYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and idempotentHint, so further safety disclosure isn't required. The description adds the candidate/ambiguation behavior, which is valuable, but is silent on return format, provenance, or failure modes beyond the candidates case.

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 compact sentences that front-load the requested fields and then state the multi-property behavior; no 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?

For a read-only lookup with a documented parameter and output schema, the description covers purpose and the only surprising behavior (candidate fan-out). It could be more complete if it mentioned what the return object contains or whether the 20-char form bypasses candidates.

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%, so the schema already documents the single parameter. The description adds only that a 14-char reference can return `candidates` and a retry is needed; this supplements but does not replace schema semantics.

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

Purpose5/5

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

States a specific resource (property) and the exact attributes returned (use, built area, year built, units). Names the sibling function it is not, and its input domain (parcel reference) is clear.

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 implies usage via the candidates note; it explains what happens when a 14-char reference matches several properties and directs a follow-up call. However, it does not say when NOT to use it or name alternatives like catastro_coordinates_from_reference.

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

catastro_reference_from_coordinatesCatastro: parcel at coordinatesA
Read-onlyIdempotent

Find the cadastral parcel and address at a point in Spain. If the point is on a street or square, returns the nearest parcels (match='nearby', with distance_m).

NameRequiredDescriptionDefault
latitudeYesWGS84 latitude
longitudeYesWGS84 longitude

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent and openWorld, so safety is covered. The description adds genuine non-annotation behavior: the fallback to match='nearby' with a distance_m field when the point is not on a parcel. It says nothing about rate limits or upstream failure modes, but for a read-only lookup that is a minor 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?

Two sentences, no filler, and the primary purpose is front-loaded ahead of the edge-case behavior. Every clause carries information the agent needs.

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?

An output schema exists, so return values need not be enumerated; the description instead flags the one response variant that matters (nearby match plus distance_m). Combined with full schema coverage and annotations, nothing needed to call this tool correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (latitude, longitude) carry WGS84 labels plus Spain-bounding min/max constraints. The description adds no parameter-level syntax or format detail beyond that, 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?

States a specific verb ('Find') and resource ('cadastral parcel and address') with an explicit geographic scope ('at a point in Spain'). It is readily distinguishable from the sibling catastro_coordinates_from_reference, which performs the reverse lookup, without opening either schema.

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 second sentence gives the operative condition of use: if the point falls on a street or square, the result set changes to nearby parcels. It clearly frames the input context but never explicitly names the alternative tool (catastro_coordinates_from_reference) for the reverse direction.

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

ine_get_seriesINE: get a seriesC
Read-onlyIdempotent

Fetch the latest values of a single INE series.

NameRequiredDescriptionDefault
last_nNo
series_codeYesSeries code, e.g. 'IPC251852'

Output Schema

NameRequiredDescription
codeYes
nameYes
pointsYes

TDQS

C2.9/5.0
Behavior3/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 by structured data. The phrase 'latest values' adds useful scoping (recent points rather than full history), but the description says nothing about rate limits, upstream INE availability, or how last_n governs the returned window.

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?

A single front-loaded sentence with zero waste. Its brevity is efficient, though it edges toward under-specification rather than pure conciseness.

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

Completeness2/5

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

An output schema exists so return values needn't be explained, but for a tool with an undocumented last_n parameter, no usage guidance, and no sibling differentiation, the description leaves meaningful gaps for correct invocation.

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 only 50%: series_code carries an example in the schema, while last_n is undocumented in both schema and description. The description adds no meaning beyond the structured fields — it never mentions the window size parameter at all.

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?

States a specific verb and resource ('fetch the latest values of a single INE series'), which tells an agent this retrieves data points rather than metadata. It doesn't explicitly contrast with siblings like ine_get_table or ine_list_tables, so an agent must infer the boundary from the noun 'series' alone.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as ine_get_table or ine_search_operations. The agent must infer that this tool applies once a series code is already known.

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

ine_get_tableINE: get table dataB
Read-onlyIdempotent

Fetch the latest values of the series in an INE table.

NameRequiredDescriptionDefault
queryNoFilter series by name, e.g. 'nacional general'
last_nNoMost recent periods per series
table_idYesTable id from ine_list_tables, e.g. 50902
max_seriesNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so safety and repeat-call behavior are covered. The description adds only that it returns 'latest values' for series in a table, with no extra detail on rate limits, auth, or data freshness semantics.

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?

Single sentence, front-loaded with the verb and resource, with no filler. It is appropriately sized for a simple read tool.

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?

An output schema exists, so return values need not be described, and annotations cover the safety profile. However, the description omits when to choose this over ine_get_series and leaves max_series undocumented, making it incomplete for routing and full parameter interpretation.

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 description adds no parameter meaning; it does not explain query, last_n, table_id, or max_series. Schema coverage is 75% (query, last_n, and table_id are described; max_series is undocumented), so the schema does most of the work, but max_series remains unexplained anywhere.

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?

States a specific verb 'Fetch' and resource 'latest values of the series in an INE table,' which is more precise than the title alone. It distinguishes the table-oriented data retrieval from siblings like ine_list_tables or ine_get_series by scoping to series within a table, though it does not name alternatives explicitly.

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

Usage Guidelines2/5

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

No when-to-use guidance, no alternatives, and no exclusions are provided. The agent must infer that ine_list_tables supplies the table_id and that ine_get_series is for a different scope.

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

ine_list_tablesINE: list tables of an operationC
Read-onlyIdempotent

List the data tables published for an INE operation.

NameRequiredDescriptionDefault
limitNo
queryNoOptional words to filter table names
operationYesOperation code or id, e.g. 'IPC' or '25'

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, covering the safety profile, but the description adds nothing beyond them. It says nothing about result size, truncation, or how the default limit of 50 / maximum of 200 affects the listing.

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?

A single front-loaded sentence with no filler. It is efficient, though its brevity edges into under-specification rather than pure conciseness.

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?

An output schema exists, so return values need not be described, and the core purpose is conveyed. Still missing is the link to ine_search_operations for obtaining the required operation code and any note on how limit interacts with large result sets.

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 67%: query and operation are documented in the schema, while limit has no description anywhere. The description reinforces that results are scoped to an operation but adds no syntax, format, or pagination detail beyond the 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?

States a specific verb and resource ('List the data tables published for an INE operation'), which is unambiguous on its own. However it does not distinguish itself from siblings like ine_get_table or ine_get_series, so an agent must infer the boundary from the names alone.

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

Usage Guidelines2/5

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

There is no guidance on when to use this versus ine_get_table or ine_get_series, and no mention that the operation code typically comes from ine_search_operations. Usage is only implied by the tool name.

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

ine_search_operationsINE: search statistical operationsB
Read-onlyIdempotent

Find INE statistical operations (IPC, EPA, Índice de Precios de Vivienda...). Accent-insensitive.

NameRequiredDescriptionDefault
limitNo
queryNoWords to match, e.g. 'precios vivienda'

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/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 one genuinely useful behavioral fact — 'Accent-insensitive' matching — but says nothing about pagination, how the limit interacts with results, or match/ranking behavior.

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?

Two short sentences with zero filler, and the core action is front-loaded. It is terse to the point of omitting useful context, but nothing present is wasted.

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?

An output schema exists, so return-format explanation is not required. However, for a search tool with an undocumented 'limit' parameter, the description should say more about result volume/paging; accent-insensitivity alone is a thin addition.

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 only 50%: 'query' is documented in the schema with an example, but 'limit' has no description beyond default 25 / max 100. The description's operation examples (IPC, EPA) implicitly illustrate good query values, which partially compensates, landing at the baseline.

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?

States a specific verb ('Find') and resource ('INE statistical operations') and gives concrete examples (IPC, EPA, Índice de Precios de Vivienda) that make the domain unambiguous. It's clearly the discovery/search tool versus the retrieval siblings (ine_get_table, ine_get_series), though it never names them.

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

Usage Guidelines2/5

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

The description offers no when-to-use guidance, no prerequisites, and no mention of the sibling tools (ine_list_tables, ine_get_table) that an agent might pick instead. Usage is only inferable from the verb 'Find'.

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. 8 tool updatesv0.1.0
    • First observedboe_daily_summary
    • First observedcatastro_coordinates_from_reference
    • First observedcatastro_property_details
    • First observedcatastro_reference_from_coordinates
    • First observedine_get_series
    • First observedine_get_table
    • First observedine_list_tables
    • First observedine_search_operations

TDQS

A3.5/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct action and resource: INE tools progress from search to list to get, BOE is a single daily summary, and Catastro tools are complementary (coordinates↔reference plus property details). No two tools appear interchangeable.

Naming Consistency4/5

All names are snake_case with a consistent source prefix (ine_, boe_, catastro_). Within each source the patterns are predictable, but action styles differ across sources (verb_noun for INE, noun_from_noun for Catastro), a minor deviation from a single global convention.

Tool Count5/5

Eight tools for three data sources is well-scoped; each tool has a clear role and the set avoids both thinness and bloat.

Completeness3/5

While core retrieval is covered, there are notable gaps: BOE only offers a daily summary (no search or date range), INE lacks historical/metadata queries, and Catastro has no address-based search. These will limit some agent workflows.

Maintenance

ActivityNo data
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    MCP server for querying Spanish government open data APIs including grants, legislation, company registry, statistics, and open data catalog. Enables LLMs to access Spanish public information on-the-fly.
    26
    5
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Official cadastral parcels from 29 European countries for AI agents: by reference in 27 and by coordinates in all 29, plus address search, outlines, neighbours, SIGPAC enclosures, terrain, ground motion, solar and agricultural potential and investment scores. Remote server at https://mcp.parcelgps.com/mcp (nothing to install) or npm catastro-gps-mcp. Free key: 250 calls/month.
    9
    358 npm
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI clients to query Spain's official BDNS subsidy and grant listings and BOE open-data publications live, with exact counts, computed deadlines, forecast calendars, and literal PDF text of grant bases. It also surfaces BOE oposiciones and licitaciones, flagging uncertainty instead of inventing data.
    10
    68 npm
    MIT