UNPKG

@superadnim/osint-mcp-server

Version:

Professional OSINT MCP Server for intelligence gathering with privacy protection

283 lines 10.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CorrelationEngine = void 0; class CorrelationEngine { logger; constructor(logger) { this.logger = logger; } correlatePeopleData(sourceResults) { this.logger.debug('Correlating people data from sources', { source_count: sourceResults.length }); const correlatedData = { names: [], phones: [], emails: [], addresses: [], relatives: [], associates: [], social_profiles: [], }; // Process each source result for (const result of sourceResults) { if (this.isValidSourceResult(result)) { this.mergePersonData(correlatedData, result); } } // Apply confidence scoring and deduplication this.deduplicateAndScore(correlatedData); this.logger.debug('People data correlation completed', { names_count: correlatedData.names?.length || 0, phones_count: correlatedData.phones?.length || 0, emails_count: correlatedData.emails?.length || 0, addresses_count: correlatedData.addresses?.length || 0, }); return correlatedData; } correlatePhoneData(sourceResults) { this.logger.debug('Correlating phone data from sources', { source_count: sourceResults.length }); const correlatedData = { associated_accounts: [], registered_services: [], historical_data: [], }; // Process each source result for (const result of sourceResults) { if (this.isValidSourceResult(result)) { this.mergePhoneData(correlatedData, result); } } this.logger.debug('Phone data correlation completed'); return correlatedData; } correlateEmailData(sourceResults) { this.logger.debug('Correlating email data from sources', { source_count: sourceResults.length }); const correlatedData = { account_enumeration: { confirmed_accounts: [], possible_accounts: [], total_platforms_checked: 0, }, breach_analysis: { total_breaches: 0, breaches: [], exposed_data_types: [], latest_breach: 'None', risk_level: 'low', }, }; // Process each source result for (const result of sourceResults) { if (this.isValidSourceResult(result)) { this.mergeEmailData(correlatedData, result); } } this.logger.debug('Email data correlation completed'); return correlatedData; } isValidSourceResult(result) { return (typeof result === 'object' && result !== null && 'success' in result && 'data' in result && 'source' in result && result.success === true); } mergePersonData(target, source) { const data = source.data; // Merge names if (data.names && Array.isArray(data.names)) { target.names = target.names || []; for (const name of data.names) { if (this.isValidNameData(name)) { target.names.push({ ...name, confidence: this.calculateSourceConfidence(source.source), }); } } } // Merge phones if (data.phones && Array.isArray(data.phones)) { target.phones = target.phones || []; for (const phone of data.phones) { if (this.isValidPhoneData(phone)) { target.phones.push({ ...phone, confidence: this.calculateSourceConfidence(source.source), }); } } } // Merge emails if (data.emails && Array.isArray(data.emails)) { target.emails = target.emails || []; for (const email of data.emails) { if (this.isValidEmailData(email)) { target.emails.push({ ...email, confidence: this.calculateSourceConfidence(source.source), }); } } } // Merge addresses if (data.addresses && Array.isArray(data.addresses)) { target.addresses = target.addresses || []; for (const address of data.addresses) { if (this.isValidAddressData(address)) { target.addresses.push({ ...address, confidence: this.calculateSourceConfidence(source.source), }); } } } } mergePhoneData(target, source) { const data = source.data; // Merge basic phone info if (data.formatted) target.formatted = data.formatted; if (data.international) target.international = data.international; if (data.national) target.national = data.national; if (data.e164) target.e164 = data.e164; // Merge carrier info if (data.carrier_info && typeof data.carrier_info === 'object') { target.carrier_info = data.carrier_info; } // Merge location info if (data.location && typeof data.location === 'object') { target.location = data.location; } // Merge reputation info if (data.reputation && typeof data.reputation === 'object') { target.reputation = data.reputation; } } mergeEmailData(target, source) { const data = source.data; // Merge basic email info if (data.is_valid !== undefined) target.is_valid = data.is_valid; if (data.is_disposable !== undefined) target.is_disposable = data.is_disposable; if (data.is_business !== undefined) target.is_business = data.is_business; // Merge domain analysis if (data.domain_analysis && typeof data.domain_analysis === 'object') { target.domain_analysis = data.domain_analysis; } // Merge breach analysis if (data.breach_analysis && typeof data.breach_analysis === 'object') { target.breach_analysis = data.breach_analysis; } // Merge account enumeration if (data.account_enumeration && typeof data.account_enumeration === 'object') { target.account_enumeration = data.account_enumeration; } // Merge deliverability if (data.deliverability && typeof data.deliverability === 'object') { target.deliverability = data.deliverability; } } deduplicateAndScore(data) { // Deduplicate names if (data.names) { data.names = this.deduplicateArray(data.names, 'full_name'); } // Deduplicate phones if (data.phones) { data.phones = this.deduplicateArray(data.phones, 'number'); } // Deduplicate emails if (data.emails) { data.emails = this.deduplicateArray(data.emails, 'address'); } // Deduplicate addresses if (data.addresses) { data.addresses = this.deduplicateArray(data.addresses, 'full_address'); } } deduplicateArray(array, keyField) { const seen = new Map(); for (const item of array) { const key = String(item[keyField]); const existing = seen.get(key); if (!existing || item.confidence > existing.confidence) { seen.set(key, item); } } return Array.from(seen.values()); } calculateSourceConfidence(source) { // Assign confidence scores based on source reliability const sourceConfidence = { 'fastpeoplesearch': 0.8, 'numverify': 0.9, 'hunter_io': 0.85, 'google_search': 0.6, }; return sourceConfidence[source] || 0.5; } isValidNameData(data) { return (typeof data === 'object' && data !== null && 'first_name' in data && 'last_name' in data && 'full_name' in data && typeof data.first_name === 'string' && typeof data.last_name === 'string' && typeof data.full_name === 'string'); } isValidPhoneData(data) { return (typeof data === 'object' && data !== null && 'number' in data && 'formatted' in data && 'international' in data && 'type' in data && typeof data.number === 'string' && typeof data.formatted === 'string' && typeof data.international === 'string' && typeof data.type === 'string'); } isValidEmailData(data) { return (typeof data === 'object' && data !== null && 'address' in data && 'domain' in data && 'is_valid' in data && typeof data.address === 'string' && typeof data.domain === 'string' && typeof data.is_valid === 'boolean'); } isValidAddressData(data) { return (typeof data === 'object' && data !== null && 'street' in data && 'city' in data && 'state' in data && 'zip_code' in data && 'country' in data && 'full_address' in data && 'type' in data && typeof data.street === 'string' && typeof data.city === 'string' && typeof data.state === 'string' && typeof data.zip_code === 'string' && typeof data.country === 'string' && typeof data.full_address === 'string' && typeof data.type === 'string'); } } exports.CorrelationEngine = CorrelationEngine; //# sourceMappingURL=correlation.js.map