The Black Caps, sent in to bat at Eden Park, reached 4-329 at stumps on the opening day.
McCullum remained unbeaten on 143, while Corey Anderson was not out 42.
Williamson made 113 before he was caught behind off seamer Zaheer Khan while trying to glance a leg-side delivery.
He and McCullum came together with the Black Caps struggling at 3-30 and they swung the momentum with a 221-run stand.
After negotiating their way to lunch, they lifted the tempo, as cloud cover gave way to sunshine and a green-tinged pitch appeared to settle.
McCullum was content to find his way early on before producing some controlled aggression.
He brought up his eighth Test century by lofting spinner Ravindra Jadeja for a six over long-on.
Williamson got to his fifth Test ton 10 balls later.
His innings continues his excellent form against the tourists, against whom he scored half-centuries in each of the five one-dayers.
He had a let-off on 32, edging a Mohammed Shami delivery to first slip, where Murali Vijay spilled a knee-high catch.
But Williamson showed plenty of fine strokeplay, such as a classy cover drive for four that brought up the hundred partnership.
He and his skipper added 125 during the middle session, with McCullum showing his increasing aggressive intent when he cut seamer Ishant Sharma for successive fours.
Williamson followed up in the next over by hooking a Shami delivery for six to bring up the New Zealand hundred.
He again cleared the rope to reach his 50, top-edging a Khan bouncer over the short fine-leg boundary.
India skipper MS Dhoni, who won all five tosses against McCullum in the one-day series, continued that run as the two-Test series began.
Dhoni's decision to bowl got early reward with openers Hamish Rutherford (6) and Peter Fulton (13), and danger man Ross Taylor (3) all out cheaply.
During a cold, windy morning session, a lively Ishant claimed two of the wickets to fall.
He was the pick of the Indian bowlers, ending the day with 2-62, while Khan had 2-98.