why is hook_access_node running three times?
Yes it’s perfectly usual for a node access hook to be hit multiple times in one request, check the $op parameter to see what you’re dealing with each time.
Checks may be done for different $op values like view,update and delete.
(Answer from @Clive in comments, posted here as answer after his advice. Please see question's comments.)