City outclassed their neighbours in the first half, going in 3-0 at the break before Ole Gunnar Solskjaer's side regrouped and avoided what could have been a more emphatic defeat.
A brilliant strike from Bernardo Silva put City ahead in the 17th minute, the winger cutting in from the right before unleashing a superb shot into the far top corner.
The busy Portugal international then created City's second, collecting a poor headed clearance from Victor Lindelof and dancing past a challenge before threading the ball to Riyad Mahrez who rounded goalkeeper David de Gea and slotted home.
City then punished United on a counter-attack, which ended with Kevin De Bruyne blasting goalwards before De Gea's parry ricocheted off United midfielder Andreas Pereira into the net.
United looked more solid after the introduction of midfielder Nemanja Matic at the break and got a foothold in the tie through a 70th minute goal from Marcus Rashford.
Leicester City face Aston Villa in the first leg of the other semi-final on Wednesday.