Willie McGee went five for six, including a homer in a three-run first, and Jack Clark drove in four runs, including a three-run homer in the eighth, to lead St. Louis in Chicago.
Kurt Kepshire (8-6) gave up seven hits over eight innings to make his lifetime record against the Cubs 4-0. The Cardinals supported him with 17 hits.
McGee, who also scored three runs, lined a one-run homer in the first and added an RBI double in a three-run fourth. He also singled in the second and eighth to raise his league-leading average to .345.
Last year, McGee hit for the cycle against the Cubs, but the feat was lost in the shuffle because that was the day Ryne Sandberg hit two home runs off Bruce Sutter as the Cubs won in extra innings.
"It's the ballpark," McGee said about his success in Wrigley Field. "It's a hitter's ballpark. But we all did the job. Everybody contributed. There are no secrets about hitting. Everybody goes out and does it, and that's why the team is winning."
The Cardinals, who have won eight of their last nine, beat the Cubs for the seventh time this year without a loss.