Regarding CPLEX's cuts, there are parameters that you can use to turn them off. Check the parameters manual for details.
Regarding your user cut callback, CPLEX will call it repeatedly at the same node until either the node is pruned (infeasible or provably suboptimal), the LP solution at the node is integer feasible, or your callback returns without adding anything (which is the most common reason). So to limit yourself to one cut per node, you'll need to check the node's unique identifier each time the callback is entered and compare it to the identifier the previous time the callback was called (which you will need to store). If the new identifier matches the previous one, this is a repeat call at the node, so your callback will need to exit without adding anything.
If you are using multiple threads, you may need to take care to ensure that the storage of the node identifier inside the callback is thread-safe.
#CPLEXOptimizers#DecisionOptimization