import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import type { LoggingMessageNotification } from "@modelcontextprotocol/sdk/types.js"; /** * Logger interface definition */ export interface ILogger { sendLog(args: LoggingMessageNotification["params"]): void; } /** * MCP compatible logger implementation * Handles "Not connected" errors gracefully */ export class McpLogger implements ILogger { constructor(private server: McpServer) {} sendLog(args: LoggingMessageNotification["params"]) { try { this.server.server.sendLoggingMessage({ ...args, }); } catch (error) { // Only swallow the expected "Not connected" error during startup/shutdown if (error instanceof Error && error.message === "Not connected") { return; } // For all other errors, log detailed information to help diagnose logging system failures console.error( "CRITICAL: Failed to send log to MCP server. Logging system may be compromised.", { error: error instanceof Error ? error.message : String(error), originalLogger: args.logger, originalLogLevel: args.level, stack: error instanceof Error ? error.stack : undefined, }, ); } } } /** * Console Logger implementation for standalone use (e.g., HTTP mode setup) * Outputs to stderr to avoid interfering with stdio transport */ export class ConsoleLogger implements ILogger { sendLog(args: LoggingMessageNotification["params"]) { const timestamp = new Date().toISOString(); const level = args.level?.toUpperCase() || "INFO"; const logger = args.logger || "unknown"; const data = args.data; console.error(`[${timestamp}] [${level}] [${logger}] ${data}`); } }