From 4a65f621588adae2eff147302ece43fae9ab413f Mon Sep 17 00:00:00 2001 From: Siddhant Bajaj Date: Fri, 8 Aug 2025 03:08:12 -0400 Subject: [PATCH] Return HTTP status code 202 for notification initialized method --- .../transports/streamable_http_transport.rb | 6 +++++ .../streamable_http_transport_test.rb | 27 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/lib/mcp/server/transports/streamable_http_transport.rb b/lib/mcp/server/transports/streamable_http_transport.rb index e1924214..531566bc 100644 --- a/lib/mcp/server/transports/streamable_http_transport.rb +++ b/lib/mcp/server/transports/streamable_http_transport.rb @@ -108,6 +108,8 @@ def handle_post(request) if body["method"] == "initialize" handle_initialization(body_string, body) + elsif body["method"] == MCP::Methods::NOTIFICATIONS_INITIALIZED + handle_notification_initialized else handle_regular_request(body_string, session_id) end @@ -185,6 +187,10 @@ def handle_initialization(body_string, body) [200, headers, [response]] end + def handle_notification_initialized + [202, {}, []] + end + def handle_regular_request(body_string, session_id) # If session ID is provided, but not in the sessions hash, return an error if session_id && !@sessions.key?(session_id) diff --git a/test/mcp/server/transports/streamable_http_transport_test.rb b/test/mcp/server/transports/streamable_http_transport_test.rb index ddeceac3..b77503c9 100644 --- a/test/mcp/server/transports/streamable_http_transport_test.rb +++ b/test/mcp/server/transports/streamable_http_transport_test.rb @@ -595,6 +595,33 @@ class StreamableHTTPTransportTest < ActiveSupport::TestCase assert_equal "Internal server error", body["error"] end + test "POST notifications/initialized returns 202 with no body" do + # Create a session first (optional for notification, but keep consistent with flow) + init_request = create_rack_request( + "POST", + "/", + { "CONTENT_TYPE" => "application/json" }, + { jsonrpc: "2.0", method: "initialize", id: "init" }.to_json, + ) + init_response = @transport.handle_request(init_request) + session_id = init_response[1]["Mcp-Session-Id"] + + notif_request = create_rack_request( + "POST", + "/", + { + "CONTENT_TYPE" => "application/json", + "HTTP_MCP_SESSION_ID" => session_id, + }, + { jsonrpc: "2.0", method: MCP::Methods::NOTIFICATIONS_INITIALIZED }.to_json, + ) + + response = @transport.handle_request(notif_request) + assert_equal 202, response[0] + assert_empty(response[1]) + assert_empty(response[2]) + end + private def create_rack_request(method, path, headers, body = nil)