Skip to main content
Glama
README.md
# mcp-rosario-municipal

API + MCP read-only para atención ciudadana con fuentes oficiales de **Municipalidad de Rosario**.

## Propuesta comercial

Demo de “Atención Ciudadana IA”: el vecino pregunta en lenguaje natural y la IA responde con información pública oficial, links de respaldo, pasos sugeridos y límites claros.

Sirve para conectar web chat, WhatsApp vía n8n/Make, ChatGPT Actions, Telegram, voice/call-center y dashboards internos.

## Qué hace

- Responde consultas por intención: reclamos, pagos, turnos, licencias, habilitaciones, obras, noticias/datos.
- Cita fuentes oficiales y devuelve links.
- Busca en índice documental generado desde **63 documentos/páginas oficiales**.
- Usa búsqueda viva sobre el buscador HTML oficial de rosario.gob.ar.
- Expone MCP stdio, HTTP/OpenAPI, webhook de mensajería, demo web `/demo` y métricas `/metrics`.

## Qué NO hace

- No reserva turnos.
- No envía reclamos ni denuncias.
- No procesa pagos.
- No consulta deuda, expedientes ni datos personales.
- No inventa requisitos si no aparecen en fuentes oficiales.

## URLs

```txt
Base actual: https://rosario.72.61.48.99.sslip.io
Demo web:    https://rosario.72.61.48.99.sslip.io/demo
OpenAPI:     https://rosario.72.61.48.99.sslip.io/openapi.json
Health:      https://rosario.72.61.48.99.sslip.io/health
```

Dominio recomendado: `https://rosario.demo.zyoma.ai` — ver `docs/deployment.md`.

## Instalar y verificar

```bash
npm install
npm run extract:docs
npm run typecheck
npm run build
npm run probe:fase1
npm run probe
npm run probe:http
npm run eval:cases
```

## HTTP local

```bash
ROSARIO_API_KEY=<tu-api-key> PORT=8787 npm run api:start
```

## Endpoints

```txt
GET  /health              público
GET  /openapi.json        público
GET  /demo                público, requiere API key dentro de la UI para consultar
GET  /metrics             privado, bearer auth
POST /consulta-ciudadana  privado, bearer auth
POST /webhook/consulta    privado, bearer auth
POST /fuentes/buscar      privado, bearer auth
POST /fuentes/detalle     privado, bearer auth
POST /noticias/buscar     privado, bearer auth
POST /instructivos/buscar privado, bearer auth
POST /web/buscar          privado, bearer auth
POST /reclamos/info       privado, bearer auth
POST /pagos/info          privado, bearer auth
POST /turnos/info         privado, bearer auth
POST /tramites/info       privado, bearer auth
```

## Ejemplos demo

```txt
Necesito sacar un turno
¿Cómo pago la tasa municipal?
Quiero hacer un reclamo por una luminaria rota
Quiero habilitar un comercio
Requisitos para final de obra
Licencia de conducir renovación
```

## Ejemplo consulta ciudadana

```bash
curl -s https://rosario.72.61.48.99.sslip.io/consulta-ciudadana \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <tu-api-key>' \
  -d '{ "consulta": "Licencia de conducir requisitos", "tono": "breve" }'
```

## Ejemplo webhook n8n/WhatsApp

```bash
curl -s https://rosario.72.61.48.99.sslip.io/webhook/consulta \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <tu-api-key>' \
  -d '{ "text": "Necesito hacer un reclamo por una luminaria rota", "channel": "whatsapp", "from": "+549****0000" }'
```

En n8n usar: `={{ $json.reply }}`.

## Métricas

`GET /metrics` devuelve contadores agregados y últimas consultas sanitizadas. No guarda teléfonos/emails completos: se redactan en memoria.

## Evaluación ciudadana

El repo incluye `tests/citizen-cases.json` y `npm run eval:cases` para medir intención correcta, fuentes y límites sobre preguntas reales/ambiguas.

## MCP

```bash
claude mcp add rosario -- node "$(pwd)/dist/src/index.js"
```

Tools: `consulta_ciudadana`, `buscar_instructivos`, `buscar_web_oficial`, `buscar_fuentes`, `detalle_fuente`, `buscar_noticias`, `reclamos_info`, `pagos_info`, `turnos_info`, `tramites_info`.

## Estado de fase

```txt
Fase 0: relevamiento de fuentes públicas
Fase 1: tools read-only de información pública
Fase 1.1: índice documental + búsqueda viva
Fase 1.2: HTTP/OpenAPI + webhook + demo web + métricas
Fase 2 futura: workflows autenticados sólo con autorización explícita, auditoría y guardrails
```

TDQS

B3.2/5.0

Scored across 10 tools

Disambiguation4/5

Tools fall into clear categories (general query, search sources, domain-specific info), but buscar_fuentes, buscar_instructivos, and buscar_web_oficial share overlapping search purposes and could be confused without careful description reading.

Naming Consistency4/5

Most tools follow a verb_noun pattern (buscar_*) or domain_info pattern (*_info), but detalle_fuente and consulta_ciudadana deviate slightly from this convention, making the naming less uniform.

Tool Count5/5

With 10 tools, the server is well-scoped for a municipal information assistant, providing enough coverage without unnecessary redundancy.

Completeness4/5

The server covers the core citizen-information lifecycle well, including source search, news, procedures, and orientations. It intentionally omits transactional actions, but could add directories or event searches to be fully comprehensive.

Maintenance

ActivityMaintained
ResponsivenessSyncing