UNPKG

@thestarware/chrome-console-mcp

Version:

MCP Server for Chrome/Edge console logs and network requests via browser extension

179 lines 6.58 kB
export class ConsoleLogManager { logs = []; maxLogs = 10000; addLog(log) { this.logs.push(log); // Keep only the most recent logs to prevent memory issues if (this.logs.length > this.maxLogs) { this.logs = this.logs.slice(-this.maxLogs); } } getLogs(filter, limit) { let filteredLogs = this.logs; if (filter) { filteredLogs = this.filterLogs(filteredLogs, filter); } if (limit && limit > 0) { filteredLogs = filteredLogs.slice(-limit); } return filteredLogs; } getLogCount() { console.error(`Console manager has ${this.logs.length} logs in memory`); return this.logs.length; } clearLogs() { this.logs = []; } exportLogs(options) { const logs = this.getLogs(options.filter, options.limit); switch (options.format) { case 'json': return JSON.stringify(logs, null, 2); case 'csv': return this.logsToCSV(logs); case 'txt': return this.logsToText(logs); default: return JSON.stringify(logs, null, 2); } } getLogStats() { const stats = { total: this.logs.length, consoleTotal: 0, networkTotal: 0, log: 0, warn: 0, error: 0, info: 0, debug: 0 }; this.logs.forEach(log => { if (log.type === 'console-log') { stats.consoleTotal++; stats[log.level] = (stats[log.level] || 0) + 1; } else { stats.networkTotal++; } }); return stats; } searchLogs(searchTerm) { const term = searchTerm.toLowerCase(); return this.logs.filter(log => { if (log.type === 'console-log') { return log.message.toLowerCase().includes(term) || log.url.toLowerCase().includes(term) || log.level.toLowerCase().includes(term); } else { return log.url.toLowerCase().includes(term) || log.method.toLowerCase().includes(term) || log.statusText.toLowerCase().includes(term); } }); } filterLogs(logs, filter) { return logs.filter(log => { // Filter by type if (filter.type && filter.type.length > 0 && !filter.type.includes(log.type)) { return false; } // Filter by level (console logs only) if (filter.level && filter.level.length > 0 && log.type === 'console-log' && !filter.level.includes(log.level)) { return false; } // Filter by method (network requests only) if (filter.method && filter.method.length > 0 && log.type === 'network-request' && !filter.method.includes(log.method)) { return false; } // Filter by status (network requests only) if (filter.status && filter.status.length > 0 && log.type === 'network-request' && !filter.status.includes(log.status)) { return false; } // Filter by URL if (filter.url && !log.url.includes(filter.url)) { return false; } // Filter by time range if (filter.timeRange) { const logTime = new Date(log.timestamp).getTime(); const startTime = new Date(filter.timeRange.start).getTime(); const endTime = new Date(filter.timeRange.end).getTime(); if (logTime < startTime || logTime > endTime) { return false; } } // Filter by search term if (filter.searchTerm) { const term = filter.searchTerm.toLowerCase(); if (log.type === 'console-log') { if (!log.message.toLowerCase().includes(term) && !log.url.toLowerCase().includes(term) && !log.level.toLowerCase().includes(term)) { return false; } } else { if (!log.url.toLowerCase().includes(term) && !log.method.toLowerCase().includes(term) && !log.statusText.toLowerCase().includes(term)) { return false; } } } return true; }); } logsToCSV(logs) { const headers = ['timestamp', 'type', 'level_or_method', 'message_or_status', 'url', 'request_body', 'response_body']; const csvRows = [headers.join(',')]; logs.forEach(log => { if (log.type === 'console-log') { const row = [ log.timestamp, log.type, log.level, `"${log.message.replace(/"/g, '""')}"`, log.url, '', '' ]; csvRows.push(row.join(',')); } else { const row = [ log.timestamp, log.type, log.method, `${log.status} ${log.statusText}`, log.url, log.requestBody ? `"${log.requestBody.replace(/"/g, '""')}"` : '', log.responseBody ? `"${log.responseBody.replace(/"/g, '""')}"` : '' ]; csvRows.push(row.join(',')); } }); return csvRows.join('\n'); } logsToText(logs) { return logs.map(log => { if (log.type === 'console-log') { return `[${log.timestamp}] [CONSOLE:${log.level.toUpperCase()}] ${log.message} (${log.url})`; } else { let result = `[${log.timestamp}] [NETWORK:${log.method}] ${log.status} ${log.statusText} (${log.url})`; if (log.requestBody) { result += `\n Request: ${log.requestBody}`; } if (log.responseBody) { result += `\n Response: ${log.responseBody}`; } return result; } }).join('\n'); } } //# sourceMappingURL=console-manager.js.map