I’m going to recommend against integration - I think that’s what you wrote, too. I think it would be easier in every respect to let the launcher handle “singleplayer” by silently running a server in the background - set to refuse all external connections - and running the client set to localhost. Maybe you can add a special menu later on to control the server from in the client UI - that would work for localhost and for remote servers where the player is admin.
ETA: I think a good first concrete step for the project overall - assuming your build system is up and running - would be to make a dummy client and dummy server. Let the protocol be a most rudimentary handshake, a keep-alive, and a quit message. Let the client just be a single button to quit, and the server just outputs to a log when clients connect and quit.
Once you have that you can build a most rudimentary launcher and implement two functions, 1) launching the client and 2) launching the server.
Everyone has to start somewhere, and these are tangible goals. 