@ssolis-ti/mcp-compra-agil 1.0.2
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/LICENSE +21 -0
- package/README.md +355 -0
- package/dist/api/compra-agil-client.d.ts +268 -0
- package/dist/api/compra-agil-client.d.ts.map +1 -0
- package/dist/api/compra-agil-client.js +137 -0
- package/dist/api/compra-agil-client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/analizar-competencia.d.ts +9 -0
- package/dist/prompts/analizar-competencia.d.ts.map +1 -0
- package/dist/prompts/analizar-competencia.js +50 -0
- package/dist/prompts/analizar-competencia.js.map +1 -0
- package/dist/prompts/buscar-oportunidades.d.ts +9 -0
- package/dist/prompts/buscar-oportunidades.d.ts.map +1 -0
- package/dist/prompts/buscar-oportunidades.js +48 -0
- package/dist/prompts/buscar-oportunidades.js.map +1 -0
- package/dist/resources/compras-template.d.ts +10 -0
- package/dist/resources/compras-template.d.ts.map +1 -0
- package/dist/resources/compras-template.js +40 -0
- package/dist/resources/compras-template.js.map +1 -0
- package/dist/resources/documentacion.d.ts +6 -0
- package/dist/resources/documentacion.d.ts.map +1 -0
- package/dist/resources/documentacion.js +100 -0
- package/dist/resources/documentacion.js.map +1 -0
- package/dist/resources/estados.d.ts +9 -0
- package/dist/resources/estados.d.ts.map +1 -0
- package/dist/resources/estados.js +51 -0
- package/dist/resources/estados.js.map +1 -0
- package/dist/resources/glosario.d.ts +9 -0
- package/dist/resources/glosario.d.ts.map +1 -0
- package/dist/resources/glosario.js +77 -0
- package/dist/resources/glosario.js.map +1 -0
- package/dist/resources/regiones.d.ts +9 -0
- package/dist/resources/regiones.d.ts.map +1 -0
- package/dist/resources/regiones.js +37 -0
- package/dist/resources/regiones.js.map +1 -0
- package/dist/services/monitor.d.ts +2 -0
- package/dist/services/monitor.d.ts.map +1 -0
- package/dist/services/monitor.js +87 -0
- package/dist/services/monitor.js.map +1 -0
- package/dist/tools/auditar-desiertas.d.ts +4 -0
- package/dist/tools/auditar-desiertas.d.ts.map +1 -0
- package/dist/tools/auditar-desiertas.js +242 -0
- package/dist/tools/auditar-desiertas.js.map +1 -0
- package/dist/tools/buscar-compras.d.ts +10 -0
- package/dist/tools/buscar-compras.d.ts.map +1 -0
- package/dist/tools/buscar-compras.js +121 -0
- package/dist/tools/buscar-compras.js.map +1 -0
- package/dist/tools/detalle-compra.d.ts +10 -0
- package/dist/tools/detalle-compra.d.ts.map +1 -0
- package/dist/tools/detalle-compra.js +119 -0
- package/dist/tools/detalle-compra.js.map +1 -0
- package/dist/tools/detalle-oc.d.ts +10 -0
- package/dist/tools/detalle-oc.d.ts.map +1 -0
- package/dist/tools/detalle-oc.js +81 -0
- package/dist/tools/detalle-oc.js.map +1 -0
- package/dist/tools/documentos.d.ts +6 -0
- package/dist/tools/documentos.d.ts.map +1 -0
- package/dist/tools/documentos.js +245 -0
- package/dist/tools/documentos.js.map +1 -0
- package/dist/tools/estadisticas-uso.d.ts +10 -0
- package/dist/tools/estadisticas-uso.d.ts.map +1 -0
- package/dist/tools/estadisticas-uso.js +22 -0
- package/dist/tools/estadisticas-uso.js.map +1 -0
- package/dist/tools/generar-borrador.d.ts +4 -0
- package/dist/tools/generar-borrador.d.ts.map +1 -0
- package/dist/tools/generar-borrador.js +178 -0
- package/dist/tools/generar-borrador.js.map +1 -0
- package/dist/tools/monitorear-cambios.d.ts +10 -0
- package/dist/tools/monitorear-cambios.d.ts.map +1 -0
- package/dist/tools/monitorear-cambios.js +68 -0
- package/dist/tools/monitorear-cambios.js.map +1 -0
- package/dist/tools/radar-oportunidades.d.ts +4 -0
- package/dist/tools/radar-oportunidades.d.ts.map +1 -0
- package/dist/tools/radar-oportunidades.js +148 -0
- package/dist/tools/radar-oportunidades.js.map +1 -0
- package/dist/tools/recomendar-precio.d.ts +4 -0
- package/dist/tools/recomendar-precio.d.ts.map +1 -0
- package/dist/tools/recomendar-precio.js +180 -0
- package/dist/tools/recomendar-precio.js.map +1 -0
- package/dist/tools/verificar-oc.d.ts +13 -0
- package/dist/tools/verificar-oc.d.ts.map +1 -0
- package/dist/tools/verificar-oc.js +94 -0
- package/dist/tools/verificar-oc.js.map +1 -0
- package/dist/utils/env-loader.d.ts +6 -0
- package/dist/utils/env-loader.d.ts.map +1 -0
- package/dist/utils/env-loader.js +35 -0
- package/dist/utils/env-loader.js.map +1 -0
- package/dist/utils/error-handler.d.ts +28 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +74 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +48 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +39 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +82 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"estados.js","sourceRoot":"","sources":["../../src/resources/estados.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,OAAO,GAAG;IACd;QACE,MAAM,EAAE,WAAW;QACnB,WAAW,EAAE,uEAAuE;QACpF,IAAI,EAAE,IAAI;KACX;IACD;QACE,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,2EAA2E;QACxF,IAAI,EAAE,IAAI;KACX;IACD;QACE,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,qDAAqD;QAClE,IAAI,EAAE,IAAI;KACX;IACD;QACE,MAAM,EAAE,WAAW;QACnB,WAAW,EAAE,sDAAsD;QACnE,IAAI,EAAE,8FAA8F;KACrG;IACD;QACE,MAAM,EAAE,wBAAwB;QAChC,WAAW,EAAE,kGAAkG;QAC/G,IAAI,EAAE,sKAAsK;KAC7K;IACD;QACE,MAAM,EAAE,YAAY;QACpB,WAAW,EAAE,kEAAkE;QAC/E,IAAI,EAAE,uPAAuP;KAC9P;CACF,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,gBAAgB,CACrB,SAAS,EACT,uBAAuB,EACvB;QACE,WAAW,EAAE,4MAA4M;QACzN,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE,CAAC;gBACT,GAAG,EAAE,uBAAuB;gBAC5B,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;aACvC,CAAC;KACH,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource: compra-agil://glosario
|
|
3
|
+
*
|
|
4
|
+
* Glosario de términos del dominio de compras públicas chilenas.
|
|
5
|
+
* Permite a la IA entender el vocabulario técnico y de negocio.
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
export declare function registerGlosarioResource(server: McpServer): void;
|
|
9
|
+
//# sourceMappingURL=glosario.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glosario.d.ts","sourceRoot":"","sources":["../../src/resources/glosario.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6DpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgBhE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource: compra-agil://glosario
|
|
3
|
+
*
|
|
4
|
+
* Glosario de términos del dominio de compras públicas chilenas.
|
|
5
|
+
* Permite a la IA entender el vocabulario técnico y de negocio.
|
|
6
|
+
*/
|
|
7
|
+
const GLOSARIO = [
|
|
8
|
+
{
|
|
9
|
+
termino: 'API',
|
|
10
|
+
definicion: 'Interfaz de Programación de Aplicaciones. Permite que sistemas informáticos se comuniquen entre sí de forma estructurada.',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
termino: 'Compra Ágil',
|
|
14
|
+
definicion: 'Mecanismo de contratación simplificada de Mercado Público para adquisición rápida de bienes y servicios por organismos del Estado de Chile.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
termino: 'Ticket',
|
|
18
|
+
definicion: 'Credencial de acceso a la API. Identifica al cliente y controla su cuota de uso diario.',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
termino: 'Token Bucket',
|
|
22
|
+
definicion: 'Algoritmo de control de tasa de solicitudes. Un "balde" de tokens se consume con cada request y se recarga automáticamente al inicio de cada día calendario.',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
termino: 'EMT',
|
|
26
|
+
definicion: 'Empresa de Menor Tamaño. Clasificación del Registro de Proveedores de ChileCompra que identifica a micro, pequeñas y medianas empresas.',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
termino: 'OC / Orden de Compra',
|
|
30
|
+
definicion: 'Documento oficial que formaliza la compra al proveedor seleccionado en el proceso de Compra Ágil.',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
termino: 'Convocatoria',
|
|
34
|
+
definicion: 'Llamado a proveedores para cotizar en una Compra Ágil. Puede haber primer llamado (abierto a proveedores invitados) y segundo llamado (ampliado).',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
termino: 'DCCP',
|
|
38
|
+
definicion: 'Dirección de Compras y Contratación Pública. Organismo público que administra Mercado Público (www.mercadopublico.cl).',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
termino: 'CLP',
|
|
42
|
+
definicion: 'Código de moneda del Peso Chileno según el estándar ISO 4217.',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
termino: 'ISO-8601',
|
|
46
|
+
definicion: 'Estándar internacional para representar fechas y horas. Formato: 2026-04-01T12:00:00Z (año-mes-díaTHora:Min:SegZ para UTC).',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
termino: 'Sincronización incremental',
|
|
50
|
+
definicion: 'Técnica para obtener solo los datos que han cambiado desde la última consulta, evitando descargas completas. Se logra usando los parámetros ttl_cambio_ms o cambio_desde/cambio_hasta.',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
termino: 'Paginación',
|
|
54
|
+
definicion: 'Mecanismo que divide un conjunto grande de resultados en páginas de tamaño fijo (máx. 50 items por página) para facilitar su procesamiento.',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
termino: '429 Too Many Requests',
|
|
58
|
+
definicion: 'Código HTTP que indica que se superó el límite de solicitudes permitidas por día. La cuota se restablece al inicio del siguiente día calendario UTC.',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
termino: 'Retry-After',
|
|
62
|
+
definicion: 'Header HTTP que indica cuántos segundos esperar antes de volver a intentar una solicitud rechazada por exceso de cuota.',
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
export function registerGlosarioResource(server) {
|
|
66
|
+
server.registerResource('glosario', 'compra-agil://glosario', {
|
|
67
|
+
description: 'Glosario de términos técnicos y de negocio del sistema de compras públicas de Chile (Mercado Público). Consulta este recurso para entender la terminología específica del dominio.',
|
|
68
|
+
mimeType: 'application/json',
|
|
69
|
+
}, async () => ({
|
|
70
|
+
contents: [{
|
|
71
|
+
uri: 'compra-agil://glosario',
|
|
72
|
+
mimeType: 'application/json',
|
|
73
|
+
text: JSON.stringify(GLOSARIO, null, 2),
|
|
74
|
+
}],
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=glosario.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glosario.js","sourceRoot":"","sources":["../../src/resources/glosario.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,QAAQ,GAAG;IACf;QACE,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,2HAA2H;KACxI;IACD;QACE,OAAO,EAAE,aAAa;QACtB,UAAU,EAAE,6IAA6I;KAC1J;IACD;QACE,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,yFAAyF;KACtG;IACD;QACE,OAAO,EAAE,cAAc;QACvB,UAAU,EAAE,8JAA8J;KAC3K;IACD;QACE,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,yIAAyI;KACtJ;IACD;QACE,OAAO,EAAE,sBAAsB;QAC/B,UAAU,EAAE,mGAAmG;KAChH;IACD;QACE,OAAO,EAAE,cAAc;QACvB,UAAU,EAAE,mJAAmJ;KAChK;IACD;QACE,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,wHAAwH;KACrI;IACD;QACE,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,+DAA+D;KAC5E;IACD;QACE,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,6HAA6H;KAC1I;IACD;QACE,OAAO,EAAE,4BAA4B;QACrC,UAAU,EAAE,wLAAwL;KACrM;IACD;QACE,OAAO,EAAE,YAAY;QACrB,UAAU,EAAE,6IAA6I;KAC1J;IACD;QACE,OAAO,EAAE,uBAAuB;QAChC,UAAU,EAAE,sJAAsJ;KACnK;IACD;QACE,OAAO,EAAE,aAAa;QACtB,UAAU,EAAE,yHAAyH;KACtI;CACF,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,gBAAgB,CACrB,UAAU,EACV,wBAAwB,EACxB;QACE,WAAW,EAAE,oLAAoL;QACjM,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE,CAAC;gBACT,GAAG,EAAE,wBAAwB;gBAC7B,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;aACxC,CAAC;KACH,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource: compra-agil://regiones
|
|
3
|
+
*
|
|
4
|
+
* Catálogo de las 16 regiones de Chile con sus códigos numéricos
|
|
5
|
+
* para usar como filtro en la API de Compra Ágil.
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
export declare function registerRegionesResource(server: McpServer): void;
|
|
9
|
+
//# sourceMappingURL=regiones.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regiones.d.ts","sourceRoot":"","sources":["../../src/resources/regiones.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqBpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgBhE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource: compra-agil://regiones
|
|
3
|
+
*
|
|
4
|
+
* Catálogo de las 16 regiones de Chile con sus códigos numéricos
|
|
5
|
+
* para usar como filtro en la API de Compra Ágil.
|
|
6
|
+
*/
|
|
7
|
+
const REGIONES = [
|
|
8
|
+
{ codigo: 1, nombre: 'Tarapacá' },
|
|
9
|
+
{ codigo: 2, nombre: 'Antofagasta' },
|
|
10
|
+
{ codigo: 3, nombre: 'Atacama' },
|
|
11
|
+
{ codigo: 4, nombre: 'Coquimbo' },
|
|
12
|
+
{ codigo: 5, nombre: 'Valparaíso' },
|
|
13
|
+
{ codigo: 6, nombre: "O'Higgins" },
|
|
14
|
+
{ codigo: 7, nombre: 'Maule' },
|
|
15
|
+
{ codigo: 8, nombre: 'Biobío' },
|
|
16
|
+
{ codigo: 9, nombre: 'Araucanía' },
|
|
17
|
+
{ codigo: 10, nombre: 'Los Lagos' },
|
|
18
|
+
{ codigo: 11, nombre: 'Aysén' },
|
|
19
|
+
{ codigo: 12, nombre: 'Magallanes y Antártica' },
|
|
20
|
+
{ codigo: 13, nombre: 'Metropolitana' },
|
|
21
|
+
{ codigo: 14, nombre: 'Los Ríos' },
|
|
22
|
+
{ codigo: 15, nombre: 'Arica y Parinacota' },
|
|
23
|
+
{ codigo: 16, nombre: 'Ñuble' },
|
|
24
|
+
];
|
|
25
|
+
export function registerRegionesResource(server) {
|
|
26
|
+
server.registerResource('regiones', 'compra-agil://regiones', {
|
|
27
|
+
description: 'Catálogo de las 16 regiones de Chile con sus códigos numéricos. Usa estos códigos en el parámetro "region" de las herramientas de búsqueda. Ej: Metropolitana = 13, Valparaíso = 5.',
|
|
28
|
+
mimeType: 'application/json',
|
|
29
|
+
}, async () => ({
|
|
30
|
+
contents: [{
|
|
31
|
+
uri: 'compra-agil://regiones',
|
|
32
|
+
mimeType: 'application/json',
|
|
33
|
+
text: JSON.stringify(REGIONES, null, 2),
|
|
34
|
+
}],
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=regiones.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regiones.js","sourceRoot":"","sources":["../../src/resources/regiones.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,QAAQ,GAAG;IACf,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE;IACjC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE;IACpC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE;IAChC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE;IACjC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE;IACnC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE;IAClC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE;IAC9B,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC/B,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE;IAClC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;IACnC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;IAC/B,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,wBAAwB,EAAE;IAChD,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE;IACvC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;IAClC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,oBAAoB,EAAE;IAC5C,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;CAChC,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,gBAAgB,CACrB,UAAU,EACV,wBAAwB,EACxB;QACE,WAAW,EAAE,qLAAqL;QAClM,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE,CAAC;gBACT,GAAG,EAAE,wBAAwB;gBAC7B,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;aACxC,CAAC;KACH,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/services/monitor.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon: monitor
|
|
3
|
+
*
|
|
4
|
+
* Servicio en segundo plano que vigila de forma periódica las Compras Públicas.
|
|
5
|
+
* Busca oportunidades vigentes (publicada), con 0 ofertas, que superen un presupuesto mínimo
|
|
6
|
+
* y que contengan palabras clave específicas. Guarda las alertas en alerts.log.
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { loadEnvManual } from '../utils/env-loader.js';
|
|
11
|
+
import { CompraAgilClient } from '../api/compra-agil-client.js';
|
|
12
|
+
// Inicializar entorno
|
|
13
|
+
loadEnvManual();
|
|
14
|
+
const TICKET = process.env.COMPRA_AGIL_TICKET;
|
|
15
|
+
const BASE_URL = process.env.COMPRA_AGIL_BASE_URL || 'https://api2.mercadopublico.cl';
|
|
16
|
+
if (!TICKET) {
|
|
17
|
+
console.error('[ERROR] Variable de entorno COMPRA_AGIL_TICKET no definida en .env');
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
// Parámetros de monitoreo configurables por el usuario
|
|
21
|
+
const INTERVAL_MINUTES = parseInt(process.env.MONITOR_INTERVAL_MINUTES || '60', 10);
|
|
22
|
+
const MIN_BUDGET = parseFloat(process.env.MONITOR_MIN_BUDGET_CLP || '5000000');
|
|
23
|
+
const KEYWORDS_RAW = process.env.MONITOR_KEYWORDS || 'software, desarrollo, licencias, plataforma, sistema';
|
|
24
|
+
const KEYWORDS = KEYWORDS_RAW.split(',').map(kw => kw.trim().toLowerCase()).filter(Boolean);
|
|
25
|
+
const ALERTS_LOG_PATH = path.resolve(process.cwd(), 'alerts.log');
|
|
26
|
+
console.log('========================================================');
|
|
27
|
+
console.log(' INICIANDO DEMONIO DE MONITOREO DE COMPRA ÁGIL v2');
|
|
28
|
+
console.log('========================================================');
|
|
29
|
+
console.log(`Frecuencia de monitoreo: Cada ${INTERVAL_MINUTES} minutos`);
|
|
30
|
+
console.log(`Presupuesto mínimo : $${MIN_BUDGET.toLocaleString('es-CL')} CLP`);
|
|
31
|
+
console.log(`Palabras clave a buscar: ${KEYWORDS.join(', ')}`);
|
|
32
|
+
console.log(`Destino de alertas : ${ALERTS_LOG_PATH}`);
|
|
33
|
+
console.log('========================================================');
|
|
34
|
+
const client = new CompraAgilClient(TICKET, BASE_URL);
|
|
35
|
+
async function runCheck() {
|
|
36
|
+
const timestamp = new Date().toISOString();
|
|
37
|
+
console.log(`[${timestamp}] Iniciando ciclo de búsqueda de cambios...`);
|
|
38
|
+
try {
|
|
39
|
+
// Definir ttl en base al intervalo de ejecución + un margen de 5 minutos por solapamiento de APIs
|
|
40
|
+
const bufferMinutes = 5;
|
|
41
|
+
const ttlMs = (INTERVAL_MINUTES + bufferMinutes) * 60 * 1000;
|
|
42
|
+
// Buscar cambios recientes en todo el país (auto-paginado completo hasta 10 páginas)
|
|
43
|
+
const items = await client.buscarTodo({
|
|
44
|
+
ttl_cambio_ms: ttlMs,
|
|
45
|
+
estado: 'publicada',
|
|
46
|
+
tamano_pagina: 50
|
|
47
|
+
});
|
|
48
|
+
console.log(`[${timestamp}] Se encontraron ${items.length} procesos modificados/creados recientemente.`);
|
|
49
|
+
let alertCount = 0;
|
|
50
|
+
for (const item of items) {
|
|
51
|
+
// Filtro 1: Debe estar en estado "publicada"
|
|
52
|
+
if (item.estado.codigo !== 'publicada')
|
|
53
|
+
continue;
|
|
54
|
+
// Filtro 2: Debe tener 0 ofertas recibidas
|
|
55
|
+
if (item.resumen.total_ofertas_recibidas !== 0)
|
|
56
|
+
continue;
|
|
57
|
+
// Filtro 3: Debe superar el presupuesto mínimo
|
|
58
|
+
if (item.montos.monto_disponible_clp < MIN_BUDGET)
|
|
59
|
+
continue;
|
|
60
|
+
// Filtro 4: Coincidencia de palabras clave en el nombre
|
|
61
|
+
const nameLower = item.nombre.toLowerCase();
|
|
62
|
+
const matchedKeyword = KEYWORDS.find(kw => nameLower.includes(kw));
|
|
63
|
+
if (matchedKeyword) {
|
|
64
|
+
alertCount++;
|
|
65
|
+
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
|
+
// Escribir en alerts.log
|
|
67
|
+
fs.appendFileSync(ALERTS_LOG_PATH, alertMsg, 'utf8');
|
|
68
|
+
// Mostrar alerta en consola
|
|
69
|
+
console.log(`\x1b[33m${alertMsg.trim()}\x1b[0m`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
console.log(`[${timestamp}] Ciclo completado. Alertas generadas en este ciclo: ${alertCount}\n`);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
const errorMsg = error?.actionableMessage || String(error);
|
|
76
|
+
console.error(`[${timestamp}] [ERROR] Falló el ciclo de monitoreo: ${errorMsg}\n`);
|
|
77
|
+
// Si la cuota de la API se agotó, podemos dormir o pausar el demonio
|
|
78
|
+
if (errorMsg.includes('Cuota diaria agotada') || error?.status === 429) {
|
|
79
|
+
console.warn(`[${timestamp}] [ADVERTENCIA] Rate limit detectado. El servicio reintentará en el próximo ciclo.`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Ejecución inicial inmediata
|
|
84
|
+
runCheck();
|
|
85
|
+
// Agendar ejecuciones periódicas
|
|
86
|
+
setInterval(runCheck, INTERVAL_MINUTES * 60 * 1000);
|
|
87
|
+
//# sourceMappingURL=monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/services/monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { CompraAgilClient } from '../api/compra-agil-client.js';
|
|
3
|
+
export declare function registerAuditarDesiertas(server: McpServer, client: CompraAgilClient): void;
|
|
4
|
+
//# sourceMappingURL=auditar-desiertas.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { CompraAgilApiError } from '../utils/error-handler.js';
|
|
3
|
+
import { logger } from '../utils/logger.js';
|
|
4
|
+
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 inputSchema = {
|
|
8
|
+
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
|
+
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.'),
|
|
10
|
+
limite_analisis: z.number().min(1).max(8).default(5).optional().describe('Cantidad de procesos históricos exitosos con los que comparar (1-8, default 5) para no agotar la cuota de la API.'),
|
|
11
|
+
};
|
|
12
|
+
export function registerAuditarDesiertas(server, client) {
|
|
13
|
+
server.registerTool(TOOL_NAME, {
|
|
14
|
+
description: TOOL_DESCRIPTION,
|
|
15
|
+
inputSchema: inputSchema,
|
|
16
|
+
}, async (args) => {
|
|
17
|
+
try {
|
|
18
|
+
let targetCode = args.codigo_compra || '';
|
|
19
|
+
let keyword = args.q || '';
|
|
20
|
+
let region = '';
|
|
21
|
+
// 1. Si no hay código pero hay keyword q, buscar un proceso desierto reciente
|
|
22
|
+
if (!targetCode && keyword) {
|
|
23
|
+
logger.info(`auditar_compras_desiertas: Buscando proceso desierto reciente para "${keyword}"`);
|
|
24
|
+
const desiertasSearch = await client.buscar({
|
|
25
|
+
q: keyword,
|
|
26
|
+
estado: 'desierta',
|
|
27
|
+
tamano_pagina: 10, // API v2 requiere mínimo 10
|
|
28
|
+
numero_pagina: 1,
|
|
29
|
+
});
|
|
30
|
+
if (!desiertasSearch.items || desiertasSearch.items.length === 0) {
|
|
31
|
+
return {
|
|
32
|
+
content: [{
|
|
33
|
+
type: 'text',
|
|
34
|
+
text: `No se encontraron procesos recientes en estado "desierta" para la búsqueda "${keyword}". Por favor intenta con otra palabra clave o ingresa un "codigo_compra" específico.`,
|
|
35
|
+
}],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
targetCode = desiertasSearch.items[0].codigo;
|
|
39
|
+
}
|
|
40
|
+
if (!targetCode) {
|
|
41
|
+
return {
|
|
42
|
+
content: [{
|
|
43
|
+
type: 'text',
|
|
44
|
+
text: 'Error de validación: Debes proporcionar "codigo_compra" o un término de búsqueda "q" para encontrar un proceso a auditar.',
|
|
45
|
+
}],
|
|
46
|
+
isError: true,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// 2. Obtener el detalle del proceso desierto a auditar
|
|
50
|
+
logger.info(`auditar_compras_desiertas: Consultando detalle del proceso objetivo ${targetCode}`);
|
|
51
|
+
const targetDetail = await client.detalle(targetCode);
|
|
52
|
+
// Extraer metadatos clave del proceso objetivo
|
|
53
|
+
const targetName = targetDetail.nombre || 'Sin nombre';
|
|
54
|
+
const targetBudget = targetDetail.presupuesto?.monto_disponible_clp || targetDetail.presupuesto?.monto_disponible || 0;
|
|
55
|
+
let targetDuration = 0;
|
|
56
|
+
if (targetDetail.fechas?.fecha_cierre && targetDetail.fechas?.fecha_publicacion) {
|
|
57
|
+
const start = new Date(targetDetail.fechas.fecha_publicacion).getTime();
|
|
58
|
+
const end = new Date(targetDetail.fechas.fecha_cierre).getTime();
|
|
59
|
+
targetDuration = Math.round(((end - start) / (1000 * 60 * 60 * 24)) * 10) / 10;
|
|
60
|
+
}
|
|
61
|
+
if (targetDetail.institucion?.region !== null) {
|
|
62
|
+
region = String(targetDetail.institucion.region);
|
|
63
|
+
}
|
|
64
|
+
// Determinar la palabra clave para la comparativa histórica
|
|
65
|
+
if (!keyword) {
|
|
66
|
+
if (targetDetail.productos_solicitados && targetDetail.productos_solicitados.length > 0) {
|
|
67
|
+
keyword = targetDetail.productos_solicitados[0].nombre;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
keyword = targetDetail.nombre;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// 3. Buscar procesos similares exitosos (proveedor_seleccionado)
|
|
74
|
+
logger.info(`auditar_compras_desiertas: Buscando procesos exitosos similares para "${keyword}"`);
|
|
75
|
+
const limit = args.limite_analisis || 5;
|
|
76
|
+
const searchResponse = await client.buscar({
|
|
77
|
+
q: keyword,
|
|
78
|
+
estado: 'proveedor_seleccionado',
|
|
79
|
+
tamano_pagina: 10, // API v2 requiere mínimo 10
|
|
80
|
+
numero_pagina: 1,
|
|
81
|
+
});
|
|
82
|
+
const successDurations = [];
|
|
83
|
+
const successPrices = [];
|
|
84
|
+
const processedCases = [];
|
|
85
|
+
const itemsToProcess = (searchResponse.items || []).slice(0, limit);
|
|
86
|
+
if (itemsToProcess.length > 0) {
|
|
87
|
+
logger.info(`auditar_compras_desiertas: Analizando detalles de ${itemsToProcess.length} procesos exitosos`);
|
|
88
|
+
for (const item of itemsToProcess) {
|
|
89
|
+
try {
|
|
90
|
+
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
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (detailError) {
|
|
121
|
+
logger.warn(`auditar_compras_desiertas: Error al consultar detalle de exitoso ${item.codigo}: ${String(detailError)}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// 4. Calcular métricas estadísticas para el análisis comparativo
|
|
126
|
+
let avgPrice = 0, minPrice = 0, maxPrice = 0;
|
|
127
|
+
if (successPrices.length > 0) {
|
|
128
|
+
successPrices.sort((a, b) => a - b);
|
|
129
|
+
minPrice = successPrices[0];
|
|
130
|
+
maxPrice = successPrices[successPrices.length - 1];
|
|
131
|
+
avgPrice = Math.round(successPrices.reduce((a, b) => a + b, 0) / successPrices.length);
|
|
132
|
+
}
|
|
133
|
+
let avgDuration = 0, minDuration = 0, maxDuration = 0;
|
|
134
|
+
if (successDurations.length > 0) {
|
|
135
|
+
successDurations.sort((a, b) => a - b);
|
|
136
|
+
minDuration = successDurations[0];
|
|
137
|
+
maxDuration = successDurations[successDurations.length - 1];
|
|
138
|
+
avgDuration = Math.round((successDurations.reduce((a, b) => a + b, 0) / successDurations.length) * 10) / 10;
|
|
139
|
+
}
|
|
140
|
+
// 5. Análisis crítico de brechas
|
|
141
|
+
const analisis_critico = {
|
|
142
|
+
presupuesto_insuficiente: false,
|
|
143
|
+
plazo_insuficiente: false,
|
|
144
|
+
requisitos_complejos: false,
|
|
145
|
+
diferencia_presupuesto_porcentaje: 0,
|
|
146
|
+
diferencia_plazo_dias: 0,
|
|
147
|
+
};
|
|
148
|
+
if (targetBudget > 0 && avgPrice > 0) {
|
|
149
|
+
analisis_critico.diferencia_presupuesto_porcentaje = Math.round(((targetBudget - avgPrice) / avgPrice) * 100);
|
|
150
|
+
if (targetBudget < minPrice || targetBudget < avgPrice * 0.8) {
|
|
151
|
+
analisis_critico.presupuesto_insuficiente = true;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else if (targetBudget === 0 && avgPrice > 0) {
|
|
155
|
+
// Si el presupuesto objetivo es $0 o no especificado, se marca como potencial brecha si el histórico requiere fondos
|
|
156
|
+
analisis_critico.presupuesto_insuficiente = true;
|
|
157
|
+
}
|
|
158
|
+
if (targetDuration > 0 && avgDuration > 0) {
|
|
159
|
+
analisis_critico.diferencia_plazo_dias = Math.round((targetDuration - avgDuration) * 10) / 10;
|
|
160
|
+
if (targetDuration < 2 || targetDuration < avgDuration * 0.6) {
|
|
161
|
+
analisis_critico.plazo_insuficiente = true;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else if (targetDuration > 0 && targetDuration < 2) {
|
|
165
|
+
// Plazo menor a 2 días siempre se marca como potencialmente insuficiente en Compra Ágil
|
|
166
|
+
analisis_critico.plazo_insuficiente = true;
|
|
167
|
+
}
|
|
168
|
+
if (targetDetail.flags?.considera_requisitos_medioambientales ||
|
|
169
|
+
targetDetail.flags?.considera_requisitos_impacto_social_economico) {
|
|
170
|
+
analisis_critico.requisitos_complejos = true;
|
|
171
|
+
}
|
|
172
|
+
// 6. Generación de recomendaciones accionables
|
|
173
|
+
const recomendaciones = [];
|
|
174
|
+
if (analisis_critico.presupuesto_insuficiente) {
|
|
175
|
+
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')}.`);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
recomendaciones.push(`Especificar o incrementar el presupuesto estimado. El promedio histórico adjudicado para productos similares es de $${avgPrice.toLocaleString('es-CL')}.`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
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.`);
|
|
184
|
+
}
|
|
185
|
+
if (analisis_critico.requisitos_complejos) {
|
|
186
|
+
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.`);
|
|
187
|
+
}
|
|
188
|
+
if (recomendaciones.length === 0) {
|
|
189
|
+
recomendaciones.push(`No se detectaron discrepancias obvias de presupuesto o plazo respecto al mercado. Se sugiere revisar la redacción de las especificaciones técnicas o los ítems requeridos en "productos_solicitados" para asegurarse de que no estén amarrados a una única marca o sean demasiado específicos.`);
|
|
190
|
+
}
|
|
191
|
+
const result = {
|
|
192
|
+
proceso_auditado: {
|
|
193
|
+
codigo: targetCode,
|
|
194
|
+
nombre: targetName,
|
|
195
|
+
region: region ? `Región ${region}` : 'No especificada',
|
|
196
|
+
estado: targetDetail.estado?.glosa || 'Desconocido',
|
|
197
|
+
presupuesto_disponible: targetBudget,
|
|
198
|
+
duracion_dias: targetDuration,
|
|
199
|
+
items_solicitados: targetDetail.productos_solicitados?.map(p => ({
|
|
200
|
+
nombre: p.nombre,
|
|
201
|
+
cantidad: p.cantidad,
|
|
202
|
+
unidad: p.unidad_medida,
|
|
203
|
+
})) || [],
|
|
204
|
+
motivo_desierta: targetDetail.motivos?.motivo_desierta || 'No especificado en el sistema',
|
|
205
|
+
},
|
|
206
|
+
busqueda_comparativa: {
|
|
207
|
+
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,
|
|
213
|
+
} : null,
|
|
214
|
+
estadisticas_duracion_exitosa: successDurations.length > 0 ? {
|
|
215
|
+
minimo_dias: minDuration,
|
|
216
|
+
maximo_dias: maxDuration,
|
|
217
|
+
promedio_dias: avgDuration,
|
|
218
|
+
} : null,
|
|
219
|
+
},
|
|
220
|
+
analisis_de_brechas: analisis_critico,
|
|
221
|
+
recomendaciones_de_optimizacion: recomendaciones,
|
|
222
|
+
casos_exitosos_analizados: processedCases,
|
|
223
|
+
};
|
|
224
|
+
return {
|
|
225
|
+
content: [{
|
|
226
|
+
type: 'text',
|
|
227
|
+
text: JSON.stringify(result, null, 2),
|
|
228
|
+
}],
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
const message = error instanceof CompraAgilApiError
|
|
233
|
+
? error.actionableMessage
|
|
234
|
+
: `Error inesperado al auditar compra desierta: ${String(error)}`;
|
|
235
|
+
return {
|
|
236
|
+
content: [{ type: 'text', text: message }],
|
|
237
|
+
isError: true,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=auditar-desiertas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditar-desiertas.js","sourceRoot":"","sources":["../../src/tools/auditar-desiertas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool: buscar_compras_agiles
|
|
3
|
+
*
|
|
4
|
+
* Busca y filtra procesos de Compra Ágil en Mercado Público
|
|
5
|
+
* usando palabras clave, fechas, estados y regiones.
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import { CompraAgilClient } from '../api/compra-agil-client.js';
|
|
9
|
+
export declare function registerBuscarCompras(server: McpServer, client: CompraAgilClient): void;
|
|
10
|
+
//# sourceMappingURL=buscar-compras.d.ts.map
|
|
@@ -0,0 +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"}
|