После многих отладок языкового клиента я обнаружил проблему: при запуске мой языковой сервер печатает что-то на стандартный вывод, чтобы указать, что он готов. Поскольку языковой сервер обменивается данными через stdout / stdin, VS Code (правильно) интерпретирует это как нарушение протокола, из-за чего все это не запускается правильно. Удаление оператора печати решило проблему.
Удивительно, но плагин LSP в Sublime Text, по-видимому, игнорировал это нарушение протокола и продолжал функционировать, несмотря на мою некорректную реализацию языкового сервера.