Skip to main content
Glama
ATO097
by ATO097

MCP-BOJA · Normativa de la Junta de Andalucía

Servidor MCP para que Claude (Desktop o Code) y otros clientes MCP consulten la normativa de la Junta de Andalucía publicada en el BOJA: leyes, decretos, decretos-ley, órdenes, resoluciones, etc.

Usa los datos abiertos de la Junta (dataset «Normativa de la Junta de Andalucía», licencia CC BY 4.0). No necesita clave ni registro.

Herramientas

Herramienta

Qué hace

buscar_normativa

Busca por palabras del título, rango, organismo, suborganismo, tema, subtema y rango de fechas. Sin distinguir mayúsculas ni tildes, con paginación.

obtener_norma

Ficha completa de una norma por su id.

leer_texto_boja

Texto íntegro de la disposición (página del BOJA o PDF), paginado, con el enlace al PDF oficial.

listar_valores_filtro

Rangos, organismos, suborganismos, temas y subtemas existentes.

contar_normas

Número total de normas del catálogo.

Ejemplos de preguntas a Claude:

  • «¿Qué decretos sobre viviendas turísticas ha aprobado la Junta?»

  • «Lista las normas publicadas en el BOJA en octubre de 2026.»

  • «Resume la Ley 13/2011 del Turismo de Andalucía.»

  • «¿Qué órdenes ha publicado la Consejería de Hacienda este año?»

Related MCP server: boe-mcp

Instalación

Requisitos: Windows, macOS o Linux con conexión a internet. El instalador usa uv (gestor de Python) y lo instala si falta. No hace falta tener Python instalado.

Windows (desde el ZIP)

  1. Entra en la última versión, descarga Source code (zip) (en el apartado Assets) y descomprímelo en cualquier carpeta. Se crea una carpeta mcp_boja-<versión>.

  2. Haz doble clic en instalar.bat.

  3. Reinicia Claude Desktop (ciérralo también desde el icono de la bandeja del sistema).

El instalador:

  1. instala el servidor con uv tool install (queda en %USERPROFILE%\.local\bin\mcp-boja.exe),

  2. lo añade a claude_desktop_config.json (guardando antes una copia .bak),

  3. lo registra en Claude Code si el comando claude está disponible.

Opciones: instalar.bat --solo-desktop o instalar.bat --solo-code.

macOS / Linux

sh instalar.sh

Directamente desde GitHub (sin ZIP)

uv tool install git+https://github.com/ATO097/mcp_boja
mcp-boja-configurar

Configuración manual

Si prefieres no usar el configurador, añade esto a claude_desktop_config.json (Claude Desktop → Configuración → Desarrollador → Editar configuración):

{
  "mcpServers": {
    "normativa-andalucia": {
      "command": "C:\\Users\\TU_USUARIO\\.local\\bin\\mcp-boja.exe"
    }
  }
}

En Claude Code:

claude mcp add -s user normativa-andalucia -- mcp-boja

Sin instalar nada de forma permanente (útil para probar):

"normativa-andalucia": {
  "command": "uvx",
  "args": ["--from", "git+https://github.com/ATO097/mcp_boja", "mcp-boja"]
}

Actualizar y desinstalar

  • Actualizar: descomprime la versión nueva y vuelve a ejecutar instalar.bat.

  • Desinstalar: desinstalar.bat (quita el registro de Claude y el programa).

Desarrollo

uv sync
uv run mcp-boja                    # servidor por stdio
uv run python tests/prueba_cliente.py   # prueba de extremo a extremo contra la API real
uv run mcp dev src/mcp_boja/server.py   # MCP Inspector

Notas sobre la API de la Junta

  • GET /search distingue mayúsculas y tildes, solo busca la frase exacta en el título y responde 400 cuando no hay resultados. Por eso el servidor descarga el catálogo completo (/all, unos 3 MB, regenerado a diario), lo guarda en memoria 3 horas y busca en local. Si falla la descarga, recurre a /search.

  • Los filtros de /search exigen el valor exacto (o - para no filtrar).

  • El texto de leer_texto_boja sale de la web del BOJA, que puede omitir imágenes o tablas. La versión auténtica es el PDF firmado (pdf_oficial).

Licencia

Código bajo licencia MIT. Datos: © Junta de Andalucía, licencia CC BY 4.0.

Available Tools

5 tools
buscar_normativaA

Busca normas de la Junta de Andalucía publicadas en el BOJA.

Ningún filtro distingue mayúsculas ni tildes, y todos admiten parte del nombre. Sin filtros devuelve las normas más recientes.

