Skip to main content
Glama
README.md
# Conector MCP — Primer Tribunal Ambiental (1TA)

Consulta de causas, expedientes, estado diario y documentos del Primer Tribunal
Ambiental de Chile (Antofagasta). Jurisdicción: Arica y Parinacota, Tarapacá,
Antofagasta, Atacama y Coquimbo.

**No es una variante del conector del Segundo Tribunal.** El 2TA corre sobre
lexsoft; el 1TA usa su propio sistema (SIGC1TA) con backend REST en
`portaljudicial1ta.cl/sgc-ws/rest`. Son APIs distintas.

## Herramientas

| Herramienta | Qué hace |
|---|---|
| `filtros()` | Tipos de causa, estados, años, regiones y actividades económicas. |
| `buscar_causas(texto, anio, tipo, estado, limite)` | Busca sobre el universo consultable (~274 causas, 2017 en adelante). Ignora tildes. |
| `ver_causa(rol)` | Carátula, materia, ubicación, estado final, audiencias, ministros y partes. |
| `expediente(rol)` | Cuadernos → asientos → documentos, con la ruta para descargarlos. |
| `estado_diario(fecha)` | Causas con providencias dictadas ese día. |
| `leer_documento(archivo, paginas)` | Texto del PDF del expediente. |

## Notas de la fuente

- Toda respuesta viene envuelta dos veces: `{"response": "<json string>"}`.
  Sin datos, `response` trae la **cadena** `"null"`, no `null`.
- La búsqueda es `POST` con `application/x-www-form-urlencoded`. Con JSON
  responde 415 y con GET responde 405.
- El servidor solo filtra por `anioIngreso`; los demás filtros del formulario
  son del lado del cliente, así que el conector los aplica en memoria sobre el
  listado completo cacheado.
- `lista-participantes` y `lista-ministros-causa` devuelven `[]` en causas
  recién ingresadas. No es un fallo del parseo.
- El estado diario del día en curso puede venir vacío hasta que se firma.
- Cada documento existe en dos versiones: `archivo_foleado` (con folio, el que
  conviene citar) y `archivo_original`.
- El sitio rechaza clientes que no parecen navegador: el User-Agent de Chrome
  no es cosmético.

## Variables de entorno

| Variable | Default | Qué hace |
|---|---|---|
| `TRIBUNAL_1TA_BASE` | `https://www.portaljudicial1ta.cl` | Base del portal |
| `TRIBUNAL_1TA_TIMEOUT_SEG` | `45` | Timeout HTTP |
| `TRIBUNAL_1TA_CACHE_TTL_SEG` | `3600` | Vida de la caché en memoria |
| `PORT` | `8080` | Lo inyecta Railway |

## Despliegue

1. **GitHub**: sube estos archivos a `bawzenit-glitch/1ta-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
```

## Aviso sobre la versión de `mcp`

`requirements.txt` fija `mcp>=1.9.0,<2`. La versión 2.x renombró `FastMCP` a
`MCPServer` y rompe este código. Los conectores anteriores quedaron con
`mcp>=1.9.0` sin tope: al reconstruirse en Railway tomarán la 2.x y fallarán al
arrancar. Conviene agregarles el `<2`.