Function: claude-code-ide-mcp--find-free-port
claude-code-ide-mcp--find-free-port is a natively compiled function
defined in claude-code-ide-mcp.el.
Signature
(claude-code-ide-mcp--find-free-port SESSION)
Documentation
Start a WebSocket server for SESSION on a free port in the configured range.
The server callbacks close over SESSION, so every connection event is routed to its owning instance without any registry lookup. Returns a cons cell (SERVER . PORT).
Source Code
;; Defined in /nix/store/yjvbhwl7p6zrbw9xlnni7y4hra8sa3pl-emacs-packages-deps/share/emacs/site-lisp/claude-code-ide-mcp.el
;;; WebSocket Server
(defun claude-code-ide-mcp--find-free-port (session)
"Start a WebSocket server for SESSION on a free port in the configured range.
The server callbacks close over SESSION, so every connection event is
routed to its owning instance without any registry lookup.
Returns a cons cell (SERVER . PORT)."
(let ((min-port (car claude-code-ide-mcp-port-range))
(max-port (cdr claude-code-ide-mcp-port-range))
(max-attempts claude-code-ide-mcp-max-port-attempts)
(attempts 0)
(found-port nil))
(claude-code-ide-debug "Starting port search in range %d-%d" min-port max-port)
(while (and (< attempts max-attempts) (not found-port))
(let* ((port (+ min-port (random (- max-port min-port))))
(server (condition-case err
(progn
(claude-code-ide-debug "Trying to bind to port %d" port)
(let ((ws-server (websocket-server
port
:host "127.0.0.1"
:on-open (lambda (ws)
(claude-code-ide-mcp--on-open session ws))
:on-message (lambda (ws frame)
(claude-code-ide-mcp--on-message session ws frame))
:on-error (lambda (ws type err)
(claude-code-ide-mcp--on-error session ws type err))
:on-close (lambda (ws)
(claude-code-ide-mcp--on-close session ws))
:on-ping #'claude-code-ide-mcp--on-ping
:protocol '("mcp"))))
;; Add debug filter to see raw data (only if debugging)
(when (and ws-server claude-code-ide-debug)
(set-process-filter ws-server
(lambda (proc string)
;; Only log if it looks like text (not binary WebSocket frames)
(if (string-match-p "^[[:print:][:space:]]+$" string)
(claude-code-ide-debug "Server received text data: %S" string)
(claude-code-ide-debug "Server received binary frame (%d bytes)" (length string)))
(websocket-server-filter proc string))))
ws-server))
(error
(claude-code-ide-debug "Failed to bind to port %d: %s" port err)
(claude-code-ide-debug "Failed to start server on port %d: %s" port err)
nil))))
(if server
(progn
(setq found-port (cons server port))
(claude-code-ide-debug "Successfully bound to port %d" port)
(claude-code-ide-debug "Server object: %S" server)
(claude-code-ide-debug "WebSocket server started on port %d" port))
(cl-incf attempts))))
(or found-port
(error "Could not find free port in range %d-%d" min-port max-port))))