From 3e16df2630f655f3a738a1e10de5367a7b05f561 Mon Sep 17 00:00:00 2001 From: edouardmercier Date: Wed, 1 Oct 2025 23:42:25 +0200 Subject: [PATCH 1/3] Fix the usage of the "PORT" environment variable. --- src/generator/server-code.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/generator/server-code.ts b/src/generator/server-code.ts index 6b6a447..3a77cf8 100644 --- a/src/generator/server-code.ts +++ b/src/generator/server-code.ts @@ -45,13 +45,14 @@ export function generateMcpServerCode( // Determine which transport to include let transportImport = ''; let transportCode = ''; + const webServicerPortNumberStatement = `${options.port ?? "process.env['PORT'] === undefined ? undefined : parseInt(process.env['PORT'], 10)"}`; switch (options.transport) { case 'web': transportImport = `\nimport { setupWebServer } from "./web-server.js";`; transportCode = `// Set up Web Server transport try { - await setupWebServer(server, ${options.port || 3000}); + await setupWebServer(server, ${webServicerPortNumberStatement}); } catch (error) { console.error("Error setting up web server:", error); process.exit(1); @@ -61,7 +62,7 @@ export function generateMcpServerCode( transportImport = `\nimport { setupStreamableHttpServer } from "./streamable-http.js";`; transportCode = `// Set up StreamableHTTP transport try { - await setupStreamableHttpServer(server, ${options.port || 3000}); + await setupStreamableHttpServer(server, ${webServicerPortNumberStatement}); } catch (error) { console.error("Error setting up StreamableHTTP server:", error); process.exit(1); @@ -89,8 +90,8 @@ export function generateMcpServerCode( */ // Load environment variables from .env file -import dotenv from 'dotenv'; -dotenv.config(); +import { config } from 'dotenv'; +config(); import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; From 2ac91242674fd4592579f0d15ef26f84ee7f5b64 Mon Sep 17 00:00:00 2001 From: edouardmercier Date: Wed, 1 Oct 2025 23:43:47 +0200 Subject: [PATCH 2/3] Introduce the "--generate-lib" to make it possible to generate a library instead of running the "main" method. --- src/generator/server-code.ts | 39 +++++++++++++++++++----------------- src/index.ts | 5 +++++ src/types/index.ts | 2 ++ 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/generator/server-code.ts b/src/generator/server-code.ts index 3a77cf8..1233ee7 100644 --- a/src/generator/server-code.ts +++ b/src/generator/server-code.ts @@ -82,6 +82,25 @@ export function generateMcpServerCode( break; } + const mainDeclaration= options.generateLib === true ? '' : ` +/** + * Cleanup function for graceful shutdown + */ +async function cleanup() { + console.error("Shutting down MCP server..."); + process.exit(0); +} + +// Register signal handlers +process.on('SIGINT', cleanup); +process.on('SIGTERM', cleanup); + +// Start the server +main().catch((error) => { + console.error("Fatal error in main execution:", error); + process.exit(1); +});`; + // Generate the full server code return `#!/usr/bin/env node /** @@ -160,27 +179,11 @@ ${executeApiToolFunctionCode} /** * Main function to start the server */ -async function main() { +${options.generateLib === true ? 'export ' : ''}async function main() { ${transportCode} } -/** - * Cleanup function for graceful shutdown - */ -async function cleanup() { - console.error("Shutting down MCP server..."); - process.exit(0); -} - -// Register signal handlers -process.on('SIGINT', cleanup); -process.on('SIGTERM', cleanup); - -// Start the server -main().catch((error) => { - console.error("Fatal error in main execution:", error); - process.exit(1); -}); +${mainDeclaration} /** * Formats API errors for better readability diff --git a/src/index.ts b/src/index.ts index d588a24..2c4d207 100644 --- a/src/index.ts +++ b/src/index.ts @@ -73,6 +73,11 @@ program 'Port for web or streamable-http transport (default: 3000)', (val) => parseInt(val, 10) ) + .option( + '-l, --generate-lib ', + 'Indicates whether a library should be generated and hence the \'main\' method not invoked (default: false)', + (val) => val === 'true' + ) .option( '--default-include ', 'Default behavior for x-mcp filtering (true|false, case-insensitive). Default: true (include by default), false = exclude by default', diff --git a/src/types/index.ts b/src/types/index.ts index e36eb3b..2eec6df 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -29,6 +29,8 @@ export interface CliOptions { transport?: TransportType; /** Server port (for web and streamable-http transports) */ port?: number; + /** Whether the generated code should invoke the main method or expose the main method as a library */ + generateLib?: boolean; /** * Default behavior for x-mcp filtering. * true (default) = include by default when x-mcp is missing or invalid; From 5ff7f4f18ba522bdb9b6821f0f952ef9be283397 Mon Sep 17 00:00:00 2001 From: edouardmercier Date: Thu, 2 Oct 2025 08:29:35 +0200 Subject: [PATCH 3/3] Fixes the declaration and the parsing of the "--generate-lib" CLI option. --- src/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 2c4d207..34265fb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -74,9 +74,10 @@ program (val) => parseInt(val, 10) ) .option( - '-l, --generate-lib ', + '-l, --generate-lib ', 'Indicates whether a library should be generated and hence the \'main\' method not invoked (default: false)', - (val) => val === 'true' + (val) => normalizeBoolean(val), + false ) .option( '--default-include ',