#!/usr/bin/env node
/**
* Initialization Script for Company MCP Server
*
* This script:
* 1. Checks prerequisites (Node.js version, pnpm)
* 2. Creates necessary directories
* 3. Generates .env file from template
* 4. Sets up .secrets directory with proper permissions
*/
import { execSync } from 'child_process';
import { existsSync, mkdirSync, copyFileSync, chmodSync, readFileSync, writeFileSync } from 'fs';
import { join, dirname } from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const ROOT_DIR = join(__dirname, '..');
// Colors for console output
const colors = {
reset: '\x1b[0m',
green: '\x1b[32m',
yellow: '\x1b[33m',
red: '\x1b[31m',
cyan: '\x1b[36m',
};
function log(message, color = 'reset') {
console.log(`${colors[color]}${message}${colors.reset}`);
}
function success(message) {
log(`✅ ${message}`, 'green');
}
function warn(message) {
log(`⚠️ ${message}`, 'yellow');
}
function error(message) {
log(`❌ ${message}`, 'red');
}
function info(message) {
log(`ℹ️ ${message}`, 'cyan');
}
// Check Node.js version
function checkNodeVersion() {
const nodeVersion = process.version;
const majorVersion = parseInt(nodeVersion.slice(1).split('.')[0], 10);
if (majorVersion < 20) {
error(`Node.js 20+ is required. Current version: ${nodeVersion}`);
process.exit(1);
}
success(`Node.js version: ${nodeVersion}`);
}
// Check pnpm
function checkPnpm() {
try {
const version = execSync('pnpm --version', { encoding: 'utf-8' }).trim();
success(`pnpm version: ${version}`);
} catch {
error('pnpm is not installed. Please install it: npm install -g pnpm');
process.exit(1);
}
}
// Create directories
function createDirectories() {
const dirs = [
join(ROOT_DIR, 'apps/mcp-server-google/.secrets'),
join(ROOT_DIR, 'apps/mcp-server-google/logs'),
join(ROOT_DIR, 'logs'),
];
for (const dir of dirs) {
if (!existsSync(dir)) {
mkdirSync(dir, { recursive: true });
success(`Created directory: ${dir.replace(ROOT_DIR, '.')}`);
} else {
info(`Directory exists: ${dir.replace(ROOT_DIR, '.')}`);
}
}
// Set permissions for .secrets
const secretsDir = join(ROOT_DIR, 'apps/mcp-server-google/.secrets');
try {
chmodSync(secretsDir, 0o700);
success('Set .secrets directory permissions to 700');
} catch (e) {
warn(`Could not set directory permissions: ${e.message}`);
}
}
// Generate .env file
function generateEnvFile() {
const serverDir = join(ROOT_DIR, 'apps/mcp-server-google');
const envExample = join(serverDir, '.env.example');
const envFile = join(serverDir, '.env');
if (existsSync(envFile)) {
info('.env file already exists. Skipping.');
return;
}
if (!existsSync(envExample)) {
error('.env.example not found');
return;
}
copyFileSync(envExample, envFile);
success('Created .env file from .env.example');
warn('Please edit .env with your credentials');
}
// Create .gitignore for .secrets
function createSecretsGitignore() {
const secretsDir = join(ROOT_DIR, 'apps/mcp-server-google/.secrets');
const gitignore = join(secretsDir, '.gitignore');
if (!existsSync(gitignore)) {
writeFileSync(gitignore, '*\n!.gitignore\n');
success('Created .secrets/.gitignore');
}
}
// Print next steps
function printNextSteps() {
console.log('\n' + '='.repeat(50));
log('Setup Complete!', 'green');
console.log('='.repeat(50) + '\n');
console.log('Next steps:\n');
console.log('1. Configure Google Cloud Project:');
console.log(' - Create a project at https://console.cloud.google.com/');
console.log(' - Enable Gmail, Drive, Sheets, Docs, Calendar APIs');
console.log(' - Create OAuth credentials (Desktop App)\n');
console.log('2. Set up credentials:');
console.log(' - Download OAuth JSON to apps/mcp-server-google/.secrets/credentials.json');
console.log(' - Edit apps/mcp-server-google/.env\n');
console.log('3. Authenticate:');
console.log(' cd apps/mcp-server-google && pnpm auth:oauth\n');
console.log('4. Start the server:');
console.log(' pnpm dev\n');
console.log('For detailed instructions, see:');
console.log(' - docs/setup/oauth.md');
console.log(' - docs/setup/service-account.md\n');
}
// Main
async function main() {
console.log('\n' + '='.repeat(50));
log('Company MCP Server - Initialization', 'cyan');
console.log('='.repeat(50) + '\n');
checkNodeVersion();
checkPnpm();
createDirectories();
generateEnvFile();
createSecretsGitignore();
printNextSteps();
}
main().catch((e) => {
error(`Initialization failed: ${e.message}`);
process.exit(1);
});