Craig, who had two hits in the game, drove in three runs and scored two runs.
The win was just the third in 11 games for the Cardinals, who had managed one run in losing the first three games of the series in New York.
A two-run home run by Scott Hairston -- his seventh of the year -- pulled the Mets even at 3-3 in the seventh but Matt Holliday opened the St. Louis eighth with a single off New York reliever Jon Rauch (3-5). After an out, Craig sent a long drive over the left-field wall.
The Mets got a run back in the bottom of the inning on an Andrea Torres sacrifice fly and had the potential tying run on third before Jason Motte came on and ended the threat.
Motte also pitched a 1-2-3 ninth and picked up his ninth save.
Marc Rzepczynski (1-3), despite allowing the home run to Hairston, was given the win.
Craig delivered an RBI single in the fourth for the game's first run only to have Lucas Duda tie the score in the bottom of the inning with his ninth home run of the season.
Craig opened the St. Louis seventh with a walk and scored on a force out. David Freese also scored on an out, giving the Cardinals a 3-1 lead and disappeared on Hairston's home run.