mcp-roldan-municipal
# 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
Scored across 10 tools
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.
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.
With 10 tools, the server is well-scoped for a municipal information assistant. Each tool covers a distinct aspect without redundancy or bloat.
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.