context-engine
Version:
ContextEngine MCP Server - Up-to-date documentation and code examples for any library
82 lines (81 loc) • 2.81 kB
JavaScript
/**
* MCP-Compatible Logger
*
* A logger specifically designed for MCP servers that:
* - Writes all output to stderr to avoid breaking stdio protocol
* - Provides different log levels
* - Can be controlled via environment variables
* - Maintains JSON structure for structured logging
*/
export var LogLevel;
(function (LogLevel) {
LogLevel[LogLevel["ERROR"] = 0] = "ERROR";
LogLevel[LogLevel["WARN"] = 1] = "WARN";
LogLevel[LogLevel["INFO"] = 2] = "INFO";
LogLevel[LogLevel["DEBUG"] = 3] = "DEBUG";
LogLevel[LogLevel["TRACE"] = 4] = "TRACE";
})(LogLevel || (LogLevel = {}));
class MCPLogger {
level;
isStructured;
constructor() {
// Get log level from environment or default to INFO
const envLevel = process.env.MCP_LOG_LEVEL?.toUpperCase();
this.level = envLevel
? (LogLevel[envLevel] ?? LogLevel.INFO)
: LogLevel.INFO;
// Enable structured logging if requested
this.isStructured = process.env.MCP_STRUCTURED_LOGS === "true";
}
shouldLog(level) {
return level <= this.level;
}
formatMessage(level, message, context) {
if (this.isStructured) {
const entry = {
timestamp: new Date().toISOString(),
level,
message,
...(context && { context }),
};
return JSON.stringify(entry);
}
const timestamp = new Date().toISOString();
const contextStr = context ? ` ${JSON.stringify(context)}` : "";
return `[${timestamp}] ${level.toUpperCase()}: ${message}${contextStr}`;
}
write(level, levelName, message, context) {
if (!this.shouldLog(level))
return;
const formatted = this.formatMessage(levelName, message, context);
// Always write to stderr to avoid breaking MCP stdio protocol
process.stderr.write(formatted + "\n");
}
error(message, context) {
this.write(LogLevel.ERROR, "error", message, context);
}
warn(message, context) {
this.write(LogLevel.WARN, "warn", message, context);
}
info(message, context) {
this.write(LogLevel.INFO, "info", message, context);
}
debug(message, context) {
this.write(LogLevel.DEBUG, "debug", message, context);
}
trace(message, context) {
this.write(LogLevel.TRACE, "trace", message, context);
}
// Convenience method for API-related logging
api(message, context) {
this.info(`[API] ${message}`, context);
}
// Convenience method for MCP-related logging
mcp(message, context) {
this.info(`[MCP] ${message}`, context);
}
}
// Export singleton instance
export const logger = new MCPLogger();
// Export the class for testing
export { MCPLogger };