UNPKG

context-engine

Version:

ContextEngine MCP Server - Up-to-date documentation and code examples for any library

82 lines (81 loc) 2.81 kB
/** * 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 };