The 26-year-old left-hander was 9-12 with a 2.53 ERA in 25 starts and six relief appearances last year for the AL champions and held opponents to a .209 average. He won the AL Division Series opener against the Los Angeles Angels, when he pitched a scoreless 10th inning.
Duffy can earn $25,000 in performance bonuses under Friday's agreement: $10,000 for 20 starts and $15,000 more for 25. He would get a $50,000 bonus if he's an All-Star.
Duffy made $526,000 last year and was eligible for arbitration for the first time. He had asked for $3 million when proposed arbitration figures were exchanged last month, and the Royals had offered $1.75 million.