Spain Open Data MCP
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., "@Spain Open Data MCPwhat was the CPI change in Spain each of the last 6 months?"
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.
Spain Open Data MCP
Give AI agents reliable access to Spanish public data: INE statistics, the BOE and the Catastro.
🇪🇸 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 |
| Find statistical operations (IPC, EPA, IPV…). Accent-insensitive. |
INE |
| List the tables of an operation. |
INE |
| Latest N values of the series in a table, filterable by series name. |
INE |
| Latest N values of one series. |
BOE |
| What the BOE published on a day, filterable by keyword and section, with HTML/PDF links. |
Catastro |
| Parcel and address at a point. On a street or square, the nearest parcels within ~50 m. |
Catastro |
| Address and coordinates of a cadastral reference. |
Catastro |
| 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-mcpClaude 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-mcpRemote (Streamable HTTP)
spain-open-data-mcp --transport streamable-http --host 0.0.0.0 --port 8000
# endpoint: http://localhost:8000/mcpArchitecture
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.pyonly 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.pyholds one sharedhttpxclient, timeouts, a 10-minute in-memory cache and readable errors.
Design decisions
The full records are in docs/adr.
Few, composable tools instead of one per endpoint. Fewer tools means better tool selection by the model. (ADR 0001)
The model controls output size. Every tool has
limit,last_norquery, and the defaults are small. Context is a budget. (ADR 0001)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)
Errors are part of the UX.
"Catastro: NO HAY NINGUNA PARCELA EN ESA UBICACION"lets the model recover. A stack trace doesn't.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-mcpThe 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 toolsboe_daily_summaryBOE: daily summaryARead-onlyIdempotent
List what the BOE published on a given day, with links to HTML and PDF.
| Name | Required | Description | Default |
|---|---|---|---|
| day | No | YYYY-MM-DD. Defaults to today in Madrid | |
| limit | No | ||
| query | No | Words that must appear in the title | |
| section | No | Filter by section name, e.g. 'Disposiciones generales' |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | Yes | |
| items | Yes | |
| returned | Yes | |
| total_items | Yes |
TDQS
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.
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.
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.
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.
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.
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 referenceBRead-onlyIdempotent
Get the address and coordinates of a cadastral reference.
| Name | Required | Description | Default |
|---|---|---|---|
| cadastral_reference | Yes | 14 or 20 character cadastral reference |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 detailsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| cadastral_reference | Yes | 14 or 20 character cadastral reference |
Output Schema
| Name | Required | Description |
|---|---|---|
| use | No | |
| kind | No | 'UR' urban or 'RU' rural |
| units | No | |
| address | No | |
| candidates | No | When the parcel holds several properties, their 20-char references |
| year_built | No | |
| built_area_m2 | No | |
| cadastral_reference | Yes |
TDQS
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.
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.
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.
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.
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.
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 coordinatesARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| latitude | Yes | WGS84 latitude | |
| longitude | Yes | WGS84 longitude |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 seriesCRead-onlyIdempotent
Fetch the latest values of a single INE series.
| Name | Required | Description | Default |
|---|---|---|---|
| last_n | No | ||
| series_code | Yes | Series code, e.g. 'IPC251852' |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | Yes | |
| name | Yes | |
| points | Yes |
TDQS
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.
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.
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.
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.
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.
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 dataBRead-onlyIdempotent
Fetch the latest values of the series in an INE table.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Filter series by name, e.g. 'nacional general' | |
| last_n | No | Most recent periods per series | |
| table_id | Yes | Table id from ine_list_tables, e.g. 50902 | |
| max_series | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 operationCRead-onlyIdempotent
List the data tables published for an INE operation.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | Optional words to filter table names | |
| operation | Yes | Operation code or id, e.g. 'IPC' or '25' |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 operationsBRead-onlyIdempotent
Find INE statistical operations (IPC, EPA, Índice de Precios de Vivienda...). Accent-insensitive.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | Words to match, e.g. 'precios vivienda' |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
8 tool updates
v0.1.0- First observed
boe_daily_summary - First observed
catastro_coordinates_from_reference - First observed
catastro_property_details - First observed
catastro_reference_from_coordinates - First observed
ine_get_series - First observed
ine_get_table - First observed
ine_list_tables - First observed
ine_search_operations
TDQS
Scored across 8 tools
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.
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.
Eight tools for three data sources is well-scoped; each tool has a clear role and the set avoids both thinness and bloat.
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
Related MCP Connectors
Search Spain's BOE/BORME gazettes, open EU funding calls and EU TED tenders. Keyless sources.
AI legal copilot for foreigners in Spain: immigration and housing rental, cited to Spanish law.
Data and tools for your AI agent: company, people, SEO, social and EU register data. Pay per call.
Web scraping, Google SERP, Markdown and ChatGPT/Gemini answers as typed tools for AI agents.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP 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.265MIT
- AlicenseBqualityBmaintenanceEnables LLMs like Claude to query the official Spanish BOE API for consolidated legislation, daily summaries, and auxiliary government tables.3159MIT
- AlicenseAqualityCmaintenanceOfficial 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.9358 npm1MIT
- AlicenseAqualityBmaintenanceEnables 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.1068 npmMIT