itglue-mcp 1.0.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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +382 -0
  3. package/dist/index.d.ts +7 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +513 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/api-client.d.ts +76 -0
  8. package/dist/lib/api-client.d.ts.map +1 -0
  9. package/dist/lib/api-client.js +189 -0
  10. package/dist/lib/api-client.js.map +1 -0
  11. package/dist/lib/audit-logger.d.ts +51 -0
  12. package/dist/lib/audit-logger.d.ts.map +1 -0
  13. package/dist/lib/audit-logger.js +119 -0
  14. package/dist/lib/audit-logger.js.map +1 -0
  15. package/dist/lib/cache.d.ts +52 -0
  16. package/dist/lib/cache.d.ts.map +1 -0
  17. package/dist/lib/cache.js +115 -0
  18. package/dist/lib/cache.js.map +1 -0
  19. package/dist/lib/error-handler.d.ts +25 -0
  20. package/dist/lib/error-handler.d.ts.map +1 -0
  21. package/dist/lib/error-handler.js +99 -0
  22. package/dist/lib/error-handler.js.map +1 -0
  23. package/dist/lib/rate-limiter.d.ts +45 -0
  24. package/dist/lib/rate-limiter.d.ts.map +1 -0
  25. package/dist/lib/rate-limiter.js +124 -0
  26. package/dist/lib/rate-limiter.js.map +1 -0
  27. package/dist/tools/auxiliary/audit/compliance-check.d.ts +54 -0
  28. package/dist/tools/auxiliary/audit/compliance-check.d.ts.map +1 -0
  29. package/dist/tools/auxiliary/audit/compliance-check.js +303 -0
  30. package/dist/tools/auxiliary/audit/compliance-check.js.map +1 -0
  31. package/dist/tools/auxiliary/health/health-check.d.ts +36 -0
  32. package/dist/tools/auxiliary/health/health-check.d.ts.map +1 -0
  33. package/dist/tools/auxiliary/health/health-check.js +287 -0
  34. package/dist/tools/auxiliary/health/health-check.js.map +1 -0
  35. package/dist/tools/auxiliary/reporting/organization-report.d.ts +41 -0
  36. package/dist/tools/auxiliary/reporting/organization-report.d.ts.map +1 -0
  37. package/dist/tools/auxiliary/reporting/organization-report.js +297 -0
  38. package/dist/tools/auxiliary/reporting/organization-report.js.map +1 -0
  39. package/dist/tools/auxiliary/staleness/staleness-detector.d.ts +82 -0
  40. package/dist/tools/auxiliary/staleness/staleness-detector.d.ts.map +1 -0
  41. package/dist/tools/auxiliary/staleness/staleness-detector.js +238 -0
  42. package/dist/tools/auxiliary/staleness/staleness-detector.js.map +1 -0
  43. package/dist/tools/auxiliary/validation/data-validator.d.ts +46 -0
  44. package/dist/tools/auxiliary/validation/data-validator.d.ts.map +1 -0
  45. package/dist/tools/auxiliary/validation/data-validator.js +296 -0
  46. package/dist/tools/auxiliary/validation/data-validator.js.map +1 -0
  47. package/dist/tools/configurations.d.ts +48 -0
  48. package/dist/tools/configurations.d.ts.map +1 -0
  49. package/dist/tools/configurations.js +89 -0
  50. package/dist/tools/configurations.js.map +1 -0
  51. package/dist/tools/documents.d.ts +42 -0
  52. package/dist/tools/documents.d.ts.map +1 -0
  53. package/dist/tools/documents.js +79 -0
  54. package/dist/tools/documents.js.map +1 -0
  55. package/dist/tools/flexible-assets.d.ts +79 -0
  56. package/dist/tools/flexible-assets.d.ts.map +1 -0
  57. package/dist/tools/flexible-assets.js +136 -0
  58. package/dist/tools/flexible-assets.js.map +1 -0
  59. package/dist/tools/organizations.d.ts +68 -0
  60. package/dist/tools/organizations.d.ts.map +1 -0
  61. package/dist/tools/organizations.js +123 -0
  62. package/dist/tools/organizations.js.map +1 -0
  63. package/dist/tools/passwords.d.ts +86 -0
  64. package/dist/tools/passwords.d.ts.map +1 -0
  65. package/dist/tools/passwords.js +165 -0
  66. package/dist/tools/passwords.js.map +1 -0
  67. package/dist/tools/search.d.ts +34 -0
  68. package/dist/tools/search.d.ts.map +1 -0
  69. package/dist/tools/search.js +79 -0
  70. package/dist/tools/search.js.map +1 -0
  71. package/dist/types/itglue.d.ts +129 -0
  72. package/dist/types/itglue.d.ts.map +1 -0
  73. package/dist/types/itglue.js +10 -0
  74. package/dist/types/itglue.js.map +1 -0
  75. package/dist/types/mcp.d.ts +33 -0
  76. package/dist/types/mcp.d.ts.map +1 -0
  77. package/dist/types/mcp.js +11 -0
  78. package/dist/types/mcp.js.map +1 -0
  79. package/package.json +64 -0
