KANSAS CITY, Mo. — If the Boston Red Sox keep getting this kind of pitching and hitting, their first 100-win season in more than seven decades seems a lock.

Rick Porcello matched his victory total from last year, pitching seven effective innings, Andrew Benintendi had four hits and scored twice, and the Red Sox beat the Kansas City Royals 7-4 on Sunday.

The Red Sox hit .385, 45 for 111, and had 68 base runners in sweeping the three-game series. Boston has won six straight and 13 of 16 and own the best record in the majors at 62-29.

“One through nine, they’re all great hitters,” losing pitcher Heath Fillmyer (0-1) said after his first big-league start. “That’s probably why they’re in the position they are this year.”

The Red Sox haven’t won 100 games since 1946.

Porcello (11-3), who was 11-17 in 2017, allowed three runs on nine hits before leaving after 111 pitches. He struck out nine, matching his season high, and walked one. Craig Kimbrel got the final two outs for his 27th save in 29 chances.

Benintendi extended his on-base streak to 10 straight — six hits and four walks — before striking out in the eighth.

“I thought I was patient up there,” Benintendi said. “I was trying to get pitches I could handle and was able to do that.”

Drew Butera singled and Whit Merrifield doubled to lead off the Kansas City seventh, but Porcello stranded them by striking out Jorge Bonifacio and Mike Moustakas and retiring Lucas Duda on a fly ball.

“I went out there with the thought of taking him out,” Red Sox manager Alex Cora said after Merrifield’s hit. “I think with the lead and the conviction he told me, ‘I got it,’ we went hitter by hitter and he got them.”

Porcello persuaded Cora to let him get out of the jam.

“I just tried to make my best case for staying in,” Porcello said. “I felt like I was throwing the ball well. They got runners at second and third with nobody out and I felt like I could get out of it and limit the damage. I felt like it was my mess to clean up. Guys in the bullpen have been getting a lot of work lately and that was my job. Our offense did a great job of putting runs up and that should’ve been a shutdown inning. I wanted it and he gave it to me.”

Eduardo Nunez drove in two Boston runs with singles in the fourth and seventh. Mitch Moreland walked with the base loaded in the fifth and singled in a run in the seventh. Xavier Bogaerts also contributed an RBI-double in a three-run seventh.

Merrifield singled in a run in the ninth for his first five-hit game. Bonifacio drove in two KC runs with a third-inning double.

“Anytime you can get five hits, that’s a good day,” Merrifield said. “But a tough day for us as a team.”

Fillmyer allowed four runs, one unearned, on eight hits and three walks. He was filling in for Jakob Junis, who went on the disabled list with back tightness.

“I just try to minimize the mistakes. I think I learned a lot from it,” Fillmyer said. “Hopefully, the next start I can put together a few things and give them a little bit more.”

The Royals, who turned five double plays, lost their ninth straight to match their longest of skid this season and are 4-27 in their last 31 games. They are 38 games below .500 for the first time since ending the 2006 season 62-100.

ROYALS SIGN TEENAGE PITCHER: The Royals signed RHP Kaito Yuki, 16, from Osaka, Japan. He opted to sign a professional contract in lieu of going to high school.

ESCOBAR STREAK ENDS: Royals SS Alcides Escobar was not in the lineup after starting the previous 421 games, which was the longest active streak in the majors.

ROSTER MOVES: Red Sox: RHPs Ryan Brasier and William Cuevas were promoted from Triple-A Pawtucket. Brasier last pitched in the majors in 2013 with the Angels and spent last year in Japan. Cuevas was 5-5 with a 3.65 ERA in 15 starts with Pawtucket.

TRAINER’S ROOM: Red Sox: DH J.D. Martinez was held out of the lineup after fouling pitches off his right foot and left calf on Saturday. “He’s a little banged up,” Red Sox manager Alex Cora said. “It made sense to stay away from him. We’ll give him one day and he’ll be back in the starting lineup tomorrow.”

