The contract is for $1 million, with a $4 million mutual option for 2022 with a $500,000 buyout.
Marisnick, 29, is a career .229 hitter for three teams in eight major league seasons. He played for the Mets last season and hit .333 with two homers and five RBIs in 16 games.
Chicago is rounding out its roster after it didn't make any major additions for much of the winter. The reigning NL Central champions announced contracts for outfielder Joc Pederson and pitchers Trevor Williams and Andrew Chafin last week.
While Pederson steps in for Kyle Schwarber in left, Marisnick likely is headed for a bench role as a late-inning defensive replacement and pinch runner. He has 73 steals, including a career-high 24 in 2015 with Houston.
Marisnick was selected by Toronto in the third round of the 2009 amateur draft. He was traded to Miami three years later and made his big league debut with the Marlins in 2013.
Information from The Associated Press was used in this report.