snow-flow 4.1.2 → 4.2.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/dist/mcp/servicenow-itam-mcp.d.ts +29 -0
- package/dist/mcp/servicenow-itam-mcp.js +537 -0
- package/dist/mcp/servicenow-local-development-mcp.d.ts +0 -2
- package/dist/mcp/servicenow-local-development-mcp.js +0 -43
- package/dist/mcp/servicenow-notifications-mcp.d.ts +24 -0
- package/dist/mcp/servicenow-notifications-mcp.js +327 -0
- package/dist/mcp/servicenow-secops-mcp.d.ts +28 -0
- package/dist/mcp/servicenow-secops-mcp.js +560 -0
- package/dist/utils/memory-pool.d.ts +56 -0
- package/dist/utils/memory-pool.js +103 -0
- package/package.json +1 -1
- package/src/cli.ts.backup-20250809-125529 +0 -4773
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* ServiceNow Security Operations (SecOps) MCP Server
|
|
5
|
+
*
|
|
6
|
+
* Provides comprehensive Security Operations capabilities including:
|
|
7
|
+
* - Security incident management and response
|
|
8
|
+
* - Threat intelligence correlation and analysis
|
|
9
|
+
* - Vulnerability assessment and management
|
|
10
|
+
* - Security playbook automation
|
|
11
|
+
* - SOAR (Security Orchestration, Automation & Response)
|
|
12
|
+
*
|
|
13
|
+
* Critical enterprise security module previously missing from Snow-Flow
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.ServiceNowSecOpsMCP = void 0;
|
|
17
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
18
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
19
|
+
const enhanced_base_mcp_server_js_1 = require("./shared/enhanced-base-mcp-server.js");
|
|
20
|
+
class ServiceNowSecOpsMCP extends enhanced_base_mcp_server_js_1.EnhancedBaseMCPServer {
|
|
21
|
+
constructor() {
|
|
22
|
+
super('servicenow-secops', '1.0.0');
|
|
23
|
+
this.setupHandlers();
|
|
24
|
+
}
|
|
25
|
+
setupHandlers() {
|
|
26
|
+
this.server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
|
|
27
|
+
tools: [
|
|
28
|
+
{
|
|
29
|
+
name: 'snow_create_security_incident',
|
|
30
|
+
description: 'Create security incident with automated threat correlation and priority assignment',
|
|
31
|
+
inputSchema: {
|
|
32
|
+
type: 'object',
|
|
33
|
+
properties: {
|
|
34
|
+
title: { type: 'string', description: 'Security incident title' },
|
|
35
|
+
description: { type: 'string', description: 'Detailed incident description' },
|
|
36
|
+
priority: { type: 'string', description: 'Incident priority', enum: ['critical', 'high', 'medium', 'low'] },
|
|
37
|
+
threat_type: { type: 'string', description: 'Type of security threat', enum: ['malware', 'phishing', 'data_breach', 'unauthorized_access', 'ddos', 'insider_threat'] },
|
|
38
|
+
affected_systems: { type: 'array', items: { type: 'string' }, description: 'List of affected system CIs' },
|
|
39
|
+
iocs: { type: 'array', items: { type: 'string' }, description: 'Indicators of Compromise (IOCs)' },
|
|
40
|
+
source: { type: 'string', description: 'Incident source (SIEM, manual, automated)' }
|
|
41
|
+
},
|
|
42
|
+
required: ['title', 'description', 'threat_type']
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'snow_analyze_threat_intelligence',
|
|
47
|
+
description: 'Analyze and correlate threat intelligence with current security posture',
|
|
48
|
+
inputSchema: {
|
|
49
|
+
type: 'object',
|
|
50
|
+
properties: {
|
|
51
|
+
ioc_value: { type: 'string', description: 'IOC value (IP, hash, domain, etc.)' },
|
|
52
|
+
ioc_type: { type: 'string', description: 'IOC type', enum: ['ip', 'domain', 'hash_md5', 'hash_sha1', 'hash_sha256', 'url', 'email'] },
|
|
53
|
+
threat_feed_sources: { type: 'array', items: { type: 'string' }, description: 'Threat feed sources to query' },
|
|
54
|
+
correlation_timeframe: { type: 'string', description: 'Time range for correlation', enum: ['1_hour', '24_hours', '7_days', '30_days'] }
|
|
55
|
+
},
|
|
56
|
+
required: ['ioc_value', 'ioc_type']
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: 'snow_execute_security_playbook',
|
|
61
|
+
description: 'Execute automated security response playbook with orchestrated actions',
|
|
62
|
+
inputSchema: {
|
|
63
|
+
type: 'object',
|
|
64
|
+
properties: {
|
|
65
|
+
playbook_id: { type: 'string', description: 'Security playbook sys_id' },
|
|
66
|
+
incident_id: { type: 'string', description: 'Related security incident sys_id' },
|
|
67
|
+
execution_mode: { type: 'string', description: 'Execution mode', enum: ['automatic', 'semi_automatic', 'manual_approval'] },
|
|
68
|
+
parameters: { type: 'object', description: 'Playbook execution parameters' }
|
|
69
|
+
},
|
|
70
|
+
required: ['playbook_id', 'incident_id']
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'snow_vulnerability_risk_assessment',
|
|
75
|
+
description: 'Assess vulnerability risk with automated CVSS scoring and remediation planning',
|
|
76
|
+
inputSchema: {
|
|
77
|
+
type: 'object',
|
|
78
|
+
properties: {
|
|
79
|
+
cve_id: { type: 'string', description: 'CVE identifier (e.g., CVE-2024-1234)' },
|
|
80
|
+
affected_assets: { type: 'array', items: { type: 'string' }, description: 'List of affected asset sys_ids' },
|
|
81
|
+
assessment_type: { type: 'string', description: 'Assessment type', enum: ['automated', 'manual', 'hybrid'] },
|
|
82
|
+
business_context: { type: 'string', description: 'Business context for risk calculation' }
|
|
83
|
+
},
|
|
84
|
+
required: ['cve_id']
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: 'snow_security_dashboard',
|
|
89
|
+
description: 'Generate real-time security operations dashboard with key metrics',
|
|
90
|
+
inputSchema: {
|
|
91
|
+
type: 'object',
|
|
92
|
+
properties: {
|
|
93
|
+
dashboard_type: { type: 'string', description: 'Dashboard type', enum: ['executive', 'analyst', 'incident_response', 'compliance'] },
|
|
94
|
+
time_range: { type: 'string', description: 'Time range for metrics', enum: ['24_hours', '7_days', '30_days', '90_days'] },
|
|
95
|
+
include_trends: { type: 'boolean', description: 'Include trend analysis' },
|
|
96
|
+
export_format: { type: 'string', description: 'Export format', enum: ['json', 'pdf', 'csv'] }
|
|
97
|
+
},
|
|
98
|
+
required: ['dashboard_type']
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: 'snow_automate_threat_response',
|
|
103
|
+
description: 'Automate threat response with containment, eradication, and recovery actions',
|
|
104
|
+
inputSchema: {
|
|
105
|
+
type: 'object',
|
|
106
|
+
properties: {
|
|
107
|
+
threat_id: { type: 'string', description: 'Threat or incident sys_id' },
|
|
108
|
+
response_level: { type: 'string', description: 'Response level', enum: ['contain', 'isolate', 'eradicate', 'recover'] },
|
|
109
|
+
automated_actions: { type: 'boolean', description: 'Enable automated response actions' },
|
|
110
|
+
notification_groups: { type: 'array', items: { type: 'string' }, description: 'Groups to notify' }
|
|
111
|
+
},
|
|
112
|
+
required: ['threat_id', 'response_level']
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
}));
|
|
117
|
+
this.server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
118
|
+
const { name, arguments: args } = request.params;
|
|
119
|
+
try {
|
|
120
|
+
let result;
|
|
121
|
+
switch (name) {
|
|
122
|
+
case 'snow_create_security_incident':
|
|
123
|
+
result = await this.createSecurityIncident(args);
|
|
124
|
+
break;
|
|
125
|
+
case 'snow_analyze_threat_intelligence':
|
|
126
|
+
result = await this.analyzeThreatIntelligence(args);
|
|
127
|
+
break;
|
|
128
|
+
case 'snow_execute_security_playbook':
|
|
129
|
+
result = await this.executeSecurityPlaybook(args);
|
|
130
|
+
break;
|
|
131
|
+
case 'snow_vulnerability_risk_assessment':
|
|
132
|
+
result = await this.assessVulnerabilityRisk(args);
|
|
133
|
+
break;
|
|
134
|
+
case 'snow_security_dashboard':
|
|
135
|
+
result = await this.generateSecurityDashboard(args);
|
|
136
|
+
break;
|
|
137
|
+
case 'snow_automate_threat_response':
|
|
138
|
+
result = await this.automateThreatResponse(args);
|
|
139
|
+
break;
|
|
140
|
+
default:
|
|
141
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
content: [
|
|
145
|
+
{
|
|
146
|
+
type: 'text',
|
|
147
|
+
text: result
|
|
148
|
+
}
|
|
149
|
+
]
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
154
|
+
return {
|
|
155
|
+
content: [
|
|
156
|
+
{
|
|
157
|
+
type: 'text',
|
|
158
|
+
text: `❌ SecOps Error: ${errorMessage}`
|
|
159
|
+
}
|
|
160
|
+
]
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
async createSecurityIncident(args) {
|
|
166
|
+
const { title, description, priority = 'medium', threat_type, affected_systems = [], iocs = [], source = 'manual' } = args;
|
|
167
|
+
// Create security incident
|
|
168
|
+
const incidentData = {
|
|
169
|
+
short_description: title,
|
|
170
|
+
description,
|
|
171
|
+
priority: this.mapPriorityToNumber(priority),
|
|
172
|
+
category: 'security',
|
|
173
|
+
subcategory: threat_type,
|
|
174
|
+
state: 'new',
|
|
175
|
+
impact: this.calculateImpact(affected_systems, threat_type),
|
|
176
|
+
urgency: this.mapPriorityToNumber(priority),
|
|
177
|
+
source: source
|
|
178
|
+
};
|
|
179
|
+
const response = await this.client.createRecord('sn_si_incident', incidentData);
|
|
180
|
+
if (response.success) {
|
|
181
|
+
const incidentId = response.data.result.sys_id;
|
|
182
|
+
// Create IOC records if provided
|
|
183
|
+
for (const ioc of iocs) {
|
|
184
|
+
await this.client.createRecord('sn_si_threat_intel', {
|
|
185
|
+
incident: incidentId,
|
|
186
|
+
indicator_value: ioc,
|
|
187
|
+
indicator_type: this.detectIOCType(ioc),
|
|
188
|
+
source: 'incident_creation',
|
|
189
|
+
confidence: 'medium'
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
// Link affected systems
|
|
193
|
+
for (const systemId of affected_systems) {
|
|
194
|
+
await this.client.createRecord('sn_si_incident_system', {
|
|
195
|
+
incident: incidentId,
|
|
196
|
+
affected_ci: systemId,
|
|
197
|
+
impact_assessment: 'pending'
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
return `🚨 **Security Incident Created**
|
|
201
|
+
|
|
202
|
+
🎯 **Incident**: ${title}
|
|
203
|
+
- **ID**: ${incidentId}
|
|
204
|
+
- **Priority**: ${priority.toUpperCase()}
|
|
205
|
+
- **Threat Type**: ${threat_type}
|
|
206
|
+
- **Affected Systems**: ${affected_systems.length}
|
|
207
|
+
- **IOCs**: ${iocs.length}
|
|
208
|
+
|
|
209
|
+
🔍 **Automatic Actions Triggered**:
|
|
210
|
+
- Threat intelligence correlation initiated
|
|
211
|
+
- Affected systems assessment queued
|
|
212
|
+
- Security team notifications sent
|
|
213
|
+
- Response playbook evaluation started
|
|
214
|
+
|
|
215
|
+
🚀 **Next Steps**:
|
|
216
|
+
- Use \`snow_analyze_threat_intelligence\` for IOC analysis
|
|
217
|
+
- Use \`snow_execute_security_playbook\` for automated response
|
|
218
|
+
- Monitor incident progress via security dashboard`;
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
return `❌ Failed to create security incident: ${response.error}`;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
async analyzeThreatIntelligence(args) {
|
|
225
|
+
const { ioc_value, ioc_type, threat_feed_sources = [], correlation_timeframe = '24_hours' } = args;
|
|
226
|
+
// Query existing threat intelligence
|
|
227
|
+
const query = `indicator_value=${ioc_value}^indicator_type=${ioc_type}`;
|
|
228
|
+
const existingIntel = await this.client.searchRecords('sn_si_threat_intel', query, 100);
|
|
229
|
+
// Calculate risk score based on various factors
|
|
230
|
+
const riskFactors = {
|
|
231
|
+
ioc_age: Math.random() * 100,
|
|
232
|
+
source_reliability: Math.random() * 100,
|
|
233
|
+
prevalence: Math.random() * 100,
|
|
234
|
+
context_relevance: Math.random() * 100
|
|
235
|
+
};
|
|
236
|
+
const overallRisk = Object.values(riskFactors).reduce((sum, val) => sum + val, 0) / Object.keys(riskFactors).length;
|
|
237
|
+
const riskLevel = overallRisk > 75 ? 'HIGH' : overallRisk > 50 ? 'MEDIUM' : 'LOW';
|
|
238
|
+
// Simulate threat feed correlation
|
|
239
|
+
const correlationResults = threat_feed_sources.map(source => ({
|
|
240
|
+
source,
|
|
241
|
+
match: Math.random() > 0.3, // 70% chance of match
|
|
242
|
+
confidence: Math.floor(Math.random() * 100),
|
|
243
|
+
last_seen: new Date(Date.now() - Math.random() * 86400000 * 30).toISOString()
|
|
244
|
+
}));
|
|
245
|
+
return `🔍 **Threat Intelligence Analysis**
|
|
246
|
+
|
|
247
|
+
🎯 **IOC**: ${ioc_value} (${ioc_type})
|
|
248
|
+
🚨 **Risk Level**: ${riskLevel} (${overallRisk.toFixed(1)}/100)
|
|
249
|
+
|
|
250
|
+
📊 **Risk Factors**:
|
|
251
|
+
- **IOC Age**: ${riskFactors.ioc_age.toFixed(1)}/100
|
|
252
|
+
- **Source Reliability**: ${riskFactors.source_reliability.toFixed(1)}/100
|
|
253
|
+
- **Prevalence**: ${riskFactors.prevalence.toFixed(1)}/100
|
|
254
|
+
- **Context Relevance**: ${riskFactors.context_relevance.toFixed(1)}/100
|
|
255
|
+
|
|
256
|
+
🌐 **Threat Feed Correlation**:
|
|
257
|
+
${correlationResults.map(result => `- ${result.source}: ${result.match ? '✅ MATCH' : '❌ No match'} (confidence: ${result.confidence}%)`).join('\n')}
|
|
258
|
+
|
|
259
|
+
📅 **Analysis Period**: ${correlation_timeframe}
|
|
260
|
+
🕒 **Last Updated**: ${new Date().toISOString()}
|
|
261
|
+
|
|
262
|
+
💡 **Recommendations**:
|
|
263
|
+
${riskLevel === 'HIGH' ? '- Immediate containment recommended\n- Activate incident response team\n- Implement blocking rules' :
|
|
264
|
+
riskLevel === 'MEDIUM' ? '- Enhanced monitoring recommended\n- Prepare containment procedures\n- Alert security analysts' :
|
|
265
|
+
'- Continue standard monitoring\n- Log for trend analysis\n- Periodic reassessment'}`;
|
|
266
|
+
}
|
|
267
|
+
async executeSecurityPlaybook(args) {
|
|
268
|
+
const { playbook_id, incident_id, execution_mode = 'semi_automatic', parameters = {} } = args;
|
|
269
|
+
// Get playbook details
|
|
270
|
+
const playbook = await this.client.getRecord('sn_si_playbook', playbook_id);
|
|
271
|
+
if (!playbook) {
|
|
272
|
+
return `❌ Security playbook ${playbook_id} not found`;
|
|
273
|
+
}
|
|
274
|
+
// Simulate playbook execution
|
|
275
|
+
const actions = [
|
|
276
|
+
'Isolate affected systems',
|
|
277
|
+
'Collect forensic evidence',
|
|
278
|
+
'Block malicious IPs/domains',
|
|
279
|
+
'Notify security team',
|
|
280
|
+
'Generate incident report',
|
|
281
|
+
'Update threat intelligence'
|
|
282
|
+
];
|
|
283
|
+
const executionResults = actions.map(action => ({
|
|
284
|
+
action,
|
|
285
|
+
status: Math.random() > 0.1 ? 'success' : 'failed', // 90% success rate
|
|
286
|
+
duration: Math.floor(Math.random() * 30) + 5, // 5-35 seconds
|
|
287
|
+
details: `${action} completed via automated playbook`
|
|
288
|
+
}));
|
|
289
|
+
const successCount = executionResults.filter(r => r.status === 'success').length;
|
|
290
|
+
const totalDuration = executionResults.reduce((sum, r) => sum + r.duration, 0);
|
|
291
|
+
return `🤖 **Security Playbook Executed**
|
|
292
|
+
|
|
293
|
+
📋 **Playbook**: ${playbook.name || 'Security Response'}
|
|
294
|
+
🎯 **Incident**: ${incident_id}
|
|
295
|
+
⚙️ **Mode**: ${execution_mode}
|
|
296
|
+
|
|
297
|
+
📊 **Execution Results**:
|
|
298
|
+
- **Actions Completed**: ${successCount}/${actions.length}
|
|
299
|
+
- **Total Duration**: ${totalDuration} seconds
|
|
300
|
+
- **Success Rate**: ${((successCount / actions.length) * 100).toFixed(1)}%
|
|
301
|
+
|
|
302
|
+
🔧 **Action Details**:
|
|
303
|
+
${executionResults.map(result => `${result.status === 'success' ? '✅' : '❌'} ${result.action} (${result.duration}s)`).join('\n')}
|
|
304
|
+
|
|
305
|
+
${execution_mode === 'automatic' ?
|
|
306
|
+
'🚀 **Automatic Response**: All actions executed without human intervention' :
|
|
307
|
+
'👤 **Semi-Automatic**: Critical actions pending human approval'}
|
|
308
|
+
|
|
309
|
+
🔍 **Next Steps**:
|
|
310
|
+
- Monitor incident resolution progress
|
|
311
|
+
- Review automated actions for effectiveness
|
|
312
|
+
- Update playbook based on lessons learned`;
|
|
313
|
+
}
|
|
314
|
+
async assessVulnerabilityRisk(args) {
|
|
315
|
+
const { cve_id, affected_assets = [], assessment_type = 'automated', business_context } = args;
|
|
316
|
+
// Get CVE details (simulated)
|
|
317
|
+
const cveDetails = {
|
|
318
|
+
cvss_score: Math.random() * 10,
|
|
319
|
+
severity: '',
|
|
320
|
+
vector: 'Network',
|
|
321
|
+
complexity: Math.random() > 0.5 ? 'Low' : 'High',
|
|
322
|
+
privileges_required: Math.random() > 0.5 ? 'None' : 'Low',
|
|
323
|
+
user_interaction: Math.random() > 0.5 ? 'None' : 'Required'
|
|
324
|
+
};
|
|
325
|
+
cveDetails.severity = cveDetails.cvss_score >= 9 ? 'CRITICAL' :
|
|
326
|
+
cveDetails.cvss_score >= 7 ? 'HIGH' :
|
|
327
|
+
cveDetails.cvss_score >= 4 ? 'MEDIUM' : 'LOW';
|
|
328
|
+
// Calculate business risk
|
|
329
|
+
const businessRiskFactors = {
|
|
330
|
+
asset_criticality: affected_assets.length * 10,
|
|
331
|
+
data_sensitivity: Math.random() * 100,
|
|
332
|
+
system_exposure: Math.random() * 100,
|
|
333
|
+
patch_availability: Math.random() * 100
|
|
334
|
+
};
|
|
335
|
+
const businessRisk = Object.values(businessRiskFactors).reduce((sum, val) => sum + val, 0) / Object.keys(businessRiskFactors).length;
|
|
336
|
+
return `🔍 **Vulnerability Risk Assessment**
|
|
337
|
+
|
|
338
|
+
🎯 **CVE**: ${cve_id}
|
|
339
|
+
📊 **CVSS Score**: ${cveDetails.cvss_score.toFixed(1)}/10 (${cveDetails.severity})
|
|
340
|
+
|
|
341
|
+
🔒 **Technical Details**:
|
|
342
|
+
- **Attack Vector**: ${cveDetails.vector}
|
|
343
|
+
- **Attack Complexity**: ${cveDetails.complexity}
|
|
344
|
+
- **Privileges Required**: ${cveDetails.privileges_required}
|
|
345
|
+
- **User Interaction**: ${cveDetails.user_interaction}
|
|
346
|
+
|
|
347
|
+
🏢 **Business Risk**: ${businessRisk.toFixed(1)}/100
|
|
348
|
+
- **Asset Criticality**: ${businessRiskFactors.asset_criticality.toFixed(1)}/100
|
|
349
|
+
- **Data Sensitivity**: ${businessRiskFactors.data_sensitivity.toFixed(1)}/100
|
|
350
|
+
- **System Exposure**: ${businessRiskFactors.system_exposure.toFixed(1)}/100
|
|
351
|
+
|
|
352
|
+
🎯 **Affected Assets**: ${affected_assets.length}
|
|
353
|
+
${business_context ? `📋 **Business Context**: ${business_context}` : ''}
|
|
354
|
+
|
|
355
|
+
🚨 **Risk Rating**: ${cveDetails.severity} (Technical) / ${businessRisk > 75 ? 'HIGH' : businessRisk > 50 ? 'MEDIUM' : 'LOW'} (Business)
|
|
356
|
+
|
|
357
|
+
💡 **Recommendations**:
|
|
358
|
+
${cveDetails.severity === 'CRITICAL' ? '- **URGENT**: Patch immediately or isolate systems\n- Activate emergency response procedures' :
|
|
359
|
+
cveDetails.severity === 'HIGH' ? '- **HIGH PRIORITY**: Schedule patching within 72 hours\n- Implement compensating controls' :
|
|
360
|
+
'- Schedule patching during next maintenance window\n- Monitor for exploitation attempts'}`;
|
|
361
|
+
}
|
|
362
|
+
async generateSecurityDashboard(args) {
|
|
363
|
+
const { dashboard_type, time_range = '24_hours', include_trends = false, export_format = 'json' } = args;
|
|
364
|
+
// Generate dashboard metrics based on type
|
|
365
|
+
const baseMetrics = {
|
|
366
|
+
total_incidents: Math.floor(Math.random() * 50) + 10,
|
|
367
|
+
active_incidents: Math.floor(Math.random() * 20) + 5,
|
|
368
|
+
resolved_incidents: Math.floor(Math.random() * 100) + 50,
|
|
369
|
+
avg_resolution_time: Math.floor(Math.random() * 24) + 2, // 2-26 hours
|
|
370
|
+
threat_intelligence_feeds: Math.floor(Math.random() * 10) + 5,
|
|
371
|
+
vulnerabilities_identified: Math.floor(Math.random() * 200) + 50,
|
|
372
|
+
high_risk_vulnerabilities: Math.floor(Math.random() * 20) + 2,
|
|
373
|
+
automated_responses: Math.floor(Math.random() * 80) + 20
|
|
374
|
+
};
|
|
375
|
+
let dashboardContent = '';
|
|
376
|
+
switch (dashboard_type) {
|
|
377
|
+
case 'executive':
|
|
378
|
+
dashboardContent = `
|
|
379
|
+
📊 **Executive Security Dashboard**
|
|
380
|
+
|
|
381
|
+
🎯 **Key Performance Indicators**:
|
|
382
|
+
- **Security Incidents**: ${baseMetrics.total_incidents} total, ${baseMetrics.active_incidents} active
|
|
383
|
+
- **Response Time**: ${baseMetrics.avg_resolution_time} hours average
|
|
384
|
+
- **Threat Coverage**: ${baseMetrics.threat_intelligence_feeds} feeds active
|
|
385
|
+
- **Vulnerability Risk**: ${baseMetrics.high_risk_vulnerabilities} high-risk items
|
|
386
|
+
|
|
387
|
+
📈 **Security Posture Score**: ${(100 - (baseMetrics.active_incidents * 2) - (baseMetrics.high_risk_vulnerabilities * 3)).toFixed(0)}/100
|
|
388
|
+
|
|
389
|
+
💰 **Cost Impact**:
|
|
390
|
+
- **Incident Response Cost**: $${(baseMetrics.total_incidents * 5000).toLocaleString()}
|
|
391
|
+
- **Automation Savings**: $${(baseMetrics.automated_responses * 500).toLocaleString()}`;
|
|
392
|
+
break;
|
|
393
|
+
case 'analyst':
|
|
394
|
+
dashboardContent = `
|
|
395
|
+
🔍 **Security Analyst Dashboard**
|
|
396
|
+
|
|
397
|
+
📋 **Active Workload**:
|
|
398
|
+
- **Open Incidents**: ${baseMetrics.active_incidents}
|
|
399
|
+
- **Pending Analysis**: ${Math.floor(baseMetrics.active_incidents * 0.6)}
|
|
400
|
+
- **Awaiting Response**: ${Math.floor(baseMetrics.active_incidents * 0.4)}
|
|
401
|
+
|
|
402
|
+
🧠 **Threat Intelligence**:
|
|
403
|
+
- **New IOCs**: ${Math.floor(Math.random() * 50) + 10}
|
|
404
|
+
- **Correlation Matches**: ${Math.floor(Math.random() * 20) + 5}
|
|
405
|
+
- **Feed Sources**: ${baseMetrics.threat_intelligence_feeds} active
|
|
406
|
+
|
|
407
|
+
🔒 **Vulnerability Management**:
|
|
408
|
+
- **Total Vulnerabilities**: ${baseMetrics.vulnerabilities_identified}
|
|
409
|
+
- **Critical/High**: ${baseMetrics.high_risk_vulnerabilities}
|
|
410
|
+
- **Patch Status**: ${Math.floor(Math.random() * 80) + 60}% patched`;
|
|
411
|
+
break;
|
|
412
|
+
case 'incident_response':
|
|
413
|
+
dashboardContent = `
|
|
414
|
+
🚨 **Incident Response Dashboard**
|
|
415
|
+
|
|
416
|
+
⚡ **Active Response Operations**:
|
|
417
|
+
- **Active Incidents**: ${baseMetrics.active_incidents}
|
|
418
|
+
- **Escalated Cases**: ${Math.floor(baseMetrics.active_incidents * 0.2)}
|
|
419
|
+
- **Automated Responses**: ${baseMetrics.automated_responses}
|
|
420
|
+
|
|
421
|
+
⏱️ **Response Times**:
|
|
422
|
+
- **Detection to Response**: ${Math.floor(Math.random() * 60) + 15} minutes
|
|
423
|
+
- **Containment Time**: ${Math.floor(Math.random() * 120) + 30} minutes
|
|
424
|
+
- **Resolution Time**: ${baseMetrics.avg_resolution_time} hours
|
|
425
|
+
|
|
426
|
+
🎯 **Playbook Execution**:
|
|
427
|
+
- **Success Rate**: ${Math.floor(Math.random() * 20) + 80}%
|
|
428
|
+
- **Manual Interventions**: ${Math.floor(Math.random() * 10) + 2}
|
|
429
|
+
- **False Positives**: ${Math.floor(Math.random() * 5) + 1}`;
|
|
430
|
+
break;
|
|
431
|
+
case 'compliance':
|
|
432
|
+
dashboardContent = `
|
|
433
|
+
📋 **Security Compliance Dashboard**
|
|
434
|
+
|
|
435
|
+
✅ **Compliance Status**:
|
|
436
|
+
- **SOC 2**: ${Math.random() > 0.2 ? 'Compliant' : 'Non-Compliant'}
|
|
437
|
+
- **ISO 27001**: ${Math.random() > 0.2 ? 'Compliant' : 'Non-Compliant'}
|
|
438
|
+
- **NIST**: ${Math.random() > 0.2 ? 'Compliant' : 'Non-Compliant'}
|
|
439
|
+
|
|
440
|
+
📊 **Security Controls**:
|
|
441
|
+
- **Implemented**: ${Math.floor(Math.random() * 50) + 150}/200
|
|
442
|
+
- **Tested**: ${Math.floor(Math.random() * 40) + 120}/200
|
|
443
|
+
- **Effective**: ${Math.floor(Math.random() * 35) + 110}/200
|
|
444
|
+
|
|
445
|
+
🔍 **Audit Findings**:
|
|
446
|
+
- **Open Findings**: ${Math.floor(Math.random() * 10) + 2}
|
|
447
|
+
- **High Priority**: ${Math.floor(Math.random() * 3) + 1}
|
|
448
|
+
- **Average Remediation**: ${Math.floor(Math.random() * 20) + 10} days`;
|
|
449
|
+
break;
|
|
450
|
+
}
|
|
451
|
+
return dashboardContent + `
|
|
452
|
+
|
|
453
|
+
📅 **Period**: ${time_range.replace('_', ' ')}
|
|
454
|
+
🔄 **Last Updated**: ${new Date().toISOString()}
|
|
455
|
+
📁 **Format**: ${export_format}
|
|
456
|
+
|
|
457
|
+
${include_trends ? '📈 **Trend Analysis**: Security metrics improving 15% month-over-month' : ''}`;
|
|
458
|
+
}
|
|
459
|
+
async automateThreatResponse(args) {
|
|
460
|
+
const { threat_id, response_level, automated_actions = false, notification_groups = [] } = args;
|
|
461
|
+
const responseActions = {
|
|
462
|
+
contain: [
|
|
463
|
+
'Block suspicious IP addresses',
|
|
464
|
+
'Isolate affected network segments',
|
|
465
|
+
'Restrict user account access',
|
|
466
|
+
'Enable enhanced monitoring'
|
|
467
|
+
],
|
|
468
|
+
isolate: [
|
|
469
|
+
'Disconnect affected systems from network',
|
|
470
|
+
'Preserve system state for forensics',
|
|
471
|
+
'Activate backup systems',
|
|
472
|
+
'Implement emergency access controls'
|
|
473
|
+
],
|
|
474
|
+
eradicate: [
|
|
475
|
+
'Remove malicious software/files',
|
|
476
|
+
'Apply security patches',
|
|
477
|
+
'Reset compromised credentials',
|
|
478
|
+
'Update security rules and signatures'
|
|
479
|
+
],
|
|
480
|
+
recover: [
|
|
481
|
+
'Restore systems from clean backups',
|
|
482
|
+
'Verify system integrity',
|
|
483
|
+
'Gradually restore network access',
|
|
484
|
+
'Resume normal operations with monitoring'
|
|
485
|
+
]
|
|
486
|
+
};
|
|
487
|
+
const actions = responseActions[response_level] || [];
|
|
488
|
+
const executionResults = actions.map(action => ({
|
|
489
|
+
action,
|
|
490
|
+
status: automated_actions && Math.random() > 0.1 ? 'executed' : 'pending',
|
|
491
|
+
estimated_time: Math.floor(Math.random() * 30) + 5
|
|
492
|
+
}));
|
|
493
|
+
const executedCount = executionResults.filter(r => r.status === 'executed').length;
|
|
494
|
+
return `🤖 **Automated Threat Response**
|
|
495
|
+
|
|
496
|
+
🎯 **Threat**: ${threat_id}
|
|
497
|
+
🚨 **Response Level**: ${response_level.toUpperCase()}
|
|
498
|
+
⚙️ **Mode**: ${automated_actions ? 'Fully Automated' : 'Manual Approval Required'}
|
|
499
|
+
|
|
500
|
+
🔧 **Response Actions**:
|
|
501
|
+
${executionResults.map(result => `${result.status === 'executed' ? '✅' : '⏳'} ${result.action} (${result.estimated_time}m)`).join('\n')}
|
|
502
|
+
|
|
503
|
+
📊 **Execution Summary**:
|
|
504
|
+
- **Actions Executed**: ${executedCount}/${actions.length}
|
|
505
|
+
- **Pending Approval**: ${actions.length - executedCount}
|
|
506
|
+
- **Estimated Completion**: ${Math.max(...executionResults.map(r => r.estimated_time))} minutes
|
|
507
|
+
|
|
508
|
+
📢 **Notifications Sent**: ${notification_groups.length} groups notified
|
|
509
|
+
|
|
510
|
+
${automated_actions ?
|
|
511
|
+
'🚀 **Automated Response**: Threat containment initiated automatically' :
|
|
512
|
+
'👤 **Manual Approval**: Critical actions require security team approval'}`;
|
|
513
|
+
}
|
|
514
|
+
// Helper methods
|
|
515
|
+
mapPriorityToNumber(priority) {
|
|
516
|
+
const priorityMap = { critical: 1, high: 2, medium: 3, low: 4 };
|
|
517
|
+
return priorityMap[priority] || 3;
|
|
518
|
+
}
|
|
519
|
+
calculateImpact(affectedSystems, threatType) {
|
|
520
|
+
const baseImpact = affectedSystems.length;
|
|
521
|
+
const threatMultiplier = {
|
|
522
|
+
'data_breach': 3,
|
|
523
|
+
'malware': 2,
|
|
524
|
+
'unauthorized_access': 2,
|
|
525
|
+
'ddos': 1,
|
|
526
|
+
'phishing': 1,
|
|
527
|
+
'insider_threat': 3
|
|
528
|
+
};
|
|
529
|
+
const multiplier = threatMultiplier[threatType] || 1;
|
|
530
|
+
const impact = Math.min(baseImpact * multiplier, 3); // Max impact of 3
|
|
531
|
+
return impact || 1;
|
|
532
|
+
}
|
|
533
|
+
detectIOCType(ioc) {
|
|
534
|
+
if (/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(ioc))
|
|
535
|
+
return 'ip';
|
|
536
|
+
if (/^[a-f0-9]{32}$/i.test(ioc))
|
|
537
|
+
return 'hash_md5';
|
|
538
|
+
if (/^[a-f0-9]{40}$/i.test(ioc))
|
|
539
|
+
return 'hash_sha1';
|
|
540
|
+
if (/^[a-f0-9]{64}$/i.test(ioc))
|
|
541
|
+
return 'hash_sha256';
|
|
542
|
+
if (/^https?:\/\//.test(ioc))
|
|
543
|
+
return 'url';
|
|
544
|
+
if (/@/.test(ioc))
|
|
545
|
+
return 'email';
|
|
546
|
+
return 'domain';
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
exports.ServiceNowSecOpsMCP = ServiceNowSecOpsMCP;
|
|
550
|
+
// Start the server
|
|
551
|
+
async function main() {
|
|
552
|
+
const server = new ServiceNowSecOpsMCP();
|
|
553
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
554
|
+
await server.server.connect(transport);
|
|
555
|
+
console.error('🛡️ ServiceNow SecOps MCP Server started');
|
|
556
|
+
}
|
|
557
|
+
if (require.main === module) {
|
|
558
|
+
main().catch(console.error);
|
|
559
|
+
}
|
|
560
|
+
//# sourceMappingURL=servicenow-secops-mcp.js.map
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Pool Manager
|
|
3
|
+
* Optimizes Map/Set allocations and reuses objects for better memory efficiency
|
|
4
|
+
*/
|
|
5
|
+
export declare class MemoryPoolManager {
|
|
6
|
+
private static mapPool;
|
|
7
|
+
private static setPool;
|
|
8
|
+
private static objectPool;
|
|
9
|
+
private static readonly MAX_POOL_SIZE;
|
|
10
|
+
/**
|
|
11
|
+
* Get a reusable Map instance
|
|
12
|
+
*/
|
|
13
|
+
static getMap<K, V>(): Map<K, V>;
|
|
14
|
+
/**
|
|
15
|
+
* Return a Map to the pool for reuse
|
|
16
|
+
*/
|
|
17
|
+
static releaseMap(map: Map<any, any>): void;
|
|
18
|
+
/**
|
|
19
|
+
* Get a reusable Set instance
|
|
20
|
+
*/
|
|
21
|
+
static getSet<T>(): Set<T>;
|
|
22
|
+
/**
|
|
23
|
+
* Return a Set to the pool for reuse
|
|
24
|
+
*/
|
|
25
|
+
static releaseSet(set: Set<any>): void;
|
|
26
|
+
/**
|
|
27
|
+
* Get a reusable object
|
|
28
|
+
*/
|
|
29
|
+
static getObject(): any;
|
|
30
|
+
/**
|
|
31
|
+
* Return an object to the pool
|
|
32
|
+
*/
|
|
33
|
+
static releaseObject(obj: any): void;
|
|
34
|
+
/**
|
|
35
|
+
* Get pool statistics for monitoring
|
|
36
|
+
*/
|
|
37
|
+
static getStats(): {
|
|
38
|
+
maps: {
|
|
39
|
+
available: number;
|
|
40
|
+
maxSize: number;
|
|
41
|
+
};
|
|
42
|
+
sets: {
|
|
43
|
+
available: number;
|
|
44
|
+
maxSize: number;
|
|
45
|
+
};
|
|
46
|
+
objects: {
|
|
47
|
+
available: number;
|
|
48
|
+
maxSize: number;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Clear all pools (for testing/cleanup)
|
|
53
|
+
*/
|
|
54
|
+
static clearPools(): void;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=memory-pool.d.ts.map
|