SAN FRANCISCO — On a lethargic night at Oracle Park, there was not a single facet of the game where the Giants outplayed the Mets.

The Mets had better hitting. The Mets had stronger pitching. The Mets had crisper fielding. Christian Koss, a position player, pitched the ninth inning. The Giants totaled three hits and as many errors.

Saturday’s final score, 9-0 in the visitor’s favor, only partially encapsulates the degree to which New York (5-4) outplayed San Francisco (3-6) in front of a packed house that had more reasons to groan than reasons to cheer.

“I would just lump the (last) two games together,” said manager Tony Vitello, referring to Friday’s 10-3 loss. “They’ve done a really, really good job of swinging the bat. But also, you’d be hard-pressed to find an inning where they scored where there wasn’t potential for the inning to be over or there wasn’t a free pass in there.”

Right-hander Landen Roupp started his night strong, striking out the first four batters he faced, but ended the night with a clunker: 4 2/3 innings, seven runs, six earned. On a night where Clay Holmes was dominant, tossing seven scoreless innings with four strikeouts, Roupp exceeded his minuscule margin of error.

With the caveat that the season is only nine games old, the Giants’ offense has either been all boom or all bust. In their three wins, they’re averaging 6.3 runs and 11.6 hits. In their six losses, they’re averaging 0.8 runs and 4.2 hits.

One of the few moments that the home crowd could applaud was Koss, who pitched a scoreless ninth inning and has yet to allow a run over five career innings. Koss, interestingly enough, made his first pitching appearance this season before getting his first at-bat.

Vitello could’ve used the blowout as an opportunity to get Koss and Jared Oliva their first at-bats of the year, but elected to give every plate appearance to his starters. When asked if he considered getting Koss or Oliva an at-bat, Vitello cited his desire to get some of his starters into a rhythm.

“With (Harrison) Bader missing some time — obviously did play in the (World Baseball Classic) — but with him missing time like (Rafael Devers), playing a little bit of catch-up there,” Vitello said. “But also kind of like (Patrick Bailey), the swing he had prior to his last at-bat, would like to get those guys in a rhythm. … I think if you’re watching with even just a half-trained eye, you can kind of see when a guy’s kind of in the right spot in the box and when he’s not.”

If Roupp had sharper defense behind him, the trajectory of his second outing of the season would’ve looked vastly different given he totaled seven strikeouts and minimized hard contact.

San Francisco’s defense committed two errors behind Roupp, both of which were on the same play. In the top of the second with the bases loaded, the Mets’ Carson Benge hit a slow roller to the left side of the infield. Third baseman Matt Chapman charged hard and fielded the ball, but the ball popped out of his glove on the exchange.

Chapman recovered and snatched the ball before it hit the ground and fired to first, but Jerar Encarnacion couldn’t make the catch and the ball skurried away. Two runs scored, and Chapman and Encarnacion were both dinged for errors.

“Certainly no bad body language, no pointing the fingers and the appropriate response of being pissed,” Vitello said of Roupp. “There’s really no other way to say it. If it means a lot to you, then natural emotion is going to come out.”

That sequence was the beginning, not the end, of the Giants’ defensive lowlights.

In the fifth with no outs and Luis Torrens on first, Francisco Lindor hit a grounder to Encarnacion’s right. If Encarnacion had fielded the ball clean, the Giants could’ve gotten the force out at second. Instead, Encarnacion awkwardly went into a half dive and could only knock the ball down. Roupp, sprinting over from the mound, picked up the ball and tagged first for the out.

Encarnacion wasn’t charged with an error, but the inability to get the lead runner hurt. Bo Bichette, the next batter, snuck a single past shortstop Willy Adames, allowing Torrens to score from second. It was one of five runs that the Giants allowed in the fifth, a defining frame that effectively sealed the game for New York.

More sloppy defense was ahead. In the seventh and Brett Baty on second, the Mets’ Tyrone Taylor, who hit a pinch-hit three-run homer in the fifth, lined a single to right field. Baty scored easily, and right fielder Jung Hoo Lee’s throw skipped to the back stop, gifting Taylor a free base.

On the very next pitch, Keaton Winn spiked a splitter that bounced in front of home plate. Catcher Patrick Bailey went for the pick instead of a block, and Winn’s splitter banged off the backstop.