Merge pull request #246 from koic/fix_prompt_nil_arguments

Fix `Prompt#validate_arguments!` crash when arguments are `nil`
This commit is contained in:
Koichi ITO 2026-03-01 18:38:14 +09:00 • committed by GitHub
commit 29a32900fd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 50 additions and 4 deletions

View file

@ -21,7 +21,7 @@ module MCP
title: title_value,
description: description_value,
icons: icons_value&.then { |icons| icons.empty? ? nil : icons.map(&:to_h) },
arguments: arguments_value&.map(&:to_h),
arguments: arguments_value.empty? ? nil : arguments_value.map(&:to_h),
_meta: meta_value,
}.compact
end
@ -32,7 +32,7 @@ module MCP
subclass.instance_variable_set(:@title_value, nil)
subclass.instance_variable_set(:@description_value, nil)
subclass.instance_variable_set(:@icons_value, nil)
subclass.instance_variable_set(:@arguments_value, nil)
subclass.instance_variable_set(:@arguments_value, [])
subclass.instance_variable_set(:@meta_value, nil)
end
@ -76,7 +76,7 @@ module MCP
if value == NOT_SET
@arguments_value
else
@arguments_value = value
@arguments_value = Array(value)
end
end
@ -103,6 +103,7 @@ module MCP
end
def validate_arguments!(args)
args ||= {}
missing = required_args - args.keys
return if missing.empty?

View file

@ -182,7 +182,7 @@ module MCP
assert_equal expected, FullPrompt.to_h
end
test "#to_h handles nil arguments value" do
test "#to_h omits arguments key when arguments are not declared" do
class NoArgumentsPrompt < Prompt
description "No arguments prompt"
end
@ -196,6 +196,51 @@ module MCP
assert_equal expected, prompt.to_h
end
test "#validate_arguments! does not raise when arguments are not declared" do
prompt_class = Class.new(Prompt) do
prompt_name "no_args_prompt"
description "A prompt with no arguments"
# NOTE: no `arguments` declaration at all
end
assert_nothing_raised do
prompt_class.validate_arguments!({})
end
end
test "#validate_arguments! handles nil args" do
prompt_class = Class.new(Prompt) do
prompt_name "no_args_prompt"
description "A prompt with no arguments"
end
assert_nothing_raised do
prompt_class.validate_arguments!(nil)
end
end
test "#validate_arguments! does not raise when arguments is explicitly set to nil" do
prompt_class = Class.new(Prompt) do
prompt_name "nil_args_prompt"
description "A prompt with nil arguments"
arguments nil
end
assert_nothing_raised do
prompt_class.validate_arguments!({})
end
end
test "#to_h omits arguments key when arguments is empty" do
prompt = Prompt.define(
name: "no_args_prompt",
description: "a prompt without arguments",
arguments: [],
)
refute prompt.to_h.key?(:arguments)
end
test "#to_h does not have `:icons` key when icons is empty" do
prompt = Prompt.define(
name: "prompt_without_icons",