https://developer.roblox.com/en-us/api-reference/class/Tool
I’m pretty sure you already know about this but if you don’t use the tool.Equipped and tool.Unequipped event and when you unequip it, you just parent the model to your character (no, it shouldn’t be a tool) and create a joint.
https://developer.roblox.com/en-us/api-reference/class/Motor6D
I usually use motor6ds for joints related to the character, you should look into the C0 property (offset from the Part0 of a motor6d) and construct a new CFrame (with CFrame.new() and CFrame.Angles())
here would be an example of code using the property C0.
local char = player.Character
local root = char.HumanoidRootPart
local box = char.Box
local motor6d = box.Motor6D
motor6d.Part1 = box
motor6d.Part0 = char.HumanoidRootPart
-- if you haven't learned about cframes yet, i suggest learning about it right now.
local positionalOffset = CFrame.new(0,5,-5) -- in this case, it would be 5 units above the humanoidrootpart and 5 units in front of it too.
local OrientationalOffset = CFrame.Angles(math.rad(90),math.rad(0),math.rad(0)) -- we use math.rad() since CFrame.Angles() takes radians. it will tilt it 90 degrees in the x axis relative to the humanoidrootpart.
motor6d.C0 = positionalOffset*OrientationalOffset -- so it will be 5 units in front of the humanoidrootpart, 5 units above it, and will be tilted 90 degrees in the x axis relative to it.