Skip to content

Commit 8dee60c

Browse files
committed
Fix: Disallow $ref in tool input schemas
1 parent bae35fa commit 8dee60c

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

lib/mcp/tool/input_schema.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ def validate_arguments(arguments)
3737
private
3838

3939
def validate_schema!
40+
check_for_refs!
4041
schema = to_h
4142
schema_reader = JSON::Schema::Reader.new(
4243
accept_uri: false,
@@ -48,6 +49,19 @@ def validate_schema!
4849
raise ArgumentError, "Invalid JSON Schema: #{errors.join(", ")}"
4950
end
5051
end
52+
53+
def check_for_refs!(obj = properties)
54+
case obj
55+
when Hash
56+
if obj.key?("$ref") || obj.key?(:$ref)
57+
raise ArgumentError, "Invalid JSON Schema: $ref is not allowed in tool input schemas"
58+
end
59+
60+
obj.each_value { |value| check_for_refs!(value) }
61+
when Array
62+
obj.each { |item| check_for_refs!(item) }
63+
end
64+
end
5165
end
5266
end
5367
end

test/mcp/tool/input_schema_test.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,18 @@ class InputSchemaTest < ActiveSupport::TestCase
6161
end
6262
end
6363
end
64+
65+
test "rejects schemas with $ref references" do
66+
assert_raises(ArgumentError) do
67+
InputSchema.new(properties: { foo: { "$ref" => "#/definitions/bar" } }, required: [:foo])
68+
end
69+
end
70+
71+
test "rejects schemas with symbol $ref references" do
72+
assert_raises(ArgumentError) do
73+
InputSchema.new(properties: { foo: { :$ref => "#/definitions/bar" } }, required: [:foo])
74+
end
75+
end
6476
end
6577
end
6678
end

test/mcp/tool_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ def call(message:, server_context: nil)
249249
properties: {
250250
foo: { "$ref" => "#/definitions/bar" },
251251
},
252-
required: [],
252+
required: ["foo"],
253253
definitions: {
254254
bar: { type: "string" },
255255
},

0 commit comments

Comments
 (0)