The method I was using most often was a script in ServerScriptService
with a remote event/remote function and activated by a client script parented to the tool. Is this inefficient in any way? I noticed most tools just have a server script inside the tool as well. What are the pros/cons of each approach and are there any other approaches I can use?
the reason people use scripts in tools is because it’s easier and more efficient by using remote events/functions to make a script work.
In what way exactly is that way more efficient?
Really it’s just how you style code. Putting the code the tool uses inside the tool itself is generally just better for keeping all the relevant code in one place. It’s by no means necessary. I often write my code the way you described by putting the code in serverScriptService. I do find though that keeping the relevant functions in the tool themselves does help me simplify my code since I can have each tool completely self contained (other than modules they access of course).
As for efficiency, if you are coding them with the same level of skill in both methods they are identical. It is probably a tad harder to manage when you are calling to the serverScriptService stuff just because you need to create different states instead of being able to use a single state (depending on tool of course), but if it makes sense to you, then no point in not doing it that way just for the sake of it.