From d015c516e0f61111c730814fa334aa6dd47022f6 Mon Sep 17 00:00:00 2001 From: yctimlin Date: Mon, 12 May 2025 23:03:29 +0800 Subject: [PATCH] Refactor error handling and logging to use process.stderr for better output management. Disable color codes in JSON parsing to prevent issues. Update logger configuration for improved clarity in log outputs. --- src/cli.js | 8 ++++---- src/index.js | 17 +++++++---------- src/test.js | 6 +++--- src/utils/logger.js | 5 ++++- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/cli.js b/src/cli.js index a8e4f09..b1647be 100644 --- a/src/cli.js +++ b/src/cli.js @@ -70,13 +70,13 @@ async function main() { await runServer(); } catch (error) { - console.error('Error starting MCP server:', error); + process.stderr.write(`Error starting MCP server: ${error}\n`); process.exit(1); } } function showHelp() { - console.log(` + process.stderr.write(` Excalidraw MCP Server Usage: @@ -94,10 +94,10 @@ function showHelp() { npx excalidraw-mcp --port 4000 npx excalidraw-mcp --mode http npx excalidraw-mcp --debug - `); + \n`); } main().catch(error => { - console.error('Fatal error:', error); + process.stderr.write(`Fatal error: ${error}\n`); process.exit(1); }); \ No newline at end of file diff --git a/src/index.js b/src/index.js index 0495d21..ec502e8 100644 --- a/src/index.js +++ b/src/index.js @@ -1,3 +1,7 @@ +// Disable colors to prevent ANSI color codes from breaking JSON parsing +process.env.NODE_DISABLE_COLORS = '1'; +process.env.NO_COLOR = '1'; + import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { @@ -716,7 +720,7 @@ async function runServer() { process.stdin.resume(); } catch (error) { logger.error('Error starting server:', error); - console.error('Failed to start MCP server:', error.message, error.stack); + process.stderr.write(`Failed to start MCP server: ${error.message}\n${error.stack}\n`); process.exit(1); } } @@ -724,23 +728,16 @@ async function runServer() { // Add global error handlers process.on('uncaughtException', (error) => { logger.error('Uncaught exception:', error); - console.error('UNCAUGHT EXCEPTION:', error.message, error.stack); - // Don't exit immediately to allow logging + process.stderr.write(`UNCAUGHT EXCEPTION: ${error.message}\n${error.stack}\n`); setTimeout(() => process.exit(1), 1000); }); process.on('unhandledRejection', (reason, promise) => { logger.error('Unhandled promise rejection:', reason); - console.error('UNHANDLED REJECTION:', reason); - // Don't exit immediately to allow logging + process.stderr.write(`UNHANDLED REJECTION: ${reason}\n`); setTimeout(() => process.exit(1), 1000); }); -// Only run the server directly if this file is executed directly (not imported) -if (import.meta.url === `file://${process.argv[1]}`) { - runServer(); -} - // For testing and debugging purposes if (process.env.DEBUG === 'true') { logger.debug('Debug mode enabled'); diff --git a/src/test.js b/src/test.js index 29431dc..af8dadb 100644 --- a/src/test.js +++ b/src/test.js @@ -1,9 +1,9 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; -console.log('MCP SDK imports successful'); -console.log('Server:', Server); -console.log('StdioServerTransport:', StdioServerTransport); +process.stderr.write('MCP SDK imports successful\n'); +process.stderr.write(`Server: ${Server}\n`); +process.stderr.write(`StdioServerTransport: ${StdioServerTransport}\n`); // Exit gracefully process.exit(0); \ No newline at end of file diff --git a/src/utils/logger.js b/src/utils/logger.js index 81b5dbe..32f4370 100644 --- a/src/utils/logger.js +++ b/src/utils/logger.js @@ -4,12 +4,15 @@ const logger = winston.createLogger({ level: process.env.LOG_LEVEL || 'info', format: winston.format.combine( winston.format.timestamp(), + winston.format.uncolorize(), winston.format.json() ), transports: [ new winston.transports.Console({ + stderrLevels: ['error', 'warn', 'info', 'debug', 'silly'], format: winston.format.combine( - winston.format.colorize(), + winston.format.timestamp(), + winston.format.uncolorize(), winston.format.simple() ) })