UNPKG

auto-publishing-mcp-server

Version:

Enterprise-grade MCP Server for Auto-Publishing with pre-publish validation, multi-cloud deployment, and monitoring

181 lines (158 loc) 7.19 kB
#!/usr/bin/env node import { program } from 'commander'; import chalk from 'chalk'; import { createServer } from '../src/index.js'; import * as dotenv from 'dotenv'; import { readFileSync } from 'fs'; import { join, dirname } from 'path'; import { fileURLToPath } from 'url'; const __dirname = dirname(fileURLToPath(import.meta.url)); const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf8')); // Load environment variables dotenv.config(); // ASCII Art Banner const banner = chalk.cyan(` ╔═══════════════════════════════════════════════════════════╗ ║ ║ ║ █████╗ ██╗ ██╗████████╗ ██████╗ ███╗ ███╗ ║ ║ ██╔══██╗██║ ██║╚══██╔══╝██╔═══██╗ ████╗ ████║ ║ ║ ███████║██║ ██║ ██║ ██║ ██║█████╗██╔████╔██║ ║ ║ ██╔══██║██║ ██║ ██║ ██║ ██║╚════╝██║╚██╔╝██║ ║ ║ ██║ ██║╚██████╔╝ ██║ ╚██████╔╝ ██║ ╚═╝ ██║ ║ ║ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ║ ║ ║ ║ Auto-Publishing MCP Server v${packageJson.version} ║ ║ ║ ╚═══════════════════════════════════════════════════════════╝ `); program .name('auto-publishing-mcp') .description('Enterprise-grade MCP Server for Auto-Publishing') .version(packageJson.version); // Start command program .command('start') .description('Start the MCP server') .option('-p, --port <port>', 'Server port', process.env.MCP_PORT || '3000') .option('-h, --host <host>', 'Server host', process.env.MCP_HOST || '0.0.0.0') .option('--no-banner', 'Skip banner display') .action(async (options) => { if (!options.noBanner) { console.log(banner); } console.log(chalk.green('🚀 Starting Auto-Publishing MCP Server...')); console.log(chalk.gray(` Host: ${options.host}`)); console.log(chalk.gray(` Port: ${options.port}`)); try { const server = await createServer({ host: options.host, port: parseInt(options.port) }); console.log(chalk.green('✅ Server started successfully!')); console.log(chalk.cyan(` Access at: http://${options.host}:${options.port}`)); // Graceful shutdown process.on('SIGTERM', async () => { console.log(chalk.yellow('\n⚠️ Received SIGTERM, shutting down gracefully...')); await server.close(); process.exit(0); }); process.on('SIGINT', async () => { console.log(chalk.yellow('\n⚠️ Received SIGINT, shutting down gracefully...')); await server.close(); process.exit(0); }); } catch (error) { console.error(chalk.red('❌ Failed to start server:'), error.message); process.exit(1); } }); // Health check command program .command('health') .description('Check server health') .option('-u, --url <url>', 'Server URL', 'http://localhost:3000') .action(async (options) => { try { const response = await fetch(`${options.url}/health`); const data = await response.json(); if (response.ok) { console.log(chalk.green('✅ Server is healthy')); console.log(chalk.gray(JSON.stringify(data, null, 2))); } else { console.log(chalk.red('❌ Server is unhealthy')); console.log(chalk.gray(JSON.stringify(data, null, 2))); process.exit(1); } } catch (error) { console.error(chalk.red('❌ Failed to connect to server:'), error.message); process.exit(1); } }); // List tools command program .command('tools') .description('List available MCP tools') .option('-u, --url <url>', 'Server URL', 'http://localhost:3000') .action(async (options) => { try { const response = await fetch(`${options.url}/tools`); const data = await response.json(); console.log(chalk.cyan('🛠️ Available MCP Tools:\n')); const toolsByCategory = {}; data.tools.forEach(tool => { const category = tool.name.split('/')[0]; if (!toolsByCategory[category]) { toolsByCategory[category] = []; } toolsByCategory[category].push(tool); }); Object.entries(toolsByCategory).forEach(([category, tools]) => { console.log(chalk.yellow(`📁 ${category.toUpperCase()}`)); tools.forEach(tool => { console.log(chalk.gray(` • ${tool.name}: ${tool.description}`)); }); console.log(); }); } catch (error) { console.error(chalk.red('❌ Failed to fetch tools:'), error.message); process.exit(1); } }); // Config command program .command('config') .description('Show current configuration') .action(() => { console.log(chalk.cyan('📋 Current Configuration:\n')); console.log(chalk.gray('Environment Variables:')); console.log(` MCP_PORT: ${process.env.MCP_PORT || '3000'}`); console.log(` MCP_HOST: ${process.env.MCP_HOST || '0.0.0.0'}`); console.log(` NODE_ENV: ${process.env.NODE_ENV || 'development'}`); console.log(` DD_API_KEY: ${process.env.DD_API_KEY ? '***' : 'not set'}`); console.log(` DD_APP_KEY: ${process.env.DD_APP_KEY ? '***' : 'not set'}`); console.log(` AWS_ACCESS_KEY_ID: ${process.env.AWS_ACCESS_KEY_ID ? '***' : 'not set'}`); console.log(` GCP_PROJECT_ID: ${process.env.GCP_PROJECT_ID || 'not set'}`); console.log(` AZURE_SUBSCRIPTION_ID: ${process.env.AZURE_SUBSCRIPTION_ID || 'not set'}`); }); // Docker info command program .command('docker-info') .description('Show Docker publishing information') .action(() => { console.log(chalk.cyan('🐳 Docker Publishing Info:\n')); console.log(chalk.gray('Build and publish Docker image:')); console.log(chalk.white(' npm run docker:build')); console.log(chalk.white(' npm run docker:push')); console.log(); console.log(chalk.gray('Or use the combined command:')); console.log(chalk.white(' npm run publish:docker')); console.log(); console.log(chalk.gray('Environment variable required:')); console.log(chalk.white(' export DOCKER_USERNAME=your-docker-username')); }); // Parse command line arguments program.parse(process.argv); // Show help if no command provided if (!process.argv.slice(2).length) { program.outputHelp(); }