McCann led off the fourth against Kyle Kendrick (8-5) with a drive to center for a 1-0 lead. He connected for his 20th homer off Brad Lidge during a seven-run ninth. Lidge, the All-Star closer who hasn't blown a save this season, had not allowed a home run this year in 42 innings.
Kendrick gave up one run and seven hits in six innings but like the rest of Philadelphia's starters lately, he didn't get much support. Ryan Howard hit his major league-leading 30th homer with two outs in the ninth.
The free-falling Phillies have lost five of seven since the All-Star break and started the day behind the New York Mets in the NL East standings.
Philadelphia was a season-high 13 games over .500 and had a season-best four-game lead in the division after a 20-2 win at St. Louis on June 13. Since then, the Phillies are 13-21 and the offense has sputtered: They have scored two runs or fewer 13 times in those 34 games, including three shutouts.
A team meeting held before playing their first game out of first place in almost two months didn't help.
"When the doors are closed, everything stays in there," shortstop Jimmy Rollins said, declining to comment on the discussion.
Rollins was back in the lineup after being benched for arriving late to the ballpark before Thursday afternoon's 3-1 loss to the Mets.
None of the hitters showed up Friday.
The Phillies had a runner on third with one out in the first, but Chase Utley struck out and Howard flied out to center. Utley struck out to leave a runner on second in the sixth.