"He was good right from the start," Cardinals manager Mike Matheny said. "That was one of his best outings of the season. This is a team that he's had trouble with. This is a place he hasn't thrown real well. He had a lot of things going against him. He was spot-on today. It was fun to see."
The Cardinals won their fourth straight and extended their winning streak over the last-place Astros to a franchise-best 10 games. They also moved 4 1/2 games ahead of Milwaukee and Los Angeles in the race for the second NL wild card. The Brewers lost 4-2 in Cincinnati, and the Dodgers were beaten 2-1 in San Diego.
With seven games remaining, St. Louis is closing in on the National League's final postseason spot. Atlanta clinched at least a wild-card berth by beating Miami 4-3 earlier Tuesday night.
Garcia (6-7) allowed six hits and struck out five to beat the Astros for the second time in a week after going 0-5 in his first seven starts against Houston. Mitchell Boggs and Joe Kelly completed the seven-hitter.
It was the ninth shutout for the Cardinals this season and their third straight over the Astros.
Garcia helped the Cardinals beat Houston 5-4 last Thursday, but still wondered how things would go at Minute Maid Park, where he'd allowed nine hits and 12 runs in two starts this season. He lasted just two innings in his last start here in June as part of his season-long struggles on the road, where he is 3-5.
"I'm not going to lie to you and say that I didn't think about it -- that every time I come here it hasn't been good," Garcia said. "But at the same time, when I go on that mound, all I'm worried about is making my pitches and giving the team a chance to win."
Houston starter Lucas Harrell (10-11) yielded seven hits and two runs with a career-high six walks in five innings to remain winless since Aug. 14.
"I was terrible," Harrell said. "I felt like the first two innings I was just trying to get a feel for the game. I felt like I never picked up a baseball before. It was embarrassing. It was bad."
Jay drove in a run with a single in the second and sent another run home on a forceout in a two-run eighth.
"He had a big day for us, a couple of big RBIs," Matheny said. "When he gets on, things happen. We were fortunate to have the bottom of our lineup be effective again."
Harrell got into trouble early as Jay led off with a single. Matt Holliday drew a one-out walk before Allen Craig's single loaded the bases. A sacrifice fly by Yadier Molina gave St. Louis a 1-0 lead.
Harrell limited the damage when he struck out Carlos Beltran to end the inning.
Garcia hit a two-out double to the left-field corner in the second and scored on a single by Jay, which rolled just out of the reach of a diving Jed Lowrie at shortstop and into center field to make it 2-0.
The Astros turned a double play to end the third inning and used another one for the first two outs of the fifth. The Cardinals had the bases loaded when Beltran hit a grounder that Matt Downs grabbed near first. He threw home for the first out before catcher Chris Snyder relayed back to first.
Kozma continued his solid play in place of injured All-Star shortstop Rafael Furcal and had an RBI double in the eighth.
The Astros couldn't string together any hits through the first six innings. Justin Maxwell singled in the seventh before a single by Brandon Laird with one out sent Maxwell to third. The Astros came away empty after a double play by St. Louis.
Houston interim manager Tony DeFrancesco said Tuesday could be Harrell's last start of the season because the rookie entered the game having pitched more than 182 innings.
Cardinals 3B David Freese missed his second straight game after rolling his right ankle in pregame warmups in the batting cage on Monday. He said he has a mild sprain and was sore on Tuesday and that he'll likely miss the last game of the series on Wednesday. ... DeFrancesco said Fernando Abad will likely miss his next start after leaving Monday's game with an oblique strain after 1 2/3 innings. ... The teams wrap up the series on Wednesday when Chris Carpenter makes his second start after missing 150 games with a right shoulder injury. Houston RHP Bud Norris is looking for his first win since May 21.