James McArthur (1-0) got the win, and Hector Neris (6-3) was tagged with the loss.
The Royals snapped a 6-6 tie with three runs in the seventh inning. Kyle Isbel put Kansas City in front with an RBI bunt single off Neris. A throwing error by Astros third baseman Alex Bregman on Dairon Blanco's ground ball produced another run, and Nick Pratto's sacrifice fly gave the Royals a three-run cushion.
The Astros closed the gap in the ninth inning on Yordan Alvarez's RBI double and Jose Abreu's run-scoring groundout off Carlos Hernandez. Taylor Clarke recorded a one-out save, his second.
In the first inning, the Royals took a three-run lead. Maikel Garcia walked and stole second base. A single by Bobby Witt Jr. put runners on the corners, and Perez lined a two-run double. Velazquez provided a sacrifice fly.
In the third inning, Witt walked and stole second base, his 47th of the season. MJ Melendez lined an RBI single to center to give Kansas City a 4-0 advantage.
The Astros answered in the fifth inning with three runs. Yainer Diaz homered to center. Mauricio Dubon tripled and scored on Bregman's RBI single. Alvarez made it a one-run game with a run-scoring single.
Perez was replaced by Porter in the fifth inning after the catcher was hit on the face mask by Jose Altuve's foul ball.
Kansas City added a run in the fifth inning when Velazquez walked with the bases loaded, and Witt lifted a sacrifice fly in the sixth inning.
But the Astros pulled even in the seventh inning on Altuve's three-run homer off Collin Snider.
—Field Level Media