Carpenter attended East Fairmont High School in Fairmont, West Virginia and then West Virginia University, where he played college baseball for the West Virginia Mountaineers baseball team from 2004 to 2006. While at West Virginia University, Carpenter was a catcher. In 2004, he batted .235 in 81 at-bats, in 2005 he batted .282 in 110 at-bats and in 2006 he batted .316 with 38 RBI in 187 at-bats.
The St. Louis Cardinals selected Carpenter in the 12th round of the 2006 MLB Draft. Carpenter played for the State College Spikes in 2006, hitting .189 in 37 games. In 2007, he hit .220 for the GCL Cardinals and Batavia Muckdogs. He both caught and pitched in 2008 – he caught for the Quad Cities River Bandits and Palm Beach Cardinals (hitting .215 in 65 at-bats) and he pitched for the GCL Cardinals and Johnson City Cardinals (posting a 1.84 ERA in 15 relief appearances while striking out 17 batters in 14 2/3 innings). For the 2009 season, he converted to pitching full-time and went 5–3 with a 4.28 ERA in 52 relief appearances for the River Bandits, striking out 77 batters in 67 1/3 innings. In 2010, he began the season with the Palm Beach Cardinals.
On August 19, 2010, he was traded to the Houston Astros for Pedro Feliz. He finished the season with the Lancaster Jethawks and went a combined 6–4 with a 2.51 ERA in 55 games, finishing 49 and saving 20.
Carpenter split the 2011 season between the major and minor leagues. At the minor league level, he went 0–1 with 14 saves and a 1.91 ERA in 33 games for the Corpus Christi Hooks and Oklahoma City RedHawks, while striking out 38 batters in 33 innings. He made his major league debut with the Astros on June 30 of that year, going 1–3 with a 2.93 ERA in 34 games. In 27.2 innings, he had 29 strikeouts.
Carpenter was traded to the Toronto Blue Jays on July 20, 2012, along with Brandon Lyon, and J. A. Happ, for Francisco Cordero, Ben Francisco, Asher Wojciechowski, David Rollins, Joe Musgrove, and Carlos Pérez. Carpenter was assigned to the Las Vegas 51s. Carpenter was called up to the Jays on August 10 after Brett Lawrie was placed on the disabled list. On the same day, Carpenter appeared in a game, becoming the 32nd pitcher used by the Jays in the 2012 season (a club record at the time), but was optioned back to Las Vegas after the game to make room for Mike McCoy. Carpenter was recalled to the Blue Jays active roster on September 7 after the Las Vegas 51s season ended.
On October 21, 2012, he was traded to the Red Sox for infielder Mike Aviles, after Aviles had been the agreed-upon compensation for the Red Sox signing incumbent Blue Jays manager John Farrell to fill that role for them. A player cannot in actuality be traded directly for a manager – he must be traded for another player – so this is why the Blue Jays sent Carpenter to Boston. On November 20, Carpenter was designated for assignment with four others.
The Atlanta Braves claimed Carpenter on waivers on November 30, 2012. He was optioned to the Triple-A Gwinnett Braves on March 26. He was recalled on April 20, then optioned back to Gwinnett on April 22. He was recalled again on April 30. Carpenter ended up making his Braves debut on May 10, giving up 2 runs in 2.1 innings against the Giants. Carpenter spent the rest of the year in the Braves bullpen, where in 56 appearances, he was 4–1 with a 1.78 ERA and 12 holds, striking out 74 in 65.2 innings. Carpenter was the losing pitcher in Game 4 of the 2013 NLDS, during which he gave up a two run homer to Juan Uribe that would win the game for the Los Angeles Dodgers, ending the Braves' postseason run.
Carpenter began 2014 with Atlanta as their setup man. On June 17, Carpenter was fined an undisclosed amount for throwing at Corey Dickerson on June 12. The incident started after Dickerson hit catcher Gerald Laird twice in one at-bat, once on a foul tip and once with on the backswing of the bat. Carpenter then hit Dickerson on the hip with a fastball. He was also placed on the disabled list that day, and was replaced by Pedro Beato. In 34 appearances before the stint on the disabled list, Carpenter was 4–1 with a 4.23 ERA and 10 holds and 35 strikeouts.
The Braves traded Carpenter and Chasen Shreve to the New York Yankees for Manny Banuelos on January 1, 2015. On June 3, Carpenter was designated for assignment by the Yankees. He appeared in 22 games for the Yankees with a 4.82 ERA.
On June 11, 2015, Carpenter was traded to the Washington Nationals in exchange for Tony Renda. He pitched in eight games for Washington, then missed the rest of the season due to right shoulder inflammation. He became a free agent after the season.
On November 24, 2015, Carpenter signed a minor league contract with the Atlanta Braves. He was invited to spring training, and released on March 5, 2016.
On March 11, 2016, Carpenter signed a minor league deal with the Tampa Bay Rays. He was released on March 30. On April 7, 2016, Carpenter signed with the Bridgeport Bluefish of the Atlantic League of Professional Baseball. On May 13, 2016, Carpenter signed a minor league deal with the Los Angeles Angels of Anaheim. He was released on June 28, 2016. Carpenter returned to Bridgeport to finish out the 2016 season.
Carpenter signed a minor league contract with the Tampa Bay Rays on January 30, 2017. He was released on March 31, 2017.
On April 6, 2017, Carpenter signed with the Bridgeport Bluefish of the Atlantic League of Professional Baseball.
On July 21, 2017, Carpenter signed a minor league deal with the Arizona Diamondbacks.