ultimate-mcp-server
Version:
The definitive all-in-one Model Context Protocol server for AI-assisted coding across 30+ platforms
100 lines • 3.4 kB
JavaScript
import winston from "winston";
import chalk from "chalk";
const customFormat = winston.format.printf(({ level, message, timestamp, context, ...metadata }) => {
let msg = `${timestamp} `;
// Color-coded level
switch (level) {
case 'error':
msg += chalk.red(`[${level.toUpperCase()}]`);
break;
case 'warn':
msg += chalk.yellow(`[${level.toUpperCase()}]`);
break;
case 'info':
msg += chalk.blue(`[${level.toUpperCase()}]`);
break;
case 'debug':
msg += chalk.gray(`[${level.toUpperCase()}]`);
break;
default:
msg += `[${level.toUpperCase()}]`;
}
// Add context if present
if (context) {
msg += chalk.cyan(` [${context}]`);
}
msg += ` ${message}`;
// Add metadata if present
if (Object.keys(metadata).length > 0) {
msg += ` ${chalk.gray(JSON.stringify(metadata))}`;
}
return msg;
});
export class Logger {
logger;
context;
static isStdioMode = process.env.MCP_TRANSPORT === 'stdio' || (!process.env.MCP_TRANSPORT && !process.env.ENABLE_SSE && !process.env.ENABLE_HTTP && !process.env.ENABLE_WEBSOCKET);
constructor(context) {
this.context = context;
this.logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
format: winston.format.combine(winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.errors({ stack: true }), winston.format.splat(), customFormat),
transports: Logger.isStdioMode ? [] : [
new winston.transports.Console({
stderrLevels: ['error', 'warn', 'info', 'debug'],
}),
],
});
// Add file transport in production
if (process.env.NODE_ENV === 'production') {
this.logger.add(new winston.transports.File({
filename: 'logs/error.log',
level: 'error',
}));
this.logger.add(new winston.transports.File({
filename: 'logs/combined.log',
}));
}
}
formatMessage(message, metadata) {
return {
message,
context: this.context,
...metadata,
};
}
error(message, error) {
if (Logger.isStdioMode)
return;
if (error instanceof Error) {
this.logger.error(this.formatMessage(message, { error: error.message, stack: error.stack }));
}
else {
this.logger.error(this.formatMessage(message, error));
}
}
warn(message, metadata) {
if (Logger.isStdioMode)
return;
this.logger.warn(this.formatMessage(message, metadata));
}
info(message, metadata) {
if (Logger.isStdioMode)
return;
this.logger.info(this.formatMessage(message, metadata));
}
debug(message, metadata) {
if (Logger.isStdioMode)
return;
this.logger.debug(this.formatMessage(message, metadata));
}
log(level, message, metadata) {
if (Logger.isStdioMode)
return;
this.logger.log(level, this.formatMessage(message, metadata));
}
child(context) {
return new Logger(`${this.context}:${context}`);
}
}
//# sourceMappingURL=logger.js.map