Adalberto Mondesi had an RBI single in the sixth and Edward Olivares and Nicky Lopez drove in runs in the ninth, giving the Royals their second straight victory after starting September with seven losses.
Duffy (3-3) struck out four and walked four over 5 2/3 innings to win for the first time at Cleveland in eight starts since Sept. 22, 2014. The left-hander was 0-6 at Progressive Field during that span.
''That's a really good team over there, top to bottom,'' said Duffy, who is 4-12 with a 5.11 ERA in his career against the Indians. ''You have to respect that lineup, and I have a lot of respect for that team and the way they play the game.''
Jesse Hahn, Josh Staumont and Greg Holland completed a six-hitter as Cleveland left 10 on base. It was Holland's third save in three chances.
''I know those are some arms that the league is not looking forward to facing,'' Royals manager Mike Matheny said. ''(Holland) continues to make really good pitches and his stuff just keeps impressing me. He's in a really good place.''
The Indians only threatened once against Duffy, loading the bases with one out in the fifth before Francisco Lindor was retired on a short fly to center and Carlos Santana struck out.
''I think we were trying too hard to put the ball into play in that situation,'' acting Cleveland manager Sandy Alomar Jr. said.
Mondesi broke the ice against Carlos Carrasco (2-4), driving in Cam Gallagher with no outs in the sixth. Kansas City scored twice off Phil Maton in the ninth when Olivares' bad-hop triple plated Alex Gordon, and Olivares then came around on Lopez's single.
Carrasco gave up seven hits in a season-high seven innings while wearing No. 21 as part of the MLB-wide celebration of Roberto Clemente Day. He won the 2019 Roberto Clemente Award for his numerous community endeavors.
The right-hander had six strikeouts, moving into fourth place in Indians history with 1,281. He surpassed Hall of Famers Bob Lemon and Early Wynn, who both had 1,277.
''It was an honor to wear No. 21 today for a lot of reasons,'' Carrasco said. ''Roberto Clemente was great, on and off the field.''
Delino DeShields went 3 for 4 with a triple for Cleveland, which fell one game behind the first-place White Sox in the AL Central.
Lopez singled three times and Kansas City teammates Whit Merrifield and Olivares had two hits apiece. Olivares has a six-game hitting streak and is batting .385 since joining the Royals in a trade with San Diego.
Indians manager Terry Francona, who briefly visited the ballpark Tuesday, missed his 29th game because of season-long gastrointestinal issues that required surgery.
''I know he's feeling better, but I'm not sure how much better,'' Alomar said.
Kansas City's Bubba Starling made the defensive play of the night in the dugout. Mondesi lost control of his bat while swinging at a pitch in the first, sending it airborne. The bat struck the netting on top of the first-base dugout, and Starling made a one-hand grab to prevent it from striking any teammates.
Alomar, Lindor, C Roberto Perez and assistant hitting coach Victor Rodriguez - all natives of Puerto Rico - joined Carrasco in wearing No. 21, along with LHP Brad Hand, the Indians' 2020 Roberto Clemente Award nominee. Kansas City did not have any active players participate.
Royals: C Salvador Perez (left eye), who has been on the 10-day injured list since Aug. 21, took batting practice Monday at the alternate training site. Perez has been affected by blurry vision.
Indians: 3B Jose Ramirez (left hand bruise) batted second and went 0 for 2 after sitting out Tuesday. Alomar said Ramirez feels no pain when he bats right-handed, but is unable to switch-hit until the swelling subsides.
Royals: RHP Brady Singer (1-4, 5.58 ERA) has not won in five road starts this season despite holding opponents to a .232 average. He is 0-2 with 24 strikeouts in 25 2/3 innings away from Kansas City.
Indians: RHP Aaron Civale (3-4, 3.72 ERA) is tied with teammate Shane Bieber and Texas' Lance Lynn for first in the majors with eight starts of at least six innings. Civale's last home victory was on July 28.
More AP MLB: https://apnews.com/MLB and https://twitter.com/AP-Sports
Copyright 2020 STATS LLC and Associated Press. Any commercial use or distribution without the express written consent of STATS LLC and Associated Press is strictly prohibited.