It's doable by hand. I wanted to run LSP servers in Docker so I don't need to juggle versions and dependencies and virtual environments on my main machine and nothing out of the box had this. Took a couple of days. It's sad that it's perceived to be so difficult that an extra thing is needed to make it usable. As a result everyone uses those and the actual plugins have poor docs and API, if not that I would've spend less than a day I guess.
LazyVim has the following completion/lsp plugins loaded (and I've added nothing): cmp-nvim-lsp, mason-lspconfig, mason, neodev, null-ls, nvim-lspconfig, luasnip, and there's more that load on demand.