Both - Consider Procedural Animation
For example, you could create an animation that linearly rotates the weapon a specific angle (moving both hands and whatever else you need with it), but not "play" it in its entirety but set at which point in the animation you are via script. Say you have a max. rotation of 90 degrees, you could make the animation "take" 90 seconds and just assign myAnimation.time = kickbackInDegrees. The same can be done with a second animation for left/right kick.
This approach works well for complex and/or cumulative inputs like your cumulative recoil (multiple shots in rapid succession kick more than a single shot).