Hold on, let me send the whole structure here:
this is my Tool’s Explorer View:

this is where the Events are being fired: (The CorePhoneHandler LocalScript)

I have here the ServerScript (which filters the Message that is being sent back to the LocalScript)

Basically, the only thing here is the Tool in StarterPack and the LocalScript in StarterGui
Edit:
If you want to see what the Script does, here’s the snippet on the Tool Activation:
CorePhoneHandler:
local BackPack 	= PLAYER_SERVICE.LocalPlayer.Backpack
local Tool 		= BackPack:WaitForChild("Hologram")
EMOTE_BUTTON.MouseButton1Click:Connect(function()
	if BUTTON_BOOL == true then
		TWEEN_SERVICE:Create(PHONE_GUI, TWEEN[3], {Position = UDim2.fromScale(0.113, 0.499)}):Play()
		BUTTON_BOOL = false
		
		Tool:WaitForChild("EquipUnequipEvent"):FireServer(true)
	elseif BUTTON_BOOL == false then
		TWEEN_SERVICE:Create(PHONE_GUI, TWEEN[3], {Position = UDim2.fromScale(-0.5, 0.499)}):Play()
		BUTTON_BOOL = true
		
		Tool:WaitForChild("EquipUnequipEvent"):FireServer(false)
	end
end)
Equip Script inside the Tool:
repeat wait() until script.Parent.Parent:IsA("Backpack")
local replicatedServ = game:GetService("ReplicatedStorage")
local Phone_Holder = replicatedServ:WaitForChild("PhoneHolderFolder")
local plr = game.Players:FindFirstChild(script.Parent.Parent.Parent.Name)
local equippedStatus = {}
script.Parent:WaitForChild("EquipUnequipEvent").OnServerEvent:Connect(function(Player, state)
	local tool = script.Parent.Parent:WaitForChild("Hologram")
	
	if equippedStatus[Player] == nil or not equippedStatus[Player] then
		tool.Parent = Player.Character
		task.wait()
		equippedStatus[Player] = true
		script.Parent:WaitForChild("TweenEvent"):FireClient(Player, state)
	else
		script.Parent:WaitForChild("TweenEvent"):FireClient(Player, state)
		task.wait(1)
		tool.Parent = Player.Backpack
		equippedStatus[Player] = false
	end
end)
and here’s the TweenAnim LocalScript:
local Tween = game:GetService("TweenService")
local tool = script.Parent.Parent:WaitForChild("Hologram")
local TINFO = TweenInfo.new(1, Enum.EasingStyle.Cubic, Enum.EasingDirection.InOut)
local Part = script.Parent:WaitForChild("MainScreen")
local equippedStatus = {}
-- supporting frames
local s_f1 = script.Parent:WaitForChild("Border")
local s_f2 = script.Parent:WaitForChild("Border1")
local function onEquip()
	Tween:Create(s_f1, TINFO, {Transparency = 0.2}):Play()
	Tween:Create(s_f2, TINFO, {Transparency = 0.2}):Play()
	Tween:Create(s_f1, TINFO, {Size = Vector3.new(1.7, 0.237, 0.152)}):Play()
	Tween:Create(s_f2, TINFO, {Size = Vector3.new(1.7, 0.237, 0.152)}):Play()
	task.wait(1)
	Tween:Create(Part, TINFO, {Transparency = 0.8}):Play()
	Tween:Create(Part, TINFO, {Size = Vector3.new(2.15, 2.56, 0.102)}):Play()
end
local function  onUnequip()
	Tween:Create(Part, TINFO, {Transparency = 1}):Play()
	Tween:Create(Part, TINFO, {Size = Vector3.new(2.15, 0.01, 0.102)}):Play()
	task.wait(1)
	Tween:Create(s_f1, TINFO, {Transparency = 1}):Play()
	Tween:Create(s_f2, TINFO, {Transparency = 1}):Play()
	Tween:Create(s_f1, TINFO, {Size = Vector3.new(0.05, 0.237, 0.152)}):Play()
	Tween:Create(s_f2, TINFO, {Size = Vector3.new(0.05, 0.237, 0.152)}):Play()
end
script.Parent:WaitForChild("TweenEvent").OnClientEvent:Connect(function(Player, state)
	if state == true then
		onEquip()
	elseif state == false then
		onUnequip()
	end
end)
I never have anticipated how complicated this will become until now 