Mbappe’s two spot-kicks came after he set up Marco Verratti for the opener in the first half at the Parc des Princes, with substitute Daniel Alves wrapping up the victory late on.
The result keeps Thomas Tuchel’s team on course to win a domestic league and cup double, which would go some small way to easing the pain of their exit from the Champions League in the last 16 at the hands of Manchester United.
PSG are 20 points clear at the top of Ligue 1 with nine matches left and could be crowned champions for the sixth time in seven seasons as early as Sunday, if they beat Strasbourg and second-placed Lille lose their game.
The Qatar-owned club can also win the French Cup for the fifth year running, and a record 13th time overall, when they play Rennes in the final at the Stade de France in Paris on April 27.
Rennes reached the final by winning 3-2 at Lyon on Tuesday, but the Brittany club have been knocked out of the Cup in each of the last two seasons after heavy defeats against PSG.
Paris might also have Neymar back for the final after the Brazilian returned to training on Wednesday following more than two months out with a foot injury.
The opening goal here arrived just before the half-hour mark, with Mbappe finding Verratti, who controlled before firing low into the net from 25 yards.
It was the Italian’s first goal for PSG since November 2017, although he did net for Italy just last week, against Liechtenstein in Euro 2020 qualifying.
The home side lost Marquinhos to injury just before the break, but were then awarded a penalty shortly after the hour mark, the referee pointing to the spot following a VAR review on a handball appeal.
Mbappe scored his penalty, but was ordered to retake it and this time his weak effort was saved by Nantes goalkeeper Ciprian Tatarusanu.
However, Nantes then had giant striker Kalifa Coulibaly sent off for a second yellow card for a foul on Thiago Silva, and Mbappe — who had also missed a penalty in a win over Marseille last month — was handed the chance to make amends from 12 yards after Alves was brought down.
This time he did score, taking his tally for the season to 33 goals, and Alves then made it 3-0 in injury time with a delightful lob.