Cavendish came around Marcel Kittel (Etixx-QuickStep) in the final 100 metres to out sprint Alexander Kristoff (Katusha) and Peter Sagan (Tinkoff) for the stage win.
Kittel raised his arm in protest as he felt the Manxman impeded his progress, but the commissaires reviewed the race footage and upheld Cavendish's victory.
Missing pilot fish Mark Renshaw after he abandoned on stage nine, Cavendish thought at one point towards the finish he didn't stand a chance.
"Janse van Rensburg is not very experienced he needs Bernie to guide him but he messed up and the other trains went past and I thought this it, it's finished.
"I followed Kittel and I saw QuickStep hit out quite early so I knew Kittel would be left out on the front quite soon into the headwind so I knew I had to wait wait wait, let him die and then come round him.
Cavendish said there was nothing wrong with his sprint.
"I jumped around (Kittel) and obviously he's bearing to the right and he's kicked off a little but I was way past him so I don't think there's anything wrong. I think he's just frustrated."
Kittel said it was not up to him to assess the validity of Cavendish's sprint.
“I started my sprint super fast with 220 metres to go, the train worked well. I was in the inside, I was well positioned. I saw Cavendish passing me and he swerved to the right and I needed to brake to avoid collision.
"It's not up to me to decide if he made a mistake.”
In traditional Cavendish style post victory, he acknowledged the work of his team.
"We knew we had to be up there. Daniel Teklehaimanot and Serge Pauwels kept us out there all day then Bernie (Eisel) kept us there for that narrow section (6kms out) and I jumped on the train to the end."
As it happened
The strong Montmeliar headwinds thwarted early attacks with the only jump off the front coming from Thomas de Gendt (Lotto Soudal) at the 20th kilometre. But this was just to grab the one KOM point on the Cote de Puy-Saint-Martin and he soon returned to the bunch.
Just eight kilometres later, Jeremy Roy (FDJ) tried his chances and the attack stuck. Alex Howes (Cannondale), Martin Elmiger (IAM) and Cesare Benedetti (Bora) joined the Frenchman and they quickly consolidated a lead of three minutes and 50 seconds by the 38th kilometre. By kilometre 50, their gap hit a maximum of four minutes and 45 seconds.
While the peloton were happy to let the four go, riders from Dimension Data, Etixx-QuickStep and Lotto Soudal worked on the front to keep the leaders within reach for a Cavendish, Kittel and Greipel sprint finish.
The intermediate sprint appeared at kilometre 145 and Benedetti took the maximum points, with Sagan, Kittel and Cavendish left to fight for the remaining crumbs. The big name sprinters crossed the line in that order, Sagan adding another 11 points to his fairly unassailable green jersey lead.
The peloton turned the screws and the gap dropped to one minute with 50 kilometres to race. The escapees fought bravely on until Howes and Benedetti each peeled off the back within the final 12 kilometres. Roy and Elmiger shook hands with 3.5kms remaining and the catch was finally made.
Matti Breschel (Cannondale) crashed earlier in the stage and was escorted to the hospital in an ambulance. However, his team reported his injuries weren't serious.
There were no changes to the overall classification. Chris Froome (Sky) still holds a comfortable lead over the rest of the field.