The deal, which includes performance bonuses, is subject to Cabrera passing a physical. The Royals confirmed the agreement on Friday.
Cabrera was obtained by the Atlanta Braves a year ago as part of a five-player trade that sent right-hander Javier Vazquez to the New York Yankees. The 26-year-old Cabrera hit .255 with four homers and 42 RBIs and started in 115 games during the regular season, then went 0-for-8 against San Francisco in the NL playoffs.
Cabrera made $3.1 million and was eligible for salary arbitration before Atlanta released him in October.