<!-- Provide a brief summary of your changes --> ## Motivation and Context This PR ensures that the draft URL points to the actual draft schema improvement suggested in https://github.com/modelcontextprotocol/registry/issues/814 ## How Has This Been Tested? <!-- Have you tested this in a real application? Which scenarios were tested? --> ## Breaking Changes <!-- Will users need to update their code or configurations? --> ## Types of changes <!-- What types of changes does your code introduce? Put an `x` in all the boxes that apply: --> - [x] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update ## Checklist <!-- Go over all the following points, and put an `x` in all the boxes that apply. --> - [ ] I have read the [MCP Documentation](https://modelcontextprotocol.io) - [ ] My code follows the repository's style guidelines - [ ] New and existing tests pass locally - [ ] I have added appropriate error handling - [ ] I have added or updated documentation as needed ## Additional context <!-- Add any other context, implementation notes, or design decisions -->
93 lines
2.3 KiB
Go
93 lines
2.3 KiB
Go
// validate-schemas validates that server.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", "reference", "server-json", "draft")
|
|
|
|
schemas := []struct {
|
|
name string
|
|
path string
|
|
}{
|
|
{"server.schema.json", filepath.Join(basePath, "server.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), "server.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://static.modelcontextprotocol.io/schemas/2025-09-16/server.schema.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
|
|
}
|