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.
- package/LICENSE +21 -0
- package/README.md +382 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +513 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +76 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +189 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/audit-logger.d.ts +51 -0
- package/dist/lib/audit-logger.d.ts.map +1 -0
- package/dist/lib/audit-logger.js +119 -0
- package/dist/lib/audit-logger.js.map +1 -0
- package/dist/lib/cache.d.ts +52 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cache.js +115 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/error-handler.d.ts +25 -0
- package/dist/lib/error-handler.d.ts.map +1 -0
- package/dist/lib/error-handler.js +99 -0
- package/dist/lib/error-handler.js.map +1 -0
- package/dist/lib/rate-limiter.d.ts +45 -0
- package/dist/lib/rate-limiter.d.ts.map +1 -0
- package/dist/lib/rate-limiter.js +124 -0
- package/dist/lib/rate-limiter.js.map +1 -0
- package/dist/tools/auxiliary/audit/compliance-check.d.ts +54 -0
- package/dist/tools/auxiliary/audit/compliance-check.d.ts.map +1 -0
- package/dist/tools/auxiliary/audit/compliance-check.js +303 -0
- package/dist/tools/auxiliary/audit/compliance-check.js.map +1 -0
- package/dist/tools/auxiliary/health/health-check.d.ts +36 -0
- package/dist/tools/auxiliary/health/health-check.d.ts.map +1 -0
- package/dist/tools/auxiliary/health/health-check.js +287 -0
- package/dist/tools/auxiliary/health/health-check.js.map +1 -0
- package/dist/tools/auxiliary/reporting/organization-report.d.ts +41 -0
- package/dist/tools/auxiliary/reporting/organization-report.d.ts.map +1 -0
- package/dist/tools/auxiliary/reporting/organization-report.js +297 -0
- package/dist/tools/auxiliary/reporting/organization-report.js.map +1 -0
- package/dist/tools/auxiliary/staleness/staleness-detector.d.ts +82 -0
- package/dist/tools/auxiliary/staleness/staleness-detector.d.ts.map +1 -0
- package/dist/tools/auxiliary/staleness/staleness-detector.js +238 -0
- package/dist/tools/auxiliary/staleness/staleness-detector.js.map +1 -0
- package/dist/tools/auxiliary/validation/data-validator.d.ts +46 -0
- package/dist/tools/auxiliary/validation/data-validator.d.ts.map +1 -0
- package/dist/tools/auxiliary/validation/data-validator.js +296 -0
- package/dist/tools/auxiliary/validation/data-validator.js.map +1 -0
- package/dist/tools/configurations.d.ts +48 -0
- package/dist/tools/configurations.d.ts.map +1 -0
- package/dist/tools/configurations.js +89 -0
- package/dist/tools/configurations.js.map +1 -0
- package/dist/tools/documents.d.ts +42 -0
- package/dist/tools/documents.d.ts.map +1 -0
- package/dist/tools/documents.js +79 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/flexible-assets.d.ts +79 -0
- package/dist/tools/flexible-assets.d.ts.map +1 -0
- package/dist/tools/flexible-assets.js +136 -0
- package/dist/tools/flexible-assets.js.map +1 -0
- package/dist/tools/organizations.d.ts +68 -0
- package/dist/tools/organizations.d.ts.map +1 -0
- package/dist/tools/organizations.js +123 -0
- package/dist/tools/organizations.js.map +1 -0
- package/dist/tools/passwords.d.ts +86 -0
- package/dist/tools/passwords.d.ts.map +1 -0
- package/dist/tools/passwords.js +165 -0
- package/dist/tools/passwords.js.map +1 -0
- package/dist/tools/search.d.ts +34 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +79 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/types/itglue.d.ts +129 -0
- package/dist/types/itglue.d.ts.map +1 -0
- package/dist/types/itglue.js +10 -0
- package/dist/types/itglue.js.map +1 -0
- package/dist/types/mcp.d.ts +33 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +11 -0
- package/dist/types/mcp.js.map +1 -0
- 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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"}
|