mcp-siber-security-audit
Version:
MCP server for security code audit with auto-fix capabilities
75 lines (63 loc) • 2.03 kB
JavaScript
const fs = require('fs');
const path = require('path');
class ReportGenerator {
constructor() {
this.report = {
metadata: {
timestamp: new Date().toISOString(),
version: require('../../package.json').version
},
summary: {
totalIssues: 0,
bySeverity: {
high: 0,
medium: 0,
low: 0
},
byType: {},
byScanner: {}
},
issues: []
};
}
addIssues(issues) {
// Sort issues by severity and file
const sortedIssues = [...issues].sort((a, b) => {
const severityOrder = { high: 3, medium: 2, low: 1 };
if (severityOrder[a.severity] !== severityOrder[b.severity]) {
return severityOrder[b.severity] - severityOrder[a.severity];
}
return a.file.localeCompare(b.file);
});
this.report.issues = this.report.issues.concat(sortedIssues);
this._updateSummary();
}
_updateSummary() {
const summary = this.report.summary;
summary.totalIssues = this.report.issues.length;
// Reset counters
summary.bySeverity = { high: 0, medium: 0, low: 0 };
summary.byType = {};
summary.byScanner = {};
// Count issues
for (const issue of this.report.issues) {
// Count by severity
summary.bySeverity[issue.severity]++;
// Count by type
summary.byType[issue.type] = (summary.byType[issue.type] || 0) + 1;
// Count by scanner
summary.byScanner[issue.scanner] = (summary.byScanner[issue.scanner] || 0) + 1;
}
}
saveReport(outputDir = 'security-reports') {
// Create output directory if it doesn't exist
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
const jsonPath = path.join(outputDir, `security-report-${timestamp}.json`);
fs.writeFileSync(jsonPath, JSON.stringify(this.report, null, 2));
return { jsonPath };
}
}
module.exports = ReportGenerator;