Descalso has a $1.35 million salary this season under the deal announced Tuesday. Arizona has a $2 million option for 2018 with a $150,000 buyout.
The 30-year-old, who bats left-handed, hit .264 with 12 doubles and 38 RBIs in 99 games with the Colorado Rockies last season. He is one of two players since 2010 with 95 or more starts at second base (132), shortstop (141) and third base (97). Descalso played first base, second base, third base, shortstop and left field for the Rockies last season.
He is a career .242 hitter in parts of seven major league seasons with St. Louis and Colorado. A member of the St. Louis Cardinals' 2011 World Series champions, Descalso has appeared in 44 postseason games, fifth most among players since 2011.
To make room, the Diamondbacks designated infielder Phil Gosselin for assignment.