#!/usr/bin/env node
/**
* MCP Calendar Server CLI
* Command-line interface for managing the calendar server
*/
import { Command } from 'commander';
import { DatabaseManager } from '../src/database';
import { createCacheManager } from '../src/cache';
import { AuthManager } from '../src/auth/AuthManager';
import { Logger } from '../src/utils/logger';
import { config } from '../src/config';
import inquirer from 'inquirer';
import chalk from 'chalk';
import ora from 'ora';
const program = new Command();
// Initialize services
const database = new DatabaseManager();
const cache = createCacheManager();
const authManager = new AuthManager(database);
program
.name('mcp-calendar-cli')
.description('MCP Calendar Server CLI')
.version('1.0.0');
// Database commands
const dbCommand = program
.command('db')
.description('Database management commands');
dbCommand
.command('init')
.description('Initialize the database')
.action(async () => {
const spinner = ora('Initializing database...').start();
try {
await database.initialize();
spinner.succeed('Database initialized successfully');
} catch (error) {
spinner.fail('Database initialization failed');
console.error(error);
process.exit(1);
}
});
dbCommand
.command('status')
.description('Check database connection status')
.action(async () => {
const spinner = ora('Checking database status...').start();
try {
const isHealthy = await database.ping();
if (isHealthy) {
spinner.succeed('Database is healthy');
} else {
spinner.warn('Database is not responding');
}
} catch (error) {
spinner.fail('Database check failed');
console.error(error);
}
});
// Cache commands
const cacheCommand = program
.command('cache')
.description('Cache management commands');
cacheCommand
.command('status')
.description('Check cache status')
.action(async () => {
const spinner = ora('Checking cache status...').start();
try {
if ('connect' in cache) {
await (cache as any).connect();
}
const isHealthy = await cache.ping();
if (isHealthy) {
spinner.succeed('Cache is healthy');
} else {
spinner.warn('Cache is not responding');
}
} catch (error) {
spinner.fail('Cache check failed');
console.error(error);
}
});
cacheCommand
.command('clear')
.description('Clear all cache data')
.action(async () => {
const { confirm } = await inquirer.prompt([
{
type: 'confirm',
name: 'confirm',
message: 'Are you sure you want to clear all cache data?',
default: false
}
]);
if (!confirm) {
console.log('Cache clear cancelled');
return;
}
const spinner = ora('Clearing cache...').start();
try {
if ('connect' in cache) {
await (cache as any).connect();
}
await cache.clear();
spinner.succeed('Cache cleared successfully');
} catch (error) {
spinner.fail('Cache clear failed');
console.error(error);
}
});
// Configuration commands
const configCommand = program
.command('config')
.description('Configuration management');
configCommand
.command('validate')
.description('Validate configuration')
.action(() => {
const spinner = ora('Validating configuration...').start();
try {
const validation = require('../src/config').validateConfig();
if (validation.valid) {
spinner.succeed('Configuration is valid');
console.log(chalk.green('✓ All configuration values are present and valid'));
// Show configuration summary
console.log('\nConfiguration Summary:');
console.log(`• Environment: ${config.server.environment}`);
console.log(`• Database: ${config.database.url.replace(/\/\/.*@/, '//<credentials>@')}`);
console.log(`• Redis: ${config.redis.url}`);
console.log(`• Features: ${Object.entries(config.features)
.filter(([, enabled]) => enabled)
.map(([feature]) => feature)
.join(', ')}`);
} else {
spinner.fail('Configuration validation failed');
validation.errors?.forEach(error => {
console.error(chalk.red(`• ${error}`));
});
}
} catch (error) {
spinner.fail('Configuration validation error');
console.error(error);
}
});
// Health check commands
const healthCommand = program
.command('health')
.description('Health check commands');
healthCommand
.command('check')
.description('Run comprehensive health check')
.action(async () => {
console.log(chalk.blue('Running health checks...\n'));
// Database health
const dbSpinner = ora('Checking database...').start();
try {
const dbHealthy = await database.ping();
if (dbHealthy) {
dbSpinner.succeed('Database is healthy');
} else {
dbSpinner.fail('Database is unhealthy');
}
} catch (error) {
dbSpinner.fail('Database check failed');
}
// Cache health
const cacheSpinner = ora('Checking cache...').start();
try {
if ('connect' in cache) {
await (cache as any).connect();
}
const cacheHealthy = await cache.ping();
if (cacheHealthy) {
cacheSpinner.succeed('Cache is healthy');
} else {
cacheSpinner.warn('Cache is not responding (non-critical)');
}
} catch (error) {
cacheSpinner.warn('Cache check failed (non-critical)');
}
// Configuration health
const configSpinner = ora('Checking configuration...').start();
try {
const validation = require('../src/config').validateConfig();
if (validation.valid) {
configSpinner.succeed('Configuration is valid');
} else {
configSpinner.fail('Configuration has errors');
}
} catch (error) {
configSpinner.fail('Configuration check failed');
}
console.log(chalk.green('\nHealth check completed!'));
});
// Development commands
const devCommand = program
.command('dev')
.description('Development utilities');
devCommand
.command('generate-auth-url')
.description('Generate OAuth2 authorization URL')
.action(() => {
try {
const authUrl = authManager.generateAuthUrl();
console.log(chalk.green('OAuth2 Authorization URL:'));
console.log(authUrl);
console.log(chalk.yellow('\nOpen this URL in your browser to authorize the application.'));
} catch (error) {
console.error(chalk.red('Failed to generate auth URL:'), error);
}
});
// Parse arguments
program.parse();
// If no command provided, show help
if (!process.argv.slice(2).length) {
program.outputHelp();
}