Each variant should be its own Product (or ProductModel). Then each Product/ProductModel would have one mpn value.
If one Product is used for all variants, it wouldn’t be possible to convey how the products differ (or that there are variants in the first place), and others couldn’t make statements about a specific variant.
For example, if one ProductModel is used for a shirt that gets offered in two variations, there is no way to convey which name/color/mpn belong together (it’s one product model with two names, two colors, and two MPNs):
{
"@context": "http://schema.org",
"@type": "ProductModel",
"name": ["Blue shirt", "Red shirt"],
"color": ["Red", "Blue"],
"mpn": ["23", "24"]
}
So, there should be two ProductModel items instead:
{
"@context": "http://schema.org",
"@type": "ProductModel",
"@id": "#p24",
"name": "Blue shirt",
"color": "Blue",
"mpn": "24",
"isSimilarTo": {"@id": "#p23", "@type": "ProductModel"}
}
{
"@context": "http://schema.org",
"@type": "ProductModel",
"@id": "#p23",
"name": "Red shirt",
"color": "Red",
"mpn": "23",
"isSimilarTo": {"@id": "#p24", "@type": "ProductModel"}
}