Module: ActionMCP::SchemaValidator

Defined in:
lib/action_mcp/schema_validator.rb

Constant Summary collapse

DEFAULT_DIALECT =
"https://json-schema.org/draft/2020-12/schema"

Class Method Summary collapse

Class Method Details

.compile(schema, context: "JSON Schema") ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/action_mcp/schema_validator.rb', line 11

def compile(schema, context: "JSON Schema")
  normalized_schema = normalize(schema)
  schema_errors = JSONSchemer.validate_schema(normalized_schema).to_a

  if schema_errors.any?
    raise ArgumentError, "Invalid #{context}: #{error_messages(schema_errors).join(', ')}"
  end

  JSONSchemer.schema(normalized_schema)
rescue JSONSchemer::UnknownRef => e
  raise ArgumentError, "Invalid #{context}: unknown schema dialect or reference #{e.message.inspect}"
end

.error_messages(errors) ⇒ Object



28
29
30
# File 'lib/action_mcp/schema_validator.rb', line 28

def error_messages(errors)
  errors.filter_map { |error| error["error"] }.uniq
end

.normalize(value) ⇒ Object



32
33
34
35
36
37
38
39
40
41
# File 'lib/action_mcp/schema_validator.rb', line 32

def normalize(value)
  case value
  when Hash
    value.deep_stringify_keys
  when Array
    value.map { |item| normalize(item) }
  else
    value
  end
end

.validate(schemer, value) ⇒ Object



24
25
26
# File 'lib/action_mcp/schema_validator.rb', line 24

def validate(schemer, value)
  schemer.validate(normalize(value)).to_a
end