Skip to main content
Glama
ruizechesortubenjamin

mcp-roldan-municipal

README.md
# mcp-roldan-municipal

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

## 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 **65 documentos/páginas oficiales**.
- Usa búsqueda viva por WordPress REST público, priorizando `documents/` y `directory/` sobre noticias viejas.
- 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://roldan.72.61.48.99.sslip.io
Demo web:    https://roldan.72.61.48.99.sslip.io/demo
OpenAPI:     https://roldan.72.61.48.99.sslip.io/openapi.json
Health:      https://roldan.72.61.48.99.sslip.io/health
```

Dominio recomendado: `https://roldan.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
```

## HTTP local

```bash
ROLDAN_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://roldan.72.61.48.99.sslip.io/consulta-ciudadana \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <tu-api-key>' \
  -d '{ "consulta": "Quiero habilitar un comercio", "tono": "breve" }'
```

## Ejemplo webhook n8n/WhatsApp

```bash
curl -s https://roldan.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.

## MCP

```bash
claude mcp add roldan -- 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

A3.6/5.0

Scored across 10 tools

Disambiguation4/5

Each tool has a clear target: general queries, search by type (sources, news, documents, live web), source details, and domain-specific guides. The four buscar_* tools overlap somewhat but descriptions specify the content scope, making them distinguishable.

Naming Consistency3/5

There is a mix of patterns: buscar_* for search, *_info for guidance, consulta_ciudadana as a noun phrase, and detalle_fuente as a noun-noun. This is not chaotic but lacks a single consistent verb_noun convention across all tools.

Tool Count5/5

With 10 tools, the server is well-scoped for a municipal information assistant. Each tool covers a distinct aspect without redundancy or bloat.

Completeness4/5

The set covers general queries, multiple search types, and guidance for complaints, payments, appointments, and procedures. It intentionally avoids write actions, which is clearly stated, so no major gaps exist, though a tool for location-based services could be a minor addition.

Maintenance

ActivityMaintained
ResponsivenessSyncing