@@ -0,0 +1,297 @@
1
+ /**
2
+ * Organization Reporting Tools
3
+ * Generate comprehensive reports for ITGlue organizations
4
+ */
5
+ import { z } from 'zod';
6
+ import { handleApiError, formatErrorResponse } from '../../../lib/error-handler.js';
7
+ export const OrganizationReportSchema = z.object({
8
+ organization_id: z.string().describe('Organization ID to generate report for'),
9
+ report_type: z
10
+ .enum(['full', 'summary', 'security', 'asset-inventory'])
11
+ .default('summary')
12
+ .describe('Type of report to generate'),
13
+ include_sensitive: z
14
+ .boolean()
15
+ .default(false)
16
+ .describe('Include sensitive data like password counts (not values)'),
17
+ });
18
+ /**
19
+ * Generate organization report
20
+ */
21
+ export async function generateOrganizationReport(client, args) {
22
+ try {
23
+ let reportText = '';
24
+ switch (args.report_type) {
25
+ case 'full':
26
+ reportText = await generateFullReport(client, args.organization_id, args.include_sensitive);
27
+ break;
28
+ case 'summary':
29
+ reportText = await generateSummaryReport(client, args.organization_id);
30
+ break;
31
+ case 'security':
32
+ reportText = await generateSecurityReport(client, args.organization_id);
33
+ break;
34
+ case 'asset-inventory':
35
+ reportText = await generateAssetInventory(client, args.organization_id);
36
+ break;
37
+ }
38
+ return {
39
+ content: [{ type: 'text', text: reportText }],
40
+ data: {
41
+ organization_id: args.organization_id,
42
+ report_type: args.report_type,
43
+ generated_at: new Date().toISOString(),
44
+ },
45
+ };
46
+ }
47
+ catch (error) {
48
+ const apiError = handleApiError(error);
49
+ return formatErrorResponse(apiError);
50
+ }
51
+ }
52
+ /**
53
+ * Generate full comprehensive report
54
+ */
55
+ async function generateFullReport(client, organizationId, includeSensitive) {
56
+ const lines = [
57
+ `# Comprehensive ITGlue Organization Report`,
58
+ `**Organization ID**: ${organizationId}`,
59
+ `**Generated**: ${new Date().toLocaleString()}`,
60
+ '',
61
+ ];
62
+ try {
63
+ // Organization details
64
+ const orgResponse = await client.get(`/organizations/${organizationId}`, {}, { cacheTTL: 300 });
65
+ const org = Array.isArray(orgResponse.data) ? orgResponse.data[0] : orgResponse.data;
66
+ lines.push('## Organization Details');
67
+ lines.push('');
68
+ lines.push(`- **Name**: ${org.attributes.name}`);
69
+ lines.push(`- **Type**: ${org.attributes['organization-type-name'] || 'Unknown'}`);
70
+ lines.push(`- **Status**: ${org.attributes['organization-status-name'] || 'Unknown'}`);
71
+ if (org.attributes['short-name']) {
72
+ lines.push(`- **Short Name**: ${org.attributes['short-name']}`);
73
+ }
74
+ if (org.attributes.description) {
75
+ lines.push(`- **Description**: ${org.attributes.description}`);
76
+ }
77
+ lines.push(`- **Created**: ${new Date(org.attributes['created-at']).toLocaleDateString()}`);
78
+ lines.push('');
79
+ // Configuration summary
80
+ const configResponse = await client.get('/configurations', { 'filter[organization_id]': organizationId, 'page[size]': 100 }, { cacheTTL: 60, organizationId });
81
+ const configs = Array.isArray(configResponse.data) ? configResponse.data : [configResponse.data];
82
+ const validConfigs = configs.filter((c) => c.id);
83
+ lines.push('## Assets & Configurations');
84
+ lines.push('');
85
+ lines.push(`- **Total Configurations**: ${validConfigs.length}`);
86
+ // Group by type
87
+ const configsByType = new Map();
88
+ for (const config of validConfigs) {
89
+ const type = config.attributes['configuration-type-name'] || 'Unknown';
90
+ configsByType.set(type, (configsByType.get(type) || 0) + 1);
91
+ }
92
+ if (configsByType.size > 0) {
93
+ lines.push('- **By Type**:');
94
+ for (const [type, count] of configsByType.entries()) {
95
+ lines.push(` - ${type}: ${count}`);
96
+ }
97
+ }
98
+ lines.push('');
99
+ // Password summary (if sensitive data allowed)
100
+ if (includeSensitive) {
101
+ const pwdResponse = await client.get('/passwords', { 'filter[organization_id]': organizationId, 'page[size]': 100 }, { skipCache: true, organizationId });
102
+ const pwds = Array.isArray(pwdResponse.data) ? pwdResponse.data : [pwdResponse.data];
103
+ const validPwds = pwds.filter((p) => p.id);
104
+ lines.push('## Credentials');
105
+ lines.push('');
106
+ lines.push(`- **Total Passwords**: ${validPwds.length}`);
107
+ // Group by category
108
+ const pwdsByCategory = new Map();
109
+ for (const pwd of validPwds) {
110
+ const category = pwd.attributes['password-category-name'] || 'Uncategorized';
111
+ pwdsByCategory.set(category, (pwdsByCategory.get(category) || 0) + 1);
112
+ }
113
+ if (pwdsByCategory.size > 0) {
114
+ lines.push('- **By Category**:');
115
+ for (const [category, count] of pwdsByCategory.entries()) {
116
+ lines.push(` - ${category}: ${count}`);
117
+ }
118
+ }
119
+ lines.push('');
120
+ }
121
+ // Document summary
122
+ const docResponse = await client.get('/documents', { 'filter[organization_id]': organizationId, 'page[size]': 100 }, { cacheTTL: 60, organizationId });
123
+ const docs = Array.isArray(docResponse.data) ? docResponse.data : [docResponse.data];
124
+ const validDocs = docs.filter((d) => d.id);
125
+ lines.push('## Documentation');
126
+ lines.push('');
127
+ lines.push(`- **Total Documents**: ${validDocs.length}`);
128
+ // Group by content type
129
+ const docsByType = new Map();
130
+ for (const doc of validDocs) {
131
+ const type = doc.attributes['content-type'] || 'Unknown';
132
+ docsByType.set(type, (docsByType.get(type) || 0) + 1);
133
+ }
134
+ if (docsByType.size > 0) {
135
+ lines.push('- **By Type**:');
136
+ for (const [type, count] of docsByType.entries()) {
137
+ lines.push(` - ${type}: ${count}`);
138
+ }
139
+ }
140
+ lines.push('');
141
+ }
142
+ catch (error) {
143
+ lines.push('*Error generating some sections of the report*');
144
+ }
145
+ lines.push('---');
146
+ lines.push('*Report generated by ITGlue MCP Server*');
147
+ return lines.join('\n');
148
+ }
149
+ /**
150
+ * Generate summary report
151
+ */
152
+ async function generateSummaryReport(client, organizationId) {
153
+ const lines = [
154
+ `# Organization Summary Report`,
155
+ `**Organization ID**: ${organizationId}`,
156
+ `**Generated**: ${new Date().toLocaleString()}`,
157
+ '',
158
+ ];
159
+ try {
160
+ const orgResponse = await client.get(`/organizations/${organizationId}`, {}, { cacheTTL: 300 });
161
+ const org = Array.isArray(orgResponse.data) ? orgResponse.data[0] : orgResponse.data;
162
+ lines.push(`**${org.attributes.name}**`);
163
+ lines.push(`${org.attributes['organization-type-name'] || 'Organization'}`);
164
+ lines.push('');
165
+ // Quick stats
166
+ const configResponse = await client.get('/configurations', { 'filter[organization_id]': organizationId, 'page[size]': 1 }, { cacheTTL: 60, organizationId });
167
+ const docResponse = await client.get('/documents', { 'filter[organization_id]': organizationId, 'page[size]': 1 }, { cacheTTL: 60, organizationId });
168
+ const configCount = configResponse.meta?.total || 0;
169
+ const docCount = docResponse.meta?.total || 0;
170
+ lines.push('## Quick Stats');
171
+ lines.push('');
172
+ lines.push(`- 🖥️ Configurations: ${configCount}`);
173
+ lines.push(`- 📄 Documents: ${docCount}`);
174
+ lines.push('');
175
+ }
176
+ catch (error) {
177
+ lines.push('*Unable to generate summary*');
178
+ }
179
+ return lines.join('\n');
180
+ }
181
+ /**
182
+ * Generate security-focused report
183
+ */
184
+ async function generateSecurityReport(client, organizationId) {
185
+ const lines = [
186
+ `# Security Report`,
187
+ `**Organization ID**: ${organizationId}`,
188
+ `**Generated**: ${new Date().toLocaleString()}`,
189
+ '',
190
+ ];
191
+ try {
192
+ // Password security analysis
193
+ const pwdResponse = await client.get('/passwords', { 'filter[organization_id]': organizationId, 'page[size]': 100 }, { skipCache: true, organizationId });
194
+ const pwds = Array.isArray(pwdResponse.data) ? pwdResponse.data : [pwdResponse.data];
195
+ const validPwds = pwds.filter((p) => p.id);
196
+ lines.push('## Password Security');
197
+ lines.push('');
198
+ lines.push(`- **Total Passwords**: ${validPwds.length}`);
199
+ let uncategorized = 0;
200
+ let stale = 0;
201
+ for (const pwd of validPwds) {
202
+ if (!pwd.attributes['password-category-id']) {
203
+ uncategorized++;
204
+ }
205
+ const updatedAt = new Date(pwd.attributes['updated-at']);
206
+ const daysSince = Math.floor((Date.now() - updatedAt.getTime()) / (1000 * 60 * 60 * 24));
207
+ if (daysSince > 365) {
208
+ stale++;
209
+ }
210
+ }
211
+ lines.push(`- **Uncategorized**: ${uncategorized}`);
212
+ lines.push(`- **Stale (>365 days)**: ${stale}`);
213
+ lines.push('');
214
+ // Warranty expiry check
215
+ const configResponse = await client.get('/configurations', { 'filter[organization_id]': organizationId, 'page[size]': 100 }, { cacheTTL: 60, organizationId });
216
+ const configs = Array.isArray(configResponse.data) ? configResponse.data : [configResponse.data];
217
+ const validConfigs = configs.filter((c) => c.id);
218
+ let expiredWarranties = 0;
219
+ let expiringWarranties = 0;
220
+ for (const config of validConfigs) {
221
+ const warrantyExpires = config.attributes['warranty-expires-at'];
222
+ if (warrantyExpires) {
223
+ const expiryDate = new Date(warrantyExpires);
224
+ const daysUntilExpiry = Math.floor((expiryDate.getTime() - Date.now()) / (1000 * 60 * 60 * 24));
225
+ if (daysUntilExpiry < 0) {
226
+ expiredWarranties++;
227
+ }
228
+ else if (daysUntilExpiry <= 90) {
229
+ expiringWarranties++;
230
+ }
231
+ }
232
+ }
233
+ lines.push('## Warranty Status');
234
+ lines.push('');
235
+ lines.push(`- **Expired**: ${expiredWarranties}`);
236
+ lines.push(`- **Expiring Soon (<90 days)**: ${expiringWarranties}`);
237
+ lines.push('');
238
+ }
239
+ catch (error) {
240
+ lines.push('*Unable to generate security report*');
241
+ }
242
+ return lines.join('\n');
243
+ }
244
+ /**
245
+ * Generate asset inventory report
246
+ */
247
+ async function generateAssetInventory(client, organizationId) {
248
+ const lines = [
249
+ `# Asset Inventory Report`,
250
+ `**Organization ID**: ${organizationId}`,
251
+ `**Generated**: ${new Date().toLocaleString()}`,
252
+ '',
253
+ ];
254
+ try {
255
+ const configResponse = await client.get('/configurations', { 'filter[organization_id]': organizationId, 'page[size]': 100 }, { cacheTTL: 60, organizationId });
256
+ const configs = Array.isArray(configResponse.data) ? configResponse.data : [configResponse.data];
257
+ const validConfigs = configs.filter((c) => c.id);
258
+ lines.push(`## Total Assets: ${validConfigs.length}`);
259
+ lines.push('');
260
+ // Group by type
261
+ const byType = new Map();
262
+ for (const config of validConfigs) {
263
+ const type = config.attributes['configuration-type-name'] || 'Unknown';
264
+ if (!byType.has(type)) {
265
+ byType.set(type, []);
266
+ }
267
+ byType.get(type).push(config);
268
+ }
269
+ // List assets by type
270
+ for (const [type, assets] of byType.entries()) {
271
+ lines.push(`### ${type} (${assets.length})`);
272
+ lines.push('');
273
+ for (const asset of assets.slice(0, 10)) {
274
+ // Show first 10 of each type
275
+ lines.push(`- **${asset.attributes.name}**`);
276
+ if (asset.attributes['serial-number']) {
277
+ lines.push(` - Serial: ${asset.attributes['serial-number']}`);
278
+ }
279
+ if (asset.attributes['manufacturer-name']) {
280
+ lines.push(` - Manufacturer: ${asset.attributes['manufacturer-name']}`);
281
+ }
282
+ if (asset.attributes['model-number']) {
283
+ lines.push(` - Model: ${asset.attributes['model-number']}`);
284
+ }
285
+ }
286
+ if (assets.length > 10) {
287
+ lines.push(` *... and ${assets.length - 10} more*`);
288
+ }
289
+ lines.push('');
290
+ }
291
+ }
292
+ catch (error) {
293
+ lines.push('*Unable to generate asset inventory*');
294
+ }
295
+ return lines.join('\n');
296
+ }
297
+ //# sourceMappingURL=organization-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organization-report.js","sourceRoot":"","sources":["../../../../src/tools/auxiliary/reporting/organization-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Staleness Detection Tools
3
+ * Identify outdated or inactive ITGlue data
4
+ */
5
+ import { z } from 'zod';
6
+ import type { APIClient } from '../../../lib/api-client.js';
7
+ export declare const StalenessCheckSchema: z.ZodObject<{
8
+ organization_id: z.ZodString;
9
+ thresholds: z.ZodDefault<z.ZodObject<{
10
+ passwords_days: z.ZodDefault<z.ZodNumber>;
11
+ configurations_days: z.ZodDefault<z.ZodNumber>;
12
+ documents_days: z.ZodDefault<z.ZodNumber>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ passwords_days: number;
15
+ configurations_days: number;
16
+ documents_days: number;
17
+ }, {
18
+ passwords_days?: number | undefined;
19
+ configurations_days?: number | undefined;
20
+ documents_days?: number | undefined;
21
+ }>>;
22
+ }, "strip", z.ZodTypeAny, {
23
+ organization_id: string;
24
+ thresholds: {
25
+ passwords_days: number;
26
+ configurations_days: number;
27
+ documents_days: number;
28
+ };
29
+ }, {
30
+ organization_id: string;
31
+ thresholds?: {
32
+ passwords_days?: number | undefined;
33
+ configurations_days?: number | undefined;
34
+ documents_days?: number | undefined;
35
+ } | undefined;
36
+ }>;
37
+ export type StalenessCheckArgs = z.infer<typeof StalenessCheckSchema>;
38
+ interface StaleItem {
39
+ type: string;
40
+ id: string;
41
+ name: string;
42
+ last_updated: string;
43
+ days_since_update: number;
44
+ severity: 'warning' | 'alert' | 'critical';
45
+ }
46
+ /**
47
+ * Detect stale data in ITGlue
48
+ */
49
+ export declare function detectStaleness(client: APIClient, args: StalenessCheckArgs): Promise<{
50
+ content: Array<{
51
+ type: "text";
52
+ text: string;
53
+ }>;
54
+ isError: true;
55
+ } | {
56
+ content: {
57
+ type: "text";
58
+ text: string;
59
+ }[];
60
+ data: {
61
+ organization_id: string;
62
+ thresholds: {
63
+ passwords_days: number;
64
+ configurations_days: number;
65
+ documents_days: number;
66
+ };
67
+ total_stale_items: number;
68
+ by_type: {
69
+ passwords: number;
70
+ configurations: number;
71
+ documents: number;
72
+ };
73
+ by_severity: {
74
+ critical: number;
75
+ alert: number;
76
+ warning: number;
77
+ };
78
+ stale_items: StaleItem[];
79
+ };
80
+ }>;
81
+ export {};
82
+ //# sourceMappingURL=staleness-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staleness-detector.d.ts","sourceRoot":"","sources":["../../../../src/tools/auxiliary/staleness/staleness-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAG5D,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU/B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEtE,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;CAC5C;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDhF"}
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Staleness Detection Tools
3
+ * Identify outdated or inactive ITGlue data
4
+ */
5
+ import { z } from 'zod';
6
+ import { handleApiError, formatErrorResponse } from '../../../lib/error-handler.js';
7
+ export const StalenessCheckSchema = z.object({
8
+ organization_id: z.string().describe('Organization ID to check for stale data'),
9
+ thresholds: z
10
+ .object({
11
+ passwords_days: z.number().default(180).describe('Days since password update to consider stale'),
12
+ configurations_days: z.number().default(90).describe('Days since config update to consider stale'),
13
+ documents_days: z.number().default(365).describe('Days since document update to consider stale'),
14
+ })
15
+ .default({})
16
+ .describe('Staleness thresholds in days'),
17
+ });
18
+ /**
19
+ * Detect stale data in ITGlue
20
+ */
21
+ export async function detectStaleness(client, args) {
22
+ try {
23
+ const staleItems = [];
24
+ const thresholds = {
25
+ passwords_days: args.thresholds?.passwords_days || 180,
26
+ configurations_days: args.thresholds?.configurations_days || 90,
27
+ documents_days: args.thresholds?.documents_days || 365,
28
+ };
29
+ // Check passwords
30
+ const stalePasswords = await checkStalePasswords(client, args.organization_id, thresholds.passwords_days);
31
+ staleItems.push(...stalePasswords);
32
+ // Check configurations
33
+ const staleConfigs = await checkStaleConfigurations(client, args.organization_id, thresholds.configurations_days);
34
+ staleItems.push(...staleConfigs);
35
+ // Check documents
36
+ const staleDocs = await checkStaleDocuments(client, args.organization_id, thresholds.documents_days);
37
+ staleItems.push(...staleDocs);
38
+ const resultText = formatStalenessReport(staleItems, args.organization_id, thresholds);
39
+ return {
40
+ content: [{ type: 'text', text: resultText }],
41
+ data: {
42
+ organization_id: args.organization_id,
43
+ thresholds,
44
+ total_stale_items: staleItems.length,
45
+ by_type: {
46
+ passwords: staleItems.filter(i => i.type === 'password').length,
47
+ configurations: staleItems.filter(i => i.type === 'configuration').length,
48
+ documents: staleItems.filter(i => i.type === 'document').length,
49
+ },
50
+ by_severity: {
51
+ critical: staleItems.filter(i => i.severity === 'critical').length,
52
+ alert: staleItems.filter(i => i.severity === 'alert').length,
53
+ warning: staleItems.filter(i => i.severity === 'warning').length,
54
+ },
55
+ stale_items: staleItems,
56
+ },
57
+ };
58
+ }
59
+ catch (error) {
60
+ const apiError = handleApiError(error);
61
+ return formatErrorResponse(apiError);
62
+ }
63
+ }
64
+ /**
65
+ * Check for stale passwords
66
+ */
67
+ async function checkStalePasswords(client, organizationId, thresholdDays) {
68
+ const staleItems = [];
69
+ try {
70
+ const response = await client.get('/passwords', {
71
+ 'filter[organization_id]': organizationId,
72
+ 'page[size]': 100,
73
+ }, {
74
+ skipCache: true,
75
+ organizationId,
76
+ });
77
+ const passwords = Array.isArray(response.data) ? response.data : [response.data];
78
+ for (const pwd of passwords) {
79
+ const updatedAt = new Date(pwd.attributes['updated-at']);
80
+ const daysSinceUpdate = Math.floor((Date.now() - updatedAt.getTime()) / (1000 * 60 * 60 * 24));
81
+ if (daysSinceUpdate >= thresholdDays) {
82
+ let severity = 'warning';
83
+ if (daysSinceUpdate >= thresholdDays * 2) {
84
+ severity = 'critical';
85
+ }
86
+ else if (daysSinceUpdate >= thresholdDays * 1.5) {
87
+ severity = 'alert';
88
+ }
89
+ staleItems.push({
90
+ type: 'password',
91
+ id: pwd.id,
92
+ name: pwd.attributes.name,
93
+ last_updated: pwd.attributes['updated-at'],
94
+ days_since_update: daysSinceUpdate,
95
+ severity,
96
+ });
97
+ }
98
+ }
99
+ }
100
+ catch (error) {
101
+ // Ignore errors - might not have password access
102
+ }
103
+ return staleItems;
104
+ }
105
+ /**
106
+ * Check for stale configurations
107
+ */
108
+ async function checkStaleConfigurations(client, organizationId, thresholdDays) {
109
+ const staleItems = [];
110
+ try {
111
+ const response = await client.get('/configurations', {
112
+ 'filter[organization_id]': organizationId,
113
+ 'page[size]': 100,
114
+ }, {
115
+ cacheTTL: 60,
116
+ organizationId,
117
+ });
118
+ const configs = Array.isArray(response.data) ? response.data : [response.data];
119
+ for (const config of configs) {
120
+ const updatedAt = new Date(config.attributes['updated-at']);
121
+ const daysSinceUpdate = Math.floor((Date.now() - updatedAt.getTime()) / (1000 * 60 * 60 * 24));
122
+ if (daysSinceUpdate >= thresholdDays) {
123
+ let severity = 'warning';
124
+ if (daysSinceUpdate >= thresholdDays * 2) {
125
+ severity = 'critical';
126
+ }
127
+ else if (daysSinceUpdate >= thresholdDays * 1.5) {
128
+ severity = 'alert';
129
+ }
130
+ staleItems.push({
131
+ type: 'configuration',
132
+ id: config.id,
133
+ name: config.attributes.name,
134
+ last_updated: config.attributes['updated-at'],
135
+ days_since_update: daysSinceUpdate,
136
+ severity,
137
+ });
138
+ }
139
+ }
140
+ }
141
+ catch (error) {
142
+ // Ignore errors
143
+ }
144
+ return staleItems;
145
+ }
146
+ /**
147
+ * Check for stale documents
148
+ */
149
+ async function checkStaleDocuments(client, organizationId, thresholdDays) {
150
+ const staleItems = [];
151
+ try {
152
+ const response = await client.get('/documents', {
153
+ 'filter[organization_id]': organizationId,
154
+ 'page[size]': 100,
155
+ }, {
156
+ cacheTTL: 60,
157
+ organizationId,
158
+ });
159
+ const documents = Array.isArray(response.data) ? response.data : [response.data];
160
+ for (const doc of documents) {
161
+ const updatedAt = new Date(doc.attributes['updated-at']);
162
+ const daysSinceUpdate = Math.floor((Date.now() - updatedAt.getTime()) / (1000 * 60 * 60 * 24));
163
+ if (daysSinceUpdate >= thresholdDays) {
164
+ let severity = 'warning';
165
+ if (daysSinceUpdate >= thresholdDays * 2) {
166
+ severity = 'critical';
167
+ }
168
+ else if (daysSinceUpdate >= thresholdDays * 1.5) {
169
+ severity = 'alert';
170
+ }
171
+ staleItems.push({
172
+ type: 'document',
173
+ id: doc.id,
174
+ name: doc.attributes.name,
175
+ last_updated: doc.attributes['updated-at'],
176
+ days_since_update: daysSinceUpdate,
177
+ severity,
178
+ });
179
+ }
180
+ }
181
+ }
182
+ catch (error) {
183
+ // Ignore errors
184
+ }
185
+ return staleItems;
186
+ }
187
+ /**
188
+ * Format staleness report
189
+ */
190
+ function formatStalenessReport(staleItems, organizationId, thresholds) {
191
+ const lines = [
192
+ `# Staleness Detection Report`,
193
+ `**Organization ID**: ${organizationId}`,
194
+ `**Thresholds**: Passwords (${thresholds.passwords_days}d), Configurations (${thresholds.configurations_days}d), Documents (${thresholds.documents_days}d)`,
195
+ `**Total Stale Items**: ${staleItems.length}`,
196
+ '',
197
+ ];
198
+ if (staleItems.length === 0) {
199
+ lines.push('✅ **No stale data found!**');
200
+ lines.push('');
201
+ lines.push('All items are within acceptable update thresholds.');
202
+ return lines.join('\n');
203
+ }
204
+ // Group by type
205
+ const byType = {
206
+ password: staleItems.filter(i => i.type === 'password'),
207
+ configuration: staleItems.filter(i => i.type === 'configuration'),
208
+ document: staleItems.filter(i => i.type === 'document'),
209
+ };
210
+ lines.push('## Stale Items by Type');
211
+ lines.push('');
212
+ lines.push(`- 🔑 **Passwords**: ${byType.password.length}`);
213
+ lines.push(`- 🖥️ **Configurations**: ${byType.configuration.length}`);
214
+ lines.push(`- 📄 **Documents**: ${byType.document.length}`);
215
+ lines.push('');
216
+ // Show most critical items first
217
+ const sortedItems = staleItems.sort((a, b) => {
218
+ const severityOrder = { critical: 3, alert: 2, warning: 1 };
219
+ return severityOrder[b.severity] - severityOrder[a.severity] || b.days_since_update - a.days_since_update;
220
+ });
221
+ lines.push('## Stale Items (Most Critical First)');
222
+ lines.push('');
223
+ for (const item of sortedItems.slice(0, 20)) {
224
+ // Show top 20
225
+ const emoji = { critical: '🔴', alert: '🟠', warning: '🟡' }[item.severity];
226
+ lines.push(`### ${emoji} ${item.name}`);
227
+ lines.push(`- **Type**: ${item.type}`);
228
+ lines.push(`- **ID**: ${item.id}`);
229
+ lines.push(`- **Last Updated**: ${new Date(item.last_updated).toLocaleDateString()}`);
230
+ lines.push(`- **Days Since Update**: ${item.days_since_update}`);
231
+ lines.push('');
232
+ }
233
+ if (sortedItems.length > 20) {
234
+ lines.push(`*... and ${sortedItems.length - 20} more stale items*`);
235
+ }
236
+ return lines.join('\n');
237
+ }
238
+ //# sourceMappingURL=staleness-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staleness-detector.js","sourceRoot":"","sources":["../../../../src/tools/auxiliary/staleness/staleness-detector.ts"],"names":[],"mappings":"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"}