The hosts were eight for three in pursuit of 227 all out after McKay had taken the wickets of Kevin Pietersen, Jonathan Trott and Joe Root in his second over.
But Michael Carberry’s 63, a maiden international 50 in a century stand with Eoin Morgan (53), helped to get England within range.
Then even after another three wickets fell for 32, Buttler (65 no) and Ben Stokes’ skilful stand of 75 put them on the brink — and the 23-year-old wicketkeeper-batsman finished the job with three balls to spare after a six and four in the final over off Mitchell Johnson.
Buttler was reprieved lbw on eight when DRS showed the ball from Shane Watson going on to miss leg-stump, and Stokes perhaps got a glove behind on an attempted hook at Johnson but was given not out by Sundaram Ravi on nine.
There was still drama left, after McKay (four for 39) returned to bowl Stokes with a change of pace. But Buttler kept his cool between two late run-out scares to make his second consecutive half-century, from just 41 balls, count as he finished with five fours and two sixes.
England’s was a patchy innings, as had been Australia’s - apart from another fine hand from George Bailey (87) - and the outcome was a far cry from the start of their chase.
Australia 227 (G Bailey 87, M Wade 36) lost to England 231-7 (J Buttler 65 not out; C McKay 4-39).