Virat Kohli (52 from 41 balls) and Rishabh Pant (52 from 28 balls) fired India to 186-5 batting first.
Nicholas Pooran (62 from 41 balls) and Rovman Powell (68 from 36 balls) led the West Indies response but they fell just short.
The three-match series concludes in Kolkata on Sunday.
West Indies elected to field first after winning the toss, hoping to take advantage of the dew later in the evening.
Indian openers Ishan Kishan (2) and Rohit Sharma (19) both fell early before Roston Chase had Suryakumar Yadav (8) caught and bowled.
Kohli helped take India past 100 before he was bowled by Chase, who finished with 3-25.
Pant and Venkatesh Iyer (33 from 18 balls) went on the attack in the final overs to push India to a competitive total.
West Indies made a slow start in response as openers Brandon King (22 from 30 balls) and Kyle Mayers (nine from 10 balls) struggled to find the boundary.
Pooran and Powell upped the scoring to keep West Indies in the chase, but a tight 19th over from Bhuvneshwar Kumar proved crucial.
Kumar had Pooran caught and conceded just four runs, leaving West Indies needing 25 from the final over, which they could not manage despite back-to-back sixes from Powell.