This PR simplifies the seed data import configuration based on maintainer feedback by removing command line flags and using a clearer environment variable name. ## Key Changes ### Configuration Simplification - **Renamed**: `MCP_REGISTRY_SEED_FILE_PATH` → `MCP_REGISTRY_SEED_FROM` - **Removed**: `--seed-file-path` command line flag to eliminate configuration complexity ### Improved User Experience Users now configure seed data import using a single, clear environment variable: ```bash # Before (multiple ways to configure) MCP_REGISTRY_SEED_FILE_PATH=data/seed.json ./registry ./registry --seed-file-path=data/seed.json # After (simplified single method) MCP_REGISTRY_SEED_FROM=data/seed.json ./registry ``` ### Registry Composability The composability workflow is now simplified while maintaining all functionality: ```bash # Start first registry with seed data MCP_REGISTRY_SEED_FROM=data/seed.json ./registry # Start second registry importing from first via pagination MCP_REGISTRY_SEED_FROM=http://localhost:8080 ./registry ``` ## Technical Implementation - Maintains full backward compatibility for import functionality - All existing seed data sources continue to work (local files, HTTP URLs, registry URLs) - Automatic pagination through `/v0/servers` endpoint remains unchanged - Configurable delays between requests preserved ## Benefits - **Reduced complexity**: Single configuration method instead of multiple - **Clearer naming**: `SEED_FROM` better describes the source of seed data - **Easier maintenance**: Fewer configuration paths to test and document - **Consistent patterns**: Aligns with other environment-variable-only configuration All existing functionality is preserved while providing a cleaner, more maintainable configuration interface. <!-- START COPILOT CODING AGENT TIPS --> --- 💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click [here](https://survey.alchemer.com/s3/8343779/Copilot-Coding-agent) to start the survey. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Avinash Sridhar <sridharavinash@users.noreply.github.com> Co-authored-by: Toby Padilla <toby@toby.sh> Co-authored-by: toby <83556+toby@users.noreply.github.com>
94 lines
2.3 KiB
Go
94 lines
2.3 KiB
Go
// validate-schemas validates that schema.json and registry-schema.json
|
|
// are valid JSON Schema documents.
|
|
//
|
|
// For more information, see docs/server-json/README.md
|
|
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
jsonschema "github.com/santhosh-tekuri/jsonschema/v5"
|
|
)
|
|
|
|
func main() {
|
|
log.SetFlags(0) // Remove timestamp from logs
|
|
|
|
if err := runValidation(); err != nil {
|
|
log.Fatalf("Error: %v", err)
|
|
}
|
|
}
|
|
|
|
func runValidation() error {
|
|
basePath := filepath.Join("docs", "server-json")
|
|
|
|
schemas := []struct {
|
|
name string
|
|
path string
|
|
}{
|
|
{"schema.json", filepath.Join(basePath, "schema.json")},
|
|
{"registry-schema.json", filepath.Join(basePath, "registry-schema.json")},
|
|
}
|
|
|
|
expectedSchemaCount := len(schemas)
|
|
validatedCount := 0
|
|
|
|
for _, schemaFile := range schemas {
|
|
log.Printf("Validating %s...", schemaFile.name)
|
|
|
|
if err := validateSchema(schemaFile.path); err != nil {
|
|
log.Printf(" ❌ Invalid: %v", err)
|
|
} else {
|
|
log.Printf(" ✅ Valid JSON Schema")
|
|
validatedCount++
|
|
}
|
|
}
|
|
|
|
if validatedCount != expectedSchemaCount {
|
|
return fmt.Errorf("validation failed: expected to validate %d schemas but only %d passed",
|
|
expectedSchemaCount, validatedCount)
|
|
}
|
|
|
|
log.Printf("\nSuccessfully validated all %d schemas!", validatedCount)
|
|
return nil
|
|
}
|
|
|
|
func validateSchema(path string) error {
|
|
data, err := os.ReadFile(path)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to read file: %w", err)
|
|
}
|
|
|
|
var schemaData any
|
|
if err := json.Unmarshal(data, &schemaData); err != nil {
|
|
return fmt.Errorf("invalid JSON: %w", err)
|
|
}
|
|
|
|
compiler := jsonschema.NewCompiler()
|
|
compiler.Draft = jsonschema.Draft7
|
|
|
|
// For registry-schema.json, we need to register the base schema it references
|
|
if strings.Contains(path, "registry-schema.json") {
|
|
basePath := filepath.Join(filepath.Dir(path), "schema.json")
|
|
baseData, err := os.ReadFile(basePath)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to read base schema: %w", err)
|
|
}
|
|
|
|
// Add the base schema to the compiler with the expected URL
|
|
if err := compiler.AddResource("https://modelcontextprotocol.io/schemas/draft/2025-07-09/server.json", bytes.NewReader(baseData)); err != nil {
|
|
return fmt.Errorf("failed to add base schema resource: %w", err)
|
|
}
|
|
}
|
|
|
|
if _, err := compiler.Compile(path); err != nil {
|
|
return fmt.Errorf("invalid schema: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|