According to ESPN's Adam Schefter, McKinnon will ink a four-year, $30 million contract.
McKinnon, 25, rushed for 570 yards and three touchdowns for the Minnesota Vikings in 2017, averaging 3.8 yards per carry. He also caught 51 passes for 421 yards and another two scores. His rushing yards, receiving yards, receptions and total touchdowns were all career highs.
The running back was expected to serve as a backup after the Vikings drafted Dalvin Cook in the second round and signed Latavius Murray to a three-year, $15 million contract before the 2017 campaign. But Cook tore his ACL in early October, so Murray and McKinnon split backfield duties as the Vikings marched to the postseason.
Murray was the more effective rusher down the stretch, while McKinnon offered more of a threat as a receiver out of the backfield.
That left the Vikings with questions. They could re-sign McKinnon and release Murray, whose contract isn't fully guaranteed until the third day of the 2018 league year. They could let McKinnon walk and keep Murray under contract. Or they could keep both players and dedicate a decent chunk of money to the position.
The Vikings took the second option.
McKinnon hasn't been a three-down feature back during his career, but the Niners contract suggests the team may try him in that role.
With Hyde out of the picture, look for McKinnon to be San Francisco's No. 1 guy in the backfield with Matt Breida and Joe Williams providing depth.