Joe Kennedy was selected by the Tampa Bay Devil Rays in the eighth round of the 1998 amateur draft and made his pro debut that year with the Princeton Devil Rays that summer, going 6-4 with a 3.76 ERA in 13 starts. He spent the entire 1999 campaign with the Hudson Valley Renegades, where he went 6-5 with a 2.65 ERA and 101 strikeouts in 16 starts. He led the New York-Penn League in strikeouts, starts and innings pitched (95). He was 5th in ERA and made the NYPL All-Star team as the top left-handed pitcher. The next season he continued to put up impressive numbers, this year with the Charleston RiverDogs, with whom he was 11-6 with a 3.31 ERA and 142 strikeouts in 136 innings. He had a 17-strikeout game, the best in the affiliated US minor leagues that year.

Kennedy went 6-0 with a 0.99 ERA in 2001 in 11 starts between the Orlando Rays and Durham Bulls; at one point, he did not allow a run in five straight starts. Baseball America named him the top pitching prospect and #4 prospect overall in the 2001 Southern League. He was called up to join the Devil Rays rotation in June. He went 7-8 with a 4.44 ERA in 20 starts in his rookie campaign in the majors. The next year, he went 8-11 with a 4.53 ERA in a full season with the Rays. He also finished second in the American League with 5 complete games. In 2003, he went 3-12 with a 6.13 ERA for the club and was moved to the bullpen for part of the season.

Following the 2003 season, Kennedy was sent to the Colorado Rockies as part of a three team trade. He responded by having his best season in the majors, going 9-7 with a 3.66 ERA for the Rockies. Despite playing his home games at Coors Field, he put up better numbers at home, posting a 6-1 mark and notching a 3.59 ERA in Colorado. He went 4-8 in the first half of the 2005 season and his ERA ballooned to 7.08 before the Rockies traded him to the Oakland Athletics in midseason. Splitting the remainder of the year between the bullpen and the rotation, he went 4-5 with a 4.45 ERA.

Kennedy pitched entirely out of the pen for the A's in 2006, going 4-1 with a 2.31 ERA in 39 games. He earned himself the number 5 starter spot in the Oakland rotation in spring 2007. He was 2-7 with a 4.28 ERA when he lost his starting spot with the club in July. About a month later, he was selected off waivers by the Arizona Diamondbacks. With Arizona, he allowed 6 earned runs in 3 relief appearances, and he was released after less than two weeks with the club. He was subsequently signed by the Toronto Blue Jays, with whom he went 1-0 with a 5.14 ERA in 9 appearances out of the pen. Kennedy became a free agent following the season.