McCullum was 143 not out at the close of play, his eighth Test century, while Williamson was dismissed after tea for 113, his fifth Test hundred.
Williamson's century was his sixth score over 50 in succession against the tourists, having scored a half century in each of the five one day internationals that preceded the two-match Test series.
The pair combined for a 221-run partnership after the hosts had been reduced to 30 for three early in the first session when India captain Mahendra Singh Dhoni had won his sixth successive toss on tour and put New Zealand into bat.
All-rounder Corey Anderson (42) was with McCullum at the close of play with Ishant Sharma and Zaheer Khan taking two wickets each.
"It was pretty tricky early on for the openers so to get through that period and kick on in partnership with Brendon was fantastic," Williamson told RadioSport.
"It's nice to put the score on the board ... but the most pleasing thing was getting the innings back on track.
"It's a very good batting track so we need to keep batting ... and make sure that we have a really good innings to bowl at."
Dhoni's three-pronged pace attack of Mohammed Shami, Zaheer Khan and Ishant Sharma exploited the green drop-in pitch and cool, overcast conditions to knock the top off New Zealand's batting and expose their middle order before the break.
Sharma had Hamish Rutherford well caught by a diving Ajinkya Rahane in the gully for six then Zaheer trapped Peter Fulton in front for 13 before Sharma had Ross Taylor caught by Ravindra Jadeja for three.
Taylor's dismissal put the hosts in a spot of bother before Williamson and McCullum consolidated, adding another 24 runs before lunch.
India's bowlers were unable to sustain their disciplined line and length after lunch and were punished for bowling too short or too full, while their fielding, especially catching, was sub-standard.
The New Zealand pair seized on the inconsistency and while the 23-year-old Williamson was dropped on 32 by Murali Vijay at first slip off Shami shortly after lunch, their counter-attacking style wore down the threadbare Indian attack.
The pair scored 125 runs in 27 overs in the middle session as Dhoni became more defensive in his field placings, pushing fielders deeper and wider, which allowed New Zealand to keep the scoreboard ticking over with easy singles.
They appeared to be in a personal race after tea to reach their century first with virtually identical strike rates before McCullum pulled away in the 90s and belted the first six of his innings to bring up the milestone off 135 balls.
Williamson accumulated through the 90s before he punched Ravindra Jadeja through extra cover for two runs to bring up his century and continue a golden run of form.
The right-hander has scored 817 runs at an average of 54.46 in the 10 Test matches in the past 12 months with two centuries and seven half centuries.
He was eventually dismissed when he glanced an innocuous Zaheer delivery to Dhoni down the leg side before McCullum and Anderson put on an unbroken 78-run partnership with the hosts looking well set to push on to a first innings total in excess of 400 on Friday.
"It's an outstanding position, we just have to make sure that we push on," McCullum told Sky Television.
"Kane was brilliant today, he's such a mature guy for someone so young. He was outstanding to bat with and took a lot of pressure off me."