What i use is a custom enet event.

In a struct you can send the caster, target and spell id and other information to the server (when key 1 is pushed).
The server then checks for validity, decreases the casters mana and sends another event that also contains the same information to all clients. He is also responsible for the action of the spell, like draining the targets health now or after the "fireball" has hit the enemy.

The clients then create a local effect for that spell, that isn't networked and saves bandwith.