@@ -426,6 +426,54 @@ class ServerTest < ActiveSupport::TestCase
426426 assert_instrumentation_data ( { method : "tools/call" , tool_name : tool_name , tool_arguments : tool_args } )
427427 end
428428
429+ test "#handle_json tools/call delivers nested object arguments with symbol keys at every level" do
430+ received_payload = nil
431+ server = Server . new ( name : "test_server" )
432+ server . define_tool (
433+ name : "nested_args_tool" ,
434+ input_schema : { properties : { message : { type : "string" } , payload : { type : "object" } } , required : [ "message" ] } ,
435+ ) do |message :, payload : nil , server_context :|
436+ received_payload = payload
437+ Tool ::Response . new ( [ { type : "text" , text : "#{ message } #{ server_context . class } " } ] )
438+ end
439+
440+ request_json = JSON . generate (
441+ jsonrpc : "2.0" ,
442+ method : "tools/call" ,
443+ id : 1 ,
444+ params : {
445+ name : "nested_args_tool" ,
446+ arguments : { message : "hi" , payload : { subject : "greet" , nested : { deep : "value" } } } ,
447+ } ,
448+ )
449+
450+ server . handle_json ( request_json )
451+
452+ assert_equal ( { subject : "greet" , nested : { deep : "value" } } , received_payload )
453+ assert_equal "greet" , received_payload [ :subject ]
454+ assert_nil received_payload [ "subject" ]
455+ end
456+
457+ test "tool receives symbol keys when called under the JSON-round-tripped argument shape" do
458+ received_payload = nil
459+ tool = Tool . define (
460+ name : "nested_args_tool" ,
461+ input_schema : { properties : { payload : { type : "object" } } } ,
462+ ) do |payload : nil , server_context :|
463+ received_payload = payload
464+ Tool ::Response . new ( [ { type : "text" , text : server_context . class . to_s } ] )
465+ end
466+
467+ # Round-trip the arguments through JSON the way a transport does, so the tool
468+ # is exercised under the symbolized shape it actually receives at runtime.
469+ arguments = { payload : { "subject" => "greet" } }
470+ delivered = JSON . parse ( JSON . generate ( arguments ) , symbolize_names : true )
471+ tool . call ( **delivered , server_context : nil )
472+
473+ assert_equal ( { subject : "greet" } , received_payload )
474+ assert_nil received_payload [ "subject" ]
475+ end
476+
429477 test "#handle tools/call returns tool execution error if required tool arguments are missing" do
430478 tool_with_required_argument = Tool . define (
431479 name : "test_tool" ,
0 commit comments