Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion lib/mcp/tool.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ class << self
NOT_SET = Object.new

attr_reader :description_value
attr_reader :input_schema_value
attr_reader :annotations_value

def call(*args, server_context: nil)
Expand Down Expand Up @@ -43,6 +42,10 @@ def name_value
@name_value || StringUtils.handle_from_class_name(name)
end

def input_schema_value
@input_schema_value || InputSchema.new
end

def description(value = NOT_SET)
if value == NOT_SET
@description_value
Expand Down
7 changes: 6 additions & 1 deletion lib/mcp/tool/input_schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,13 @@ def initialize(properties: {}, required: [])
validate_schema!
end

def ==(other)
other.is_a?(InputSchema) && properties == other.properties && required == other.required
end

def to_h
{ type: "object", properties: }.tap do |hsh|
{ type: "object" }.tap do |hsh|
hsh[:properties] = properties if properties.any?
hsh[:required] = required if required.any?
end
end
Expand Down
2 changes: 1 addition & 1 deletion test/mcp/server_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ class ServerTest < ActiveSupport::TestCase
assert_kind_of Array, result[:tools]
assert_equal "test_tool", result[:tools][0][:name]
assert_equal "Test tool", result[:tools][0][:description]
assert_empty(result[:tools][0][:inputSchema])
assert_equal({ type: "object" }, result[:tools][0][:inputSchema])
assert_instrumentation_data({ method: "tools/list" })
end

Expand Down
15 changes: 15 additions & 0 deletions test/mcp/tool/input_schema_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,21 @@ class InputSchemaTest < ActiveSupport::TestCase
InputSchema.new(properties: { foo: { :$ref => "#/definitions/bar" } }, required: [:foo])
end
end

test "== compares two input schemas with the same properties and required fields" do
schema1 = InputSchema.new(properties: { foo: { type: "string" } }, required: [:foo])
schema2 = InputSchema.new(properties: { foo: { type: "string" } }, required: [:foo])
assert_equal schema1, schema2

schema3 = InputSchema.new(properties: { bar: { type: "string" } }, required: [:bar])
refute_equal schema1, schema3

schema4 = InputSchema.new(properties: { foo: { type: "string" } }, required: [:bar])
refute_equal schema1, schema4

schema5 = InputSchema.new(properties: { bar: { type: "string" } }, required: [:foo])
refute_equal schema1, schema5
end
end
end
end
15 changes: 12 additions & 3 deletions test/mcp/tool_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def call(message:, server_context: nil)

test "#to_h returns a hash with name, description, and inputSchema" do
tool = Tool.define(name: "mock_tool", description: "a mock tool for testing")
assert_equal tool.to_h, { name: "mock_tool", description: "a mock tool for testing", inputSchema: {} }
assert_equal tool.to_h, { name: "mock_tool", description: "a mock tool for testing", inputSchema: { type: "object" } }
end

test "#to_h includes annotations when present" do
Expand Down Expand Up @@ -71,6 +71,15 @@ class DefaultNameTool < Tool
assert_equal tool.tool_name, "default_name_tool"
end

test "input schema defaults to an empty hash" do
class NoInputSchemaTool < Tool; end

tool = NoInputSchemaTool

expected = { type: "object" }
assert_equal expected, tool.input_schema.to_h
end

test "accepts input schema as an InputSchema object" do
class InputSchemaTool < Tool
input_schema InputSchema.new(properties: { message: { type: "string" } }, required: [:message])
Expand Down Expand Up @@ -106,7 +115,7 @@ class InputSchemaTool < Tool

assert_equal tool.name_value, "mock_tool"
assert_equal tool.description, "a mock tool for testing"
assert_equal tool.input_schema, nil
assert_equal tool.input_schema, Tool::InputSchema.new
end

test ".define allows definition of tools with annotations" do
Expand All @@ -123,7 +132,7 @@ class InputSchemaTool < Tool

assert_equal tool.name_value, "mock_tool"
assert_equal tool.description, "a mock tool for testing"
assert_equal tool.input_schema, nil
assert_equal tool.input_schema, Tool::InputSchema.new
assert_equal tool.annotations_value.to_h, { title: "Mock Tool", readOnlyHint: true }
end

Expand Down