Shane Victorino's RBI double in the fourth was the only support Kendrick (1-4) needed and John Mayberry added a two-run double in a three-run sixth. Hunter Pence and Brian Schneider added two hits apiece for the Phillies, who have won four in a row.
Kendrick entered with a 5.23 ERA and the Phillies were 1-9 in the games he pitched, five of them starts. But he's 5-1 against the Cardinals in eight games, all but two of them starts.
Jaime Garcia (3-3) allowed four runs on six hits in six innings for the Cardinals, who swept a three-game series against the Padres before hitting the wall against the team they upset in the NL Division Series last fall.
David Freese had two singles and is 7 for 7 with two homers and four RBIs for St. Louis since returning from a two-game break to clear his head from a 3 for 34 slump.
They haven't been swept in a four-game series at home by the Phillies since Aug. 4-7, 1986, and even in three-game series they haven't been swept since 2001.
Kendrick needed just 94 pitches, 70 of them strikes, to throw his second career complete game and first since July 3, 2010, at Pittsburgh. He worked ahead in the count constantly, throwing first-pitch strikes to the first 13 batters, and had four strikeouts with no walks.
Kendrick pitched a season-high seven innings in his last start, a 2-1 loss to the Nationals on May 21. He allowed three or fewer runs for the 14th time in 15 starts.
The Phillies totaled just five runs while Kendrick was in the game his other five starts this season, an average of 1.67 runs that was the majors' worst with a minimum of five starts.
The Cardinals got their first runner in scoring position when Tyler Greene doubled with two outs in the sixth, and Kendrick quickly escaped by getting Holliday to ground out.
Garcia retired seven of eight before the fourth, when Pence had a leadoff single and scored on Victorino's double to put the Phillies ahead.
Placido Polanco doubled to start the sixth and Garcia walked two of the next three hitters before Mayberry doubled down the third base line. Mayberry had been 3 for 22 with one RBI against St. Louis, but with all three hits and the RBI in six at-bats against Garcia.
Garcia's effectiveness was down from his previous two starts in which he gave up three runs in 14 1-3 innings.
NOTES: Cardinals SS Rafael Furcal and C Yadier Molina both got days off, along with Phillies C Carlos Ruiz. ... Victorino, who lost track of a flyball on Friday night, hasn't committed an error in 223 games. RF Pence blamed twilight for a pair of balls that dropped in the fourth, but Cardinals manager Mike Matheny said none of his players have ever complained about visibility problems. ... Attendance of 44,476 was St. Louis' 10th sellout. ... The time of game was 2 hours, 26 minutes, the Cardinals' shortest of season.
Link to boxscore: Philadelphia 4 at St. Louis 0