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
JavaScript
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();
}