@superadnim/osint-mcp-server
Version:
Professional OSINT MCP Server for intelligence gathering with privacy protection
283 lines • 10.3 kB
JavaScript
"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