Skip to main content
Glama
index.js7.1 kB
"use strict"; /** * index.ts - Composition Root * * @semantic-intent Main entry point that wires all dependencies together * Implements Dependency Injection for hexagonal architecture * * @observable-anchoring * - Environment configuration drives database selection * - Configuration loaded from environment variables * - Dependencies injected from outer layers to inner layers * * @intent-preservation * - Composition root maintains clear dependency flow * - Infrastructure → Application → Domain → Presentation * - No business logic in composition root */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const dotenv_1 = __importDefault(require("dotenv")); const MCPServer_js_1 = require("./presentation/mcp/MCPServer.js"); const AnalyzeSchemaUseCase_js_1 = require("./application/use-cases/AnalyzeSchemaUseCase.js"); const GetRelationshipsUseCase_js_1 = require("./application/use-cases/GetRelationshipsUseCase.js"); const ValidateSchemaUseCase_js_1 = require("./application/use-cases/ValidateSchemaUseCase.js"); const SuggestOptimizationsUseCase_js_1 = require("./application/use-cases/SuggestOptimizationsUseCase.js"); const SchemaAnalyzer_js_1 = require("./domain/services/SchemaAnalyzer.js"); const RelationshipAnalyzer_js_1 = require("./domain/services/RelationshipAnalyzer.js"); const OptimizationService_js_1 = require("./domain/services/OptimizationService.js"); const CloudflareAPIClient_js_1 = require("./infrastructure/http/CloudflareAPIClient.js"); const CloudflareD1Repository_js_1 = require("./infrastructure/adapters/CloudflareD1Repository.js"); const InMemoryCacheProvider_js_1 = require("./infrastructure/adapters/InMemoryCacheProvider.js"); const CloudflareConfig_js_1 = require("./infrastructure/config/CloudflareConfig.js"); const DatabaseConfig_js_1 = require("./infrastructure/config/DatabaseConfig.js"); const Environment_js_1 = require("./domain/value-objects/Environment.js"); /** * Load environment configuration * Silent mode to prevent stdout pollution (MCP uses stdio for communication) */ dotenv_1.default.config({ debug: false }); /** * Validate required environment variables */ function validateEnvironment() { const required = ['CLOUDFLARE_ACCOUNT_ID', 'CLOUDFLARE_API_TOKEN']; const missing = required.filter((key) => !process.env[key]); if (missing.length > 0) { console.error('❌ Missing required environment variables:'); missing.forEach((key) => console.error(` - ${key}`)); console.error('\nPlease create a .env file with these variables.'); console.error('See .env.example for reference.'); process.exit(1); } // Validate at least one database is configured const hasDevDb = process.env.D1_DEV_DATABASE_ID && process.env.D1_DEV_DATABASE_NAME; const hasStagingDb = process.env.D1_STAGING_DATABASE_ID && process.env.D1_STAGING_DATABASE_NAME; const hasProdDb = process.env.D1_PROD_DATABASE_ID && process.env.D1_PROD_DATABASE_NAME; if (!hasDevDb && !hasStagingDb && !hasProdDb) { console.error('❌ No database configured!'); console.error(' Please configure at least one database environment:'); console.error(' - D1_DEV_DATABASE_ID + D1_DEV_DATABASE_NAME'); console.error(' - D1_STAGING_DATABASE_ID + D1_STAGING_DATABASE_NAME'); console.error(' - D1_PROD_DATABASE_ID + D1_PROD_DATABASE_NAME'); process.exit(1); } } /** * Create database configuration from environment */ function createDatabaseConfig() { const databases = new Map(); // Development database if (process.env.D1_DEV_DATABASE_ID && process.env.D1_DEV_DATABASE_NAME) { databases.set(Environment_js_1.Environment.DEVELOPMENT, { id: process.env.D1_DEV_DATABASE_ID, name: process.env.D1_DEV_DATABASE_NAME, }); } // Staging database if (process.env.D1_STAGING_DATABASE_ID && process.env.D1_STAGING_DATABASE_NAME) { databases.set(Environment_js_1.Environment.STAGING, { id: process.env.D1_STAGING_DATABASE_ID, name: process.env.D1_STAGING_DATABASE_NAME, }); } // Production database if (process.env.D1_PROD_DATABASE_ID && process.env.D1_PROD_DATABASE_NAME) { databases.set(Environment_js_1.Environment.PRODUCTION, { id: process.env.D1_PROD_DATABASE_ID, name: process.env.D1_PROD_DATABASE_NAME, }); } return new DatabaseConfig_js_1.DatabaseConfig(databases); } /** * Composition Root: Wire all dependencies */ async function main() { try { // Validate environment validateEnvironment(); console.error('🚀 Starting Semantic D1 MCP Server...'); // Infrastructure Layer - External adapters const cloudflareConfig = new CloudflareConfig_js_1.CloudflareConfig(process.env.CLOUDFLARE_ACCOUNT_ID, process.env.CLOUDFLARE_API_TOKEN); const apiClient = new CloudflareAPIClient_js_1.CloudflareAPIClient(cloudflareConfig); const cache = new InMemoryCacheProvider_js_1.InMemoryCacheProvider(); const databaseConfig = createDatabaseConfig(); const repository = new CloudflareD1Repository_js_1.CloudflareD1Repository(apiClient, databaseConfig); // Log configured environments const configuredEnvs = Array.from(databaseConfig['databases'].keys()); console.error(`📊 Configured environments: ${configuredEnvs.join(', ')}`); // Domain Layer - Business logic services const schemaAnalyzer = new SchemaAnalyzer_js_1.SchemaAnalyzer(); const relationshipAnalyzer = new RelationshipAnalyzer_js_1.RelationshipAnalyzer(); const optimizationService = new OptimizationService_js_1.OptimizationService(); // Application Layer - Use cases (orchestration) const analyzeSchemaUseCase = new AnalyzeSchemaUseCase_js_1.AnalyzeSchemaUseCase(repository, schemaAnalyzer, databaseConfig, cache); const getRelationshipsUseCase = new GetRelationshipsUseCase_js_1.GetRelationshipsUseCase(repository, relationshipAnalyzer, databaseConfig, cache); const validateSchemaUseCase = new ValidateSchemaUseCase_js_1.ValidateSchemaUseCase(repository, schemaAnalyzer, databaseConfig, cache); const suggestOptimizationsUseCase = new SuggestOptimizationsUseCase_js_1.SuggestOptimizationsUseCase(repository, optimizationService, relationshipAnalyzer, databaseConfig, cache); // Presentation Layer - MCP Server const mcpServer = new MCPServer_js_1.D1DatabaseMCPServer(analyzeSchemaUseCase, getRelationshipsUseCase, validateSchemaUseCase, suggestOptimizationsUseCase); // Start the server await mcpServer.start(); console.error('✅ Semantic D1 MCP Server running on stdio'); } catch (error) { console.error('❌ Failed to start server:', error); process.exit(1); } } // Start the server main(); //# sourceMappingURL=index.js.map

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/semanticintent/semantic-d1-mcp'

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