A day after the sides reached a tentative agreement, Penny passed a physical. The two-time All-Star got a one-year contract for $7.5 million, with about $1.5 million more available in performance bonuses.
Penny went a combined 11-9 with a 4.88 ERA in 30 starts for Boston and San Francisco last season. He recently turned down a one-year offer to stay with the Giants.
Penny helped Florida win the 2003 World Series, although Cardinals manager Tony La Russa already had his eye on the burly right-hander. That season, St. Louis and the Marlins began sharing a spring training complex in Jupiter, Fla.
"Whenever a guy faces you and you're not happy when he gets announced, you always think, 'Boy, it would be nice to get him on your side,'" La Russa said. "So I'm going back to the Marlin days of spring training, that season and ever since. He's a guy that we thought would be a real good starter for our side."
"Brad Penny has long been a pitcher of interest to us and we are thrilled to have him," Cardinals general manager John Mozeliak said in a statement. "By teaming Brad with our Cy Young finalists Chris Carpenter and Adam Wainwright, in addition to Kyle Lohse, we feel that our pitching staff will continue to be a key cornerstone for the ballclub."
The 31-year-old Penny has spent most of his career in the National League. He was an All-Star in 2006 and 2007, winning a career-high 16 games each season.
Shoulder trouble hampered Penny in 2008. He signed a $5 million, one-year contract with Boston last offseason, but went 7-8 with a 5.61 ERA for the Red Sox and got released in August.
Penny signed with the Giants on Aug. 31 and went 4-1 with a 2.59 ERA in six starts for them. He is 105-84 lifetime.