@ssolis-ti/mcp-compra-agil 1.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +113 -25
  2. package/dist/api/compra-agil-client.d.ts +2 -1
  3. package/dist/api/compra-agil-client.d.ts.map +1 -1
  4. package/dist/api/compra-agil-client.js +12 -2
  5. package/dist/api/compra-agil-client.js.map +1 -1
  6. package/dist/index.js +31 -7
  7. package/dist/index.js.map +1 -1
  8. package/dist/reports/components.d.ts +59 -0
  9. package/dist/reports/components.d.ts.map +1 -0
  10. package/dist/reports/components.js +125 -0
  11. package/dist/reports/components.js.map +1 -0
  12. package/dist/reports/export.d.ts +27 -0
  13. package/dist/reports/export.d.ts.map +1 -0
  14. package/dist/reports/export.js +47 -0
  15. package/dist/reports/export.js.map +1 -0
  16. package/dist/reports/format.d.ts +24 -0
  17. package/dist/reports/format.d.ts.map +1 -0
  18. package/dist/reports/format.js +74 -0
  19. package/dist/reports/format.js.map +1 -0
  20. package/dist/reports/render.d.ts +18 -0
  21. package/dist/reports/render.d.ts.map +1 -0
  22. package/dist/reports/render.js +30 -0
  23. package/dist/reports/render.js.map +1 -0
  24. package/dist/reports/templates/radar-oportunidades.d.ts +41 -0
  25. package/dist/reports/templates/radar-oportunidades.d.ts.map +1 -0
  26. package/dist/reports/templates/radar-oportunidades.js +170 -0
  27. package/dist/reports/templates/radar-oportunidades.js.map +1 -0
  28. package/dist/reports/theme.d.ts +83 -0
  29. package/dist/reports/theme.d.ts.map +1 -0
  30. package/dist/reports/theme.js +284 -0
  31. package/dist/reports/theme.js.map +1 -0
  32. package/dist/resources/compras-template.d.ts.map +1 -1
  33. package/dist/resources/compras-template.js +2 -1
  34. package/dist/resources/compras-template.js.map +1 -1
  35. package/dist/resources/documentacion.d.ts.map +1 -1
  36. package/dist/resources/documentacion.js +5 -36
  37. package/dist/resources/documentacion.js.map +1 -1
  38. package/dist/resources/estados.d.ts.map +1 -1
  39. package/dist/resources/estados.js +24 -10
  40. package/dist/resources/estados.js.map +1 -1
  41. package/dist/services/monitor.js +37 -2
  42. package/dist/services/monitor.js.map +1 -1
  43. package/dist/tools/analizar-precios-mercado.d.ts +21 -0
  44. package/dist/tools/analizar-precios-mercado.d.ts.map +1 -0
  45. package/dist/tools/analizar-precios-mercado.js +217 -0
  46. package/dist/tools/analizar-precios-mercado.js.map +1 -0
  47. package/dist/tools/auditar-desiertas.d.ts.map +1 -1
  48. package/dist/tools/auditar-desiertas.js +64 -46
  49. package/dist/tools/auditar-desiertas.js.map +1 -1
  50. package/dist/tools/buscar-compras.d.ts.map +1 -1
  51. package/dist/tools/buscar-compras.js +2 -1
  52. package/dist/tools/buscar-compras.js.map +1 -1
  53. package/dist/tools/detalle-compra.d.ts.map +1 -1
  54. package/dist/tools/detalle-compra.js +6 -5
  55. package/dist/tools/detalle-compra.js.map +1 -1
  56. package/dist/tools/detalle-oc.d.ts.map +1 -1
  57. package/dist/tools/detalle-oc.js +6 -5
  58. package/dist/tools/detalle-oc.js.map +1 -1
  59. package/dist/tools/documentos.d.ts.map +1 -1
  60. package/dist/tools/documentos.js +51 -50
  61. package/dist/tools/documentos.js.map +1 -1
  62. package/dist/tools/generar-borrador.d.ts.map +1 -1
  63. package/dist/tools/generar-borrador.js +37 -26
  64. package/dist/tools/generar-borrador.js.map +1 -1
  65. package/dist/tools/generar-informe.d.ts +13 -0
  66. package/dist/tools/generar-informe.d.ts.map +1 -0
  67. package/dist/tools/generar-informe.js +111 -0
  68. package/dist/tools/generar-informe.js.map +1 -0
  69. package/dist/tools/monitorear-cambios.d.ts +32 -2
  70. package/dist/tools/monitorear-cambios.d.ts.map +1 -1
  71. package/dist/tools/monitorear-cambios.js +79 -10
  72. package/dist/tools/monitorear-cambios.js.map +1 -1
  73. package/dist/tools/radar-oportunidades.d.ts +42 -1
  74. package/dist/tools/radar-oportunidades.d.ts.map +1 -1
  75. package/dist/tools/radar-oportunidades.js +123 -103
  76. package/dist/tools/radar-oportunidades.js.map +1 -1
  77. package/dist/tools/recomendar-precio.d.ts +13 -0
  78. package/dist/tools/recomendar-precio.d.ts.map +1 -1
  79. package/dist/tools/recomendar-precio.js +54 -58
  80. package/dist/tools/recomendar-precio.js.map +1 -1
  81. package/dist/tools/verificar-oc.d.ts.map +1 -1
  82. package/dist/tools/verificar-oc.js +9 -7
  83. package/dist/tools/verificar-oc.js.map +1 -1
  84. package/dist/tools/verificar-ticket.d.ts +13 -0
  85. package/dist/tools/verificar-ticket.d.ts.map +1 -0
  86. package/dist/tools/verificar-ticket.js +79 -0
  87. package/dist/tools/verificar-ticket.js.map +1 -0
  88. package/dist/utils/docs-locator.d.ts +41 -0
  89. package/dist/utils/docs-locator.d.ts.map +1 -0
  90. package/dist/utils/docs-locator.js +82 -0
  91. package/dist/utils/docs-locator.js.map +1 -0
  92. package/dist/utils/error-handler.d.ts.map +1 -1
  93. package/dist/utils/error-handler.js +7 -4
  94. package/dist/utils/error-handler.js.map +1 -1
  95. package/dist/utils/logger.d.ts.map +1 -1
  96. package/dist/utils/logger.js +9 -6
  97. package/dist/utils/logger.js.map +1 -1
  98. package/dist/utils/quotation.d.ts +71 -0
  99. package/dist/utils/quotation.d.ts.map +1 -0
  100. package/dist/utils/quotation.js +140 -0
  101. package/dist/utils/quotation.js.map +1 -0
  102. package/dist/utils/rate-limiter.d.ts +8 -1
  103. package/dist/utils/rate-limiter.d.ts.map +1 -1
  104. package/dist/utils/rate-limiter.js +25 -1
  105. package/dist/utils/rate-limiter.js.map +1 -1
  106. package/dist/utils/redact.d.ts +48 -0
  107. package/dist/utils/redact.d.ts.map +1 -0
  108. package/dist/utils/redact.js +100 -0
  109. package/dist/utils/redact.js.map +1 -0
  110. package/package.json +55 -53
