McLain's three-run blast to left-center highlighted a five-run fifth inning during which the Reds hit three homers
With one out in the frame, Stuart Fairchild hit his fourth homer. One out later, McLain and Jonathan India delivered back-to-back home runs.
McLain hit his third homer and India his eighth as the Reds grabbed a 7-1 lead. The pair combined for four hits and five RBIs
Spencer Steer's ninth homer, a one-out solo shot to left, opened the scoring for Cincinnati in the second.
After Bobby Witt Jr.'s single tied the game 1-1 in the third, Cincinnati retook the lead in the fourth when McLain bunted and was ruled safe on an overturned call then scored on India's double for a 2-1 advantage.
Ben Lively (4-4) scattered 10 hits over 5 2/3 innings, allowing two runs and striking out four. He exited after Dairon Blanco's RBI double in the sixth cut the deficit to 7-2.
Kansas City's Maikel Garcia tripled and scored on MJ Melendez's grounder to lead off the seventh.
The Reds' fourth error of the game led to a ninth-inning run, capping the scoring as Alexis Diaz recorded the final two outs for his 17th save
Royals starter Daniel Lynch (0-3), who had allowed just one home run over his first three starts, surrendered a career-high four while finishing seven innings. He allowed seven runs on seven hits with two walks and three strikeouts
The Reds' four homers matched a season high
Having won five straight and eight of 10, Cincinnati will open a three-game series in Houston on Friday.
Edward Olivares had four of the Royals' 15 hits. Kansas City went 2-for-14 with runners in scoring position and stranded 14 runners
Salvador Perez left the game in the third inning, suffering a bruised left hand after being hit by a pitch. He is considered day-to-day.
Kansas City has lost nine straight and 12 of 13.
The Royals have dropped 10 of 11 home series, including four series sweeps. They begin a three-game series Friday, hosting the Los Angeles Angels
--- Field Level Media