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))))