@mcp-shark/mcp-shark
Version:
Aggregate multiple Model Context Protocol (MCP) servers into a single unified interface with a powerful monitoring UI. Prov deep visibility into every request and response.
99 lines (86 loc) • 3.04 kB
JavaScript
/**
* Utility functions for normalizing scan data from various API response formats
*/
export function getScanValue(scan, path) {
const paths = path.split('.');
let value = scan;
for (const p of paths) {
if (value && typeof value === 'object' && p in value) {
value = value[p];
} else {
return null;
}
}
return value;
}
export function normalizeScanData(scan) {
const actualScan = scan.result || scan.data || scan;
const scanId =
getScanValue(scan, 'result.id') ||
getScanValue(scan, 'id') ||
getScanValue(scan, 'scan_id') ||
getScanValue(scan, 'data.id') ||
getScanValue(scan, 'data.scan_id') ||
(actualScan && actualScan.id) ||
(actualScan && actualScan.scan_id);
const serverName =
scan.serverName || // Check top-level first (for cached scans)
scan.server_name ||
getScanValue(scan, 'result.mcp_server_data.server.name') ||
getScanValue(scan, 'mcp_server_data.server.name') ||
getScanValue(scan, 'server.name') ||
getScanValue(scan, 'data.server.name') ||
getScanValue(scan, 'data.data.server.name') ||
(scan.server && scan.server.name) || // Check nested server object
'Unknown Server';
const status =
getScanValue(scan, 'result.status') ||
getScanValue(scan, 'status') ||
getScanValue(scan, 'data.status');
const overallRiskLevel =
getScanValue(scan, 'result.overall_risk_level') ||
getScanValue(scan, 'overall_risk_level') ||
getScanValue(scan, 'data.overall_risk_level') ||
getScanValue(scan, 'data.data.overall_risk_level');
const createdAt =
getScanValue(scan, 'result.created_at') ||
getScanValue(scan, 'created_at') ||
getScanValue(scan, 'data.created_at') ||
getScanValue(scan, 'data.data.created_at');
const updatedAt =
getScanValue(scan, 'result.updated_at') ||
getScanValue(scan, 'updated_at') ||
getScanValue(scan, 'data.updated_at') ||
getScanValue(scan, 'data.data.updated_at');
let analysisResult =
getScanValue(scan, 'result.analysis_result') ||
getScanValue(scan, 'analysis_result') ||
getScanValue(scan, 'data.analysis_result') ||
getScanValue(scan, 'data.data.analysis_result') ||
getScanValue(scan, 'data.data.data.analysis_result');
if (!analysisResult && actualScan && typeof actualScan === 'object') {
if (actualScan.tool_findings || actualScan.prompt_findings || actualScan.resource_findings) {
analysisResult = actualScan;
}
if (!analysisResult && actualScan.analysis_result) {
analysisResult = actualScan.analysis_result;
}
}
const serverData =
getScanValue(scan, 'result.mcp_server_data.server') ||
getScanValue(scan, 'mcp_server_data.server') ||
getScanValue(scan, 'server') ||
getScanValue(scan, 'data.server') ||
getScanValue(scan, 'data.data.server') ||
getScanValue(scan, 'mcp_server_data');
return {
scanId,
serverName,
status,
overallRiskLevel,
createdAt,
updatedAt,
analysisResult,
serverData,
};
}