Можно пойти разными путями - подменять бренд клиента и на сервере проверять его. Но в модах так обычно не делают, потому что бренд один на весь клиент. Могут максимум загрузчики модов менять по типу форжа вроде бы.
Если у тебя прям свой полноценный клиент, то, возможно и подойдёт такое решение.
Но существует и более стандартный подход - можно просто отправлять от клиента серверу пакет, сообщающий о том, что игрок использует этот самый клиент. Если такой пакет на пришел, то сервер отключает игрока.
У плагинов и модов есть система обмена сообщениями, которая организована вот этими пакетами:
От сервера клиенту:
https://wiki.vg/Protocol#Clientbound_Plugin_Message_.28configuration.29
От клиента серверу:
https://wiki.vg/Protocol#Serverbound_Plugin_Message_.28configuration.29
Насколько я знаю, даже модовые сервера общаются, используя этот пакет. Передавать можно абсолютно произвольную информацию (массив байт).
Наглядный пример взаимодействия клиентского мода и серверного плагина - это WorldEdit CUI.
Есть реализация клиентского мода под разные платформы: фабрик, форж.
Есть реализация серверного мода/плагина под разные платформы: форж, баккит.
Но поскольку протокол обмена сообщениями используется один и тот же - любой мод совместим с плагином на любом ядре.
Поэтому предлагаю просто глянуть WE CUI или любого другого мода/плагина. Так, например, PlasmoVoice дружит между разными клиентами и серверами, правда там свой канал связи на отдельном порту, но как минимум инициализация обмена по каналу должна быть через те же самые пакеты.
В плагинах под баккит для работы с указанными пакетами используются PluginMessages, пример их использования можно найти тут:
https://www.spigotmc.org/wiki/bukkit-bungee-plugin-messaging-channel/
Но это под банжу, естественно у тебя должен быть другой канал, другие типы данных и т.д.