Mendoza, who entered the game with a career 6.45 ERA, tossed eight strong innings, allowing just one run on five hits. He handed the Twins their third straight loss and their ninth loss over their last 14 games.
"He really didn't give us much of a chance," Twins manager Ron Gardenhire said. "We didn't really do too much off the guy. So a terrific job by him."
The Twins did rally in the ninth inning against closer Jonathan Broxton but fell just short. Joe Mauer laced an RBI double to put runners at second and third with nobody out. Josh Willingham then hit into an RBI groundout, before Justin Morneau flied out and Trevor Plouffe popped out to end the game.
"I came out and I just couldn't find it. I couldn't even find it in the warm-ups out there," Broxton said. "In the 'pen I was good but when I warmed up [on the mound] everything was high and was running on me. But, at the end of the day, we came out with a victory."
It came after left-hander Brian Duensing, who was making his second start of the season, allowed three runs on eight hits with a strikeout over four-plus innings.
He was on a 65-70 pitch limit because he's still getting stretched out after starting the year in the bullpen. Duensing threw 66 pitches and said he's hoping to go deeper into the game if he gets another chance to start.
"I'm frustrated, to be honest," Duensing said. "A lot more negatives than positives in that start. Some of the positives were that I lasted an inning longer, the ball felt good out of [my] hand and I made some good pitches. The negatives were I left the ball up, I was kind of misfiring and all the runs scoring. It's kind of a step forward but not very far."
The Royals got on the board in a hurry, scoring in the first inning on a two-out single from Billy Butler that plated Alex Gordon, who led off the game with a bloop double.
Kansas City added another run in the second on a solo homer from Salvador Perez. It was Perez's second homer of the year and came on a 3-1 fastball.
Duensing was bounced in the fifth, when the left-hander gave up three consecutive hits, including an RBI double to Yuniesky Betancourt. Right-hander Anthony Swarzak came in and was able to get out of the jam, and ended up tossing two scoreless frames.
"Everything was up that last inning so we got him outta there," Gardenhire said. "Swarzy came in there and did a nice job. The bullpen held their own."
The Royals tacked on an insurance run in the seventh on an infield single from Eric Hosmer with the bases loaded. The hit came against Kyle Waldrop but the run was charged to Tyler Robertson.
The Twins managed to score just once against Mendoza, on a two-out RBI single from Ryan Doumit in the second inning. It was all they could do against Mendoza, who has allowed just three runs over 13 innings against Minnesota this season.
"I think with Mendoza, especially, on the mound today, he did a very good job," shortstop Brian Dozier said. "When the opportunity presents itself, you know you have to come up with the big hit. We didn't, but at the same time, that's the way it goes. The beauty of it is we play baseball tomorrow."