Args: texto: palabras que deben aparecer todas en el título, en cualquier orden y sin importar género o número (p. ej. "vivienda turistica"). rango: tipo de norma: "Ley", "Decreto", "Decreto-ley", "Orden", "Resolución", "Acuerdo", "Corrección de errores"... organismo: consejería u organismo (p. ej. "Hacienda", "Servicio Andaluz de Salud"). suborganismo: órgano dependiente (p. ej. "Dirección General de Presupuestos"). tema: tema (p. ej. "Medio ambiente"). subtema: subtema (p. ej. "Becas"). desde_fecha: fecha de publicación mínima, formato AAAA-MM-DD. hasta_fecha: fecha de publicación máxima, formato AAAA-MM-DD. orden: campo de ordenación. ascendente: True para orden ascendente (por defecto, lo más reciente primero). limite: número de resultados a devolver (1-100). saltar: resultados a omitir, para paginar (usa el valor siguiente_saltar).

ParametersJSON Schema
NameRequiredDescriptionDefault
temaNo
ordenNofecha_publicacion
rangoNo
textoNo
limiteNo
saltarNo
subtemaNo
organismoNo
ascendenteNo
desde_fechaNo
hasta_fechaNo
suborganismoNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does reasonably well: it discloses that filters are case/accent insensitive, accept partial names, require all terms to be present, and that an empty filter set returns the most recent norms. It omits any note on result volume limits or upstream source behavior, but the observable call semantics are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and global filter behavior are front-loaded before the Args list, and each param line is terse and example-driven rather than padded. Length is justified by 12 parameters, though the bullet-per-argument style is slightly verbose.

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

Completeness5/5

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

For a 12-parameter search tool with 0% schema coverage, the description supplies everything needed to invoke it correctly, and the existence of an output schema removes any obligation to document return values. Sibling differentiation is the only thin spot, which is a usage rather than a completeness gap.

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

Parameters5/5

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

Schema description coverage is 0%, yet the Args block documents all 12 parameters with types, formats (AAAA-MM-DD), ranges (limite 1-100), defaults (ascendente false, most recent first), examples for the taxonomy filters, and pagination semantics for saltar. This fully compensates for the schema's lack of descriptions.

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

Purpose4/5

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

The opening sentence states a specific verb (Busca) and resource (normas de la Junta de Andalucía publicadas en el BOJA), making the tool's scope unambiguous. It does not, however, explicitly distinguish itself from siblings like contar_normas or obtener_norma, so an agent must infer the boundary from the verb alone.

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

Usage Guidelines3/5

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

"Sin filtros devuelve las normas más recientes" gives one concrete usage condition and the saltar param points at pagination via siguiente_saltar. But there is no guidance on when to prefer this over contar_normas (counting) or obtener_norma (single-record retrieval), leaving the choice to inference.

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

contar_normasB

Número total de normas disponibles en el catálogo.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

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

No annotations and the description adds nothing about behavior beyond the count itself. It doesn't say whether it requires auth, whether it's a live count or cached, or what triggers staleness. However, the tool is trivial (a count) with an output schema, so the burden is lighter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single short sentence, front-loaded, zero waste.

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

Completeness4/5

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

With an output schema present, return values need not be explained, and there are no params. The description is sufficient for a trivial count tool, though a note about catalog scope would help marginally.

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

Parameters4/5

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

Zero parameters; baseline 4 per rules. The description correctly implies no filtering parameters affect the count.

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

Purpose4/5

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

States clearly it returns the total count of norms in the catalog ('Número total de normas disponibles en el catálogo'). The verb+resource is identifiable (count of normas) and distinguishable from siblings like buscar_normativa or obtener_norma, though 'contar' being absent makes it slightly less explicit.

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

Usage Guidelines2/5

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

No guidance on when to use this counting tool versus buscar_normativa or listar_valores_filtro. The agent must infer usage context entirely.

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

leer_texto_bojaA

Lee el texto íntegro de una disposición publicada en el BOJA.

El texto procede de la web del BOJA y puede omitir imágenes o tablas; la versión oficial y auténtica es el PDF firmado (campo pdf_oficial).

Args: enlace_o_id: id de la norma (de buscar_normativa) o URL del BOJA. desde: posición del carácter desde el que leer (para paginar textos largos). max_caracteres: tamaño máximo del fragmento devuelto (1000-100000).

ParametersJSON Schema
NameRequiredDescriptionDefault
desdeNo
enlace_o_idYes
max_caracteresNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden, and it does disclose real caveats: the text comes from the BOJA website, may omit images or tables, and the signed PDF (pdf_oficial) is the authentic version. Pagination behavior is also surfaced via desde/max_caracteres. It omits return-format details, but those are covered by the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Content is front-loaded: purpose, then the important authenticity caveat, then per-argument documentation. Every sentence carries information. The Args block is slightly verbose for three simple parameters, but nothing is wasted.

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

Completeness4/5

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

