#!/usr/bin/env node
import { parseArgs, printBanner, printHelp } from './cli.js';
import { loadConfig, type Config } from './config/index.js';
import { createLogger, setLogger, log } from './utils/logger.js';
import { parseSpec } from './parser/index.js';
import { convertToMCPTools, applyFilters } from './converter/index.js';
import { createMcpServer, createHttpServer, startServer } from './server/index.js';
/**
* Main entry point
*/
async function main(): Promise<void> {
// Parse CLI arguments
const args = parseArgs();
// Load and validate configuration
let config: Config;
try {
config = await loadConfig(args);
} catch (error) {
const message = error instanceof Error ? error.message : 'Unknown error';
console.error(`Configuration error: ${message}`);
printHelp();
process.exit(1);
}
// Setup logger
const logger = createLogger({
level: config.logging.level,
format: config.logging.format,
});
setLogger(logger);
// Print banner in pretty mode
if (config.logging.format === 'pretty') {
printBanner();
}
log.info('Starting openapi-mcp-ts', {
version: '1.0.0',
spec: config.spec.url || config.spec.file || 'inline',
upstream: config.upstream.baseUrl,
});
try {
// Step 1: Parse spec (OpenAPI or Postman)
log.info('Parsing specification...');
const operations = await parseSpec(
{
url: config.spec.url,
file: config.spec.file,
inline: config.spec.inline,
},
config.format
);
if (operations.length === 0) {
log.error('No operations found in specification');
process.exit(1);
}
log.info('Parsed operations', { count: operations.length });
// Step 2: Convert to MCP tools
log.info('Converting to MCP tools...');
let tools = convertToMCPTools(operations);
// Step 3: Apply filters
tools = applyFilters(tools, config);
const enabledCount = tools.filter((t) => t._ui.enabled).length;
if (enabledCount === 0) {
log.warn('No tools are enabled after filtering. Server will have no functionality.');
}
// Step 4: Create MCP server
log.info('Creating MCP server...');
const mcpServer = createMcpServer(tools, config);
// Step 5: Create HTTP server
log.info('Creating HTTP server...');
const httpApp = createHttpServer(mcpServer, tools, config);
// Step 6: Start server
startServer(httpApp, config);
// Handle graceful shutdown
const shutdown = () => {
log.info('Shutting down...');
process.exit(0);
};
process.on('SIGINT', shutdown);
process.on('SIGTERM', shutdown);
} catch (error) {
const message = error instanceof Error ? error.message : 'Unknown error';
log.error('Failed to start server', { error: message });
process.exit(1);
}
}
// Run main
main().catch((error) => {
console.error('Fatal error:', error);
process.exit(1);
});