Input from VR is available both clientside and serverside in Simulate() all through Input.VR.
Both hands are represented as Input.VR.LeftHand and Input.VR.RightHand, this struct contains the position and rotation of each hand.
You can access the inputs for each hand's controller. This is generic to to support as much of the mainstream controllers as possible.
You can get the finger curl and splay, which allows you to pose the fingers to match your real life fingers in game.
Head mounted device position and rotation can also be accessed simply through Input.VR.Head.
You can get the position and rotation of any puck trackers, and also your base stations if you're not using a quest.
Haptic vibrations can be triggered per hand using Input.VrHand.TriggerHapticVibration you can call this as often as you like, if a haptic event is already running it will be interrupted immediately.
Something to consider is different controllers have different limitations to their haptics, something I've noticed with Oculus controllers is the frequency is a lot less responsive than other controllers for example.