@@ -660,7 +660,8 @@ def __init__(self):
660660 self .root = self
661661 self .params = MockParams ()
662662
663- def model_dump (self , ** kwargs ):
663+ @staticmethod
664+ def model_dump (** kwargs ):
664665 return {"method" : "test" , "params" : {"name" : "test_tool" }}
665666
666667 @classmethod
@@ -687,7 +688,8 @@ class MockRequestNoRoot:
687688 def __init__ (self ):
688689 self .params = MockParams ()
689690
690- def model_dump (self , ** kwargs ):
691+ @staticmethod
692+ def model_dump (** kwargs ):
691693 return {"method" : "test" , "params" : {"name" : "test_tool" }}
692694
693695 @classmethod
@@ -883,6 +885,102 @@ def model_validate(cls, data):
883885 return cls (params = FakeParams (name = data ["params" ].get ("name" )))
884886
885887
888+ class TestMCPTypesCoverage (unittest .TestCase ):
889+ """Test isinstance checks in _generate_mcp_attributes and _get_mcp_operation"""
890+
891+ def setUp (self ) -> None :
892+ self .instrumentor = MCPInstrumentor ()
893+ self .mock_span = MagicMock ()
894+
895+ def test_generate_mcp_attributes_list_tools (self ) -> None :
896+ """Test _generate_mcp_attributes with ListToolsRequest"""
897+ from amazon .opentelemetry .distro .instrumentation .mcp .semconv import MCPAttributes
898+
899+ class MockListToolsRequest :
900+ pass
901+
902+ with patch ("amazon.opentelemetry.distro.instrumentation.mcp.mcp_instrumentor.types" ) as mock_types :
903+ mock_types .ListToolsRequest = MockListToolsRequest
904+ mock_types .CallToolRequest = type ("CallToolRequest" , (), {})
905+ mock_types .InitializeRequest = type ("InitializeRequest" , (), {})
906+
907+ request = MockListToolsRequest ()
908+ self .instrumentor ._generate_mcp_attributes (self .mock_span , request , is_client = True )
909+ self .mock_span .set_attribute .assert_any_call (MCPAttributes .MCP_LIST_TOOLS , True )
910+
911+ def test_generate_mcp_attributes_call_tool (self ) -> None :
912+ """Test _generate_mcp_attributes with CallToolRequest"""
913+ from amazon .opentelemetry .distro .instrumentation .mcp .semconv import MCPAttributes
914+
915+ class MockCallToolRequest :
916+ def __init__ (self ):
917+ self .params = type ("Params" , (), {"name" : "test_tool" })()
918+
919+ with patch ("amazon.opentelemetry.distro.instrumentation.mcp.mcp_instrumentor.types" ) as mock_types :
920+ mock_types .ListToolsRequest = type ("ListToolsRequest" , (), {})
921+ mock_types .CallToolRequest = MockCallToolRequest
922+ mock_types .InitializeRequest = type ("InitializeRequest" , (), {})
923+
924+ request = MockCallToolRequest ()
925+ self .instrumentor ._generate_mcp_attributes (self .mock_span , request , is_client = True )
926+ self .mock_span .set_attribute .assert_any_call (MCPAttributes .MCP_CALL_TOOL , True )
927+
928+ def test_generate_mcp_attributes_initialize (self ) -> None :
929+ """Test _generate_mcp_attributes with InitializeRequest"""
930+ from amazon .opentelemetry .distro .instrumentation .mcp .semconv import MCPAttributes
931+
932+ class MockInitializeRequest :
933+ pass
934+
935+ with patch ("amazon.opentelemetry.distro.instrumentation.mcp.mcp_instrumentor.types" ) as mock_types :
936+ mock_types .ListToolsRequest = type ("ListToolsRequest" , (), {})
937+ mock_types .CallToolRequest = type ("CallToolRequest" , (), {})
938+ mock_types .InitializeRequest = MockInitializeRequest
939+
940+ request = MockInitializeRequest ()
941+ self .instrumentor ._generate_mcp_attributes (self .mock_span , request , is_client = True )
942+ self .mock_span .set_attribute .assert_any_call (MCPAttributes .MCP_INITIALIZE , True )
943+
944+ def test_get_mcp_operation_list_tools (self ) -> None :
945+ """Test _get_mcp_operation with ListToolsRequest"""
946+
947+ class MockListToolsRequest :
948+ pass
949+
950+ with patch ("amazon.opentelemetry.distro.instrumentation.mcp.mcp_instrumentor.types" ) as mock_types :
951+ mock_types .ListToolsRequest = MockListToolsRequest
952+ mock_types .CallToolRequest = type ("CallToolRequest" , (), {})
953+
954+ request = MockListToolsRequest ()
955+ result = self .instrumentor ._get_mcp_operation (request )
956+ self .assertEqual (result , "tools/list" )
957+
958+ def test_get_mcp_operation_call_tool (self ) -> None :
959+ """Test _get_mcp_operation with CallToolRequest"""
960+
961+ class MockCallToolRequest :
962+ def __init__ (self ):
963+ self .params = type ("Params" , (), {"name" : "my_tool" })()
964+
965+ with patch ("amazon.opentelemetry.distro.instrumentation.mcp.mcp_instrumentor.types" ) as mock_types :
966+ mock_types .ListToolsRequest = type ("ListToolsRequest" , (), {})
967+ mock_types .CallToolRequest = MockCallToolRequest
968+
969+ request = MockCallToolRequest ()
970+ result = self .instrumentor ._get_mcp_operation (request )
971+ self .assertEqual (result , "tools/my_tool" )
972+
973+ def test_get_mcp_operation_unknown (self ) -> None :
974+ """Test _get_mcp_operation with unknown request type"""
975+ with patch ("amazon.opentelemetry.distro.instrumentation.mcp.mcp_instrumentor.types" ) as mock_types :
976+ mock_types .ListToolsRequest = type ("ListToolsRequest" , (), {})
977+ mock_types .CallToolRequest = type ("CallToolRequest" , (), {})
978+
979+ unknown_request = object ()
980+ result = self .instrumentor ._get_mcp_operation (unknown_request )
981+ self .assertEqual (result , "unknown" )
982+
983+
886984class TestAdditionalCoverage (unittest .TestCase ):
887985 def setUp (self ):
888986 self .instrumentor = MCPInstrumentor ()
0 commit comments