The “Event Pickup” interface most likely only executes on client as a result of pressing a keybind, so you need to route the call through server to inform everyone, as you are doing.
However this most likely won’t work properly because calling events on server from client only works when client owns that actor. In the case of an actor (book) placed in the world that anybody can pick up, this approach is not gonna hold up.
To properly call the server event you need to route it through a class that the client owns, such as the character or playercontroller. In EventPickup you have an “Attach To” parameter. I assume that would be the character. In your character class add a custom event such as “Server Grab This” set to run-on-server, with a parameter of type Book or Actor. Now from the EventPickup you can call AttachTo->ServerGrabThis(Self). Now your function is properly called on server side. From the ServerGrabThis event on server, you can do the multicast to inform everyone else and attach the thing.
To answer your other questions, “execute on server” will always execute if called from server, and will never execute on client machines, so you don’t need any authority switches. And you shouldn’t ever connect pins across different execution paths unless you really know what you are doing. In this specific case, connecting the AttachTo pin directly to its uses after server+multicast replication will lead to issues for everyone involved except for the host in case of listen server or standalone.