Skip to main content
Glama
README.md
# ⚖️ LeyChile MCP

**Servidor MCP (Model Context Protocol) que conecta a Claude — u otra IA compatible — en vivo y directamente con _Ley Chile_, el sistema de legislación de la Biblioteca del Congreso Nacional de Chile (BCN).**

Convierte el ordenamiento jurídico chileno en herramientas de nivel **forense**, pensadas para el estudio y la práctica de estudiantes de Derecho, abogados litigantes y jueces: buscar normas, leer el texto vigente, **citar con precisión incisos/numerales/letras**, controlar la **vigencia intertemporal**, comparar versiones, aislar transitorios, mapear especialidad y vías procesales, y razonar con prompts jurídicos guiados.

[![CI](https://github.com/IanGuiloff/leychile-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/IanGuiloff/leychile-mcp/actions)
![Python](https://img.shields.io/badge/python-3.10%2B-blue)
![License](https://img.shields.io/badge/license-MIT-green)

> ⚠️ **Herramienta no oficial**, sin afiliación con la BCN. Los textos provienen de Ley Chile. **No constituye asesoría jurídica**: verifique siempre contra la fuente oficial. Es una ayuda metodológica; el criterio jurídico es del profesional.

---

## ¿Por qué este servidor?

A diferencia de un volcado estático y parcial, **LeyChile MCP consulta a BCN en cada llamada**, por lo que entrega la **versión consolidada y vigente** de cada norma, con cobertura completa del ordenamiento (leyes, decretos, DFL, códigos, resoluciones). Está en español, con **citas verificables** y enlace oficial.

## Arquitectura en 3 capas (honesta)

La API de BCN entrega **datos**, no juicios jurídicos. Para no “alucinar derecho”, el servidor separa:

| Capa | Qué es | Fuente de verdad |
|------|--------|------------------|
| **A — Datos** | Recuperación y parsing determinista del XML de BCN | `obtxml` (BCN, en vivo) |
| **B — Conocimiento** | Catálogos curados y verificados (códigos, especialidad, reenvíos procesales) | Tablas mantenidas + verificación de vigencia en vivo |
| **C — Razonamiento** | *Prompts* que guían el análisis usando A+B | El modelo, citando A/B |

Así, los datos los aporta BCN; el método lo aportan los prompts; y toda conclusión queda anclada a normas citadas.

---

## Características destacadas

- 🔎 **Búsqueda** por palabra clave o materia que **rankea el cuerpo legal** (Ley/Código) sobre modificaciones y actos administrativos, con filtros por **tipo, año y `excluir_modificaciones`**.
- 📄 **Texto consolidado y vigente** de cualquier norma (por idNorma o N° de ley).
- 🧷 **Segmentación forense**: extrae el **inciso**, **numeral** o **letra** exactos (p. ej. “art. 254 inciso segundo del CPC”, “art. 434 N° 4”).
- 🔤 **Artículos con sufijo**: `183-A`…`183-E` CT, `27A` LSA, `145 bis E`, `157 TER`, `4 bis`. La cita forense usa guion y LeyChile nombra con espacio: ambas formas resuelven al mismo artículo. Y un artículo con sufijo **nunca** resuelve al base — antes `183-B` devolvía el 183 con la cita «Art. 183», que en una herramienta anti-alucinación es el peor modo de fallo posible.
- 🕰️ **Vigencia intertemporal**: cómo estaba redactado un artículo **a una fecha dada**, versión histórica exacta (`idVersion`), línea de tiempo y **comparación de versiones**.
- ⚖️ **Alerta de ultraactividad procesal**: avisa cuando, en normas adjetivas, los plazos o actuaciones ya iniciados podrían regirse por la ley antigua.
- 📘 **Texto refundido** e instrumento fijador; **vacancia legal** (publicada pero no vigente).
- 🧩 **Transitorios**, **definiciones legales** y **anexos** (p. ej. sentencias del Tribunal Constitucional) aislados.
- 🔗 **Modificaciones** desde notas marginales e **Historia de la Ley** con las leyes modificatorias.
- 🗂️ **Índice sistemático** anti-desborde para códigos extensos y **categorías** temáticas de BCN.
- 🧠 **Capa de conocimiento**: resolución de **códigos** por nombre, **mapa de especialidad** (arts. 4° y 13 CC) y **reenvíos sustantivo↔adjetivo** con verificación de vigencia de la vía procesal.
- ⚙️ **Razonamiento jurídico ejecutable** (PYTHEN, determinista): reglas derrotables *exception-first* (`leychile_razonar`, `leychile_evaluar_regla`) y **cascada de antinomías** lex superior › specialis › posterior (`leychile_resolver_antinomia`).
- 🪶 **Modo `compacto`** (`response_format=compacto`): salidas mínimas que ahorran ~50 % de tokens al explorar.
- 🌐 **Entrar al BCN** (opcional, DrissionPage/Chrome): renderiza páginas JavaScript que la API no expone —Historia de la Ley, jurisprudencia— con `leychile_bcn_extraer`.
- 💬 **6 prompts jurídicos**: antinomías, ratio legis, derogación orgánica, vigencia intertemporal, minuta de alegato y mapa normativo del caso.
- 📌 **Citas en texto libre**: pega «art. 1698 inc. 1° del Código Civil» y obtén el texto exacto (`leychile_citar`).
- 🔦 **Buscar dentro de una norma** (`leychile_buscar_en_norma`) y **concordancias/remisiones** de un artículo (`leychile_concordancias_articulo`).
- 🏷️ **Leyes por nombre popular**: «Ley Karin», «Ley Emilia», etc. (`leychile_resolver_ley_por_nombre`).
- 🛡️ Resiliencia: User-Agent de navegador (anti-403), failover de hosts BCN, caché diaria, reintentos, plegado de acentos.
- 🔌 Transporte **stdio** (local) y **streamable-HTTP** (servicio).

---

## Instalación

Requisitos: **Python 3.10+**.

```bash
git clone https://github.com/IanGuiloff/leychile-mcp.git
cd leychile-mcp
pip install -e .
```

Esto deja disponible el comando `leychile-mcp`.

### Uso en Claude Desktop

Edita el archivo de configuración (`%APPDATA%\Claude\claude_desktop_config.json` en Windows; `~/Library/Application Support/Claude/claude_desktop_config.json` en macOS) y agrega:

```json
{
  "mcpServers": {
    "leychile": { "command": "leychile-mcp" }
  }
}
```

Reinicia Claude Desktop: aparecerán las herramientas `leychile_*`. (Ver `examples/claude_desktop_config.json` para la variante sin instalar.)

### Uso en Claude Code

```bash
claude mcp add leychile -- leychile-mcp
```

### Publicarlo como servicio (HTTP / Docker)

```bash
leychile-mcp --transport http --host 0.0.0.0 --port 8000   # endpoint: http://host:8000/mcp
# o con Docker:
docker build -t leychile-mcp . && docker run -p 8000:8000 leychile-mcp
```

---

## Ejemplos (en lenguaje natural a la IA)

- “Tráeme el **inciso segundo del artículo 254 del Código de Procedimiento Civil**.”
- “Resuelve la cita: **art. 19 N° 12 de la Constitución**.”
- “Busca **‘fuero maternal’** dentro del **Código del Trabajo**.”
- “¿A qué artículos y leyes **remite** el art. 23 de la Ley 19.628?”
- “¿Qué ley es la **‘Ley Karin’**?”
- “¿Cómo estaba redactado el **artículo 17 de la Ley 19.628 el 1 de enero de 2005**?”
- “**Compara** el artículo 17 de la Ley 19.628 entre 2010 y hoy.”
- “Dame los **artículos transitorios** del Código del Trabajo.”
- “¿Qué **leyes especiales** priman en materia de **consumo**? ¿Siguen vigentes?”
- “¿Cuál es la **vía procesal** para una **acción reivindicatoria**?”
- “Arma una **minuta de alegato** sobre término de contrato de arrendamiento urbano.”

---

## Herramientas y prompts

34 herramientas (búsqueda con ranking, texto, fragmentos anidados, vigencia/vacancia, versiones, transitorios, modificaciones, definiciones, anexos, categorías, códigos, especialidad, vía procesal, Historia de la Ley, **razonamiento jurídico ejecutable** y **navegador BCN**) y 6 prompts jurídicos. Referencia completa en **[docs/HERRAMIENTAS.md](docs/HERRAMIENTAS.md)**.

Todas las herramientas aceptan `response_format` = `markdown` (por defecto), `json` o **`compacto`** (markdown mínimo, ~50 % menos tokens). Las de texto aceptan `formato_texto` = `limpio` (quita notas marginales) u `original`.

---

## Cómo funciona

Usa el servicio abierto `obtxml` de Ley Chile:

- Búsqueda: `obtxml?opt=61&cadena=…&cantidad=…`
- Norma consolidada: `obtxml?opt=7&idNorma=…` (`&idVersion=YYYY-MM-DD` para texto histórico exacto)
- Recientes: `opt=3` · Categorías: `opt=30` · Normas por categoría: `opt=6`

El XML se parsea preservando la jerarquía oficial (Libros/Títulos/Capítulos/Párrafos/Artículos) y la **fecha de versión por artículo**, base del control intertemporal.

Documentación de la fuente:
[Servicios web de Ley Chile](https://www.leychile.cl/Consulta/legislacion_abierta_web_service) ·
[Esquema XML](https://www.leychile.cl/esquemas/accesoLeyesChilenas4.pdf)

---

## Desarrollo

```bash
pip install -e ".[dev]"
pytest -q
```

Estructura del paquete: `client.py` (HTTP), `parser.py` (XML y numeración de artículos), `citas.py` (citas en texto libre), `segmenter.py` (incisos/numerales/letras), `timeline.py` (vigencia intertemporal), `catalog.py` (capa B), `prompts.py` (capa C), `razonamiento/` (PYTHEN: reglas derrotables y antinomías), `browser.py` (navegador BCN, opcional), `formatting.py` (salida + citas), `service.py` (orquestación), `server.py` (FastMCP).

> El vocabulario de sufijos de artículo (`SUFIJOS_LATINOS`, `SUFIJO_LETRA`) vive en `parser.py` y lo
> importa `citas.py`: los dos módulos deben coincidir, y tenerlo duplicado fue justamente el origen
> del defecto que hacía resolver `183-B` al artículo 183.

---

## Limitaciones

- Depende de la disponibilidad del servicio de BCN (con reintentos, failover y caché).
- `numero_ley` resuelve **leyes**; para otros tipos use `id_norma` o búsqueda.
- La línea de tiempo se deriva del historial observable del texto vigente; para precisión absoluta a una fecha, contraste con la versión oficial.
- `leychile_historia_ley` entrega **enlaces** a la tramitación (no descarga los PDF).
- Las capas B y C son apoyo metodológico curado, **no** dictan derecho.

## Créditos y datos

Datos: servicio público **Ley Chile** de la **Biblioteca del Congreso Nacional de Chile (BCN)**. Proyecto creado y mantenido por **Ian Guiloff**.

## Licencia

[MIT](LICENSE) © 2026 Ian Guiloff.

TDQS

A3.6/5.0

Scored across 28 tools

Disambiguation5/5

Every tool has a clearly distinct purpose, from searching norms to retrieving specific fragments to mapping procedural routes. No two tools overlap in functionality, and the descriptions make their unique roles explicit.

Naming Consistency5/5

All tools follow the consistent pattern 'leychile_verb_noun' using snake_case, e.g., leychile_buscar_normas, leychile_obtener_articulo. This makes the tool set predictable and easy for an agent to navigate.

Tool Count4/5

With 28 tools, the set is larger than the typical well-scoped range, but each tool addresses a specific legal research need (citation, comparisons, timelines, etc.), justifying the count for the complexity of Chilean law. Slightly oversized but still reasonable.

Completeness5/5

The tool set covers the full lifecycle of legal research: search, retrieval, citation, comparison, history, categorization, and special features like process mapping and definition extraction. No obvious gaps are present for a comprehensive legal MCP server.

Maintenance

ActivityMaintained
ResponsivenessNo issues