The 25-year-old defenseman could have become a restricted free agent July 1.
Kulak appeared in 57 games for the Canadiens this season and had NHL career highs in goals (six), assists (11), points (17), average ice time (17:51) and plus-minus rating (plus-12). The Canadiens acquired Kulak from the Calgary Flames on Oct. 1 in a trade for defensemen Matt Taormina and Rinat Valiev.
"When I got the opportunity to sign the three years, it was a no-brainer for me," Kulak told the Canadiens website. "That's the dream growing up: when you work, you want to play at the highest level in the world. And I think the Canadiens are probably the best franchise in the world and hockey market to play in. That's the dream and the goal to work towards. I didn't hesitate when I got the chance to sign for three years."
He said his style of play meshed perfectly with Montreal's structure under coach Claude Julien.
"The style, the game that the coaches want to push on the team; the speed, the skating, it plays right into the strengths of my game with my skating, puck movement, and getting into transitioning quickly," Kulak said. "It was an easy transition for me into the group, even at the start. Right from the start, really, I just jumped in. And obviously, the coaches help you along a little ways. But it just felt pretty natural for me jumping into their system."
Kulak has 28 points (eight goals, 20 assists) in 158 NHL games with the Canadiens and Flames, who selected him in the fourth round (No. 105) of the 2012 NHL Draft.