The agreement, which is pending a physical, was first reported by Yahoo.
The deal could be worth up to $22.7 million over two seasons, a person familiar with negotiations told The Associated Press. Moustakas gets a $5.5 million salary this year and has the chance to earn $2.2 million in performance bonuses based on plate appearances. The deal includes a $15 million mutual option for 2019 with a $1 million buyout.
Moustakas turned down a $17.4 million, one-year qualifying offer from the Royals in November. In a historically slow free-agent market, he found the interest of many teams dimmed because a deal with him would require compensation such as a loss of draft picks and/or international signing bonus allotment.
Moustakas was one of several high-profile free agents yet to sign, even with spring training in full swing. Others include Jake Arrieta, Alex Cobb, Lance Lynn and Greg Holland. That group has opted to work out individually instead of joining the free agent camp held in Florida.
Coming off his second All-Star appearance, the 29-year-old Moustakas hit .272 last year with 24 doubles and 151 hits while also setting career highs in home runs (38), RBIs (85) and slugging (.521) for Kansas City.
His 38 home runs broke the Royals' single-season record of 36 set by Steve Balboni in 1985.
Moustakas was one of four Royals, along with first baseman Eric Hosmer, outfielder Lorenzo Cain and shortstop Alcides Escobar, who made their Kansas City debuts in 2011 and keyed the team's run to consecutive World Series, including a championship in 2015. They all became eligible for free agency after the season.
The left-handed-hitting third baseman has a .251 average with 119 home runs and 379 RBIs in 836 games over his six-year career.
Information from ESPN's Jerry Crasnick and The Associated Press was used in this report.