Skip to main content
Glama
server.ts3.6 kB
/** * 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); } })(); }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/JacobFV/mcp-fullstack'

If you have feedback or need assistance with the MCP directory API, please join our Discord server