- Tiago Tomas (19')
- Enzo Millot (83')
- Borna Sosa (85')
- Obite Ndicka (51')
- Daichi Kamada (55')
- Randal Kolo Muani (77' Pen)
Kolo Muani sealed the result with a penalty after setting up Frankfurt's equalizer to book a showdown with RB Leipzig on June 3 in Berlin's Olympiastadion.
Leipzig -- who defeated Freiburg 5-1 in their semifinal on Tuesday -- are the defending champions after winning the competition for their first title last year.
Frankfurt have won the tournament five times, most recently in 2018.
Tiago Tomás put Stuttgart ahead in the 19th minute as the home team got the better start. But Stuttgart also missed good opportunities and the visitors improved, particularly after Stuttgart defender Konstantinos Mavropanos had to go off with an injury.
Kolo Muani set up Evan Ndicka's equalizer in the 51st, four minutes before Daichi Kamada got Frankfurt's second.
Kolo Muani sealed the win from the penalty spot in the 77th after he was brought down on a counterattack by Stuttgart goalkeeper Fabian Bredlow, who was booked.
But Stuttgart kept pushing and a late penalty appeal for an alleged handball was declined after a VAR check.
Frankfurt hadn't won a game since beating Union Berlin in the semifinals last month. That was their only win in their previous 12 games across all competitions.
- Daniel Schlager