See bug#58745; there's a patch included. Report duplicated here:
I'm calling `eglot' from lisp. The doc string says the first argument
`managed-major-mode' is an atom, not a list. But it is passed to
eglot--connect as the first argument, which is expected to be a list of
major modes. When called interactively, `managed-major-mode' is set by
(eglot--guess-contact t), which returns a list.
So when not interactive, `eglot' must convert `managed-major-mode' into
a list:
-------------------
[2. text/x-patch]
diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el
index 71001ba680..dee88db022 100644
--- a/lisp/progmodes/eglot.el
+++ b/lisp/progmodes/eglot.el
@@ -1078,6 +1078,8 @@ eglot
INTERACTIVE is t if called interactively."
(interactive (append (eglot--guess-contact t) '(t)))
+ (unless (listp managed-major-mode)
+ (setq managed-major-mode (list managed-major-mode)))
(let* ((current-server (eglot-current-server))
(live-p (and current-server (jsonrpc-running-p current-server))))
(if (and live-p
------------------
João Távora; ok to commit this patch?
Yes (but please CC me next time to grab my attention).
Also see other's comments about ensure-list.
Also eglot, the function, does not have any non-interactive use i know of.
João