@@ -312,7 +312,7 @@ class ServerTest < ActiveSupport::TestCase
312312 assert_instrumentation_data ( { method : "tools/call" , tool_name : tool_name , tool_arguments : tool_args } )
313313 end
314314
315- test "#handle tools/call returns error response with isError true if required tool arguments are missing" do
315+ test "#handle tools/call returns protocol error in JSON-RPC format if required tool arguments are missing" do
316316 tool_with_required_argument = Tool . define (
317317 name : "test_tool" ,
318318 title : "Test tool" ,
@@ -336,10 +336,10 @@ class ServerTest < ActiveSupport::TestCase
336336
337337 response = server . handle ( request )
338338
339- assert_nil response [ :error ] , "Expected no JSON-RPC error"
340- assert response [ :result ] [ :isError ]
341- assert_equal "text " , response [ :result ] [ :content ] [ 0 ] [ :type ]
342- assert_equal "Missing required arguments: message" , response [ :result ] [ :content ] [ 0 ] [ :text ]
339+ assert_nil response [ :result ]
340+ assert_equal ( - 32602 , response [ :error ] [ :code ] )
341+ assert_equal "Invalid params " , response [ :error ] [ :message ]
342+ assert_includes response [ :error ] [ :data ] , "Missing required arguments: message"
343343 end
344344
345345 test "#handle_json tools/call executes tool and returns result" do
@@ -407,17 +407,7 @@ def call(message:, server_context: nil)
407407 assert_equal ( { content : [ { type : "text" , content : "OK" } ] , isError : false } , response [ :result ] )
408408 end
409409
410- test "#handle tools/call returns error response with isError true if the tool raises an error" do
411- @server . configuration . exception_reporter . expects ( :call ) . with do |exception , server_context |
412- assert_not_nil exception
413- assert_equal (
414- {
415- request : { name : "tool_that_raises" , arguments : { message : "test" } } ,
416- } ,
417- server_context ,
418- )
419- end
420-
410+ test "#handle tools/call returns protocol error in JSON-RPC format if the tool raises an uncaught exception" do
421411 request = {
422412 jsonrpc : "2.0" ,
423413 method : "tools/call" ,
@@ -428,13 +418,18 @@ def call(message:, server_context: nil)
428418 id : 1 ,
429419 }
430420
421+ @server . configuration . exception_reporter . expects ( :call ) . with do |exception , server_context |
422+ refute_kind_of MCP ::Server ::RequestHandlerError , exception
423+ assert_equal ( { request : request } , server_context )
424+ end
425+
431426 response = @server . handle ( request )
432427
433- assert_nil response [ :error ] , "Expected no JSON-RPC error"
434- assert response [ :result ] [ :isError ]
435- assert_equal "text " , response [ :result ] [ :content ] [ 0 ] [ :type ]
436- assert_match ( /Internal error calling tool tool_that_raises: / , response [ :result ] [ :content ] [ 0 ] [ :text ] )
437- assert_instrumentation_data ( { method : "tools/call" , tool_name : "tool_that_raises" , tool_arguments : { message : "test" } } )
428+ assert_nil response [ :result ]
429+ assert_equal ( - 32603 , response [ :error ] [ :code ] )
430+ assert_equal "Internal error " , response [ :error ] [ :message ]
431+ assert_match ( /Internal error calling tool tool_that_raises: / , response [ :error ] [ :data ] )
432+ assert_instrumentation_data ( { method : "tools/call" , tool_name : "tool_that_raises" , tool_arguments : { message : "test" } , error : :internal_error } )
438433 end
439434
440435 test "registers tools with the same class name in different namespaces" do
@@ -475,7 +470,7 @@ class Example < Tool
475470 MESSAGE
476471 end
477472
478- test "#handle_json returns error response with isError true if the tool raises an error " do
473+ test "#handle_json returns protocol error in JSON-RPC format if the tool raises an uncaught exception " do
479474 request = JSON . generate ( {
480475 jsonrpc : "2.0" ,
481476 method : "tools/call" ,
@@ -487,14 +482,14 @@ class Example < Tool
487482 } )
488483
489484 response = JSON . parse ( @server . handle_json ( request ) , symbolize_names : true )
490- assert_nil response [ :error ] , "Expected no JSON-RPC error"
491- assert response [ :result ] [ :isError ]
492- assert_equal "text " , response [ :result ] [ :content ] [ 0 ] [ :type ]
493- assert_match ( /Internal error calling tool tool_that_raises: / , response [ :result ] [ :content ] [ 0 ] [ :text ] )
494- assert_instrumentation_data ( { method : "tools/call" , tool_name : "tool_that_raises" , tool_arguments : { message : "test" } } )
485+ assert_nil response [ :result ]
486+ assert_equal ( - 32603 , response [ :error ] [ :code ] )
487+ assert_equal "Internal error " , response [ :error ] [ :message ]
488+ assert_match ( /Internal error calling tool tool_that_raises: / , response [ :error ] [ :data ] )
489+ assert_instrumentation_data ( { method : "tools/call" , tool_name : "tool_that_raises" , tool_arguments : { message : "test" } , error : :internal_error } )
495490 end
496491
497- test "#handle tools/call returns error response with isError true if input_schema raises an error during validation" do
492+ test "#handle tools/call returns protocol error in JSON-RPC format if input_schema raises an error during validation" do
498493 tool = Tool . define (
499494 name : "tool_with_faulty_schema" ,
500495 title : "Tool with faulty schema" ,
@@ -518,10 +513,10 @@ class Example < Tool
518513
519514 response = server . handle ( request )
520515
521- assert_nil response [ :error ] , "Expected no JSON-RPC error"
522- assert response [ :result ] [ :isError ]
523- assert_equal "text " , response [ :result ] [ :content ] [ 0 ] [ :type ]
524- assert_match ( /Internal error calling tool tool_with_faulty_schema: Unexpected schema error/ , response [ :result ] [ :content ] [ 0 ] [ :text ] )
516+ assert_nil response [ :result ]
517+ assert_equal ( - 32603 , response [ :error ] [ :code ] )
518+ assert_equal "Internal error " , response [ :error ] [ :message ]
519+ assert_match ( /Internal error calling tool tool_with_faulty_schema: Unexpected schema error/ , response [ :error ] [ :data ] )
525520 end
526521
527522 test "#handle tools/call returns JSON-RPC error for unknown tool" do
@@ -1310,7 +1305,7 @@ class Example < Tool
13101305 refute response [ :result ] . key? ( :instructions )
13111306 end
13121307
1313- test "tools/call handles missing arguments field " do
1308+ test "tools/call returns protocol error in JSON-RPC format for missing arguments" do
13141309 server = Server . new (
13151310 tools : [ TestTool ] ,
13161311 configuration : Configuration . new ( validate_tool_call_arguments : true ) ,
@@ -1329,12 +1324,13 @@ class Example < Tool
13291324
13301325 assert_equal "2.0" , response [ :jsonrpc ]
13311326 assert_equal 1 , response [ :id ]
1332- assert_nil response [ :error ] , "Expected no JSON-RPC error"
1333- assert response [ :result ] [ :isError ]
1334- assert_includes response [ :result ] [ :content ] [ 0 ] [ :text ] , "Missing required arguments"
1327+ assert_nil response [ :result ]
1328+ assert_equal ( -32602 , response [ :error ] [ :code ] )
1329+ assert_equal "Invalid params" , response [ :error ] [ :message ]
1330+ assert_includes response [ :error ] [ :data ] , "Missing required arguments"
13351331 end
13361332
1337- test "tools/call validates arguments against input schema when validate_tool_call_arguments is true" do
1333+ test "tools/call returns protocol error in JSON-RPC format for invalid arguments when validate_tool_call_arguments is true" do
13381334 server = Server . new (
13391335 tools : [ TestTool ] ,
13401336 configuration : Configuration . new ( validate_tool_call_arguments : true ) ,
@@ -1354,9 +1350,10 @@ class Example < Tool
13541350
13551351 assert_equal "2.0" , response [ :jsonrpc ]
13561352 assert_equal 1 , response [ :id ]
1357- assert_nil response [ :error ] , "Expected no JSON-RPC error"
1358- assert response [ :result ] [ :isError ]
1359- assert_includes response [ :result ] [ :content ] [ 0 ] [ :text ] , "Invalid arguments"
1353+ assert_nil response [ :result ]
1354+ assert_equal ( -32602 , response [ :error ] [ :code ] )
1355+ assert_equal "Invalid params" , response [ :error ] [ :message ]
1356+ assert_includes response [ :error ] [ :data ] , "Invalid arguments"
13601357 end
13611358
13621359 test "tools/call skips argument validation when validate_tool_call_arguments is false" do
@@ -1441,7 +1438,7 @@ class Example < Tool
14411438 assert_equal "OK" , response [ :result ] [ :content ] [ 0 ] [ :content ]
14421439 end
14431440
1444- test "tools/call disallows additional properties when additionalProperties set to false" do
1441+ test "tools/call returns protocol error in JSON-RPC format when additionalProperties set to false" do
14451442 server = Server . new (
14461443 tools : [ TestToolWithAdditionalPropertiesSetToFalse ] ,
14471444 configuration : Configuration . new ( validate_tool_call_arguments : true ) ,
@@ -1464,9 +1461,10 @@ class Example < Tool
14641461
14651462 assert_equal "2.0" , response [ :jsonrpc ]
14661463 assert_equal 1 , response [ :id ]
1467- assert_nil response [ :error ] , "Expected no JSON-RPC error"
1468- assert response [ :result ] [ :isError ]
1469- assert_includes response [ :result ] [ :content ] [ 0 ] [ :text ] , "Invalid arguments"
1464+ assert_nil response [ :result ]
1465+ assert_equal ( -32602 , response [ :error ] [ :code ] )
1466+ assert_equal "Invalid params" , response [ :error ] [ :message ]
1467+ assert_includes response [ :error ] [ :data ] , "Invalid arguments"
14701468 end
14711469
14721470 test "#handle completion/complete returns default completion result" do
0 commit comments