/**
* Main server entry point
*/
// Load polyfills for Node.js 19.x compatibility
import './polyfills.js';
import dotenv from 'dotenv';
import { MCPServer } from './core/server.js';
import { HttpTransport } from './transport/http.js';
import { BrowserNamespace } from './namespaces/browser.js';
import { SearchNamespace } from './namespaces/search.js';
import { MessagesNamespace } from './namespaces/messages.js';
import { SecretsNamespace } from './namespaces/secrets.js';
import { DbNamespace } from './namespaces/db.js';
import { SupabaseNamespace } from './namespaces/supabase.js';
import { RenderNamespace } from './namespaces/render.js';
import { VercelNamespace } from './namespaces/vercel.js';
import { TrackingNamespace } from './namespaces/tracking.js';
// Load environment variables
dotenv.config();
export async function createMCPServer(): Promise<{ server: MCPServer; transport: HttpTransport }> {
// Create core MCP server
const mcpServer = new MCPServer({
logLevel: (process.env.LOG_LEVEL as any) || 'info'
});
// Initialize all namespaces
const browserNamespace = new BrowserNamespace(mcpServer);
const searchNamespace = new SearchNamespace(mcpServer);
const messagesNamespace = new MessagesNamespace(mcpServer);
const secretsNamespace = new SecretsNamespace(mcpServer);
const dbNamespace = new DbNamespace(mcpServer);
const supabaseNamespace = new SupabaseNamespace(mcpServer);
const renderNamespace = new RenderNamespace(mcpServer);
const vercelNamespace = new VercelNamespace(mcpServer);
const trackingNamespace = new TrackingNamespace(mcpServer);
// Create HTTP transport
const httpTransport = new HttpTransport(mcpServer, {
enableWebSocket: true,
enableFileUpload: true,
corsOrigins: [
'http://localhost:3001',
'http://localhost:3000',
'http://127.0.0.1:3001',
'http://127.0.0.1:3000'
]
});
// Set up graceful shutdown
const cleanup = async () => {
console.log('Shutting down gracefully...');
// Cleanup browser sessions
await browserNamespace.cleanup();
// Cleanup database connections
await dbNamespace.cleanup();
// Stop HTTP transport
await httpTransport.stop();
};
process.on('SIGINT', async () => {
console.log('Received SIGINT...');
await cleanup();
process.exit(0);
});
process.on('SIGTERM', async () => {
console.log('Received SIGTERM...');
await cleanup();
process.exit(0);
});
return { server: mcpServer, transport: httpTransport };
}
// Start server if this file is run directly
if (import.meta.url === `file://${process.argv[1]}`) {
(async () => {
try {
const { server, transport } = await createMCPServer();
console.log('Starting MCP Fullstack Server...');
console.log(`Environment: ${process.env.NODE_ENV || 'development'}`);
console.log(`Log Level: ${server.getConfig().logLevel}`);
await transport.start();
console.log('Server started successfully!');
console.log('Available endpoints:');
console.log(` - HTTP/JSON-RPC: http://${server.getConfig().host}:${server.getConfig().port}/mcp`);
console.log(` - WebSocket: ws://${server.getConfig().host}:${server.getConfig().port}/ws`);
console.log(` - Dashboard: http://${server.getConfig().host}:${server.getConfig().port}`);
console.log(` - Health Check: http://${server.getConfig().host}:${server.getConfig().port}/health`);
} catch (error) {
console.error('Failed to start server:', error);
process.exit(1);
}
})();
}