City goalkeeper Ederson – restored to the starting line-up in place of Claudio Bravo – inadvertently played a part in both goals as United climbed back to fifth place, closing to within three points of Chelsea in fourth.
Pep Guardiola’s side started in dominant fashion, certainly in terms of possession, but struggled to create many openings, although Raheem Sterling could have done better with the first chance of the game but his tame curler from 10 yards out was saved by David De Gea.
United seemed happy to play on the counter, despite being at home, but it was working in their favour as Daniel James, Anthony Martial and Bruno Fernandes all had openings on the break, although Ederson wasn’t overly troubled.
However, that changed on the half-hour mark when Fernandes won a free-kick, before beautifully clipping the ball over the wall into the path of Martial, and the French striker’s volley squeezed through Ederson’s hands at his near post, with the Brazilian knowing he should have done better.
Fred felt he could have won a penalty as the half drew to a close before Ederson almost gifted Martial a second just after the restart, miscontrolling a Fernandinho back-pass only to deny the United man with a last-ditch tackle only two yards out from goal.
Sergio Aguero had an equaliser ruled out for offside, with the on-field decision ratified by VAR as City started to pen United deep into their own half.
However, chances remained at a premium with Sterling unable to get the right touch on a Riyad Mahrez cross before Gabriel Jesus was denied by De Gea in their only meaningful chances.
James was denied on the counter by Ederson on a rare United break before the former Benfica stopped practically handed United their second, deep into stoppage time.
Fred overplayed a pass intended for James into the City box, but Ederson, perhaps in desperation with time almost up, overthrew the ball out to Benjamin Mendy with McTominay racing onto the loose ball to calmy curl his first-time 40-yarder into the unguarded net.
It was the third time United had beaten City this season, doing the league double of course, with the result meaning Liverpool are just two wins away from claiming the title.