George Springer led off the 12th with a walk, and Alex Bregman followed with a bloop single into shallow right field that fell between three players. An error by Ryan Goins allowed Springer to advance to third. After reigning AL MVP Jose Altuve was walked intentionally, Correa singled into right-center gap against Justin Grimm (1-3).
Collin McHugh (3-0) pitched a perfect inning for the win.
Kansas City carried a 3-2 lead into the ninth, but Houston rallied against Brandon Maurer. After Yuli Gurriel and Josh Reddick singled with one out, Evan Gattis hit a tying sacrifice fly to left. Marwin Gonzalez then walked, but Brian McCann grounded out to end the inning.
The Royals wasted a solid start by Ian Kennedy in their 10th loss in 11 games. Kennedy allowed two runs and four hits in seven innings.
Kansas City jumped in front on Hunter Dozier's three-run homer in the fourth, but Correa hit a sacrifice fly and Gurriel homered to trim the Royals' lead to 3-2 in the bottom half of the inning.
Houston right-hander Lance McCullers Jr. struck out nine in six innings. He permitted four hits and walked two.
ALTUVE MOVING UP THE CHARTS
Altuve tied Terry Puhl for seventh in Astros history with 1,357 hits with his double in the fourth. Altuve tied Bill Doran for ninth place in franchise history with 611 runs when he scored in the fourth.
Royals: 1B Lucas Duda (right foot) was recalled from his rehab assignment with Triple-A Omaha and started at designated hitter. He went 1 for 4 with a ninth-inning single. OF Paulo Orlando was optioned to Omaha to make room on the roster for Duda.
Royals: RHP Jason Hammel (2-8) will make his 16th start of the season Sunday in the series finale. Hammel has a 2.85 ERA in nine appearances -- eight starts -- against the Astros.
Astros: RHP Gerrit Cole (8-1) will make his 16th start of the season looking for his seventh straight win. Cole walked a career-high five and allowed four runs for a second straight outing in earning a no-decision Monday against the Rays.