The deal will pay Francis a base salary of $2 million, a baseball source said. Francis has an opportunity to earn an additional $2 million in performance bonuses based on starts and innings pitched.
Francis, 30, has a 55-50 record with a 4.77 ERA in six seasons with the Colorado Rockies. He went 4-6 with a 5.00 ERA last season in his comeback from shoulder surgery that he had in February 2009.
"I've been feeling really good," Francis said, according to The Associated Press. "I've been able to do anything I wanted to up to this point. I'm excited about it.
I'll be ready to go for spring training."
The Royals also agreed to terms with outfielder Alex Gordon on a one-year deal.
Gordon has been a major disappointment since being the overall No. 2 pick in the 2005 draft. Projected as a future star at third base, he moved to the outfield last year after a stint in the minor leagues.
Francis slots into a Royals rotation that will have a much different look now that Zack Greinke has been traded to Milwaukee, Gil Meche is moving to the bullpen, Brian Bannister has departed for Japan and 12-game winner Bruce Chen is still on the free-agent market.
Luke Hochevar, Kyle Davies, Vin Mazzaro and Sean O'Sullivan are the other top candidates for starting jobs in Kansas City, and sources said the Royals have been trolling the free-agent market for another starter in addition to Francis.
Kansas City also has several highly regarded minor league prospects -- including Mike Montgomery, John Lamb, Aaron Crow and Danny Duffy -- working their way through the system.
Francis will be reunited in Kansas City with Bob McClure, his former pitching coach in the Rockies organization.
Jerry Crasnick is a senior baseball writer for ESPN.com. Information from The Associated Press was used in this report.