@thestarware/chrome-console-mcp
Version:
MCP Server for Chrome/Edge console logs and network requests via browser extension
179 lines • 6.58 kB
JavaScript
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