@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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +355 -0
  3. package/dist/api/compra-agil-client.d.ts +268 -0
  4. package/dist/api/compra-agil-client.d.ts.map +1 -0
  5. package/dist/api/compra-agil-client.js +137 -0
  6. package/dist/api/compra-agil-client.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +95 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/prompts/analizar-competencia.d.ts +9 -0
  12. package/dist/prompts/analizar-competencia.d.ts.map +1 -0
  13. package/dist/prompts/analizar-competencia.js +50 -0
  14. package/dist/prompts/analizar-competencia.js.map +1 -0
  15. package/dist/prompts/buscar-oportunidades.d.ts +9 -0
  16. package/dist/prompts/buscar-oportunidades.d.ts.map +1 -0
  17. package/dist/prompts/buscar-oportunidades.js +48 -0
  18. package/dist/prompts/buscar-oportunidades.js.map +1 -0
  19. package/dist/resources/compras-template.d.ts +10 -0
  20. package/dist/resources/compras-template.d.ts.map +1 -0
  21. package/dist/resources/compras-template.js +40 -0
  22. package/dist/resources/compras-template.js.map +1 -0
  23. package/dist/resources/documentacion.d.ts +6 -0
  24. package/dist/resources/documentacion.d.ts.map +1 -0
  25. package/dist/resources/documentacion.js +100 -0
  26. package/dist/resources/documentacion.js.map +1 -0
  27. package/dist/resources/estados.d.ts +9 -0
  28. package/dist/resources/estados.d.ts.map +1 -0
  29. package/dist/resources/estados.js +51 -0
  30. package/dist/resources/estados.js.map +1 -0
  31. package/dist/resources/glosario.d.ts +9 -0
  32. package/dist/resources/glosario.d.ts.map +1 -0
  33. package/dist/resources/glosario.js +77 -0
  34. package/dist/resources/glosario.js.map +1 -0
  35. package/dist/resources/regiones.d.ts +9 -0
  36. package/dist/resources/regiones.d.ts.map +1 -0
  37. package/dist/resources/regiones.js +37 -0
  38. package/dist/resources/regiones.js.map +1 -0
  39. package/dist/services/monitor.d.ts +2 -0
  40. package/dist/services/monitor.d.ts.map +1 -0
  41. package/dist/services/monitor.js +87 -0
  42. package/dist/services/monitor.js.map +1 -0
  43. package/dist/tools/auditar-desiertas.d.ts +4 -0
  44. package/dist/tools/auditar-desiertas.d.ts.map +1 -0
  45. package/dist/tools/auditar-desiertas.js +242 -0
  46. package/dist/tools/auditar-desiertas.js.map +1 -0
  47. package/dist/tools/buscar-compras.d.ts +10 -0
  48. package/dist/tools/buscar-compras.d.ts.map +1 -0
  49. package/dist/tools/buscar-compras.js +121 -0
  50. package/dist/tools/buscar-compras.js.map +1 -0
  51. package/dist/tools/detalle-compra.d.ts +10 -0
  52. package/dist/tools/detalle-compra.d.ts.map +1 -0
  53. package/dist/tools/detalle-compra.js +119 -0
  54. package/dist/tools/detalle-compra.js.map +1 -0
  55. package/dist/tools/detalle-oc.d.ts +10 -0
  56. package/dist/tools/detalle-oc.d.ts.map +1 -0
  57. package/dist/tools/detalle-oc.js +81 -0
  58. package/dist/tools/detalle-oc.js.map +1 -0
  59. package/dist/tools/documentos.d.ts +6 -0
  60. package/dist/tools/documentos.d.ts.map +1 -0
  61. package/dist/tools/documentos.js +245 -0
  62. package/dist/tools/documentos.js.map +1 -0
  63. package/dist/tools/estadisticas-uso.d.ts +10 -0
  64. package/dist/tools/estadisticas-uso.d.ts.map +1 -0
  65. package/dist/tools/estadisticas-uso.js +22 -0
  66. package/dist/tools/estadisticas-uso.js.map +1 -0
  67. package/dist/tools/generar-borrador.d.ts +4 -0
  68. package/dist/tools/generar-borrador.d.ts.map +1 -0
  69. package/dist/tools/generar-borrador.js +178 -0
  70. package/dist/tools/generar-borrador.js.map +1 -0
  71. package/dist/tools/monitorear-cambios.d.ts +10 -0
  72. package/dist/tools/monitorear-cambios.d.ts.map +1 -0
  73. package/dist/tools/monitorear-cambios.js +68 -0
  74. package/dist/tools/monitorear-cambios.js.map +1 -0
  75. package/dist/tools/radar-oportunidades.d.ts +4 -0
  76. package/dist/tools/radar-oportunidades.d.ts.map +1 -0
  77. package/dist/tools/radar-oportunidades.js +148 -0
  78. package/dist/tools/radar-oportunidades.js.map +1 -0
  79. package/dist/tools/recomendar-precio.d.ts +4 -0
  80. package/dist/tools/recomendar-precio.d.ts.map +1 -0
  81. package/dist/tools/recomendar-precio.js +180 -0
  82. package/dist/tools/recomendar-precio.js.map +1 -0
  83. package/dist/tools/verificar-oc.d.ts +13 -0
  84. package/dist/tools/verificar-oc.d.ts.map +1 -0
  85. package/dist/tools/verificar-oc.js +94 -0
  86. package/dist/tools/verificar-oc.js.map +1 -0
  87. package/dist/utils/env-loader.d.ts +6 -0
  88. package/dist/utils/env-loader.d.ts.map +1 -0
  89. package/dist/utils/env-loader.js +35 -0
  90. package/dist/utils/env-loader.js.map +1 -0
  91. package/dist/utils/error-handler.d.ts +28 -0
  92. package/dist/utils/error-handler.d.ts.map +1 -0
  93. package/dist/utils/error-handler.js +74 -0
  94. package/dist/utils/error-handler.js.map +1 -0
  95. package/dist/utils/logger.d.ts +15 -0
  96. package/dist/utils/logger.d.ts.map +1 -0
  97. package/dist/utils/logger.js +48 -0
  98. package/dist/utils/logger.js.map +1 -0
  99. package/dist/utils/rate-limiter.d.ts +39 -0
  100. package/dist/utils/rate-limiter.d.ts.map +1 -0
  101. package/dist/utils/rate-limiter.js +82 -0
  102. package/dist/utils/rate-limiter.js.map +1 -0
  103. package/package.json +53 -0
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Control inteligente de rate limiting para la API de Compra Ágil.
3
+ *
4
+ * La API usa cuota por día calendario (se resetea a medianoche UTC).
5
+ * Este módulo lleva un contador local de requests para advertir
6
+ * proactivamente antes de alcanzar el límite.
7
+ */
8
+ import { logger } from './logger.js';
9
+ export class RateLimiter {
10
+ requestCount = 0;
11
+ currentDay;
12
+ isLimited = false;
13
+ limitResetTime = null;
14
+ constructor() {
15
+ this.currentDay = this.getTodayUTC();
16
+ }
17
+ getTodayUTC() {
18
+ return new Date().toISOString().split('T')[0];
19
+ }
20
+ /**
21
+ * Registra un request exitoso. Resetea el contador si cambió el día.
22
+ */
23
+ recordRequest() {
24
+ const today = this.getTodayUTC();
25
+ if (today !== this.currentDay) {
26
+ this.requestCount = 0;
27
+ this.currentDay = today;
28
+ this.isLimited = false;
29
+ this.limitResetTime = null;
30
+ logger.info('Rate limiter: contador diario reseteado (nuevo día calendario UTC).');
31
+ }
32
+ this.requestCount++;
33
+ logger.debug(`Rate limiter: request #${this.requestCount} del día.`);
34
+ }
35
+ /**
36
+ * Marca que se recibió un error 429.
37
+ */
38
+ markLimited() {
39
+ this.isLimited = true;
40
+ const now = new Date();
41
+ const tomorrow = new Date(now);
42
+ tomorrow.setUTCDate(tomorrow.getUTCDate() + 1);
43
+ tomorrow.setUTCHours(0, 1, 0, 0);
44
+ this.limitResetTime = tomorrow;
45
+ logger.warn(`Rate limiter: cuota agotada. Reset estimado: ${tomorrow.toISOString()}`);
46
+ }
47
+ /**
48
+ * Verifica si estamos actualmente limitados.
49
+ */
50
+ checkLimit() {
51
+ if (!this.isLimited) {
52
+ return { limited: false };
53
+ }
54
+ const now = new Date();
55
+ if (this.limitResetTime && now >= this.limitResetTime) {
56
+ this.isLimited = false;
57
+ this.limitResetTime = null;
58
+ this.requestCount = 0;
59
+ this.currentDay = this.getTodayUTC();
60
+ return { limited: false };
61
+ }
62
+ const waitMs = this.limitResetTime
63
+ ? this.limitResetTime.getTime() - now.getTime()
64
+ : 0;
65
+ const waitHours = Math.ceil(waitMs / (1000 * 60 * 60));
66
+ return {
67
+ limited: true,
68
+ resetIn: `aproximadamente ${waitHours} hora(s)`,
69
+ };
70
+ }
71
+ /**
72
+ * Obtiene estadísticas del uso actual.
73
+ */
74
+ getStats() {
75
+ return {
76
+ requestsToday: this.requestCount,
77
+ isLimited: this.isLimited,
78
+ resetTime: this.limitResetTime?.toISOString() ?? null,
79
+ };
80
+ }
81
+ }
82
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@ssolis-ti/mcp-compra-agil",
3
+ "version": "1.0.2",
4
+ "description": "Servidor MCP para la API Compra Ágil v2 de Mercado Público (Chile)",
5
+ "type": "module",
6
+ "bin": {
7
+ "mcp-compra-agil": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "author": "ssolis-ti",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/ssolis-ti/compra-agil-mcp.git"
16
+ },
17
+ "bugs": {
18
+ "url": "https://github.com/ssolis-ti/compra-agil-mcp/issues"
19
+ },
20
+ "homepage": "https://github.com/ssolis-ti/compra-agil-mcp#readme",
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "start": "node dist/index.js",
24
+ "dev": "tsx watch src/index.ts",
25
+ "inspect": "npx @modelcontextprotocol/inspector node dist/index.js",
26
+ "monitor": "node dist/services/monitor.js",
27
+ "prepublishOnly": "npm run build"
28
+ },
29
+ "dependencies": {
30
+ "@modelcontextprotocol/sdk": "^1.12.0",
31
+ "pdf-parse": "^2.4.5",
32
+ "zod": "^3.24.0"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^22.0.0",
36
+ "@types/pdf-parse": "^1.1.5",
37
+ "tsx": "^4.19.0",
38
+ "typescript": "^5.7.0"
39
+ },
40
+ "keywords": [
41
+ "mcp",
42
+ "model-context-protocol",
43
+ "compra-agil",
44
+ "mercado-publico",
45
+ "chile",
46
+ "gobierno",
47
+ "licitaciones"
48
+ ],
49
+ "license": "MIT",
50
+ "publishConfig": {
51
+ "access": "public"
52
+ }
53
+ }