tc-mcp
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.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues