@ssolis-ti/mcp-compra-agil 2.4.0 → 2.5.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.
- package/README.md +21 -6
- package/dist/api/compra-agil-client.d.ts +29 -0
- package/dist/api/compra-agil-client.d.ts.map +1 -1
- package/dist/api/compra-agil-client.js +35 -0
- package/dist/api/compra-agil-client.js.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/services/monitor.js +11 -1
- package/dist/services/monitor.js.map +1 -1
- package/dist/tools/analizar-precios-mercado.d.ts.map +1 -1
- package/dist/tools/analizar-precios-mercado.js +68 -14
- package/dist/tools/analizar-precios-mercado.js.map +1 -1
- package/dist/tools/auditar-desiertas.d.ts.map +1 -1
- package/dist/tools/auditar-desiertas.js +31 -8
- package/dist/tools/auditar-desiertas.js.map +1 -1
- package/dist/tools/buscar-compras.d.ts.map +1 -1
- package/dist/tools/buscar-compras.js +2 -0
- package/dist/tools/buscar-compras.js.map +1 -1
- package/dist/tools/detalle-compra.d.ts.map +1 -1
- package/dist/tools/detalle-compra.js +2 -0
- package/dist/tools/detalle-compra.js.map +1 -1
- package/dist/tools/detalle-oc.d.ts.map +1 -1
- package/dist/tools/detalle-oc.js +2 -0
- package/dist/tools/detalle-oc.js.map +1 -1
- package/dist/tools/documentos.d.ts.map +1 -1
- package/dist/tools/documentos.js +6 -0
- package/dist/tools/documentos.js.map +1 -1
- package/dist/tools/estadisticas-uso.d.ts.map +1 -1
- package/dist/tools/estadisticas-uso.js +2 -0
- package/dist/tools/estadisticas-uso.js.map +1 -1
- package/dist/tools/generar-borrador.d.ts +1 -1
- package/dist/tools/generar-borrador.d.ts.map +1 -1
- package/dist/tools/generar-borrador.js +35 -18
- package/dist/tools/generar-borrador.js.map +1 -1
- package/dist/tools/generar-informe.d.ts.map +1 -1
- package/dist/tools/generar-informe.js +5 -1
- package/dist/tools/generar-informe.js.map +1 -1
- package/dist/tools/monitorear-cambios.d.ts.map +1 -1
- package/dist/tools/monitorear-cambios.js +2 -0
- package/dist/tools/monitorear-cambios.js.map +1 -1
- package/dist/tools/radar-oportunidades.d.ts +5 -0
- package/dist/tools/radar-oportunidades.d.ts.map +1 -1
- package/dist/tools/radar-oportunidades.js +18 -4
- package/dist/tools/radar-oportunidades.js.map +1 -1
- package/dist/tools/verificar-hora.d.ts +13 -0
- package/dist/tools/verificar-hora.d.ts.map +1 -0
- package/dist/tools/verificar-hora.js +71 -0
- package/dist/tools/verificar-hora.js.map +1 -0
- package/dist/tools/verificar-oc.d.ts.map +1 -1
- package/dist/tools/verificar-oc.js +2 -0
- package/dist/tools/verificar-oc.js.map +1 -1
- package/dist/tools/verificar-ticket.js +1 -1
- package/dist/tools/verificar-ticket.js.map +1 -1
- package/dist/utils/concurrencia.d.ts +63 -0
- package/dist/utils/concurrencia.d.ts.map +1 -0
- package/dist/utils/concurrencia.js +122 -0
- package/dist/utils/concurrencia.js.map +1 -0
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +8 -0
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/fechas.d.ts +50 -0
- package/dist/utils/fechas.d.ts.map +1 -0
- package/dist/utils/fechas.js +77 -0
- package/dist/utils/fechas.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +13 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/ntp.d.ts +51 -0
- package/dist/utils/ntp.d.ts.map +1 -0
- package/dist/utils/ntp.js +121 -0
- package/dist/utils/ntp.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -69,7 +69,7 @@ Este servidor MCP maneja datos públicos de la API de Compra Ágil de Mercado P
|
|
|
69
69
|
## ⚡ Características Clave
|
|
70
70
|
* **Modernizado para SDK v1.12+:** Carga declarativa y robusta de herramientas, recursos y prompts bajo los nuevos estándares del protocolo.
|
|
71
71
|
* **Carga de Entorno Autónoma:** El servidor detecta y carga de forma automática y manual el archivo `.env` del directorio de trabajo al iniciarse, facilitando la conexión en clientes MCP de escritorio sin necesidad de configurar variables de sistema globales.
|
|
72
|
-
* **Lector de Documentación Integrado (Recursos):** Exposición nativa de guías, normativas y manuales en PDF (dentro de la carpeta `docs/`) como recursos del protocolo MCP (`compra-agil://documentacion/{filename}`). El servidor extrae el texto del PDF de manera local y lo inyecta en el LLM bajo demanda.
|
|
72
|
+
* **Lector de Documentación Integrado (Recursos):** Exposición nativa de guías, normativas y manuales en PDF (dentro de la carpeta `docs/`) como recursos del protocolo MCP (`compra-agil://documentacion/{filename}`). El servidor extrae el texto del PDF de manera local y lo inyecta en el LLM bajo demanda. ⚠ **Solo si clonas este repositorio** — ver [nota sobre la instalación por npm](#-la-documentación-no-viaja-en-el-paquete-de-npm).
|
|
73
73
|
* **Filtrado Inteligente Anti-Ruido:** Filtros locales en la herramienta `buscar_compras_agiles` (`palabras_clave_requeridas` y `palabras_clave_excluidas`) para afinar búsquedas amplias de la API y remover ofertas irrelevantes.
|
|
74
74
|
* **Paginación Inteligente y Monitoreo Completo:** La herramienta de cambios recientes admite navegación de páginas (`numero_pagina`), y el demonio de monitoreo periódico procesa de forma recursiva todas las páginas de resultados (`client.buscarTodo()`) para evitar pérdidas de alertas.
|
|
75
75
|
* **Integración del Detalle de OC:** Resuelve de forma dinámica el código alfanumérico o ID numérico de las Órdenes de Compra utilizando la API legada de Mercado Público.
|
|
@@ -78,7 +78,7 @@ Este servidor MCP maneja datos públicos de la API de Compra Ágil de Mercado P
|
|
|
78
78
|
* **Rate Limiting Local:** Throttle proactivo que espacia las solicitudes bajo un máximo por minuto **antes** de enviarlas, además de reaccionar al error 429 para evitar la inhabilitación temporal del ticket. El estado de cuota persiste entre reinicios, y ante un 429 se honra el header `Retry-After` con espera creciente en vez de bloquear hasta el día siguiente: la cuota es un *token bucket* que se recarga solo (verificado: la API respondió con normalidad 13 min después de un 429).
|
|
79
79
|
* **Caché de respuestas:** Las consultas repetidas se sirven desde disco sin gastar cuota (15 min para detalles, 5 min para búsquedas). Es lo que hace viable el flujo completo de análisis: repetir `generar_borrador_cotizacion` pasó de 6 consultas y 11 s a **0 consultas y 41 ms**. El ticket nunca entra en la caché.
|
|
80
80
|
* **Informes imprimibles:** Genera documentos HTML autocontenidos con diseño de impresión real (`@page`, saltos controlados, cabeceras de tabla repetidas) en formatos **Carta, Oficio y A4**.
|
|
81
|
-
* **Logs Nativos en el Protocolo:**
|
|
81
|
+
* **Logs Nativos en el Protocolo:** El servidor declara la capacidad `logging` y emite `notifications/message`, así que la actividad se puede seguir y depurar desde la propia interfaz del cliente. El cliente puede ajustar el detalle con `logging/setLevel`. Como esos logs llegan al contexto del modelo, **todo lo enviado pasa antes por la redacción de credenciales** — incluido el endpoint legado de Órdenes de Compra, que lleva el ticket en la URL y se emite como `ticket=[REDACTED]`.
|
|
82
82
|
* **Manejo Seguro de Documentos (UUID):** Evita errores de tipo `Authentication parameters missing` al tratar con archivos adjuntos protegidos de Compra Ágil (UUIDs) redirigiendo al usuario a la ficha pública del buscador (`https://buscador.mercadopublico.cl/ficha?code={codigo}`) en lugar de entregar enlaces de descarga directa inaccesibles.
|
|
83
83
|
|
|
84
84
|
---
|
|
@@ -343,10 +343,11 @@ const resources = await client.listResources();
|
|
|
343
343
|
| `verificar_orden_compra` | Informa si un proceso tiene OC emitida. **No consulta la API por su cuenta** (gastaba cuota para responder siempre "no puedo saberlo"): reutiliza el detalle si ya está en caché e indica cómo confirmarlo en la ficha pública — ver [Limitaciones](#-limitaciones-conocidas-de-la-api). |
|
|
344
344
|
| `obtener_detalle_orden_compra` | Desglose de productos y facturación de una OC. ⚠ **El código debe venir de otra fuente** (la OC que te emitieron, un correo, la ficha pública): consulta la API legada de Órdenes de Compra, y la de Compra Ágil no entrega códigos de OC. |
|
|
345
345
|
| `obtener_estadisticas_uso` | Cuántas consultas lleva esta instalación en el día UTC y si ya recibió un 429. ⚠ Es un **conteo local**, no el saldo del ticket: la API no publica cuánta cuota queda. Persiste entre reinicios. |
|
|
346
|
-
| `verificar_ticket` | Comprueba que el ticket configurado funcione contra la API real **sin revelar su valor** (solo muestra `••••1234`). Primer diagnóstico recomendado. |
|
|
346
|
+
| `verificar_ticket` | Comprueba que el ticket configurado funcione contra la API real **sin revelar su valor** (solo muestra `••••1234`). Primer diagnóstico recomendado. |
|
|
347
|
+
| `verificar_hora_oficial` | Contrasta el reloj de esta máquina con la hora oficial de Chile (`ntp.shoa.cl`, del SHOA). Importa porque `horas_restantes` y el puntaje de urgencia se calculan restando la hora local: un reloj desviado los falsea aunque los datos sean correctos. No consume cuota de Mercado Público. |
|
|
347
348
|
| `obtener_enlace_documento` | Entrega el enlace a la **ficha pública** del proceso, que es donde el adjunto sí es accesible (en un navegador). El enlace heredado de descarga directa se ofrece advirtiendo que hoy responde 404. |
|
|
348
349
|
| `descargar_y_leer_documento` | ⚠ **Hoy no puede descargar los adjuntos de Compra Ágil**: el portal dejó de servirlos por enlace directo (404 verificado) y en la ficha el archivo lo genera JavaScript, sin URL que pedir. Para IDs numéricos responde de inmediato con el enlace a la ficha, sin gastar el intento. Los UUID sí se intentan. |
|
|
349
|
-
| `consultar_documentos_locales` | Busca dentro de los PDF/TXT/MD de `docs/`. Admite **preguntas en lenguaje natural** ("¿qué multas me pueden aplicar?"), no solo palabras sueltas: descompone la consulta en términos, ignora acentos y palabras vacías, y ordena por densidad de coincidencias. |
|
|
350
|
+
| `consultar_documentos_locales` | Busca dentro de los PDF/TXT/MD de `docs/`. Admite **preguntas en lenguaje natural** ("¿qué multas me pueden aplicar?"), no solo palabras sueltas: descompone la consulta en términos, ignora acentos y palabras vacías, y ordena por densidad de coincidencias. ⚠ Requiere una carpeta `docs/` con contenido: **no viene en el paquete de npm** (ver [nota](#-la-documentación-no-viaja-en-el-paquete-de-npm)). |
|
|
350
351
|
| `analizar_precios_mercado` | Analiza la distribución de precios **cotizados** por la competencia en procesos similares (mín/p25/mediana/promedio/máx) y sugiere un precio competitivo. Advierte cuando la muestra es demasiado dispersa. ⚠ Analiza precios cotizados, **no adjudicados** — ver [Limitaciones](#-limitaciones-conocidas-de-la-api). |
|
|
351
352
|
| `auditar_compras_desiertas` | Analiza por qué una convocatoria quedó desierta, cruzando su presupuesto y plazo contra los precios que el mercado cotizó en procesos del mismo rubro. Reporta el motivo oficial de deserción. |
|
|
352
353
|
| `generar_borrador_cotizacion` | Auto-completa propuestas JSON de cotización bajo el esquema oficial, calculando impuestos (19% IVA) y redactando la carta de presentación. Marca explícitamente los campos placeholder. |
|
|
@@ -361,7 +362,21 @@ const resources = await client.listResources();
|
|
|
361
362
|
| `compra-agil://estados` | `application/json` | Estados de la API con su comportamiento **real verificado**: marca cuáles funcionan (`publicada`, `cerrada`, `desierta`, `cancelada`) y cuáles no (`proveedor_seleccionado` devuelve 0; `oc_emitida` da HTTP 400), pese a estar ambos documentados oficialmente. |
|
|
362
363
|
| `compra-agil://glosario` | `application/json` | Glosario de acrónimos del dominio de ChileCompra para contextualización semántica de la IA. |
|
|
363
364
|
| `compra-agil://compras/{codigo}` | `application/json` | Recurso dinámico que resuelve el objeto JSON puro devuelto por la API v2 de una Compra Ágil usando su código único. |
|
|
364
|
-
| `compra-agil://documentacion/{filename}` | `text/plain` | Recurso dinámico que lee y extrae todo el contenido de texto de un PDF/TXT/MD local en la carpeta `docs/` en tiempo real. |
|
|
365
|
+
| `compra-agil://documentacion/{filename}` | `text/plain` | Recurso dinámico que lee y extrae todo el contenido de texto de un PDF/TXT/MD local en la carpeta `docs/` en tiempo real. ⚠ Requiere clonar el repositorio — ver la nota siguiente. |
|
|
366
|
+
|
|
367
|
+
#### ⚠️ La documentación no viaja en el paquete de npm
|
|
368
|
+
|
|
369
|
+
El paquete publicado incluye únicamente `dist/` (declarado en `files` de `package.json`), porque las guías en PDF de ChileCompra pesan **12 MB** frente a los ~110 KB del servidor. En consecuencia, **si lo instalas con `npx` o `npm install` en lugar de clonar el repositorio**:
|
|
370
|
+
|
|
371
|
+
* Verás **3 recursos en vez de 13**: `regiones`, `estados` y `glosario`, que están definidos en código. Los diez de `compra-agil://documentacion/…` no existirán.
|
|
372
|
+
* `consultar_documentos_locales` informará que la carpeta `docs/` está vacía, apuntando a tu directorio de trabajo.
|
|
373
|
+
|
|
374
|
+
Ninguna de las 15 herramientas que consultan la API se ve afectada: la limitación alcanza solo a la documentación local.
|
|
375
|
+
|
|
376
|
+
**Si quieres esa documentación**, tienes dos caminos:
|
|
377
|
+
|
|
378
|
+
1. **Clonar el repositorio** en lugar de instalar desde npm — la carpeta `docs/` viene incluida.
|
|
379
|
+
2. **Poner tus propios documentos**: crea una carpeta `docs/` en el directorio donde corres el servidor y guarda ahí los PDF, TXT o MD que te interesen. Se expondrán igual como recursos y `consultar_documentos_locales` los buscará. Sirve para tus propias bases técnicas, normativa interna o cualquier material de referencia.
|
|
365
380
|
|
|
366
381
|
### Prompts Disponibles
|
|
367
382
|
|
|
@@ -416,7 +431,7 @@ Por eso este servidor **no bloquea hasta el día siguiente**: honra `Retry-After
|
|
|
416
431
|
|
|
417
432
|
* **Las consultas sin filtros devuelven HTTP 500.** Hay que enviar al menos un filtro.
|
|
418
433
|
* **`tamano_pagina` mínimo es 10** (valores `1` y `5` devuelven HTTP 400).
|
|
419
|
-
* **La API es lenta
|
|
434
|
+
* **La API es lenta, y empeoró.** Medido el 8 de septiembre de 2026 sobre nueve consultas: búsqueda simple **10-12 s**, búsqueda con texto **13-17 s**, y detalle de un proceso **21-25 s**, con **HTTP 504 intermitentes** en el detalle (1 de cada 3 en esa muestra). La pasarela corta a los ~30 s, así que las consultas grandes fallan enteras. Las herramientas de análisis piden sus detalles en paralelo y la caché evita repetirlos, pero conviene mantener `limite_analisis` bajo: cada unidad es una llamada de detalle más, y cada una puede caerse.
|
|
420
435
|
* **El segundo llamado es poco frecuente:** 6% de los procesos cerrados/desiertos y 0,5% de los activos.
|
|
421
436
|
|
|
422
437
|
---
|
|
@@ -233,6 +233,13 @@ export declare class CompraAgilClient {
|
|
|
233
233
|
private readonly ticket;
|
|
234
234
|
private readonly rateLimiter;
|
|
235
235
|
private readonly cache;
|
|
236
|
+
/**
|
|
237
|
+
* Compartido por todas las herramientas: lo que una aprende sobre el estado
|
|
238
|
+
* del servicio le sirve a la siguiente. Si `analizar_precios_mercado` acaba
|
|
239
|
+
* de chocar con una tanda de 504, `auditar_compras_desiertas` no debería
|
|
240
|
+
* volver a intentarlo con el paralelismo máximo.
|
|
241
|
+
*/
|
|
242
|
+
private readonly concurrencia;
|
|
236
243
|
/**
|
|
237
244
|
* @param opciones.persistir Rutas en disco para la cuota y la caché.
|
|
238
245
|
*
|
|
@@ -251,6 +258,28 @@ export declare class CompraAgilClient {
|
|
|
251
258
|
* Realiza un GET autenticado a la API.
|
|
252
259
|
*/
|
|
253
260
|
private request;
|
|
261
|
+
/**
|
|
262
|
+
* Pide varios detalles a la vez, con concurrencia adaptativa.
|
|
263
|
+
*
|
|
264
|
+
* Sustituye al `Promise.all(...map(...catch))` que cada herramienta de
|
|
265
|
+
* análisis tenía por su cuenta. La diferencia no es solo quitar duplicación:
|
|
266
|
+
* al pasar por un único limitador compartido, la saturación que detecta una
|
|
267
|
+
* herramienta protege a las siguientes, y el paralelismo baja a mitad de
|
|
268
|
+
* tanda si los primeros detalles ya vienen con 504.
|
|
269
|
+
*
|
|
270
|
+
* Devuelve un arreglo del mismo largo y orden que `codigos`, con `null` donde
|
|
271
|
+
* la consulta falló — que es como las herramientas ya cuentan sus fallos para
|
|
272
|
+
* distinguir "la API no respondió" de "no había datos".
|
|
273
|
+
*/
|
|
274
|
+
detallesEnParalelo(codigos: string[]): Promise<Array<CompraAgilDetalle | null>>;
|
|
275
|
+
/** Estado del limitador de concurrencia, para diagnóstico. */
|
|
276
|
+
getConcurrenciaStats(): {
|
|
277
|
+
limiteActual: number;
|
|
278
|
+
minimo: number;
|
|
279
|
+
maximo: number;
|
|
280
|
+
tandas: number;
|
|
281
|
+
congestiones: number;
|
|
282
|
+
};
|
|
254
283
|
/**
|
|
255
284
|
* Devuelve el detalle SOLO si ya está en caché; nunca sale a la red.
|
|
256
285
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compra-agil-client.d.ts","sourceRoot":"","sources":["../../src/api/compra-agil-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"compra-agil-client.d.ts","sourceRoot":"","sources":["../../src/api/compra-agil-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ import { logger } from '../utils/logger.js';
|
|
|
10
10
|
import { handleApiResponse, CompraAgilApiError } from '../utils/error-handler.js';
|
|
11
11
|
import { RateLimiter, RUTA_ESTADO_POR_DEFECTO } from '../utils/rate-limiter.js';
|
|
12
12
|
import { ResponseCache } from '../utils/cache.js';
|
|
13
|
+
import { LimitadorConcurrencia } from '../utils/concurrencia.js';
|
|
13
14
|
import path from 'path';
|
|
14
15
|
import { registrarSecreto } from '../utils/redact.js';
|
|
15
16
|
// ─── Cliente ────────────────────────────────────────────────────────
|
|
@@ -30,6 +31,13 @@ export class CompraAgilClient {
|
|
|
30
31
|
ticket;
|
|
31
32
|
rateLimiter;
|
|
32
33
|
cache;
|
|
34
|
+
/**
|
|
35
|
+
* Compartido por todas las herramientas: lo que una aprende sobre el estado
|
|
36
|
+
* del servicio le sirve a la siguiente. Si `analizar_precios_mercado` acaba
|
|
37
|
+
* de chocar con una tanda de 504, `auditar_compras_desiertas` no debería
|
|
38
|
+
* volver a intentarlo con el paralelismo máximo.
|
|
39
|
+
*/
|
|
40
|
+
concurrencia;
|
|
33
41
|
/**
|
|
34
42
|
* @param opciones.persistir Rutas en disco para la cuota y la caché.
|
|
35
43
|
*
|
|
@@ -49,6 +57,7 @@ export class CompraAgilClient {
|
|
|
49
57
|
// que reiniciar el servidor no debe borrar la memoria de un 429.
|
|
50
58
|
this.rateLimiter = new RateLimiter(15, persistir ? RUTA_ESTADO_POR_DEFECTO : null);
|
|
51
59
|
this.cache = new ResponseCache({ rutaEstado: persistir ? RUTA_CACHE_POR_DEFECTO : null });
|
|
60
|
+
this.concurrencia = new LimitadorConcurrencia({ maximo: 5 });
|
|
52
61
|
// El cliente se auto-protege: cualquier consumidor (servidor MCP, daemon,
|
|
53
62
|
// scripts, tests) queda cubierto sin tener que acordarse de registrarlo.
|
|
54
63
|
registrarSecreto(ticket);
|
|
@@ -116,6 +125,32 @@ export class CompraAgilClient {
|
|
|
116
125
|
this.cache.guardar(claveCache, payload, ttl);
|
|
117
126
|
return payload;
|
|
118
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Pide varios detalles a la vez, con concurrencia adaptativa.
|
|
130
|
+
*
|
|
131
|
+
* Sustituye al `Promise.all(...map(...catch))` que cada herramienta de
|
|
132
|
+
* análisis tenía por su cuenta. La diferencia no es solo quitar duplicación:
|
|
133
|
+
* al pasar por un único limitador compartido, la saturación que detecta una
|
|
134
|
+
* herramienta protege a las siguientes, y el paralelismo baja a mitad de
|
|
135
|
+
* tanda si los primeros detalles ya vienen con 504.
|
|
136
|
+
*
|
|
137
|
+
* Devuelve un arreglo del mismo largo y orden que `codigos`, con `null` donde
|
|
138
|
+
* la consulta falló — que es como las herramientas ya cuentan sus fallos para
|
|
139
|
+
* distinguir "la API no respondió" de "no había datos".
|
|
140
|
+
*/
|
|
141
|
+
async detallesEnParalelo(codigos) {
|
|
142
|
+
const resultados = await this.concurrencia.ejecutar(codigos.map((codigo) => () => this.detalle(codigo)));
|
|
143
|
+
const fallidos = resultados.filter((r) => r === null).length;
|
|
144
|
+
if (fallidos > 0) {
|
|
145
|
+
logger.warn(`Detalles en paralelo: ${fallidos} de ${codigos.length} fallaron ` +
|
|
146
|
+
`(concurrencia actual: ${this.concurrencia.limiteActual}).`);
|
|
147
|
+
}
|
|
148
|
+
return resultados;
|
|
149
|
+
}
|
|
150
|
+
/** Estado del limitador de concurrencia, para diagnóstico. */
|
|
151
|
+
getConcurrenciaStats() {
|
|
152
|
+
return this.concurrencia.estadisticas();
|
|
153
|
+
}
|
|
119
154
|
/**
|
|
120
155
|
* Devuelve el detalle SOLO si ya está en caché; nunca sale a la red.
|
|
121
156
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compra-agil-client.js","sourceRoot":"","sources":["../../src/api/compra-agil-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AA4NtD,uEAAuE;AAEvE,2EAA2E;AAC3E,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAErF;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG,EAAE,GAAG,EAAE,CAAC;AAChC,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,CAAC;AAEhC,MAAM,OAAO,gBAAgB;IACV,OAAO,CAAS;IAChB,MAAM,CAAS;IACf,WAAW,CAAc;IACzB,KAAK,CAAgB;
|
|
1
|
+
{"version":3,"file":"compra-agil-client.js","sourceRoot":"","sources":["../../src/api/compra-agil-client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -33,6 +33,7 @@ import { registerGenerarBorrador } from './tools/generar-borrador.js';
|
|
|
33
33
|
import { registerRadarOportunidades } from './tools/radar-oportunidades.js';
|
|
34
34
|
import { registerGenerarInforme } from './tools/generar-informe.js';
|
|
35
35
|
import { registerVerificarTicket } from './tools/verificar-ticket.js';
|
|
36
|
+
import { registerVerificarHora } from './tools/verificar-hora.js';
|
|
36
37
|
// Resources
|
|
37
38
|
import { registerRegionesResource } from './resources/regiones.js';
|
|
38
39
|
import { registerEstadosResource } from './resources/estados.js';
|
|
@@ -66,6 +67,17 @@ async function main() {
|
|
|
66
67
|
const server = new McpServer({
|
|
67
68
|
name: 'mcp-compra-agil',
|
|
68
69
|
version: PKG_VERSION,
|
|
70
|
+
}, {
|
|
71
|
+
// ⚠ SIN ESTA DECLARACIÓN LOS LOGS NUNCA LLEGAN AL CLIENTE. El servidor
|
|
72
|
+
// llamaba a `sendLoggingMessage()` desde utils/logger.ts, pero no
|
|
73
|
+
// declaraba la capacidad `logging`, así que el SDK rechazaba cada envío
|
|
74
|
+
// y el `.catch()` del logger se lo tragaba en silencio. Verificado en
|
|
75
|
+
// auditoría (8 de septiembre de 2026): el servidor anunciaba solo
|
|
76
|
+
// `tools, resources, prompts`, `logging/setLevel` respondía "Method not
|
|
77
|
+
// found" y llegaban 0 notificaciones pese a LOG_LEVEL=debug. La
|
|
78
|
+
// característica que el README anuncia como "Logs Nativos en el
|
|
79
|
+
// Protocolo" nunca había funcionado.
|
|
80
|
+
capabilities: { logging: {} },
|
|
69
81
|
});
|
|
70
82
|
// 3. Registrar herramientas (Tools)
|
|
71
83
|
registerBuscarCompras(server, client);
|
|
@@ -81,12 +93,19 @@ async function main() {
|
|
|
81
93
|
registerRadarOportunidades(server, client);
|
|
82
94
|
registerGenerarInforme(server, client);
|
|
83
95
|
registerVerificarTicket(server, client);
|
|
96
|
+
registerVerificarHora(server);
|
|
97
|
+
// ⚠ Lista mantenida a mano, y por eso frágil: al agregar
|
|
98
|
+
// `verificar_hora_oficial` esto seguía diciendo 15. Es solo un log —la
|
|
99
|
+
// fuente autoritativa es `tools/list` del propio servidor— pero si vuelve a
|
|
100
|
+
// desincronizarse, lo correcto es derivarla del servidor y no volver a
|
|
101
|
+
// parcharla.
|
|
84
102
|
const TOOL_NAMES = [
|
|
85
103
|
'buscar_compras_agiles', 'obtener_detalle_compra', 'monitorear_cambios_recientes',
|
|
86
104
|
'verificar_orden_compra', 'obtener_estadisticas_uso', 'obtener_detalle_orden_compra',
|
|
87
105
|
'obtener_enlace_documento', 'descargar_y_leer_documento', 'consultar_documentos_locales',
|
|
88
106
|
'analizar_precios_mercado', 'auditar_compras_desiertas', 'generar_borrador_cotizacion',
|
|
89
107
|
'radar_oportunidades_calientes', 'generar_informe', 'verificar_ticket',
|
|
108
|
+
'verificar_hora_oficial',
|
|
90
109
|
];
|
|
91
110
|
logger.info(`${TOOL_NAMES.length} herramientas registradas: ${TOOL_NAMES.join(', ')}`);
|
|
92
111
|
// 4. Registrar recursos (Resources)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,oEAAoE;AACpE,aAAa,EAAE,CAAC;AAEhB;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAS,MAAM,mBAAmB,CAAC;AAE5D,QAAQ;AACR,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,oEAAoE;AACpE,aAAa,EAAE,CAAC;AAEhB;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAS,MAAM,mBAAmB,CAAC;AAE5D,QAAQ;AACR,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,YAAY;AACZ,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,+BAA+B,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAE7E,UAAU;AACV,OAAO,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;AAEtF,uEAAuE;AAEvE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,gCAAgC,CAAC;AAEtF,iFAAiF;AACjF,gFAAgF;AAChF,iDAAiD;AACjD,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAEzB,IAAI,CAAC,MAAM,EAAE,CAAC;IACZ,MAAM,CAAC,KAAK,CACV,yDAAyD;QACzD,gGAAgG,CACjG,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,sEAAsE;AACtE,MAAM,YAAY,GAAW,MAAM,CAAC;AAEpC,uEAAuE;AAEvE,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAExD,uDAAuD;IACvD,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,YAAY,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,MAAM,CAAC,IAAI,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;IAErD,wBAAwB;IACxB,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,WAAW;KACrB,EACD;QACE,uEAAuE;QACvE,oEAAoE;QACpE,0EAA0E;QAC1E,wEAAwE;QACxE,oEAAoE;QACpE,0EAA0E;QAC1E,kEAAkE;QAClE,kEAAkE;QAClE,uCAAuC;QACvC,YAAY,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;KAC9B,CACF,CAAC;IAEF,oCAAoC;IACpC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,iCAAiC;IAClE,8BAA8B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE9B,yDAAyD;IACzD,yEAAyE;IACzE,8EAA8E;IAC9E,yEAAyE;IACzE,eAAe;IACf,MAAM,UAAU,GAAG;QACjB,uBAAuB,EAAE,wBAAwB,EAAE,8BAA8B;QACjF,wBAAwB,EAAE,0BAA0B,EAAE,8BAA8B;QACpF,0BAA0B,EAAE,4BAA4B,EAAE,8BAA8B;QACxF,0BAA0B,EAAE,2BAA2B,EAAE,6BAA6B;QACtF,+BAA+B,EAAE,iBAAiB,EAAE,kBAAkB;QACtE,wBAAwB;KACzB,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,8BAA8B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEvF,oCAAoC;IACpC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,+BAA+B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,cAAc,GAAG;QACrB,UAAU,EAAE,SAAS,EAAE,UAAU;QACjC,gCAAgC,EAAE,wCAAwC;KAC3E,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,0BAA0B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE3F,uBAAuB;IACvB,iCAAiC,CAAC,MAAM,CAAC,CAAC;IAC1C,iCAAiC,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,CAAC,gCAAgC,EAAE,sBAAsB,CAAC,CAAC;IAChF,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,yBAAyB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEtF,kCAAkC;IAClC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,8EAA8E;IAC9E,YAAY,CAAC,MAAM,CAAC,CAAC;IAErB,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;AAC3E,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/services/monitor.js
CHANGED
|
@@ -10,6 +10,7 @@ import path from 'path';
|
|
|
10
10
|
import { loadEnvManual } from '../utils/env-loader.js';
|
|
11
11
|
import { CompraAgilClient } from '../api/compra-agil-client.js';
|
|
12
12
|
import { safeError, registrarSecreto } from '../utils/redact.js';
|
|
13
|
+
import { enHoraDeChile } from '../utils/fechas.js';
|
|
13
14
|
// Inicializar entorno
|
|
14
15
|
loadEnvManual();
|
|
15
16
|
const TICKET = process.env.COMPRA_AGIL_TICKET;
|
|
@@ -95,7 +96,16 @@ async function runCheck() {
|
|
|
95
96
|
continue;
|
|
96
97
|
alertedCodes.add(item.codigo);
|
|
97
98
|
alertCount++;
|
|
98
|
-
|
|
99
|
+
// El cierre se informa en hora de Chile además del valor crudo: la API
|
|
100
|
+
// no declara zona horaria en ese campo y se interpreta como UTC, así
|
|
101
|
+
// que leer el crudo como hora local haría creer que quedan tres horas
|
|
102
|
+
// más de las reales. En una alerta cuyo propósito es avisar a tiempo,
|
|
103
|
+
// esa confusión sería justamente el fallo que se quiere evitar.
|
|
104
|
+
const cierreChile = enHoraDeChile(item.fechas.fecha_cierre);
|
|
105
|
+
const cierreTexto = cierreChile
|
|
106
|
+
? `${cierreChile} (hora de Chile; la API entrega "${item.fechas.fecha_cierre}" sin zona horaria)`
|
|
107
|
+
: String(item.fechas.fecha_cierre);
|
|
108
|
+
const alertMsg = `[${new Date().toISOString()}] [ALERTA] Código: ${item.codigo} | Presupuesto: $${item.montos.monto_disponible_clp.toLocaleString('es-CL')} CLP | Cierre: ${cierreTexto} | Institución: ${item.institucion.organismo_comprador} | Coincidencia: "${matchedKeyword}" | Nombre: ${item.nombre.trim()}\n`;
|
|
99
109
|
// Escribir en alerts.log
|
|
100
110
|
fs.appendFileSync(ALERTS_LOG_PATH, alertMsg, 'utf8');
|
|
101
111
|
// Mostrar alerta en consola
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/services/monitor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/services/monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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,
|
|
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,CA0PhG"}
|
|
@@ -33,10 +33,10 @@ const inputSchema = {
|
|
|
33
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
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
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(5).optional().describe('Cuántos procesos históricos auditar (1-15, default 5). Cada uno consume una consulta de cuota y la
|
|
36
|
+
limite_analisis: z.number().min(1).max(15).default(5).optional().describe('Cuántos procesos históricos auditar (1-15, default 5). Cada uno consume una consulta de cuota Y una llamada de detalle, que es lo lento: medido en septiembre de 2026, entre 20 y 25 segundos cada una, con HTTP 504 intermitentes. Los detalles se piden en paralelo, así que el total se parece más al más lento que a la suma — pero subir este número aumenta la probabilidad de que alguno falle. Con 5 el análisis completo ronda los 45-55 s.'),
|
|
37
37
|
};
|
|
38
38
|
export function registerAnalizarPreciosMercado(server, client) {
|
|
39
|
-
server.registerTool(TOOL_NAME, { description: TOOL_DESCRIPTION, inputSchema }, async (args) => {
|
|
39
|
+
server.registerTool(TOOL_NAME, { title: "Analizar precios de mercado", description: TOOL_DESCRIPTION, inputSchema, annotations: { readOnlyHint: true, openWorldHint: true } }, async (args) => {
|
|
40
40
|
try {
|
|
41
41
|
let keyword = args.q || '';
|
|
42
42
|
let region = args.region || '';
|
|
@@ -70,14 +70,23 @@ export function registerAnalizarPreciosMercado(server, client) {
|
|
|
70
70
|
// • estado=desierta → 5 de 8 procesos con cotizaciones, 20 precios unitarios
|
|
71
71
|
// • estado=cerrada → 0 de 8 procesos con cotizaciones, 0 precios
|
|
72
72
|
// Los procesos `cerrada` de primer llamado no publican sus cotizaciones,
|
|
73
|
-
// así que incluirlos solo gasta cuota y tiempo (
|
|
73
|
+
// así que incluirlos solo gasta cuota y tiempo (medido en septiembre de 2026:
|
|
74
|
+
// 10-17 s por búsqueda y 20-25 s por detalle, con 504 intermitentes).
|
|
74
75
|
// `proveedor_seleccionado` queda descartado: devuelve 0 resultados.
|
|
76
|
+
const limite = args.limite_analisis || 5;
|
|
75
77
|
logger.info(`analizar_precios_mercado: buscando históricos de "${keyword}" región "${region || 'todas'}"`);
|
|
76
78
|
const busqueda = await client.buscar({
|
|
77
79
|
q: keyword,
|
|
78
80
|
estado: 'desierta',
|
|
79
81
|
region: region || undefined,
|
|
80
|
-
|
|
82
|
+
// Solo se examinan los primeros `limite` resultados (ver más abajo),
|
|
83
|
+
// así que pedir más es desperdicio — y desperdicio caro: medido en
|
|
84
|
+
// producción (septiembre 2026), `estado=desierta` con búsqueda de
|
|
85
|
+
// texto y tamano_pagina=50 devuelve HTTP 504 sistemáticamente porque
|
|
86
|
+
// la pasarela corta a los ~30 s. Con 15 la misma consulta respondió
|
|
87
|
+
// en 9,9 s. Se pide lo que se va a usar, con el mínimo de 10 que
|
|
88
|
+
// exige la API.
|
|
89
|
+
tamano_pagina: Math.max(10, Math.min(limite, 50)),
|
|
81
90
|
numero_pagina: 1,
|
|
82
91
|
});
|
|
83
92
|
if (!busqueda.items?.length) {
|
|
@@ -86,16 +95,41 @@ export function registerAnalizarPreciosMercado(server, client) {
|
|
|
86
95
|
};
|
|
87
96
|
}
|
|
88
97
|
// 3. Recolectar cotizaciones de los detalles
|
|
89
|
-
const limite = args.limite_analisis || 5;
|
|
90
98
|
const preciosUnitarios = [];
|
|
91
99
|
const montosNetos = [];
|
|
92
100
|
const cotizaciones = [];
|
|
93
101
|
const inadmisibles = [];
|
|
94
102
|
let procesosConDatos = 0;
|
|
95
103
|
let adjudicacionesDetectadas = 0;
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
104
|
+
// Los detalles se piden EN PARALELO, con concurrencia adaptativa. Son
|
|
105
|
+
// independientes entre sí y la API tarda mucho por consulta —medido en
|
|
106
|
+
// producción (septiembre 2026): 20 a 25 s cada detalle—, así que en
|
|
107
|
+
// serie el total superaba los 105 s y ningún cliente MCP espera tanto.
|
|
108
|
+
// En paralelo la misma tanda tardó 29,5 s. El limitador del cliente
|
|
109
|
+
// baja el paralelismo si aparecen 504, para no insistir contra un
|
|
110
|
+
// servicio saturado; un histórico que falla llega como `null` y se
|
|
111
|
+
// descarta, PERO se cuenta (ver `consultasFallidas` más abajo).
|
|
112
|
+
const seleccionados = busqueda.items.slice(0, limite);
|
|
113
|
+
const detalles = await client.detallesEnParalelo(seleccionados.map((i) => i.codigo));
|
|
114
|
+
const detallados = seleccionados.map((item, i) => detalles[i] ? { item, det: detalles[i] } : null);
|
|
115
|
+
// ⚠ Cuántas consultas de detalle FALLARON, no cuántas se pretendía hacer.
|
|
116
|
+
// Sin esto, la herramienta informaba "se revisaron N procesos pero
|
|
117
|
+
// ninguno expuso cotizaciones con precios" incluso cuando las N
|
|
118
|
+
// consultas habían fallado con HTTP 504 y no se revisó nada. El
|
|
119
|
+
// usuario concluía que su rubro no tiene precios publicados —una
|
|
120
|
+
// afirmación sobre el mercado— cuando el hecho real era que la API no
|
|
121
|
+
// respondió. Observado en producción el 8 de septiembre de 2026: 6 de
|
|
122
|
+
// 6 detalles devolvieron 504 y el mensaje siguió siendo el de "sin
|
|
123
|
+
// precios". Un fallo de infraestructura no puede disfrazarse de
|
|
124
|
+
// conclusión de negocio.
|
|
125
|
+
const consultasIntentadas = detallados.length;
|
|
126
|
+
const consultasFallidas = detallados.filter((d) => d === null).length;
|
|
127
|
+
const consultasOk = consultasIntentadas - consultasFallidas;
|
|
128
|
+
for (const entrada of detallados) {
|
|
129
|
+
if (!entrada)
|
|
130
|
+
continue;
|
|
131
|
+
{
|
|
132
|
+
const { item, det } = entrada;
|
|
99
133
|
const provs = det.proveedores_cotizando ?? [];
|
|
100
134
|
if (provs.length === 0)
|
|
101
135
|
continue;
|
|
@@ -136,19 +170,35 @@ export function registerAnalizarPreciosMercado(server, client) {
|
|
|
136
170
|
inadmisibles.push(registro);
|
|
137
171
|
}
|
|
138
172
|
}
|
|
139
|
-
catch (e) {
|
|
140
|
-
logger.warn(`analizar_precios_mercado: falló el detalle de ${item.codigo}: ${safeError(e)}`);
|
|
141
|
-
}
|
|
142
173
|
}
|
|
143
174
|
if (preciosUnitarios.length === 0 && montosNetos.length === 0) {
|
|
175
|
+
// Sin datos hay dos causas muy distintas y no deben confundirse:
|
|
176
|
+
// que la API no respondiera, o que respondiera sin precios.
|
|
177
|
+
if (consultasOk === 0) {
|
|
178
|
+
return {
|
|
179
|
+
content: [{
|
|
180
|
+
type: 'text',
|
|
181
|
+
text: [
|
|
182
|
+
`No se pudo consultar el detalle de ninguno de los ${consultasIntentadas} procesos que coinciden con "${keyword}": las ${consultasFallidas} consultas fallaron.`,
|
|
183
|
+
'',
|
|
184
|
+
'⚠ Esto NO significa que no haya precios publicados para este rubro: significa que la API no respondió. No saques conclusiones de mercado desde este resultado.',
|
|
185
|
+
'Reintenta en unos minutos. Si persiste, baja "limite_analisis" para pedir menos por vez.',
|
|
186
|
+
].join('\n'),
|
|
187
|
+
}],
|
|
188
|
+
isError: true,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
const aviso = consultasFallidas > 0
|
|
192
|
+
? `\n⚠ Además, ${consultasFallidas} de las ${consultasIntentadas} consultas de detalle fallaron, así que la cobertura real fue menor a la pedida.`
|
|
193
|
+
: '';
|
|
144
194
|
return {
|
|
145
195
|
content: [{
|
|
146
196
|
type: 'text',
|
|
147
197
|
text: [
|
|
148
|
-
`Se revisaron ${
|
|
198
|
+
`Se revisaron ${consultasOk} procesos históricos que coinciden con "${keyword}", y ninguno expuso cotizaciones con precios.`,
|
|
149
199
|
'',
|
|
150
200
|
'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.',
|
|
201
|
+
'Sugerencias: usa un término más general, amplía "limite_analisis", o quita el filtro de región.' + aviso,
|
|
152
202
|
].join('\n'),
|
|
153
203
|
}],
|
|
154
204
|
};
|
|
@@ -182,7 +232,11 @@ export function registerAnalizarPreciosMercado(server, client) {
|
|
|
182
232
|
region_analisis: region ? `Región ${region}` : 'Todas las regiones',
|
|
183
233
|
cobertura: {
|
|
184
234
|
procesos_encontrados: busqueda.paginacion.total_resultados,
|
|
185
|
-
procesos_revisados:
|
|
235
|
+
procesos_revisados: consultasOk,
|
|
236
|
+
procesos_que_fallaron: consultasFallidas,
|
|
237
|
+
...(consultasFallidas > 0 && {
|
|
238
|
+
_aviso_cobertura: `${consultasFallidas} de ${consultasIntentadas} consultas de detalle fallaron (la API no respondió), así que la muestra es más chica que la pedida. No interpretes esto como escasez de datos del rubro.`,
|
|
239
|
+
}),
|
|
186
240
|
procesos_con_cotizaciones: procesosConDatos,
|
|
187
241
|
cotizaciones_totales: cotizaciones.length,
|
|
188
242
|
cotizaciones_declaradas_inadmisibles: inadmisibles.length,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analizar-precios-mercado.js","sourceRoot":"","sources":["../../src/tools/analizar-precios-mercado.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EACL,SAAS,EAAE,WAAW,EAAE,qBAAqB,EAAE,gBAAgB,EAC/D,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,SAAS,GAAG,0BAA0B,CAAC;AAE7C,MAAM,gBAAgB,GAAG;;;;;;;mHAO0F,CAAC;AAEpH,MAAM,WAAW,GAAG;IAClB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qIAAqI,CAAC;IACpL,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mIAAmI,CAAC;IACtK,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+EAA+E,CAAC;IACvH,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,
|
|
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;AAmBhE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,
|
|
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,CAsT1F"}
|