Give Customised Tool to player. Server -> Client -> Server or Client -> Server?

You can write your topic however you want, but you need to answer these questions:

  1. What do you want to achieve? Keep it simple and clear!
    I’m currently implementing a (what sounds like basic) tool-equipping system where the player interacts with a model, customises the colour of the model and then receives a that model as a tool in their backpack
  2. What is the issue? Include screenshots / videos if possible!
    I’m experimenting with how to communicate to the server with what colour was picked and giving the tool to the player.
  3. What solutions have you tried so far? Did you look for solutions on the Creator Hub?
    The two main options I’ve explored is having a proximityprompt being triggered on clientside, enabling a gui on the client that lets the player pick the colour and then sending what colour was picked to the server so it can replicate the model, change its colour and then hand it to the player. This works pretty easy with one tool but scaling it up is proving difficult since I’m not able to dynamically send the model associated with the prompt that was interacted with since the prompt is in the playergui file.

The code below is pretty arbitrary and the function names/uses are rudimentary but hopefully it gets my idea across clearly. My current code is too much of a mess to put here ToT

-- client side
prompt.triggered()
    colour = OpenColourGUI()
    GiveTool(colour)
end

-- server side
GiveTool(colour, player)
    -- gets colour from the client
    
end

The alternative is having the prompt being interacted on the server side, sending a remoteevent/function to the client to enable the colour-picking gui and then going back to the server with the colour picked so it can give it to the player. According to remotefunction documentation, server → client → is risky in case the client leaves which means the server is infinitely waiting for a response/an error is thrown.

Example code:

-- server script #1
prompt.triggered()
    TellClientToOpenColourGUI()
end

-- client side
Colour.Selected()
     SendColourBackToServer()
end

-- Server Script #2
GiveTool(colour, player)

I may be missing a pretty obvious thing that makes implementing this a lot easier but I’d like to hear if other people have experience with this and insight they have to offer.

can’t you just send over the name of the model, and have the a copy of every available model located in serverstorage that the server can go look up?