Franco, who became a free agent when he was non-tendered by the Philadelphia Phillies earlier this offseason, is expected to be the Royals' everyday third baseman.
Hunter Dozier (.279, 26 homers, 84 RBIs) primarily manned third base (91 starts) for the Royals last season, but Kansas City will take advantage of his versatility and move him around the field in 2020. Dozier also had starts at first base and in the outfield last season.
Franco, 27, hit .234 with 17 home runs and 56 RBIs in 123 games last season for Philadelphia.
Before 2019, Franco had hit at least 22 home runs for three consecutive seasons for the Phillies, the only team he has played for in six major league seasons.
He is a .249 hitter with 102 home runs and 343 RBIs in 656 career games.
MLB.com was first to report to Franco's agreement with the Royals.
ESPN's Jeff Passan contributed to this report.