C Christian Vazquez (broken right pinkie) went on the disabled list and will see a hand specialist Monday in Boston. LHP Brian Johnson (left hip inflammation) was placed on the 10-day DL.

Royals: Junis’s DL is retroactive to July 3.

UP NEXT: Red Sox: LHP Eduardo Rodriguez (10-3, 3.84) will start the series opener Monday against the Rangers at Fenway Park.

Royals: LHP Danny Duffy (4-8, 5.19 ERA) will start Monday in Minnesota as the club opens a six-game trip.

Saturday night’s game

KANSAS CITY, Mo. — Andrew Benintendi and the Red Sox easily made up for David Price’s bad outing.

Benintendi homered, doubled, walked a career-high four times and scored four runs, and Boston routed the Kansas City Royals 15-4 on Saturday night.

Mookie Betts had four hits, raising his American League-leading average to .343. Ten Red Sox players had RBIs as they scored a season high in runs. They scored 11 runs after the sixth inning.

They needed the big finish to overcome Price’s poor start. He was lifted after 4 2/3 innings, allowing four runs on six hits with nine strikeouts.

“I put us in a hole early,” Price said. “We bounced back in the fifth inning with that four-spot then to give up the lead the way I did, not to be able to get through five innings, that’s tough. I’m struggling right now, searching, so that’s a big win for us to be able to come back the way we did.”

Benintendi became the sixth Boston player to walk four times and homer in a nine-inning game.

Xander Bogaerts had three RBIs for the Red Sox, who have won five straight and 12 of their past 15.

Christian Vazquez had a two-run, two-out single in the seventh.

Royals pitchers walked 13, one shy of the franchise record, including three in the three-run seventh. Mitch Moreland’s sacrifice fly scored Benintendi, who led off the inning with his fourth walk, for the first run of the inning.

The Red Sox rallied from a three-run deficit to take the lead with a four-run fifth, which Bogaerts highlighted with a three-run double.

“(Brad Keller) was on,” Bogaerts said of the KC starter. “It was a tough pitch. Good thing I hit it hard and it kind of ran away from (center fielder Alcides) Escobar. He was throwing a good game until that last inning. He started to lose a little command. The walks might have got them in a little trouble — two-out walks, leadoff walks.”

Keller walked five, including Benintendi and Moreland in the fifth to load the bases before Bogaerts’ double. J.D. Martinez singled in the initial run of the inning, hiking his major league-leading RBI total to 74.

“He got into the fifth inning and got two quick outs,” Royals manager Ned Yost said. “He just couldn’t make that pitch to get through that inning at that point.”

The next five batters reached base, four scored and Keller was pulled.

“You get two outs and think on the attack, but unfortunately it snowballed really quick on me,” Keller said.

Price, who had never hit three batters in a game, hit three Royals in a four-batter span, including Lucas Duda with the bases loaded to bring home Whit Merrifield in the fifth to tie the score at 4.

Heath Hembree (4-1) worked 1 1/3 hitless innings to pick up the victory. Jason Adam (0-2), the third of seven KC pitchers, took the loss. Catcher Drew Butera got the final out in his sixth career relief appearance and his first since 2016.

“I was trying not to get anybody hurt, including myself,” Butera said.

The Royals led 3-0 after Duda homered in the second and they scored twice more in the third.

The Royals have lost eight straight and 27 of 32 to fall 38 games below .500 for the first time since ending the 2006 season 62-100. They have lost 14 of their past 15 games at Kauffman Stadium.

LONGEST GAME: The game lasted 4 hours, 3 minutes, the longest nine-inning game for both clubs this season.

MOUSTAKAS AT FIRST: Mike Moustakas, who normally plays third, made his third start of the season at first. It was probably no coincidence a Yankees scout was in attendance and they are in the market for a first baseman.

ROSTER MOVE: The Royals placed RHP Justin Grimm on unconditional release waivers. Grimm had been on the disabled list with a right shoulder impingement. He was 1-3 with a 13.50 ERA in 16 relief appearances.