For a paginated read tool with an output schema present, the description supplies what the schema cannot: the data provenance, the authenticity caveat, and how to page through long texts. Return values need not be explained because an output schema exists. Only the relationship to obtener_norma is left implicit.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate entirely, and it does: enlace_o_id is explained as an id from buscar_normativa or a BOJA URL, desde as the character offset for pagination, and max_caracteres as the fragment size with the valid 1000-100000 range. All three parameters are semantically richer than the bare schema.

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

Purpose4/5

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

States a specific verb (lee), resource (texto íntegro de una disposición) and source (BOJA), so an agent knows immediately this returns full text rather than metadata. It does not explicitly distinguish itself from the sibling obtener_norma, which is presumably the metadata counterpart, 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.

Usage Guidelines3/5

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

Usage is implied rather than stated: the id is sourced 'de buscar_normativa' and pagination params exist for long texts, which signals when to use this tool. However there is no explicit when-not or direct comparison against siblings like obtener_norma. Adequate but leaves routing to inference.

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

listar_valores_filtroA

Lista los valores existentes de un filtro de búsqueda.

Args: tipo: filtro a consultar. contiene: texto opcional para filtrar la lista (sin distinguir mayúsculas ni tildes).

ParametersJSON Schema
NameRequiredDescriptionDefault
tipoYes
contieneNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It usefully discloses that contiene matching is case- and accent-insensitive, but says nothing about permissions, error behavior for invalid tipo, or result limits. The output schema covers return format, lowering that requirement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in a single sentence, followed by a compact Args block. No filler or redundancy, though the tipo line ("filtro a consultar") borders on restating the field name.

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

Completeness3/5

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

For a simple two-parameter enum lookup with an output schema, the description covers enough to invoke correctly. It is missing routing guidance versus sibling search tools and any error/edge-case behavior, but nothing critical for a correct call is absent.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It explains both parameters, adding the non-obvious matching semantics of contiene (case/accent insensitive) that the schema does not convey; tipo's valid values are already covered by the enum in the schema.

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

Purpose4/5

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

States a specific verb (Lista) and resource (valores existentes de un filtro de búsqueda), so the agent knows it enumerates valid filter values. It does not explicitly differentiate itself from siblings like buscar_normativa, but the purpose is unambiguous.

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

Usage Guidelines3/5

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

Usage is implied by the purpose: you call it to discover valid values for a search filter. There is no explicit when-to-use statement, no mention of alternatives such as buscar_normativa, and no prerequisites or exclusions.

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

obtener_normaB

Devuelve la ficha completa de una norma a partir de su identificador (campo "id").

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing beyond the read-and-return intent. It does not say whether the operation is read-only, what happens when the id does not exist, or whether any permission is needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the retrieval action and its key are both stated immediately.

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

Completeness4/5

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

For a one-parameter lookup with an output schema covering return values, the description covers what the tool does and what the input is. Only failure behavior and sibling routing are absent, which are minor for this shape of tool.

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

Parameters3/5

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

Schema description coverage is 0%, but the description names the single parameter and ties it to the field "id", giving the agent some semantic anchor. It adds no format guidance (e.g., what an id looks like) beyond the schema's bare string type.

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

Purpose4/5

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

States a specific verb and resource: "Devuelve la ficha completa de una norma" and the retrieval key ("a partir de su identificador"). This distinguishes it from contar_normas (counting), buscar_normativa (searching) and leer_texto_boja (reading raw text), though it never names those siblings explicitly.

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

Usage Guidelines3/5

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

Usage is implied by "a partir de su identificador": you call this when you already have an id. There is no explicit when-to-use vs buscar_normativa, no statement of prerequisites, and no exclusions.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedbuscar_normativa
    • First observedcontar_normas
    • First observedleer_texto_boja
    • First observedlistar_valores_filtro
    • First observedobtener_norma

TDQS

A3.7/5.0

Scored across 5 tools

Disambiguation4/5

Each tool has a largely distinct role: contar_normas counts, buscar_normativa searches, obtener_norma fetches metadata by id, listar_valores_filtro enumerates filter values, and leer_texto_boja reads full text. The only mild overlap is between obtener_norma (ficha/metadata) and leer_texto_boja (full disposition text), but the descriptions distinguish them adequately.

Naming Consistency5/5

All five tools follow a consistent Spanish verb_noun pattern (contar_normas, buscar_normativa, obtener_norma, listar_valores_filtro, leer_texto_boja). No mixing of conventions or casing styles.

Tool Count4/5

Five tools is well-scoped for a read-only normative catalog: search, count, retrieve, filter discovery, and full-text reading each earn their place. It is on the lean side but nothing is redundant.

Completeness4/5

For a read-only BOJA catalog, the surface covers search with rich filters, counting, detail retrieval, filter value discovery, and full-text access with pagination, which is a solid lifecycle. Minor gaps like related-norms or citation lookup exist but are workable.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers