framework-mcp
Version:
Pure Data Provider architecture serving authentic CIS Controls Framework data via MCP and HTTP API. Empowers LLMs with authoritative safeguards data for analysis. Supports Microsoft Copilot custom connectors and DigitalOcean App Services deployment.
176 lines (145 loc) ⢠6.05 kB
JavaScript
/**
* Comprehensive Validation Script for CIS Safeguards Migration
* This script will be used to validate data integrity during and after migration
*/
const fs = require('fs');
class SafeguardsValidator {
constructor() {
this.expectedCount = 153;
this.expectedControls = 18;
this.requiredFields = [
'id', 'title', 'description', 'implementationGroup',
'assetType', 'securityFunction', 'governanceElements',
'coreRequirements', 'subTaxonomicalElements',
'implementationSuggestions', 'relatedSafeguards', 'keywords'
];
}
validateFile(filePath) {
console.log(`š Validating: ${filePath}\n`);
if (!fs.existsSync(filePath)) {
console.log('ā File not found');
return false;
}
const content = fs.readFileSync(filePath, 'utf8');
return this.validateContent(content);
}
validateContent(content) {
const results = {
countTest: false,
duplicateTest: false,
formatTest: false,
syntaxTest: false,
fieldsTest: false,
controlsTest: false
};
try {
// Extract safeguards data
let safeguardsData;
if (content.includes('this.safeguards = ')) {
// SafeguardManager format
const match = content.match(/this\.safeguards = ({[\s\S]*});/);
safeguardsData = match ? match[1] : null;
} else {
// Raw CIS_SAFEGUARDS format
const match = content.match(/= ({[\s\S]*});/);
safeguardsData = match ? match[1] : null;
}
if (!safeguardsData) {
console.log('ā Could not extract safeguards data');
return false;
}
// Parse the data
const safeguards = eval(`(${safeguardsData})`);
const safeguardIds = Object.keys(safeguards);
// Test 1: Count validation
console.log('š Count Validation:');
console.log(` Expected: ${this.expectedCount}`);
console.log(` Found: ${safeguardIds.length}`);
results.countTest = safeguardIds.length === this.expectedCount;
console.log(` Result: ${results.countTest ? 'ā
' : 'ā'}\n`);
// Test 2: Duplicate check
console.log('š Duplicate Check:');
const duplicates = safeguardIds.filter((id, index) => safeguardIds.indexOf(id) !== index);
results.duplicateTest = duplicates.length === 0;
console.log(` Duplicates found: ${duplicates.length}`);
console.log(` Result: ${results.duplicateTest ? 'ā
' : 'ā'}\n`);
// Test 3: ID format validation
console.log('š Format Validation:');
const invalidFormats = safeguardIds.filter(id => !/^\d+\.\d+$/.test(id));
results.formatTest = invalidFormats.length === 0;
console.log(` Invalid formats: ${invalidFormats.length}`);
console.log(` Result: ${results.formatTest ? 'ā
' : 'ā'}\n`);
// Test 4: Syntax validation (already done by eval above)
console.log('āļø Syntax Validation:');
results.syntaxTest = true; // If we got here, syntax is valid
console.log(` Result: ā
\n`);
// Test 5: Required fields validation
console.log('š Fields Validation:');
let fieldsValid = true;
const sampleSafeguard = safeguards[safeguardIds[0]];
const missingFields = this.requiredFields.filter(field => !(field in sampleSafeguard));
if (missingFields.length > 0) {
console.log(` Missing fields in sample: ${missingFields.join(', ')}`);
fieldsValid = false;
}
// Check a few random safeguards for field completeness
const testSafeguards = [safeguardIds[0], safeguardIds[Math.floor(safeguardIds.length / 2)], safeguardIds[safeguardIds.length - 1]];
for (const id of testSafeguards) {
const missing = this.requiredFields.filter(field => !(field in safeguards[id]));
if (missing.length > 0) {
console.log(` Missing fields in ${id}: ${missing.join(', ')}`);
fieldsValid = false;
}
}
results.fieldsTest = fieldsValid;
console.log(` Result: ${fieldsValid ? 'ā
' : 'ā'}\n`);
// Test 6: Control coverage
console.log('šÆ Control Coverage:');
const controlCounts = {};
safeguardIds.forEach(id => {
const control = parseInt(id.split('.')[0]);
controlCounts[control] = (controlCounts[control] || 0) + 1;
});
let allControlsPresent = true;
for (let i = 1; i <= this.expectedControls; i++) {
const count = controlCounts[i] || 0;
if (count === 0) {
console.log(` ā Control ${i}: Missing`);
allControlsPresent = false;
} else {
console.log(` ā
Control ${i}: ${count} safeguards`);
}
}
results.controlsTest = allControlsPresent;
console.log(` Result: ${allControlsPresent ? 'ā
' : 'ā'}\n`);
} catch (error) {
console.log('ā Validation error:', error.message);
return false;
}
// Overall result
const allTestsPassed = Object.values(results).every(test => test);
console.log('šÆ Overall Validation Result:');
console.log(` Status: ${allTestsPassed ? 'ā
PASSED' : 'ā FAILED'}`);
console.log(` Details:`, results);
return allTestsPassed;
}
}
// Main execution
if (require.main === module) {
const validator = new SafeguardsValidator();
console.log('š CIS Safeguards Comprehensive Validation\n');
console.log('=' .repeat(50) + '\n');
// Test the formatted data ready for integration
const testFile = '/tmp/formatted_safeguards_ready.ts';
const isValid = validator.validateFile(testFile);
console.log('\n' + '='.repeat(50));
console.log(`Final Result: ${isValid ? 'ā
READY FOR INTEGRATION' : 'ā NOT READY'}`);
if (!isValid) {
console.log('\nā Issues found - please fix before proceeding with integration');
process.exit(1);
} else {
console.log('\nš All validations passed - data is ready for SafeguardManager integration!');
}
}
module.exports = SafeguardsValidator;