KANSAS CITY, Mo. -- Maikel Garcia hit a game-ending two-run double off Yankees closer Clay Holmes, and the Royals recovered after squandering a brilliant start by Alec Marsh to beat New York 4-3 on Thursday and avoid a four-game sweep.
Marsh took a no-hit bid into the seventh inning against the major league-best Yankees (49-22), who had outscored the Royals 25-8 in the first three games of the series. He allowed Juan Soto's leadoff single in that frame and then retired the next three batters to conclude his 96-pitch outing.
"I thought we had a good game plan going in," Marsh said. "Me and [catcher Freddy Fermin] were on the same page all day. I just felt comfortable out there.
"Just watching what they did the last couple of days, I was sick and tired of it."
Marsh struck out Aaron Judge three times.
"Mixing it up," he said. "I tried to keep him off-balance. He's such a good hitter. He's looking for things in certain counts. I was trying to throw him things I don't normally throw in those counts."
After Marsh's exit, New York went to work in the eighth against reliever John Schreiber. Anthony Rizzo homered to get the Yankees within 2-1. An error by second baseman Garrett Hampson set up Anthony Volpe's RBI grounder. Angel Zerpa came in and gave up Soto's go-ahead RBI single.
With one out in the ninth against Holmes (1-2), Drew Waters hit a grounder that went for an infield hit after Holmes and first baseman Rizzo were confused about who would field the ball. After a fielder's choice, Kyle Isbel singled to bring up Garcia, who hit a liner down the left-field line to score MJ Melendez from third and Isbel from first.
It was the fourth blown save in 23 chances for Holmes.
"I couldn't be more proud of those guys," Kansas City manager Matt Quatraro said. "You're down. That's a really good club with an elite closer coming in. We've talked so much about it, but I never get tired of bragging about it. The way they hustle, the way they never quit, it's inspiring for me to come to work every day to be around these guys."
Quatraro missed the rally after being ejected in the sixth inning. After the game, Marsh said Quatraro told him he didn't even know he had a no-hitter going, and Marsh responded, "Don't get tossed next time."
James McArthur (3-3) worked a scoreless ninth for Kansas City, which snapped a four-game skid and is second in the AL Central. The Royals finished 2-for-10 with runners in scoring position.
Nestor Cortes gave up two runs in seven innings for New York to lower his road ERA to 5.57 from 6.17. The left-hander's ERA at Yankee Stadium is 1.77.
"I thought Nestor was good," Yankees manager Aaron Boone said. "It was a good pitchers' duel. His fastball was playing up. He was at 90, 91, 92, but it was, it had something on it. He had a presence on both sides. I thought he did a good job, like Marsh, of mixing to give us seven strong there."
Bobby Witt Jr. extended his hitting streak to a career-high 14 games with a fourth-inning single and came in to score on Vinnie Pasquantino's two-run double off the wall in left-center. That gave the Royals their first lead in the series.
The Royals threatened again in the sixth. Witt led off with a single but was caught stealing on a pickoff throw by Cortes. Quatraro was ejected after arguing that Yankees second baseman Gleyber Torres blocked Witt's path to the bag.