es-eli-mcp
Click on "Install 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., "@es-eli-mcpget the consolidated text of BOE-A-2018-16673"
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.
es-eli-mcp
Install (one command)
Published on PyPI + MCP Registry (io.github.matematicsolutions/es-eli-mcp). Run without cloning:
uvx es-eli-mcpConfigure your MCP client (stdio):
{ "mcpServers": { "es-eli-mcp": { "command": "uvx", "args": ["es-eli-mcp"] } } }Windows 11 with Smart App Control
Smart App Control blocks unsigned executables, which covers uvx.exe, pip.exe
and the es-eli-mcp.exe launcher that pip writes at install time. The python.exe and
py.exe from the python.org installer are signed by the Python Software
Foundation, so running the module through the interpreter works:
python -m pip install es-eli-mcp
python -m es_eli_mcppip.exe is blocked for the same reason, so install with python -m pip, not
pip install. If python is not on PATH, use the Windows launcher: py -3 -m es_eli_mcp.
{ "mcpServers": { "es-eli-mcp": { "command": "python", "args": ["-m", "es_eli_mcp"] } } }Do not turn Smart App Control off to work around this - it cannot be re-enabled without reinstalling Windows.
Building from source: see Install.
An MCP server for five Spanish open-data sources:
BOE (Boletin Oficial del Estado) open-data API - consolidated legislation. Given a BOE id or a date in the official gazette, returns metadata, structure and full consolidated text, with verifiable ELI identifiers and Spanish citations.
Tribunal Constitucional (Sistema HJ /
hj.tribunalconstitucional.es) - Spain's Constitutional Court case law (Sentencias / Autos / Declaraciones). Given an internal resolution id, or a citation number+year (e.g. "STC 31/2010"), returns the full ruling with ECLI and a Spanish doctrinal citation.DGT (Direccion General de Tributos,
petete.tributos.hacienda.gob.es) - binding tax rulings: ~69,500 consultas vinculantes + ~19,700 consultas generales (live-counted 2026-07-08). Full-text/date search plus the full ruling text by NUM-CONSULTA (e.g. "V0001-25").TEAC (Tribunales Economico-Administrativos, DYCTEA) - ~6,500 doctrine criterios with the full resolution text inline, searched by RG claim-number segments and/or date range.
AEPD (Agencia Espanola de Proteccion de Datos) - ~46,800 data-protection resolutions with Solr full-text search and a verified PDF permalink per expediente (e.g. "PS-00615-2025").
Part of the MateMatic eu-legal-mcp production line - after PL, DE and AT. Same citation
contract pattern, five Spanish sources.
Free-text search exists on DGT and AEPD only. The BOE open-data keyword-search endpoint (
/legislacion-consolidada) currently returns a server-side error; the Tribunal Constitucional site only supports structured search (citation number+year, ECLI, magistrado, materia); DYCTEA accepts text-looking parameters but silently ignores them (verified live). Discover BOE documents viaes_browse_gazette(by date) or a known BOE id / ELI; TC rulings viaes_search_constitutional; TEAC criterios via RG segments or dates. Every response carries adataset_note.Licence. Both sources are official public information published as Spanish PSI (public-sector information) open data; reuse presumes acceptance of the respective reuse conditions. This connector relays that public content with attribution and a
source_url.
Related MCP server: Spanish Public Data MCP
The tools
Tool | What it does |
| List documents published in the BOE on a date ( |
| Metadata for a BOE id (eli_uri, official |
| The block index (articles, titles) of a consolidated law. |
| Consolidated text (XML), whole or by block. |
| Tribunal Constitucional ruling by internal resolution id. |
| Resolve a citation (numero+anno, e.g. 31/2010) to the full TC ruling. |
| Full-text/date search over DGT consultas (vinculantes or generales). |
| Full DGT ruling (facts, question, normativa, answer) by NUM-CONSULTA. |
| TEAC criterios by RG segments and/or resolution-date range. |
| Full TEAC criterio + resolution text by DYCTEA id. |
| Full-text/date search over AEPD resolutions. |
| AEPD resolution + verified full-text PDF permalink by expediente. |
| Declare what this connector covers, when each family was captured, and - explicitly - what it does NOT cover. Every gap carries a fallback. |
Every BOE response carries the contract: eli_uri (a full ELI URL, e.g.
https://www.boe.es/eli/es/lo/2018/12/05/3), human_readable_citation (the official
titulo), and source_url.
Every Tribunal Constitucional response carries: ecli (e.g. ECLI:ES:TC:2010:31 - TC case law
has no ELI, ELI covers legislation only), human_readable_citation (Spanish doctrinal
convention, e.g. "STC 31/2010, de 28 de junio"), and source_url.
Install
cd es-eli-mcp
pip install -e .Configure (Claude Code / any MCP client)
{
"mcpServers": {
"es-eli-mcp": { "command": "es-eli-mcp" }
}
}Environment:
ES_ELI_BASE_URL- defaulthttps://www.boe.es/datosabiertos/apiES_ELI_TC_BASE_URL- defaulthttps://hj.tribunalconstitucional.esES_ELI_DGT_BASE_URL- defaulthttps://petete.tributos.hacienda.gob.esES_ELI_TEAC_BASE_URL- defaulthttps://serviciostelematicosext.hacienda.gob.es/TEAC/DYCTEAES_ELI_AEPD_BASE_URL- defaulthttps://www.aepd.esES_ELI_CACHE_DIR- default~/.matematic/cache/es-eliES_ELI_AUDIT_DIR- default~/.matematic/audit
No API key. All five sources are keyless.
Governance
Public data only - read-only against the five official sources; no client data leaves the machine.
Audit log - every tool call appends one JSON line to
~/.matematic/audit/es-eli-mcp.jsonl.Vendor-neutral - talks only to the official
*.boe.es/*.tribunalconstitucional.es/*.hacienda.gob.es/*.aepd.eshosts; no LLM provider, no telemetry.Verifiable citations - every response is independently checkable via
source_url.
See CONSTITUTION.md and DISCOVERY.md.
Tests
pip install -e ".[dev]"
pytest tests/ --ignore=tests/test_smoke.py -v # offline (fixtures)
pytest tests/test_smoke.py -v # hits live BOE + TC + DGT + TEAC + AEPDLicence
Apache-2.0. © Matematic Solutions / Wieslaw Mazur.
Available Tools
13 toolses_browse_gazetteARead-onlyIdempotent
List documents published in the official BOE gazette on a date.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | the publication date as ``YYYYMMDD`` (e.g. ``"20181206"``). |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | Yes | |
| items | No | |
| total | Yes | |
| dataset_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds the date scoping but no additional behavioral traits like pagination, limits, or error conditions. It is consistent with annotations and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or repetition. Every word contributes to the purpose, making it highly concise and efficiently structured.
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 simple listing tool with one parameter and an output schema, the description is complete. It specifies what is listed (documents in the BOE gazette) and the condition (on a date), while the output schema and annotations cover return structure and safety. No additional explanation is needed.
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 input schema fully describes the single 'date' parameter with format and example, so schema coverage is 100%. The description adds no new semantic detail beyond referencing 'on a date', which aligns with the parameter but does not enhance or clarify further. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'documents published in the official BOE gazette on a date', making the scope and action unambiguous. It distinguishes itself from sibling tools like es_get_act or es_search_tax_rulings by focusing on browsing all documents for a given date.
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 (browse documents by date) but does not explicitly state when to use this tool over siblings or provide exclusions. There is no mention of alternatives, such as 'use es_get_act to retrieve a specific document'. The context is clear but not explicit about decision boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
es_coverageARead-onlyIdempotent
Declare what this connector covers, how it is sourced, and what it does NOT cover.
Call this before telling a user that the law "does not contain" something, and whenever a search comes back empty: the absence may be a gap in this connector rather than in the law. Every gap carries a fallback saying where to look instead.
Returns:
Coverage with families, an as-of note, and a non-empty list of known gaps.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| families | No | |
| as_of_note | Yes | States what the dates mean, and what they do not promise. |
| known_gaps | No | Never empty. An empty list would mean 'not checked', not 'no gaps'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey read-only, idempotent, and open-world behavior. The description adds meaningful context beyond annotations by explaining that empty searches may indicate connector gaps rather than legal absence, and that gaps include fallback pointers. This is useful interpretive behavior not otherwise stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: first sentence states purpose, second provides when-to-call guidance, third summarizes the return value. Every sentence adds necessary information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters and an output schema, the description is fully sufficient. It covers the tool's purpose, invocation timing, gap semantics, fallback behavior, and high-level return structure, leaving no important decision context 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?
The tool has zero parameters, so parameter semantics are not applicable; the score reflects the baseline for 0-parameter tools. The description sensibly focuses on the return content instead, mentioning families, an as-of note, and a non-empty list of gaps.
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 purpose: declare what the connector covers, how it is sourced, and what it does not cover. It is clearly distinguished from the get/search/browse sibling tools by being a coverage-metadata tool rather than a document retrieval tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit, actionable usage guidance: call this before telling a user the law 'does not contain' something, and whenever a search returns empty. It also explains the reasoning—absence may reflect a connector gap rather than the law—and notes that every gap carries a fallback.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
es_get_actARead-onlyIdempotent
Fetch consolidated-law metadata from BOE by id.
| Name | Required | Description | Default |
|---|---|---|---|
| boe_id | Yes | a BOE identifier, e.g. ``"BOE-A-2018-16673"``. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| rango | No | |
| titulo | No | |
| eli_uri | No | |
| source_url | No | |
| dataset_note | No | |
| departamento | No | |
| numero_oficial | No | |
| fecha_disposicion | No | |
| fecha_publicacion | No | |
| estado_consolidacion | No | |
| human_readable_citation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the key behavioral distinction that this tool returns 'metadata' (not the full legal text), which sets expectations for what the agent receives. It does not describe error handling or return format, but the output schema exists, so the description need not cover those.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no fluff. It immediately states the verb and object, making it easy to scan. Every word contributes to the meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple read-only lookup by ID. The description clearly states the purpose and scope, the schema documents the parameter, annotations cover safety, and an output schema exists. There are no complex side effects or hidden requirements, so the description is fully complete for an agent to select and invoke the tool.
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 input schema has one parameter (boe_id) with a clear example (e.g., 'BOE-A-2018-16673'), and schema description coverage is 100%. The tool description only says 'by id', which adds no semantic detail beyond what the schema already provides. A baseline score of 3 is appropriate because the schema fully documents the parameter.
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 is precise: 'Fetch consolidated-law metadata from BOE by id.' It specifies a clear verb ('Fetch'), a specific resource ('consolidated-law metadata from BOE'), and a lookup method ('by id'). This differentiates it from sibling tools like es_get_text (which likely retrieves full text) and es_browse_gazette (which likely browses the gazette).
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 that the tool should be used when you have a BOE identifier and need metadata for a consolidated law, but it does not explicitly contrast it with alternatives (e.g., 'for full text, use es_get_text'). There are no stated exclusions or when-not-to-use conditions, so the guidance remains implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
es_get_aepd_resolutionARead-onlyIdempotent
Resolve an AEPD expediente number to its resolution and full-text PDF permalink.
| Name | Required | Description | Default |
|---|---|---|---|
| expediente | Yes | the AEPD procedure number, e.g. ``"PS-00615-2025"`` (PS = sanciones, PD = derechos, AI = actuaciones de investigacion). |
Output Schema
| Name | Required | Description |
|---|---|---|
| pdf_url | No | |
| snippet | No | |
| expediente | Yes | |
| source_url | No | |
| fecha_firma | No | |
| dataset_note | No | |
| human_readable_citation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnly, idempotent, and non-destructive behavior, lowering the bar. The description adds that the tool returns a resolution and PDF permalink, but provides no additional context such as error handling, rate limits, or behavior when the number is invalid. This is acceptable but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that states the action and the expected output. No wasted words or information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple one-parameter input, clear schema, presence of an output schema, and strong annotations, the description is nearly complete. A small gap is the lack of explicit usage guidance relative to the sibling search tool, but overall the tool is well-specified.
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 input schema has 100% parameter description coverage, so the baseline is 3. The description adds no extra meaning beyond what the schema already provides for the 'expediente' parameter.
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 uses a specific verb ('Resolve') and clearly identifies the resource ('AEPD expediente number') and the outcome ('its resolution and full-text PDF permalink'). This distinguishes the direct-lookup tool from its sibling search tool (es_search_aepd_resolutions).
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 the tool is used when you already have a specific expediente number, which is clear context. However, it does not explicitly mention alternatives or exclude search-based workflows, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
es_get_constitutional_rulingARead-onlyIdempotent
Fetch a Tribunal Constitucional ruling (Sentencia/Auto/Declaracion) by internal id.
| Name | Required | Description | Default |
|---|---|---|---|
| resolution_id | Yes | the internal Sistema HJ sequential id (e.g. ``"6670"`` for STC 31/2010). Get this id either from ``es_search_constitutional`` or from a hyperlink inside another ruling's text (``.../Resolucion/Show/{id}``). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| ecli | No | |
| sala | No | |
| tipo | No | |
| fallo | No | |
| source_url | No | |
| dataset_note | No | |
| encabezamiento | No | |
| human_readable_citation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds context about the internal id system and ruling types, but no additional behavioral traits such as side effects, permissions, or limitations beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant information. It is appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (one parameter), rich annotations, and existing output schema, the description provides sufficient context for an agent to select and invoke the tool correctly. The essential facts—what it fetches and how—are present.
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%, with the parameter description already explaining what resolution_id is, how to obtain it, and including an example. The tool description adds no parameter-level meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Fetch'), the specific resource ('Tribunal Constitucional ruling'), and the distinguishing method ('by internal id'). It also specifies the ruling types (Sentencia/Auto/Declaracion), which differentiates it from sibling getter tools for other jurisdictions or document types.
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 when an internal id is available, but it does not explicitly name alternatives or when-not-to-use. The parameter description provides further guidance on obtaining the id, but the main description lacks direct contrasting with sibling search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
es_get_indexARead-onlyIdempotent
List the block index (articles, titles) of a consolidated law.
| Name | Required | Description | Default |
|---|---|---|---|
| boe_id | Yes | a BOE identifier, e.g. ``"BOE-A-2018-16673"``. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| blocks | No | |
| dataset_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is well covered. The description adds a modest behavioral constraint by specifying that the tool expects a 'consolidated law' and returns articles/titles, but it does not disclose any operational behaviors such as pagination, error handling, or special cases, which would be valuable beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundancy or filler. It directly states the tool's function in minimal space, making it highly efficient and easy to parse.
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 simple one-parameter tool with strong annotations and an output schema, the description sufficiently conveys the core purpose. However, terms like 'consolidated law' and 'block index' are left undefined, and there is no mention of edge cases or return value semantics beyond the schema, so it is not fully complete for an agent unfamiliar with the legal domain.
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 input schema fully documents the sole parameter boe_id with an example, achieving 100% schema description coverage. The description contributes no additional parameter-level detail, so the baseline score of 3 is appropriate given the schema's completeness.
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 uses the specific verb 'list' and identifies the resource as 'block index (articles, titles)' of a 'consolidated law', which clearly distinguishes it from sibling tools like es_get_text or es_get_act. The parenthetical clarifies the content of the index, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives like es_get_text or es_get_act, nor does it mention exclusions or prerequisites. The only implied usage is derived from the purpose statement itself, offering essentially no strategic direction for an agent deciding between tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
es_get_tax_rulingARead-onlyIdempotent
Fetch a full DGT tax ruling by its official number.
| Name | Required | Description | Default |
|---|---|---|---|
| numero_consulta | Yes | the official NUM-CONSULTA, e.g. ``"V0001-25"`` (vinculante) or ``"0001-03"`` (general). |
Output Schema
| Name | Required | Description |
|---|---|---|
| organo | No | |
| normativa | No | |
| source_url | No | |
| contestacion | No | |
| dataset_note | No | |
| fecha_salida | No | |
| num_consulta | No | |
| cuestion_planteada | No | |
| descripcion_hechos | No | |
| human_readable_citation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds 'full' to indicate completeness, but no further behavioral context (e.g., pagination, error cases) is provided. This is adequate given annotation coverage.
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 that communicates the essential purpose without unnecessary words. It is appropriately concise and well structured.
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?
This is a simple one-parameter tool with an output schema present, so return values are already documented. The description sufficiently identifies the input and the nature of the output ('full ruling'). No additional context is needed 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 100%, with the parameter description including format examples ('V0001-25' and '0001-03'). The tool description does not add additional parameter semantics beyond what the schema already provides, so the baseline of 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?
The description uses a specific verb ('Fetch') and resource ('full DGT tax ruling') with the key input ('official number'). It clearly distinguishes from sibling 'get' tools by specifying DGT tax rulings as opposed to constitutional rulings or TEAC criteria.
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 that the tool requires an official number, which suggests prior search usage, but it does not explicitly state when to use this tool versus alternatives or mention any exclusions. The context is clear but lacks explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
es_get_teac_criterioARead-onlyIdempotent
Fetch one TEAC criterio (with the full resolution text) by its DYCTEA id.
| Name | Required | Description | Default |
|---|---|---|---|
| criterio_id | Yes | the DYCTEA id from ``es_search_teac_doctrine``, e.g. ``"00/07082/2025/00/0/1"``. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rg | No | |
| asunto | No | |
| criterio | No | |
| source_url | No | |
| criterio_id | Yes | |
| calificacion | No | |
| dataset_note | No | |
| fecha_resolucion | No | |
| texto_resolucion | No | |
| unidad_resolutoria | No | |
| referencias_normativas | No | |
| human_readable_citation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only and idempotent, which the description's 'Fetch' aligns with. The description adds that the response includes the 'full resolution text,' which is useful but also covered by the output schema. No extra behavioral context (e.g., errors, pagination) is provided, so a mid-range score is appropriate.
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 delivers all essential information without any filler. Every word contributes to understanding the tool's purpose, making it an exemplary concise description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple get-by-id operation, the presence of a full output schema, and strong annotations, the description is sufficient. It correctly identifies the tool's purpose and key identifier, and no critical operational details are 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?
The schema description for 'criterio_id' is thorough, explaining the source (es_search_teac_doctrine) and providing an example format, giving 100% coverage. The tool description itself merely restates 'by its DYCTEA id,' adding no further semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Fetch'), the resource ('one TEAC criterio'), and the distinguishing scope ('with the full resolution text', 'by its DYCTEA id'). This differentiates it from sibling get-tools that target other document types, making the purpose unambiguous.
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 the tool is used when you have a specific DYCTEA id, and the schema explicitly references es_search_teac_doctrine as the source of that id, providing clear context. However, it does not explicitly name alternatives or exclusions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
es_get_textARead-onlyIdempotent
Fetch the consolidated text (XML) of a law, whole or by block.
| Name | Required | Description | Default |
|---|---|---|---|
| boe_id | Yes | a BOE identifier, e.g. ``"BOE-A-2018-16673"``. | |
| block_id | No | optional block id from ``es_get_index`` (e.g. ``"a1"`` for Articulo 1). Omit for the full consolidated text (can be large). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| format | No | |
| content | No | |
| eli_uri | No | |
| block_id | No | |
| byte_size | No | |
| source_url | No | |
| content_type | No | |
| dataset_note | No | |
| human_readable_citation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior, and the description complements them by specifying the output format (XML) and the ability to fetch whole or by block. It does not add details like rate limits or auth, but the bar is lower given the existing annotations and the simple nature of the operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that efficiently communicates the core function and scope. No unnecessary words or repetition of schema/annotation information, making it an exemplar of concise writing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool with 2 parameters and an existing output schema, the description provides sufficient context. It clarifies the return format (XML) and the optional block scope, which complements the schema. A higher score would require more explicit context such as size warnings, but these are not essential for this straightforward read operation.
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 schema provides full coverage (100%) with clear descriptions for both boe_id and block_id, including an example and guidance on omitting block_id. The description adds no additional parameter semantics, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches the consolidated text (XML) of a law, with the option for whole or by block. This verb+resource combination is specific and distinguishes it from siblings like es_get_index (which likely provides block identifiers) and es_get_act (which may handle different act data).
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 the tool is used to retrieve law text, but it does not explicitly state when to use this over alternatives like es_get_index or es_get_act. The schema mentions block_id from es_get_index, hinting at a workflow, but the description itself lacks direct guidance on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
es_search_aepd_resolutionsARead-onlyIdempotent
Search AEPD (Spanish DPA) resolutions by full text and/or signature date.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based results page (10 hits per page). | |
| texto | No | full-text query (Solr), e.g. ``"videovigilancia"`` - an expediente number also works as an exact query. | |
| fecha_desde | No | earliest signature date, ``dd/mm/aaaa``. | |
| fecha_hasta | No | latest signature date, ``dd/mm/aaaa``. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| items | No | |
| total | Yes | |
| dataset_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive, so the safety profile is covered. The description adds the functional scoping (full text/date) but does not add behavioral traits like pagination behavior, rate limits, or response format beyond what the schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler words. It conveys the essential information efficiently.
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 search tool with full schema coverage, good annotations, and an output schema, the one-sentence description is adequate to understand its purpose. It could add examples of expediente-number queries or clarify behavior with no filters, but these are already covered by the schema descriptions, so no critical gaps exist.
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%, with each parameter (page, texto, fecha_desde, fecha_hasta) already described in detail. The tool description adds no parameter-specific meaning, 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?
The description clearly states a specific verb ('Search'), a specific resource ('AEPD resolutions'), and the search dimensions ('by full text and/or signature date'), which distinguishes it from sibling tools like es_get_aepd_resolution (retrieval) and es_search_constitutional (different authority).
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 (use when searching by text or date) but does not explicitly state when not to use it or name alternatives. The distinction from es_get_aepd_resolution is implicit through the verb 'search' versus 'get', but no alternative guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
es_search_constitutionalARead-onlyIdempotent
Resolve a Tribunal Constitucional citation (number + year) to the full ruling.
| Name | Required | Description | Default |
|---|---|---|---|
| anno | Yes | the citation year, e.g. ``"2010"``. | |
| tipo | No | one of ``"SENTENCIA"`` (default, -> STC), ``"AUTO"`` (-> ATC), or ``"DECLARACION"`` (-> DTC). | SENTENCIA |
| numero | Yes | the citation number, e.g. ``"31"`` for "STC 31/2010". |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| ecli | No | |
| sala | No | |
| tipo | No | |
| fallo | No | |
| source_url | No | |
| dataset_note | No | |
| encabezamiento | No | |
| human_readable_citation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description does not need to repeat that. The term 'resolve' suggests a deterministic lookup, but no additional behavioral context (e.g., error handling, authentication needs, or rate limits) is provided. This is acceptable given the strong annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence that is front-loaded with the primary action and resource. It contains no filler and communicates the core function efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple, low-complexity lookup. The input schema and annotations fully cover safety and parameter semantics, and the presence of an output schema means return values are already documented. The concise description adequately covers the tool's purpose without needing additional elaboration.
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% and each parameter has a clear description. The description mentions 'number + year' but does not add meaning for the optional 'tipo' parameter or go beyond what the schema already provides. The baseline of 3 applies because the schema carries the full explanatory burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('resolve') on a specific resource (Tribunal Constitucional citation) with the outcome being the full ruling. However, it does not distinguish this tool from the sibling 'es_get_constitutional_ruling', which likely serves a similar purpose, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used when the user has a citation number and year, but it provides no explicit guidance on when to prefer this tool over siblings like 'es_get_constitutional_ruling' or other search tools. There are no exclusions or alternative scenarios mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
es_search_tax_rulingsARead-onlyIdempotent
Search DGT tax rulings (consultas tributarias) by free text and/or date.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based results page (20 hits per page). | |
| texto | No | free-text query over the ruling corpus (e.g. ``"aerotermia"``). | |
| database | No | ``"vinculantes"`` (default, V-numbers, binding) or ``"generales"``. | vinculantes |
| fecha_desde | No | earliest ``fecha salida``, ``dd/mm/aaaa``. | |
| fecha_hasta | No | latest ``fecha salida``, ``dd/mm/aaaa`` (requires fecha_desde). |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| items | No | |
| total | Yes | |
| database | Yes | |
| total_pages | Yes | |
| dataset_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds no extra behavioral context beyond the search criteria; it does not mention pagination, result limits, or any caveats. This is acceptable given the annotations but not particularly rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that directly states the action, resource, and search criteria. Every word earns its place; there is no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with 5 optional parameters, a full output schema, and rich annotations, the description is minimally sufficient. It names the resource and criteria, while the schema and annotations handle the rest. Slightly more context (e.g., that this is for Spanish tax agency rulings) could improve it, but it is not incomplete.
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 descriptions cover 100% of parameters, each with meaningful detail (e.g., 'free-text query over the ruling corpus', 'earliest fecha salida, dd/mm/aaaa'). The tool description adds no semantic value beyond the schema, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Search'), a specific resource ('DGT tax rulings (consultas tributarias)'), and search criteria ('by free text and/or date'). This distinguishes it from sibling tools like es_search_teac_doctrine or es_get_tax_ruling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on what is searched (DGT tax rulings) and the two search dimensions (free text and date). It implicitly indicates that this tool is for searching rather than retrieving a specific ruling, but it does not explicitly mention alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
es_search_teac_doctrineARead-onlyIdempotent
Search TEAC doctrine (DYCTEA criterios) by RG segments and/or date range.
| Name | Required | Description | Default |
|---|---|---|---|
| anno | No | RG year segment, e.g. ``"2025"``. | |
| page | No | 1-based results page (10 hits per page, portal caps display at 100). | |
| sede | No | RG sede segment, e.g. ``"00"`` (TEAC) - first part of RG 00/07082/2025. | |
| numero | No | RG claim number segment, e.g. ``"07082"``. | |
| fecha_desde | No | earliest resolution date, ``dd/mm/aaaa``. | |
| fecha_hasta | No | latest resolution date, ``dd/mm/aaaa``. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| items | No | |
| total | Yes | |
| dataset_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, open-world, and idempotent, so the description does not need to repeat those. It adds context that the target is 'DYCTEA criterios', but does not disclose behavioral details such as result limits, pagination behavior, or handling of no matches. With strong annotations, the added value is moderate, so a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, information-dense sentence. It front-loads the primary purpose and covers the key dimensions without any redundant wording or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (6 optional parameters, output schema provided, and strong annotations), the description is minimally sufficient. It tells the agent what the tool searches for and by what criteria, but lacks guidance on edge cases, result formatting, and how it relates to sibling tools. The output schema presumably covers return values, so this score reflects only what the description itself contributes.
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 schema covers all parameters with descriptions (100% coverage), but the description adds conceptual grouping by stating 'RG segments and/or date range', clarifying that 'anno', 'sede', and 'numero' are RG segments while 'fecha_desde' and 'fecha_hasta' are date filters. This helps the agent quickly map the parameters to the stated search dimensions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Search') and resource ('TEAC doctrine (DYCTEA criterios)'), and specifies the search dimensions ('by RG segments and/or date range'). It distinguishes itself from sibling 'get' tools by indicating a search operation rather than retrieval of a single item.
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 explicit guidance is given on when to use this tool versus alternatives. It does not name sibling tools like 'es_get_teac_criterio' or 'es_search_tax_rulings', nor does it state when not to use it (e.g., when a specific criterio ID is known). The intended usage is only implied by the word 'Search'.
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. Dates show when Glama detected each change.
1 tool update
v0.5.3- Added
es_coverage
12 tool updates
v0.4.1- First observed
es_browse_gazette - First observed
es_get_act - First observed
es_get_aepd_resolution - First observed
es_get_constitutional_ruling - First observed
es_get_index - First observed
es_get_tax_ruling - First observed
es_get_teac_criterio - First observed
es_get_text - First observed
es_search_aepd_resolutions - First observed
es_search_constitutional - First observed
es_search_tax_rulings - First observed
es_search_teac_doctrine
TDQS
Most tools follow a clear search/get pair per legal source, but es_get_act and es_get_text could be momentarily confused (metadata vs. full text). Overall each tool targets a distinct resource/action, so mis-selection risk is low.
All tools share the es_ prefix and use a consistent verb_resource structure (es_get_*, es_search_*, es_browse_gazette, es_coverage). The naming pattern is uniform across all 13 tools.
13 tools is well-scoped for a multi-source legal connector covering BOE, TC, DGT, TEAC, and AEPD. Each tool earns its place and the count is neither thin nor bloated.
Each legal domain has both a search/resolution and a fetch tool, and BOE laws have metadata/index/text retrieval. Minor gaps like no free-text law search or direct gazette document fetch exist but are workable via browse and coverage fallbacks.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for Brazilian Federal Senate open data (legislative, administrative, e-Cidadania).
MCP server for French (BOAMP) + EU (TED) public procurement data via TenderAPI.
An MCP server that provides congressional transcripts
This MCP server provides seamless access to Malaysia's government open data, including datasets, w…
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for accessing Uruguay's IMPO open data API with SQLite caching. Provides tools to retrieve legal norms, search regulations, and access schema documentation from Uruguay's official legal database.4MIT
- 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
- AlicenseNot gradedqualityDmaintenanceA community-maintained MCP server that simplifies access to EU legal and legislative data from the CELLAR service, supporting lookups, metadata retrieval, relation checks, and monitoring.1MIT
- AlicenseAqualityAmaintenanceMCP server for the Brazilian Chamber of Deputies open-data API, enabling search and retrieval of federal legislative bills and their status.151Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/matematicsolutions/es-eli-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server