@@ -572,8 +572,10 @@ def json_server_url(json_server_port: int) -> str:
572572# Basic request validation tests
573573def test_accept_header_validation (basic_server : None , basic_server_url : str ):
574574 """Test that Accept header is properly validated."""
575- # Test without Accept header
576- response = requests .post (
575+ # Test without Accept header (suppress requests library default Accept: */*)
576+ session = requests .Session ()
577+ session .headers .pop ("Accept" )
578+ response = session .post (
577579 f"{ basic_server_url } /mcp" ,
578580 headers = {"Content-Type" : "application/json" },
579581 json = {"jsonrpc" : "2.0" , "method" : "initialize" , "id" : 1 },
@@ -582,6 +584,52 @@ def test_accept_header_validation(basic_server: None, basic_server_url: str):
582584 assert "Not Acceptable" in response .text
583585
584586
587+ @pytest .mark .parametrize (
588+ "accept_header" ,
589+ [
590+ "*/*" ,
591+ "application/*, text/*" ,
592+ "text/*, application/json" ,
593+ "application/json, text/*" ,
594+ "*/*;q=0.8" ,
595+ "application/*;q=0.9, text/*;q=0.8" ,
596+ ],
597+ )
598+ def test_accept_header_wildcard (basic_server : None , basic_server_url : str , accept_header : str ):
599+ """Test that wildcard Accept headers are accepted per RFC 7231."""
600+ response = requests .post (
601+ f"{ basic_server_url } /mcp" ,
602+ headers = {
603+ "Accept" : accept_header ,
604+ "Content-Type" : "application/json" ,
605+ },
606+ json = INIT_REQUEST ,
607+ )
608+ assert response .status_code == 200
609+
610+
611+ @pytest .mark .parametrize (
612+ "accept_header" ,
613+ [
614+ "text/html" ,
615+ "application/*" ,
616+ "text/*" ,
617+ ],
618+ )
619+ def test_accept_header_incompatible (basic_server : None , basic_server_url : str , accept_header : str ):
620+ """Test that incompatible Accept headers are rejected for SSE mode."""
621+ response = requests .post (
622+ f"{ basic_server_url } /mcp" ,
623+ headers = {
624+ "Accept" : accept_header ,
625+ "Content-Type" : "application/json" ,
626+ },
627+ json = INIT_REQUEST ,
628+ )
629+ assert response .status_code == 406
630+ assert "Not Acceptable" in response .text
631+
632+
585633def test_content_type_validation (basic_server : None , basic_server_url : str ):
586634 """Test that Content-Type header is properly validated."""
587635 # Test with incorrect Content-Type
@@ -826,7 +874,10 @@ def test_json_response_accept_json_only(json_response_server: None, json_server_
826874def test_json_response_missing_accept_header (json_response_server : None , json_server_url : str ):
827875 """Test that json_response servers reject requests without Accept header."""
828876 mcp_url = f"{ json_server_url } /mcp"
829- response = requests .post (
877+ # Suppress requests library default Accept: */* header
878+ session = requests .Session ()
879+ session .headers .pop ("Accept" )
880+ response = session .post (
830881 mcp_url ,
831882 headers = {
832883 "Content-Type" : "application/json" ,
@@ -853,6 +904,29 @@ def test_json_response_incorrect_accept_header(json_response_server: None, json_
853904 assert "Not Acceptable" in response .text
854905
855906
907+ @pytest .mark .parametrize (
908+ "accept_header" ,
909+ [
910+ "*/*" ,
911+ "application/*" ,
912+ "application/*;q=0.9" ,
913+ ],
914+ )
915+ def test_json_response_wildcard_accept_header (json_response_server : None , json_server_url : str , accept_header : str ):
916+ """Test that json_response servers accept wildcard Accept headers per RFC 7231."""
917+ mcp_url = f"{ json_server_url } /mcp"
918+ response = requests .post (
919+ mcp_url ,
920+ headers = {
921+ "Accept" : accept_header ,
922+ "Content-Type" : "application/json" ,
923+ },
924+ json = INIT_REQUEST ,
925+ )
926+ assert response .status_code == 200
927+ assert response .headers .get ("Content-Type" ) == "application/json"
928+
929+
856930def test_get_sse_stream (basic_server : None , basic_server_url : str ):
857931 """Test establishing an SSE stream via GET request."""
858932 # First, we need to initialize a session
@@ -941,8 +1015,10 @@ def test_get_validation(basic_server: None, basic_server_url: str):
9411015 assert init_data is not None
9421016 negotiated_version = init_data ["result" ]["protocolVersion" ]
9431017
944- # Test without Accept header
945- response = requests .get (
1018+ # Test without Accept header (suppress requests library default Accept: */*)
1019+ session = requests .Session ()
1020+ session .headers .pop ("Accept" )
1021+ response = session .get (
9461022 mcp_url ,
9471023 headers = {
9481024 MCP_SESSION_ID_HEADER : session_id ,
0 commit comments