Bristol City pushed Manchester City over their two-legged tie, but Pep Guardiola's men are on to the final as their quest for a quadruple continues.
The Sky Blues led 2-1 on aggregate going into the game, but fought off a valiant second leg fightback after taking a 2-0 lead in the second leg. Leroy Sane and Sergio Aguero put City firmly in control, before Kevin De Bruyne killed the game off with a third after the hosts had pegged City back with two of their own.
Both managers opted for full strength teams as neither tactician risked rotation so late into the competition with so much at stake.
Bristol City were caged into their own third of the pitch and - not for the want of trying - just couldn't get out during the opening exchanges.
The first chance of the half came to John Stones after he did well at the back post to get in front of his man and meet David Silva's out-swinging free kick, but he just couldn't get enough on it to divert it goalward.
Aguero had a cross/shot ricochet off the crossbar and Oleksandr Zinchenko continued to impress down the left-hand side but his fizzing long-range effort flew past the post in the 23rd minute.
Luke Steele made his first save of the game shortly after, getting down well to palm David Silva's low shot just out of the reach of Aguero. The Bristol City goalkeeper was brought into action again with four minutes remaining of the first-half as Silva's fierce drive from inside the box needed tipping around the post.
It wasn't long until Steele conceded though. In the 44th minute, a horrendous error from Hordur Magnusson undid all of Lee Johnson's men's hard work. He attempted to shepherd the ball out for a goal kick but Bernardo Silva got the better of him, laid the ball of to Sane who fired the ball into the back of the net from close range.
Although it was deserved after all of the unrelenting pressure, the Robins will be bitterly disappointed in the manner that they conceded and came out for the second half hoping to make amends. However, it didn't take long until matters got worse...
Five minutes to be exact. De Bruyne spun away from his marker and played a pinpoint pass through to Aguero and the Argentine continued his goal-scoring form by blasting the ball past Steele to double the lead.
Marlon Pack then offered the Robins fans a glimmer of hope in the 64th minute. Some poor defending from Stones resulted in Josh Brownhill having the ball on the edge of the box and his floated cross was wonderfully headed in by the onrushing central midfielder.
The Citizens were playing some truly mezmerising attacking football which was at times eerily reminiscent of Guardiola's universally adored Barcelona side.
Aden Flint almost put the ball into his own net when trying to intercept a signature Kyle Walker run and cross but thankfully for the 6'6" defender Steele was there to save his bacon.
Manchester City slowed the game down as it came to a close as they're so adept at doing, but they almost had a third in the 89th minute. David Silva played the ball wide to Danilo - who had replaced Kyle Walker as an injury precaution - but the Brazilian's shot bounced a whisker wide of the post.
Bristol City threw a late spanner in the works when Flint tapped home Bobby Reid's downward header to make the last minute anxious, but sadly for the romantics it just wasn't to be and the game ended with Sane squaring to De Bruyne to ensure City won the game.
The Citizens marched off to chants of Wembley - where they will play either Arsenal or Chelsea depending on who wins Wednesday's game.