@@ -4062,6 +4062,91 @@ def handle_subscription(server, method)
40624062 refute handler_called
40634063 end
40644064
4065+ test "#subscribable_resource_uris reports a resources_subscribe_handler error and leaves its URI out" do
4066+ reported = [ ]
4067+ configuration = MCP ::Configuration . new
4068+ configuration . exception_reporter = -> ( e , server_context ) { reported << [ e . message , server_context ] }
4069+ server = Server . new ( name : "test_server" , configuration : configuration )
4070+ server . resources_subscribe_handler do |params |
4071+ raise "denied" if params [ :uri ] == "file:///private.txt"
4072+ end
4073+
4074+ uris = server . subscribable_resource_uris ( [ "file:///public.txt" , "file:///private.txt" ] )
4075+
4076+ assert_equal ( [ "file:///public.txt" ] , uris )
4077+ assert_equal ( [ [ "denied" , { request : { uri : "file:///private.txt" } } ] ] , reported )
4078+ end
4079+
4080+ test "#subscribable_resource_uris calls the resources_subscribe_handler once per distinct URI and accepts any return value" do
4081+ server = Server . new ( name : "test_server" )
4082+ requested = [ ]
4083+ server . resources_subscribe_handler do |params |
4084+ requested << params
4085+ false
4086+ end
4087+
4088+ uris = server . subscribable_resource_uris ( [ "file:///a.txt" , "file:///a.txt" ] , meta : { trace : "t1" } )
4089+
4090+ assert_equal ( [ "file:///a.txt" ] , uris )
4091+ assert_equal ( [ { uri : "file:///a.txt" , _meta : { trace : "t1" } } ] , requested )
4092+ end
4093+
4094+ test "#subscribable_resource_uris reports the original error of a RequestHandlerError" do
4095+ reported = [ ]
4096+ configuration = MCP ::Configuration . new
4097+ configuration . exception_reporter = -> ( e , _server_context ) { reported << e }
4098+ server = Server . new ( name : "test_server" , configuration : configuration )
4099+ original = ArgumentError . new ( "lookup failed" )
4100+ server . resources_subscribe_handler do |params |
4101+ raise Server ::RequestHandlerError . new ( "Forbidden" , params , error_type : :invalid_params , original_error : original )
4102+ end
4103+
4104+ assert_empty ( server . subscribable_resource_uris ( [ "file:///a.txt" ] ) )
4105+ assert_equal ( [ original ] , reported )
4106+ end
4107+
4108+ test "#subscribable_resource_uris reports a RequestHandlerError without an original error itself" do
4109+ reported = [ ]
4110+ configuration = MCP ::Configuration . new
4111+ configuration . exception_reporter = -> ( e , _server_context ) { reported << e }
4112+ server = Server . new ( name : "test_server" , configuration : configuration )
4113+ error = Server ::RequestHandlerError . new ( "Forbidden" , { } , error_type : :invalid_params )
4114+ server . resources_subscribe_handler { |_params | raise error }
4115+
4116+ assert_empty ( server . subscribable_resource_uris ( [ "file:///a.txt" ] ) )
4117+ assert_equal ( [ error ] , reported )
4118+ end
4119+
4120+ test "#subscribable_resource_uris keeps an accepted URI after a denied one and accepts a nil return value" do
4121+ server = Server . new ( name : "test_server" )
4122+ server . resources_subscribe_handler do |params |
4123+ raise "denied" if params [ :uri ] == "file:///denied.txt"
4124+
4125+ nil
4126+ end
4127+
4128+ assert_equal ( [ "file:///accepted.txt" ] , server . subscribable_resource_uris ( [ "file:///denied.txt" , "file:///accepted.txt" ] ) )
4129+ end
4130+
4131+ test "#subscribable_resource_uris passes the envelope to the resources_subscribe_handler" do
4132+ server = Server . new ( name : "test_server" )
4133+ seen = nil
4134+ server . resources_subscribe_handler do |_params , server_context :|
4135+ seen = server_context . envelope
4136+ end
4137+ envelope = RequestEnvelope . new ( protocol_version : "2026-07-28" , client_info : { name : "c" } , client_capabilities : { } , log_level : nil )
4138+
4139+ server . subscribable_resource_uris ( [ "file:///a.txt" ] , envelope : envelope )
4140+
4141+ assert_same ( envelope , seen )
4142+ end
4143+
4144+ test "#subscribable_resource_uris keeps every URI with the default resources_subscribe_handler" do
4145+ server = Server . new ( name : "test_server" )
4146+
4147+ assert_equal ( [ "file:///a.txt" , "file:///b.txt" ] , server . subscribable_resource_uris ( [ "file:///a.txt" , "file:///b.txt" ] ) )
4148+ end
4149+
40654150 test "tools/call with no args" do
40664151 server = Server . new ( tools : [ @tool_with_no_args ] )
40674152
0 commit comments