@@ -6047,6 +6047,55 @@ def string
60476047 assert_equal ( -32601 , JSON . parse ( response [ 2 ] [ 0 ] ) . dig ( "error" , "code" ) )
60486048 end
60496049
6050+ test "modern POST maps a method of an undeclared capability to 404 with -32601" do
6051+ server = Server . new ( name : "tools_only" , capabilities : { tools : { } } )
6052+ transport = StreamableHTTPTransport . new ( server )
6053+
6054+ response = transport . handle_request ( modern_rack_request ( modern_body ( "prompts/list" , { } ) ) )
6055+
6056+ assert_equal 404 , response [ 0 ]
6057+
6058+ body = JSON . parse ( response [ 2 ] [ 0 ] )
6059+
6060+ assert_equal ( -32601 , body . dig ( "error" , "code" ) )
6061+ assert_equal "Server does not support prompts (required for prompts/list)" , body . dig ( "error" , "data" )
6062+ assert_equal 1 , body [ "id" ]
6063+ ensure
6064+ transport . close
6065+ end
6066+
6067+ test "legacy POST answers a method of an undeclared capability with 200 and -32601" do
6068+ server = Server . new ( name : "tools_only" , capabilities : { tools : { } } )
6069+ transport = StreamableHTTPTransport . new ( server )
6070+ init_response = transport . handle_request ( create_rack_request (
6071+ "POST" ,
6072+ "/" ,
6073+ { "CONTENT_TYPE" => "application/json" } ,
6074+ { jsonrpc : "2.0" , method : "initialize" , id : "init" , params : initialize_params } . to_json ,
6075+ ) )
6076+ session_id = init_response [ 1 ] [ "mcp-session-id" ]
6077+
6078+ response = transport . handle_request ( create_rack_request (
6079+ "POST" ,
6080+ "/" ,
6081+ { "CONTENT_TYPE" => "application/json" , "HTTP_MCP_SESSION_ID" => session_id } ,
6082+ { jsonrpc : "2.0" , method : "prompts/list" , id : 1 } . to_json ,
6083+ ) )
6084+
6085+ assert_equal 200 , response [ 0 ]
6086+
6087+ io = StringIO . new
6088+ response [ 2 ] . call ( io )
6089+ body = JSON . parse ( io . string . match ( /^data: (.+)$/ ) [ 1 ] )
6090+
6091+ assert_equal ( -32601 , body . dig ( "error" , "code" ) )
6092+ assert_equal "Method not found" , body . dig ( "error" , "message" )
6093+ assert_equal "Server does not support prompts (required for prompts/list)" , body . dig ( "error" , "data" )
6094+ assert_equal 1 , body [ "id" ]
6095+ ensure
6096+ transport . close
6097+ end
6098+
60506099 test "modern POST requires the _meta envelope" do
60516100 response = @transport . handle_request ( modern_rack_request (
60526101 { jsonrpc : "2.0" , method : "tools/list" , id : 1 } . to_json ,
0 commit comments