diff --git a/README.md b/README.md index 5cd446a9..9ac3cdb6 100644 --- a/README.md +++ b/README.md @@ -289,6 +289,7 @@ The service can be configured using environment variables: | Variable | Description | Default | |----------|-------------|---------| | `MCP_REGISTRY_APP_VERSION` | Application version | `dev` | +| `MCP_REGISTRY_DATABASE_TYPE` | Database type | `mongodb` | | `MCP_REGISTRY_COLLECTION_NAME` | MongoDB collection name | `servers_v2` | | `MCP_REGISTRY_DATABASE_NAME` | MongoDB database name | `mcp-registry` | | `MCP_REGISTRY_DATABASE_URL` | MongoDB connection string | `mongodb://localhost:27017` | diff --git a/cmd/registry/main.go b/cmd/registry/main.go index 7042b515..cb776f56 100644 --- a/cmd/registry/main.go +++ b/cmd/registry/main.go @@ -15,6 +15,7 @@ import ( "github.com/modelcontextprotocol/registry/internal/auth" "github.com/modelcontextprotocol/registry/internal/config" "github.com/modelcontextprotocol/registry/internal/database" + "github.com/modelcontextprotocol/registry/internal/model" "github.com/modelcontextprotocol/registry/internal/service" ) @@ -39,38 +40,48 @@ func main() { // Initialize services based on environment var registryService service.RegistryService - // Use MongoDB for real registry service in production/other environments - // Create a context with timeout for MongoDB connection - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - - // Connect to MongoDB - mongoDB, err := database.NewMongoDB(ctx, cfg.DatabaseURL, cfg.DatabaseName, cfg.CollectionName) - if err != nil { - log.Printf("Failed to connect to MongoDB: %v", err) - return - } - - // Create registry service with MongoDB - registryService = service.NewRegistryServiceWithDB(mongoDB) - log.Printf("MongoDB database name: %s", cfg.DatabaseName) - log.Printf("MongoDB collection name: %s", cfg.CollectionName) - - // Store the MongoDB instance for later cleanup - defer func() { - if err := mongoDB.Close(); err != nil { - log.Printf("Error closing MongoDB connection: %v", err) - } else { - log.Println("MongoDB connection closed successfully") + switch cfg.DatabaseType { + case config.DatabaseTypeMemory: + memoryDB := database.NewMemoryDB(map[string]*model.Server{}) + registryService = service.NewRegistryServiceWithDB(memoryDB) + case config.DatabaseTypeMongoDB: + // Use MongoDB for real registry service in production/other environments + // Create a context with timeout for MongoDB connection + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + // Connect to MongoDB + mongoDB, err := database.NewMongoDB(ctx, cfg.DatabaseURL, cfg.DatabaseName, cfg.CollectionName) + if err != nil { + log.Printf("Failed to connect to MongoDB: %v", err) + return } - }() - if cfg.SeedImport { - log.Println("Importing data...") - if err := database.ImportSeedFile(mongoDB, cfg.SeedFilePath); err != nil { - log.Printf("Failed to import seed file: %v", err) + // Create registry service with MongoDB + registryService = service.NewRegistryServiceWithDB(mongoDB) + log.Printf("MongoDB database name: %s", cfg.DatabaseName) + log.Printf("MongoDB collection name: %s", cfg.CollectionName) + + // Store the MongoDB instance for later cleanup + defer func() { + if err := mongoDB.Close(); err != nil { + log.Printf("Error closing MongoDB connection: %v", err) + } else { + log.Println("MongoDB connection closed successfully") + } + }() + + if cfg.SeedImport { + log.Println("Importing data...") + if err := database.ImportSeedFile(mongoDB, cfg.SeedFilePath); err != nil { + log.Printf("Failed to import seed file: %v", err) + } else { + log.Println("Data import completed successfully") + } } - log.Println("Data import completed successfully") + default: + log.Printf("Invalid database type: %s; supported types: %s, %s", cfg.DatabaseType, config.DatabaseTypeMemory, config.DatabaseTypeMongoDB) + return } // Initialize authentication services diff --git a/internal/config/config.go b/internal/config/config.go index cbb5637c..950c3f58 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -4,18 +4,26 @@ import ( env "github.com/caarlos0/env/v11" ) +type DatabaseType string + +const ( + DatabaseTypeMongoDB DatabaseType = "mongodb" + DatabaseTypeMemory DatabaseType = "memory" +) + // Config holds the application configuration type Config struct { - ServerAddress string `env:"SERVER_ADDRESS" envDefault:":8080"` - DatabaseURL string `env:"DATABASE_URL" envDefault:"mongodb://localhost:27017"` - DatabaseName string `env:"DATABASE_NAME" envDefault:"mcp-registry"` - CollectionName string `env:"COLLECTION_NAME" envDefault:"servers_v2"` - LogLevel string `env:"LOG_LEVEL" envDefault:"info"` - SeedFilePath string `env:"SEED_FILE_PATH" envDefault:"data/seed.json"` - SeedImport bool `env:"SEED_IMPORT" envDefault:"true"` - Version string `env:"VERSION" envDefault:"dev"` - GithubClientID string `env:"GITHUB_CLIENT_ID" envDefault:""` - GithubClientSecret string `env:"GITHUB_CLIENT_SECRET" envDefault:""` + ServerAddress string `env:"SERVER_ADDRESS" envDefault:":8080"` + DatabaseType DatabaseType `env:"DATABASE_TYPE" envDefault:"mongodb"` + DatabaseURL string `env:"DATABASE_URL" envDefault:"mongodb://localhost:27017"` + DatabaseName string `env:"DATABASE_NAME" envDefault:"mcp-registry"` + CollectionName string `env:"COLLECTION_NAME" envDefault:"servers_v2"` + LogLevel string `env:"LOG_LEVEL" envDefault:"info"` + SeedFilePath string `env:"SEED_FILE_PATH" envDefault:"data/seed.json"` + SeedImport bool `env:"SEED_IMPORT" envDefault:"true"` + Version string `env:"VERSION" envDefault:"dev"` + GithubClientID string `env:"GITHUB_CLIENT_ID" envDefault:""` + GithubClientSecret string `env:"GITHUB_CLIENT_SECRET" envDefault:""` } // NewConfig creates a new configuration with default values