Skip to main content
Glama
README.md
# Conector MCP — Tribunal Constitucional de Chile

Causas en tramitación y jurisprudencia del TC. El buscador de sentencias
devuelve el **texto completo**, así que se puede buscar por lo que dice un
fallo y no solo por su carátula.

## Dos sistemas, no uno

El TC expone dos backends independientes y este conector cubre los dos:

- **Tramitación** (`tramitacion.tcchile.cl/tc/rest`) — corre sobre lexsoft,
  el mismo proveedor que el Segundo Tribunal Ambiental.
- **Jurisprudencia** (`buscador-backend.tcchile.cl/api`) — Laravel, con
  búsqueda de texto completo sobre las sentencias.

## Herramientas

| Herramienta | Qué hace |
|---|---|
| `filtros()` | Vocabularios de jurisprudencia (competencias del art. 93, tipos de resolución, ministros, palabras clave) y facetas de causas con sus conteos. |
| `buscar_causas(texto, anio, sala, etapa, relator, procedimiento, limite, pagina)` | Causas en tramitación. Acepta rol exacto. |
| `ver_causa(rol_o_id)` | Detalle y partes con su rol procesal. Acepta rol o id. |
| `buscar_sentencias(texto, limite, pagina)` | Busca dentro del texto de las sentencias y devuelve los párrafos coincidentes. |
| `ver_sentencia(folio)` | Ficha analítica: doctrina, resultado, voto de mayoría, redactor, artículos invocados, palabras clave. |
| `leer_sentencia(id, max_chars, desde)` | Texto completo, paginable. |

## Notas de la fuente

- **La búsqueda de sentencias distingue tildes.** `electrica` devuelve 2
  resultados y `eléctrica` devuelve 25. La API sugiere la corrección en
  `corrected_query`; el conector reintenta solo y avisa cuando lo hace.
- **Los filtros de causas no son parámetros.** Van dentro de `query` con
  sintaxis `campo:valor`. Un `?era=2024` se ignora en silencio, sin error.
  Facetas válidas: era, sala, etapa, relator, tramitador, procedimiento.
- El filtro de jurisprudencia es un **JSON dentro del parámetro de query**.
  Sin él, 404 "El filtro es obligatorio"; con POST o PUT, 405.
- La ficha trae `parametro_id` numérico, pero cada item incluye su
  `parametro` embebido con el nombre del campo: no hace falta mapeo aparte.
- **No hay documentos del expediente por vía pública.** La ruta de causas es
  `/ot/{fragmento}/{id}` con un enum cerrado, y `data` es el único fragmento
  abierto. El expediente vive tras ClaveÚnica. Si la causa terminó con
  sentencia, el texto está en el buscador de jurisprudencia.
- El endpoint de estado diario existe (herencia de lexsoft) pero devuelve
  vacío: el TC no lo publica por ahí.

## Variables de entorno

| Variable | Default |
|---|---|
| `TC_TRAMITACION_BASE` | `https://tramitacion.tcchile.cl` |
| `TC_JURISPRUDENCIA_BASE` | `https://buscador-backend.tcchile.cl` |
| `TC_TIMEOUT_SEG` | `45` |
| `TC_CACHE_TTL_SEG` | `3600` |
| `PORT` | `8080` (lo inyecta Railway) |

## Despliegue

1. **GitHub**: sube estos archivos a `bawzenit-glitch/tc-mcp`.
2. **Railway**: New Project → Deploy from GitHub repo → detecta el Dockerfile
   → Settings → Networking → Generate Domain (puerto 8080).
3. **Claude**: Personalizar → Conectores → "+" → Agregar conector
   personalizado → `https://TU-DOMINIO.up.railway.app/mcp`.

Verificación: abrir `/mcp` en el navegador debe devolver el error
`Client must accept text/event-stream`. Eso significa que está vivo.

## Local

```bash
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python test_parseo.py   # tests de parseo, sin red
.venv/bin/python server.py        # http://localhost:8000/mcp
```

`requirements.txt` fija `mcp>=1.9.0,<2`: la versión 2.x renombró `FastMCP` y
rompe este código.