Hamari Traore stunned the capital city giants by breaking the deadlock in the 65th minute with a clinical left-footed strike, his first league goal of the season.
Substitute Mbappe squandered a clear opportunity for a leveller after being played in behind the Rennes defence soon afterwards, sweeping a powerful shot over the bar when he only had Steve Mandanda to beat.
PSG pushed for a leveller, but Rennes had their number once again at Roazhon Park, which has been the way of things in recent seasons.
The visitors’ threat was stifled in the first half, and the best chance fell to Rennes striker Arnaud Kalimuendo, whose volley from 10 yards was blocked by Gianluigi Donnarumma. The Italian also later saved well from Amine Gouiri.
Lionel Messi was not at his sharpest, sending one shot from 20 yards soaring high over the crossbar and failing to hit the target with any of his three goal attempts before the break.
Neymar was similarly subdued, but PSG had a weapon up their sleeve with Mbappe among their substitutes.
Danilo Pereira looked to have squandered a big chance when Mandanda parried his close-range header early in the second half, but the defender, making his 100th PSG appearance, was one of three players offside in the build-up.
Coach Christophe Galtier sent on Mbappe and Achraf Hakimi in the 55th minute, as Hugo Ekitike and Nordi Mukiele made way. However, the opening goal went to Rennes, with captain Traore lashing a stabbed cutback from Adrien Truffert low and past the reaches of Donnarumma from 12 yards.
Mbappe then missed woefully after connecting with a long pass from Messi, and try as they might, the visitors could not find a way back to level terms.
PSG player ratings
GK – Gianluigi Donnarumma – 6/10 – Forced into a few decent saves in the first half to keep Rennes at bay.
CB – Sergio Ramos – 5/10 – Few nice passes here and there.
CB – Marquinhos – 4/10 – He lost his man a few too many times.
CB – Danilo Pereira – 4/10 – His usual clumsy self.
RWB – Nordi Mukiele – 4/10 – Didn’t look quite at the races, failing to provide any width on the right flank.
CM – Warren Zaire-Emery – 6/10 – 16 years old and starting games of football for PSG. He put in a battling performance.
CM – Vitinha – 5/10 – Busy but failed to provide any cutting edge when he got into the final third.
LWB – Juan Bernat – 5/10 – Like his wing-back partner, didn’t really do enough.
RW – Lionel Messi – 6/10 – Played a few lovely through balls but generally not at his brilliant best.
ST – Hugo Ekitike – 3/10 – The youngster just didn’t do enough up top.
LW – Neymar – 0/10 – He was surprisingly on the pitch.
SUB – Kylian Mbappe – 6/10 – He made a bit of a difference when he came on.
SUB – Achraf Hakimi – 3/10 – Turned inside out in the lead up to Rennes’ goal.
SUB – Carlos Soler – 5/10.
SUB – Fabian Ruiz – 5/10.
SUB – Renato Sanches – N/A.