@@ -9,10 +9,13 @@ import fs from 'fs';
9
9
  import path from 'path';
10
10
  import { loadEnvManual } from '../utils/env-loader.js';
11
11
  import { CompraAgilClient } from '../api/compra-agil-client.js';
12
+ import { safeError, registrarSecreto } from '../utils/redact.js';
12
13
  // Inicializar entorno
13
14
  loadEnvManual();
14
15
  const TICKET = process.env.COMPRA_AGIL_TICKET;
15
16
  const BASE_URL = process.env.COMPRA_AGIL_BASE_URL || 'https://api2.mercadopublico.cl';
17
+ // El daemon es un proceso independiente: debe registrar el secreto por su cuenta.
18
+ registrarSecreto(TICKET);
16
19
  if (!TICKET) {
17
20
  console.error('[ERROR] Variable de entorno COMPRA_AGIL_TICKET no definida en .env');
18
21
  process.exit(1);
@@ -23,6 +26,32 @@ const MIN_BUDGET = parseFloat(process.env.MONITOR_MIN_BUDGET_CLP || '5000000');
23
26
  const KEYWORDS_RAW = process.env.MONITOR_KEYWORDS || 'software, desarrollo, licencias, plataforma, sistema';
24
27
  const KEYWORDS = KEYWORDS_RAW.split(',').map(kw => kw.trim().toLowerCase()).filter(Boolean);
25
28
  const ALERTS_LOG_PATH = path.resolve(process.cwd(), 'alerts.log');
29
+ const STATE_PATH = path.resolve(process.cwd(), '.monitor-state.json');
30
+ // ─── Deduplicación de alertas ──────────────────────────────────────────
31
+ // Evita re-alertar el mismo proceso en ciclos consecutivos. Se persiste en disco
32
+ // para sobrevivir reinicios del daemon.
33
+ function loadAlertedCodes() {
34
+ try {
35
+ if (fs.existsSync(STATE_PATH)) {
36
+ const raw = JSON.parse(fs.readFileSync(STATE_PATH, 'utf8'));
37
+ if (Array.isArray(raw.alerted))
38
+ return new Set(raw.alerted);
39
+ }
40
+ }
41
+ catch (e) {
42
+ console.error(`[ADVERTENCIA] No se pudo leer el estado de deduplicación (${STATE_PATH}): ${safeError(e)}`);
43
+ }
44
+ return new Set();
45
+ }
46
+ const alertedCodes = loadAlertedCodes();
47
+ function persistAlertedCodes() {
48
+ try {
49
+ fs.writeFileSync(STATE_PATH, JSON.stringify({ alerted: [...alertedCodes] }, null, 2), 'utf8');
50
+ }
51
+ catch (e) {
52
+ console.error(`[ADVERTENCIA] No se pudo guardar el estado de deduplicación: ${safeError(e)}`);
53
+ }
54
+ }
26
55
  console.log('========================================================');
27
56
  console.log(' INICIANDO DEMONIO DE MONITOREO DE COMPRA ÁGIL v2');
28
57
  console.log('========================================================');
@@ -61,6 +90,10 @@ async function runCheck() {
61
90
  const nameLower = item.nombre.toLowerCase();
62
91
  const matchedKeyword = KEYWORDS.find(kw => nameLower.includes(kw));
63
92
  if (matchedKeyword) {
93
+ // Deduplicación: no re-alertar un proceso ya notificado en ciclos previos
94
+ if (alertedCodes.has(item.codigo))
95
+ continue;
96
+ alertedCodes.add(item.codigo);
64
97
  alertCount++;
65
98
  const alertMsg = `[${new Date().toISOString()}] [ALERTA] Código: ${item.codigo} | Presupuesto: $${item.montos.monto_disponible_clp.toLocaleString('es-CL')} CLP | Cierre: ${item.fechas.fecha_cierre} | Institución: ${item.institucion.organismo_comprador} | Coincidencia: "${matchedKeyword}" | Nombre: ${item.nombre.trim()}\n`;
66
99
  // Escribir en alerts.log
@@ -69,10 +102,12 @@ async function runCheck() {
69
102
  console.log(`\x1b[33m${alertMsg.trim()}\x1b[0m`);
70
103
  }
71
104
  }
72
- console.log(`[${timestamp}] Ciclo completado. Alertas generadas en este ciclo: ${alertCount}\n`);
105
+ if (alertCount > 0)
106
+ persistAlertedCodes();
107
+ console.log(`[${timestamp}] Ciclo completado. Alertas nuevas en este ciclo: ${alertCount}\n`);
73
108
  }
74
109
  catch (error) {
75
- const errorMsg = error?.actionableMessage || String(error);
110
+ const errorMsg = error?.actionableMessage || safeError(error);
76
111
  console.error(`[${timestamp}] [ERROR] Falló el ciclo de monitoreo: ${errorMsg}\n`);
77
112
  // Si la cuota de la API se agotó, podemos dormir o pausar el demonio
78
113
  if (errorMsg.includes('Cuota diaria agotada') || error?.status === 429) {
@@ -1 +1 @@
1
- {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/services/monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/services/monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Tool: analizar_precios_mercado
3
+ *
4
+ * Analiza la distribución de precios COTIZADOS por proveedores en procesos
5
+ * históricos de Compra Ágil similares.
6
+ *
7
+ * POR QUÉ "COTIZADOS" Y NO "GANADORES":
8
+ * Se verificó empíricamente contra la API real que los procesos adjudicados
9
+ * NO son consultables (el filtro `estado=proveedor_seleccionado` devuelve 0
10
+ * resultados y ninguna cotización trae `proveedor_seleccionado=1`).
11
+ * Lo que la API sí expone son las cotizaciones presentadas, con su
12
+ * `precio_unitario` real. Eso es señal de mercado genuina — y es lo que se
13
+ * analiza aquí, sin prometer un dato que el servicio no entrega.
14
+ *
15
+ * Reemplaza a la antigua `recomendar_precio_ganador`, que buscaba adjudicaciones
16
+ * y por tanto nunca encontraba datos.
17
+ */
18
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
19
+ import { CompraAgilClient } from '../api/compra-agil-client.js';
20
+ export declare function registerAnalizarPreciosMercado(server: McpServer, client: CompraAgilClient): void;
21
+ //# sourceMappingURL=analizar-precios-mercado.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analizar-precios-mercado.d.ts","sourceRoot":"","sources":["../../src/tools/analizar-precios-mercado.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AA2BhE,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CA6LhG"}
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Tool: analizar_precios_mercado
3
+ *
4
+ * Analiza la distribución de precios COTIZADOS por proveedores en procesos
5
+ * históricos de Compra Ágil similares.
6
+ *
7
+ * POR QUÉ "COTIZADOS" Y NO "GANADORES":
8
+ * Se verificó empíricamente contra la API real que los procesos adjudicados
9
+ * NO son consultables (el filtro `estado=proveedor_seleccionado` devuelve 0
10
+ * resultados y ninguna cotización trae `proveedor_seleccionado=1`).
11
+ * Lo que la API sí expone son las cotizaciones presentadas, con su
12
+ * `precio_unitario` real. Eso es señal de mercado genuina — y es lo que se
13
+ * analiza aquí, sin prometer un dato que el servicio no entrega.
14
+ *
15
+ * Reemplaza a la antigua `recomendar_precio_ganador`, que buscaba adjudicaciones
16
+ * y por tanto nunca encontraba datos.
17
+ */
18
+ import { z } from 'zod';
19
+ import { CompraAgilApiError } from '../utils/error-handler.js';
20
+ import { logger } from '../utils/logger.js';
21
+ import { safeError } from '../utils/redact.js';
22
+ import { esGanador, esAdmisible, extraerPrecioUnitario, extraerMontoNeto, calcularEstadisticas, } from '../utils/quotation.js';
23
+ const TOOL_NAME = 'analizar_precios_mercado';
24
+ const TOOL_DESCRIPTION = `Analiza a qué precios está cotizando el mercado en procesos históricos de Compra Ágil similares, para posicionar una oferta competitiva.
25
+ Admite el código de una compra activa (extrae sus palabras clave automáticamente) o un término de búsqueda.
26
+ Retorna la distribución de precios unitarios cotizados (mínimo, percentil 25, mediana, promedio, máximo) y el detalle de cada cotización observada.
27
+
28
+ LIMITACIONES IMPORTANTES, verificadas contra la API real (julio 2026):
29
+ 1. Analiza precios COTIZADOS, no adjudicados. La API no expone qué oferta ganó (el estado "proveedor_seleccionado" devuelve 0 resultados y ninguna cotización viene marcada como seleccionada). La referencia es lo que ofertó la competencia.
30
+ 2. Los precios provienen de procesos declarados DESIERTOS, porque son los únicos que publican sus cotizaciones (medido: desierta 5/8 procesos con precios, cerrada 0/8). Muchas deserciones se deben a incumplimientos formales (garantías, certificados) y no a que el precio fuera malo, por lo que siguen siendo señal de mercado válida — pero conviene interpretarlas con ese contexto.
31
+ 3. Las cotizaciones declaradas inadmisibles por el comprador se reportan aparte y se excluyen de las estadísticas.`;
32
+ const inputSchema = {
33
+ codigo_compra: z.string().optional().describe('Código de una Compra Ágil para extraer sus palabras clave automáticamente (ej: "1057539-228-COT26"). Opcional si se especifica "q".'),
34
+ q: z.string().optional().describe('Término de búsqueda del producto/servicio a cotizar (ej: "resmas papel", "reactivos"). Opcional si se especifica "codigo_compra".'),
35
+ region: z.string().optional().describe('Código de región para acotar el análisis (1-16). Ej: "13" para Metropolitana.'),
36
+ limite_analisis: z.number().min(1).max(15).default(8).optional().describe('Cuántos procesos históricos auditar (1-15, default 8). Cada uno consume una consulta de cuota y la API es lenta (~1-5s por consulta).'),
37
+ };
38
+ export function registerAnalizarPreciosMercado(server, client) {
39
+ server.registerTool(TOOL_NAME, { description: TOOL_DESCRIPTION, inputSchema }, async (args) => {
40
+ try {
41
+ let keyword = args.q || '';
42
+ let region = args.region || '';
43
+ let contextoProceso = '';
44
+ // 1. Si dan un código, extraer keyword y región de ese proceso
45
+ if (args.codigo_compra) {
46
+ logger.info(`analizar_precios_mercado: leyendo compra ${args.codigo_compra}`);
47
+ const activa = await client.detalle(args.codigo_compra);
48
+ if (activa.productos_solicitados?.length > 0) {
49
+ const p = activa.productos_solicitados[0];
50
+ keyword = p.nombre;
51
+ contextoProceso = `Producto solicitado: "${p.nombre}" (cantidad ${p.cantidad} ${p.unidad_medida})`;
52
+ }
53
+ else {
54
+ keyword = activa.nombre;
55
+ contextoProceso = `Proceso: "${activa.nombre}"`;
56
+ }
57
+ if (!region && activa.institucion.region !== null) {
58
+ region = String(activa.institucion.region);
59
+ }
60
+ }
61
+ if (!keyword) {
62
+ return {
63
+ content: [{ type: 'text', text: 'Error de validación: debes proporcionar "codigo_compra" o un término de búsqueda "q".' }],
64
+ isError: true,
65
+ };
66
+ }
67
+ // 2. Buscar procesos que EXPONGAN cotizaciones.
68
+ //
69
+ // Se usa SOLO `desierta`. Medición contra la API real (q="reparacion"):
70
+ // • estado=desierta → 5 de 8 procesos con cotizaciones, 20 precios unitarios
71
+ // • estado=cerrada → 0 de 8 procesos con cotizaciones, 0 precios
72
+ // Los procesos `cerrada` de primer llamado no publican sus cotizaciones,
73
+ // así que incluirlos solo gasta cuota y tiempo (la API tarda 1-5s por consulta).
74
+ // `proveedor_seleccionado` queda descartado: devuelve 0 resultados.
75
+ logger.info(`analizar_precios_mercado: buscando históricos de "${keyword}" región "${region || 'todas'}"`);
76
+ const busqueda = await client.buscar({
77
+ q: keyword,
78
+ estado: 'desierta',
79
+ region: region || undefined,
80
+ tamano_pagina: 50, // mínimo de la API es 10; 50 maximiza el material por consulta
81
+ numero_pagina: 1,
82
+ });
83
+ if (!busqueda.items?.length) {
84
+ return {
85
+ content: [{ type: 'text', text: `No se encontraron procesos históricos con cotizaciones publicadas que coincidan con "${keyword}"${region ? ` en la región ${region}` : ''}. Prueba con un término más general o quita el filtro de región.` }],
86
+ };
87
+ }
88
+ // 3. Recolectar cotizaciones de los detalles
89
+ const limite = args.limite_analisis || 8;
90
+ const preciosUnitarios = [];
91
+ const montosNetos = [];
92
+ const cotizaciones = [];
93
+ const inadmisibles = [];
94
+ let procesosConDatos = 0;
95
+ let adjudicacionesDetectadas = 0;
96
+ for (const item of busqueda.items.slice(0, limite)) {
97
+ try {
98
+ const det = await client.detalle(item.codigo);
99
+ const provs = det.proveedores_cotizando ?? [];
100
+ if (provs.length === 0)
101
+ continue;
102
+ procesosConDatos++;
103
+ for (const prov of provs) {
104
+ const unitario = extraerPrecioUnitario(prov, keyword);
105
+ const neto = extraerMontoNeto(prov);
106
+ const admisible = esAdmisible(prov);
107
+ // Si la API alguna vez publica adjudicaciones, lo reportamos.
108
+ if (esGanador(prov))
109
+ adjudicacionesDetectadas++;
110
+ // Las cotizaciones inadmisibles SÍ entran en las estadísticas.
111
+ // Motivo: en los procesos desiertos —única fuente de precios de la API—
112
+ // prácticamente todas las cotizaciones fueron declaradas inadmisibles;
113
+ // excluirlas dejaba la muestra vacía. Y el precio que un proveedor ofertó
114
+ // es señal de mercado real aunque le hayan rechazado el papeleo (ej:
115
+ // "no cumple con garantía solicitada"). Se anota el motivo de cada una
116
+ // para que quien lea pueda ponderarlas — sobre todo las rechazadas por
117
+ // precio ("sobrepasa el monto máximo"), que sesgan la muestra hacia arriba.
118
+ const registro = {
119
+ codigo_proceso: item.codigo,
120
+ estado_proceso: det.estado.glosa,
121
+ institucion: det.institucion.organismo_comprador,
122
+ proveedor: prov.razon_social,
123
+ es_emt: prov.es_emt,
124
+ precio_unitario: unitario,
125
+ monto_neto: neto,
126
+ monto_total: prov.monto_total ?? null,
127
+ admisible,
128
+ motivo_inadmisibilidad: prov.justificacion_inadmisibilidad ?? null,
129
+ };
130
+ if (unitario !== null)
131
+ preciosUnitarios.push(unitario);
132
+ if (neto !== null)
133
+ montosNetos.push(neto);
134
+ cotizaciones.push(registro);
135
+ if (!admisible)
136
+ inadmisibles.push(registro);
137
+ }
138
+ }
139
+ catch (e) {
140
+ logger.warn(`analizar_precios_mercado: falló el detalle de ${item.codigo}: ${safeError(e)}`);
141
+ }
142
+ }
143
+ if (preciosUnitarios.length === 0 && montosNetos.length === 0) {
144
+ return {
145
+ content: [{
146
+ type: 'text',
147
+ text: [
148
+ `Se revisaron ${Math.min(limite, busqueda.items.length)} procesos históricos que coinciden con "${keyword}", pero ninguno expuso cotizaciones con precios.`,
149
+ '',
150
+ 'Esto es habitual: la API de Mercado Público solo publica las cotizaciones de algunos procesos.',
151
+ 'Sugerencias: usa un término más general, amplía "limite_analisis", o quita el filtro de región.',
152
+ ].join('\n'),
153
+ }],
154
+ };
155
+ }
156
+ // 4. Estadísticas y recomendación
157
+ const statsUnitario = calcularEstadisticas(preciosUnitarios);
158
+ const statsNeto = calcularEstadisticas(montosNetos);
159
+ const base = statsUnitario ?? statsNeto;
160
+ const tipoBase = statsUnitario ? 'precio_unitario' : 'monto_neto_total';
161
+ // El percentil 25 es una referencia competitiva más robusta que "5% bajo el
162
+ // promedio": resiste valores atípicos y refleja el cuarto más económico.
163
+ const sugerido = base.p25;
164
+ // Control de dispersión: la búsqueda por palabra clave puede mezclar productos
165
+ // muy distintos (ej. "reparación" trae desde materiales de $5.000 hasta
166
+ // servicios de $5.000.000). En ese caso el estadístico es aritméticamente
167
+ // correcto pero engañoso, y hay que decirlo en vez de entregar un número
168
+ // con falsa precisión.
169
+ const dispersion = base.mediana > 0 ? base.maximo / base.mediana : 0;
170
+ const muestraHeterogenea = dispersion > 10;
171
+ const advertenciaDispersion = muestraHeterogenea
172
+ ? `⚠ MUESTRA MUY DISPERSA: el precio máximo (${base.maximo.toLocaleString('es-CL')}) es ${Math.round(dispersion)} veces la mediana (${base.mediana.toLocaleString('es-CL')}). El término "${keyword}" probablemente está mezclando productos o servicios de naturaleza distinta, así que este precio sugerido tiene poco valor. Acota la búsqueda con un término más específico o usa "codigo_compra" para partir del producto exacto.`
173
+ : undefined;
174
+ const resultado = {
175
+ _nota_metodologica: [
176
+ 'Precios COTIZADOS por proveedores, NO adjudicados: la API de Mercado Público no expone qué oferta ganó (el estado "proveedor_seleccionado" devuelve 0 resultados y ninguna cotización viene marcada como seleccionada).',
177
+ 'La muestra proviene de procesos declarados DESIERTOS, los únicos que publican sus cotizaciones (medido: desierta 5/8 procesos con precios; cerrada 0/8).',
178
+ 'Las cotizaciones declaradas inadmisibles SÍ se incluyen en las estadísticas: en los procesos desiertos casi todas lo son, y el precio ofertado sigue siendo señal de mercado aunque se haya rechazado el papeleo. Revisa "motivos_de_inadmisibilidad": si predomina "sobrepasa el monto máximo", la muestra está sesgada hacia arriba; si predominan motivos formales (garantías, certificados), los precios son representativos.',
179
+ ].join(' '),
180
+ contexto: contextoProceso || undefined,
181
+ termino_busqueda: keyword,
182
+ region_analisis: region ? `Región ${region}` : 'Todas las regiones',
183
+ cobertura: {
184
+ procesos_encontrados: busqueda.paginacion.total_resultados,
185
+ procesos_revisados: Math.min(limite, busqueda.items.length),
186
+ procesos_con_cotizaciones: procesosConDatos,
187
+ cotizaciones_totales: cotizaciones.length,
188
+ cotizaciones_declaradas_inadmisibles: inadmisibles.length,
189
+ motivos_de_inadmisibilidad: inadmisibles.length > 0
190
+ ? [...new Set(inadmisibles.map((c) => c.motivo_inadmisibilidad).filter(Boolean))]
191
+ : [],
192
+ adjudicaciones_detectadas: adjudicacionesDetectadas,
193
+ },
194
+ estadisticas_precio_unitario: statsUnitario,
195
+ estadisticas_monto_neto: statsNeto,
196
+ base_de_la_sugerencia: tipoBase,
197
+ _advertencia_dispersion: advertenciaDispersion,
198
+ muestra_homogenea: !muestraHeterogenea,
199
+ precio_sugerido_competitivo: sugerido,
200
+ criterio_sugerencia: 'Percentil 25 de la distribución cotizada: te ubica en el cuarto más económico sin regalar margen. Resiste valores atípicos mejor que el promedio.',
201
+ rango_competitivo: { desde: base.minimo, hasta: base.mediana },
202
+ cotizaciones_observadas: cotizaciones,
203
+ cotizaciones_inadmisibles: inadmisibles.length > 0 ? inadmisibles : undefined,
204
+ };
205
+ return {
206
+ content: [{ type: 'text', text: JSON.stringify(resultado, null, 2) }],
207
+ };
208
+ }
209
+ catch (error) {
210
+ const message = error instanceof CompraAgilApiError
211
+ ? error.actionableMessage
212
+ : `Error inesperado al analizar precios de mercado: ${safeError(error)}`;
213
+ return { content: [{ type: 'text', text: message }], isError: true };
214
+ }
215
+ });
216
+ }
217
+ //# sourceMappingURL=analizar-precios-mercado.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analizar-precios-mercado.js","sourceRoot":"","sources":["../../src/tools/analizar-precios-mercado.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auditar-desiertas.d.ts","sourceRoot":"","sources":["../../src/tools/auditar-desiertas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAehE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAyQ1F"}
1
+ {"version":3,"file":"auditar-desiertas.d.ts","sourceRoot":"","sources":["../../src/tools/auditar-desiertas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAmBhE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAwR1F"}
@@ -1,9 +1,13 @@
1
1
  import { z } from 'zod';
2
2
  import { CompraAgilApiError } from '../utils/error-handler.js';
3
3
  import { logger } from '../utils/logger.js';
4
+ import { esAdmisible, extraerMontoNeto } from '../utils/quotation.js';
5
+ import { safeError } from '../utils/redact.js';
4
6
  const TOOL_NAME = 'auditar_compras_desiertas';
5
- const TOOL_DESCRIPTION = `Audita un proceso de Compra Ágil que haya quedado "desierto" (sin ofertas) para identificar los motivos (plazo ajustado, presupuesto bajo, requisitos restrictivos) comparándolo con procesos exitosos similares en el mercado.
6
- Admite ingresar el código de la compra o un término de búsqueda para encontrar un proceso desierto reciente.`;
7
+ const TOOL_DESCRIPTION = `Audita un proceso de Compra Ágil que haya quedado "desierto" para identificar por qué falló (plazo ajustado, presupuesto bajo, requisitos restrictivos), comparándolo con los precios que el mercado cotizó en procesos similares.
8
+ Admite el código de la compra o un término de búsqueda para encontrar un proceso desierto reciente.
9
+ NOTA: la comparación se hace contra precios COTIZADOS por proveedores en procesos del mismo rubro, no contra precios adjudicados: la API de Mercado Público no expone qué oferta ganó (verificado empíricamente).
10
+ También reporta el motivo oficial de deserción y las cotizaciones declaradas inadmisibles, que suelen explicar el fracaso mejor que el precio.`;
7
11
  const inputSchema = {
8
12
  codigo_compra: z.string().optional().describe('Código de la Compra Ágil desierta para auditar (ej: "1057539-228-COT26"). Opcional si se especifica "q".'),
9
13
  q: z.string().optional().describe('Término de búsqueda de producto/servicio para encontrar y auditar un proceso desierto reciente (ej: "resmas papel"). Opcional.'),
@@ -70,13 +74,16 @@ export function registerAuditarDesiertas(server, client) {
70
74
  keyword = targetDetail.nombre;
71
75
  }
72
76
  }
73
- // 3. Buscar procesos similares exitosos (proveedor_seleccionado)
74
- logger.info(`auditar_compras_desiertas: Buscando procesos exitosos similares para "${keyword}"`);
77
+ // 3. Buscar procesos comparables del mismo rubro que publiquen cotizaciones.
78
+ // Solo `desierta`: medido contra la API real, es el único estado que las
79
+ // expone (desierta 5/8 procesos con precios; cerrada 0/8).
80
+ // `proveedor_seleccionado` devuelve 0 resultados.
81
+ logger.info(`auditar_compras_desiertas: Buscando procesos comparables para "${keyword}"`);
75
82
  const limit = args.limite_analisis || 5;
76
83
  const searchResponse = await client.buscar({
77
84
  q: keyword,
78
- estado: 'proveedor_seleccionado',
79
- tamano_pagina: 10, // API v2 requiere mínimo 10
85
+ estado: 'desierta',
86
+ tamano_pagina: 50, // el mínimo de la API es 10; 50 maximiza el material por consulta
80
87
  numero_pagina: 1,
81
88
  });
82
89
  const successDurations = [];
@@ -84,41 +91,51 @@ export function registerAuditarDesiertas(server, client) {
84
91
  const processedCases = [];
85
92
  const itemsToProcess = (searchResponse.items || []).slice(0, limit);
86
93
  if (itemsToProcess.length > 0) {
87
- logger.info(`auditar_compras_desiertas: Analizando detalles de ${itemsToProcess.length} procesos exitosos`);
94
+ logger.info(`auditar_compras_desiertas: Analizando detalles de ${itemsToProcess.length} procesos comparables`);
88
95
  for (const item of itemsToProcess) {
89
96
  try {
90
97
  const detail = await client.detalle(item.codigo);
91
- const winner = detail.proveedores_cotizando?.find(prov => {
92
- if (prov.proveedor_seleccionado === true || prov.proveedor_seleccionado === 1)
93
- return true;
94
- if (prov.seleccion && prov.seleccion.proveedor_seleccionado === true)
95
- return true;
96
- return false;
97
- });
98
- if (winner) {
99
- const totalNeto = winner.valor_neto || winner.monto_total || 0;
100
- let successDuration = 0;
101
- if (detail.fechas?.fecha_cierre && detail.fechas?.fecha_publicacion) {
102
- const start = new Date(detail.fechas.fecha_publicacion).getTime();
103
- const end = new Date(detail.fechas.fecha_cierre).getTime();
104
- successDuration = Math.round(((end - start) / (1000 * 60 * 60 * 24)) * 10) / 10;
105
- successDurations.push(successDuration);
106
- }
107
- if (totalNeto > 0) {
108
- successPrices.push(totalNeto);
109
- }
110
- processedCases.push({
111
- codigo: item.codigo,
112
- institucion: item.institucion?.organismo_comprador || 'Desconocido',
113
- monto_adjudicado: totalNeto,
114
- duracion_dias: successDuration,
115
- fecha_cierre: item.fechas?.fecha_cierre,
116
- ganador: winner.razon_social || 'Desconocido',
117
- });
98
+ // Se recolectan TODAS las cotizaciones del proceso, incluidas las
99
+ // declaradas inadmisibles: en los procesos desiertos casi todas lo son
100
+ // (por eso quedaron desiertos) y filtrarlas dejaba la muestra vacía.
101
+ // El precio ofertado sigue siendo señal de mercado.
102
+ // Antes se buscaba solo al adjudicado, pero la API nunca marca un
103
+ // ganador (verificado), así que ese camino no encontraba nada.
104
+ const cotizaciones = detail.proveedores_cotizando ?? [];
105
+ if (cotizaciones.length === 0)
106
+ continue;
107
+ const inadmisibles = cotizaciones.filter((c) => !esAdmisible(c)).length;
108
+ const netos = cotizaciones
109
+ .map((c) => extraerMontoNeto(c))
110
+ .filter((n) => n !== null);
111
+ if (netos.length === 0)
112
+ continue;
113
+ // Referencia por proceso: la cotización más económica — es el precio
114
+ // al que ese mercado estuvo dispuesto a atender la necesidad.
115
+ const menorNeto = Math.min(...netos);
116
+ successPrices.push(menorNeto);
117
+ let successDuration = 0;
118
+ if (detail.fechas?.fecha_cierre && detail.fechas?.fecha_publicacion) {
119
+ const start = new Date(detail.fechas.fecha_publicacion).getTime();
120
+ const end = new Date(detail.fechas.fecha_cierre).getTime();
121
+ successDuration = Math.round(((end - start) / (1000 * 60 * 60 * 24)) * 10) / 10;
122
+ successDurations.push(successDuration);
118
123
  }
124
+ processedCases.push({
125
+ codigo: item.codigo,
126
+ estado: detail.estado?.glosa,
127
+ institucion: item.institucion?.organismo_comprador || 'Desconocido',
128
+ cotizaciones_recibidas: cotizaciones.length,
129
+ cotizaciones_inadmisibles: inadmisibles,
130
+ menor_monto_cotizado: menorNeto,
131
+ mayor_monto_cotizado: Math.max(...netos),
132
+ duracion_dias: successDuration,
133
+ fecha_cierre: item.fechas?.fecha_cierre,
134
+ motivo_desierta: detail.motivos?.motivo_desierta ?? null,
135
+ });
119
136
  }
120
137
  catch (detailError) {
121
- logger.warn(`auditar_compras_desiertas: Error al consultar detalle de exitoso ${item.codigo}: ${String(detailError)}`);
138
+ logger.warn(`auditar_compras_desiertas: Error al consultar detalle de ${item.codigo}: ${safeError(detailError)}`);
122
139
  }
123
140
  }
124
141
  }
@@ -173,14 +190,14 @@ export function registerAuditarDesiertas(server, client) {
173
190
  const recomendaciones = [];
174
191
  if (analisis_critico.presupuesto_insuficiente) {
175
192
  if (targetBudget > 0) {
176
- recomendaciones.push(`Aumentar el presupuesto disponible. El presupuesto actual de $${targetBudget.toLocaleString('es-CL')} es un ${Math.abs(analisis_critico.diferencia_presupuesto_porcentaje)}% inferior al promedio de adjudicación histórico ($${avgPrice.toLocaleString('es-CL')}). Se sugiere incrementarlo a al menos $${Math.round(avgPrice * 1.05).toLocaleString('es-CL')}.`);
193
+ recomendaciones.push(`Aumentar el presupuesto disponible. El presupuesto actual de $${targetBudget.toLocaleString('es-CL')} es un ${Math.abs(analisis_critico.diferencia_presupuesto_porcentaje)}% inferior al promedio de lo que el mercado cotizó en procesos similares ($${avgPrice.toLocaleString('es-CL')}). Se sugiere incrementarlo a al menos $${Math.round(avgPrice * 1.05).toLocaleString('es-CL')}.`);
177
194
  }
178
195
  else {
179
- recomendaciones.push(`Especificar o incrementar el presupuesto estimado. El promedio histórico adjudicado para productos similares es de $${avgPrice.toLocaleString('es-CL')}.`);
196
+ recomendaciones.push(`Especificar o incrementar el presupuesto estimado. El promedio de lo cotizado por el mercado para productos similares es de $${avgPrice.toLocaleString('es-CL')}.`);
180
197
  }
181
198
  }
182
199
  if (analisis_critico.plazo_insuficiente) {
183
- recomendaciones.push(`Extender el plazo de postulación. El proceso actual ofreció un plazo de ${targetDuration} días (cierre y publicación), mientras que los procesos exitosos de mercado promedian ${avgDuration} días. Se recomienda extender el plazo a un mínimo de 3 a 5 días hábiles.`);
200
+ recomendaciones.push(`Extender el plazo de postulación. El proceso actual ofreció ${targetDuration} días entre publicación y cierre, mientras que los procesos comparables promedian ${avgDuration} días. Se recomienda extender el plazo a un mínimo de 3 a 5 días hábiles.`);
184
201
  }
185
202
  if (analisis_critico.requisitos_complejos) {
186
203
  recomendaciones.push(`Flexibilizar los requisitos ambientales/sociales exigidos. Aunque promueven buenas prácticas, en procesos rápidos de bajo monto pueden asustar o inhabilitar a microempresas locales si implican adjuntar certificados complejos.`);
@@ -205,13 +222,13 @@ export function registerAuditarDesiertas(server, client) {
205
222
  },
206
223
  busqueda_comparativa: {
207
224
  termino_clave: keyword,
208
- casos_exitosos_encontrados: successPrices.length,
209
- estadisticas_precios_exitosos: successPrices.length > 0 ? {
210
- minimo_adjudicado: minPrice,
211
- maximo_adjudicado: maxPrice,
212
- promedio_adjudicado: avgPrice,
225
+ procesos_comparables_con_cotizaciones: successPrices.length,
226
+ estadisticas_montos_cotizados: successPrices.length > 0 ? {
227
+ minimo_cotizado: minPrice,
228
+ maximo_cotizado: maxPrice,
229
+ promedio_cotizado: avgPrice,
213
230
  } : null,
214
- estadisticas_duracion_exitosa: successDurations.length > 0 ? {
231
+ estadisticas_duracion: successDurations.length > 0 ? {
215
232
  minimo_dias: minDuration,
216
233
  maximo_dias: maxDuration,
217
234
  promedio_dias: avgDuration,
@@ -219,7 +236,8 @@ export function registerAuditarDesiertas(server, client) {
219
236
  },
220
237
  analisis_de_brechas: analisis_critico,
221
238
  recomendaciones_de_optimizacion: recomendaciones,
222
- casos_exitosos_analizados: processedCases,
239
+ procesos_comparables_analizados: processedCases,
240
+ _nota_metodologica: 'La comparación usa el MENOR monto cotizado de cada proceso similar (cerrado o desierto), no montos adjudicados: la API de Mercado Público no expone qué oferta ganó. Revisa también "motivo_desierta": muchas deserciones se explican por incumplimientos formales (garantías, certificados) y no por precio.',
223
241
  };
224
242
  return {
225
243
  content: [{
@@ -231,7 +249,7 @@ export function registerAuditarDesiertas(server, client) {
231
249
  catch (error) {
232
250
  const message = error instanceof CompraAgilApiError
233
251
  ? error.actionableMessage
234
- : `Error inesperado al auditar compra desierta: ${String(error)}`;
252
+ : `Error inesperado al auditar compra desierta: ${safeError(error)}`;
235
253
  return {
236
254
  content: [{ type: 'text', text: message }],
237
255
  isError: true,
@@ -1 +1 @@
1
- {"version":3,"file":"auditar-desiertas.js","sourceRoot":"","sources":["../../src/tools/auditar-desiertas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auditar-desiertas.js","sourceRoot":"","sources":["../../src/tools/auditar-desiertas.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"buscar-compras.d.ts","sourceRoot":"","sources":["../../src/tools/buscar-compras.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAgDhE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAqGvF"}
1
+ {"version":3,"file":"buscar-compras.d.ts","sourceRoot":"","sources":["../../src/tools/buscar-compras.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAiDhE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAqGvF"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import { z } from 'zod';
8
8
  import { CompraAgilApiError } from '../utils/error-handler.js';
9
+ import { safeError } from '../utils/redact.js';
9
10
  const TOOL_NAME = 'buscar_compras_agiles';
10
11
  const TOOL_DESCRIPTION = `Busca procesos de Compra Ágil en Mercado Público de Chile.
11
12
  Permite filtrar por palabras clave, estado del proceso, región geográfica y rango de fechas de publicación.
@@ -110,7 +111,7 @@ export function registerBuscarCompras(server, client) {
110
111
  catch (error) {
111
112
  const message = error instanceof CompraAgilApiError
112
113
  ? error.actionableMessage
113
- : `Error inesperado: ${String(error)}`;
114
+ : `Error inesperado: ${safeError(error)}`;
114
115
  return {
115
116
  content: [{ type: 'text', text: message }],
116
117
  isError: true,