Function: claude-code-ide-mcp--stop-session

claude-code-ide-mcp--stop-session is a natively compiled function defined in claude-code-ide-mcp.el.

Signature

(claude-code-ide-mcp--stop-session SESSION)

Documentation

Stop SESSION: close its server, timers and lockfile, deregister it.

Deregistration and hook removal run unconditionally: a failure freeing one resource (say, an unwritable lockfile directory) must not leave a phantom session wedged in the registry with the global hooks alive.

Source Code

;; Defined in /nix/store/yjvbhwl7p6zrbw9xlnni7y4hra8sa3pl-emacs-packages-deps/share/emacs/site-lisp/claude-code-ide-mcp.el
(defun claude-code-ide-mcp--stop-session (session)
  "Stop SESSION: close its server, timers and lockfile, deregister it.
Deregistration and hook removal run unconditionally: a failure freeing
one resource (say, an unwritable lockfile directory) must not leave a
phantom session wedged in the registry with the global hooks alive."
  (let ((project-dir (claude-code-ide-mcp-session-project-dir session)))
    (claude-code-ide-debug "Stopping MCP session %s for %s"
                           (claude-code-ide-mcp-session-session-id session)
                           project-dir)

    (unwind-protect
        (progn
          ;; Detach the client first so a callback for an already-queued
          ;; frame finds no owner and gets ignored
          (setf (claude-code-ide-mcp-session-client session) nil)

          ;; Close server and client (best effort)
          (when-let* ((server (claude-code-ide-mcp-session-server session)))
            (ignore-errors (websocket-server-close server)))

          ;; Stop timers
          (when-let* ((ping-timer (claude-code-ide-mcp-session-ping-timer session)))
            (ignore-errors (cancel-timer ping-timer)))

          ;; Remove lockfile
          (when-let* ((port (claude-code-ide-mcp-session-port session)))
            (claude-code-ide-debug "Removing lockfile for port %d" port)
            (claude-code-ide-mcp--remove-lockfile port)))

      ;; Remove session from registry
      (remhash (claude-code-ide-mcp-session-session-id session)
               claude-code-ide-mcp--sessions)

      ;; Drop the project's selection timer when its last session is gone
      (unless (claude-code-ide-mcp--sessions-for-project project-dir)
        (when-let* ((timer (gethash project-dir claude-code-ide-mcp--selection-timers)))
          (ignore-errors (cancel-timer timer)))
        (remhash project-dir claude-code-ide-mcp--selection-timers))

      ;; Remove hooks if no more sessions
      (when (= 0 (hash-table-count claude-code-ide-mcp--sessions))
        (remove-hook 'post-command-hook #'claude-code-ide-mcp--track-selection)
        (remove-hook 'post-command-hook #'claude-code-ide-mcp--track-active-buffer)))

    (claude-code-ide-debug "MCP server stopped for %s"
                           (file-name-nondirectory (directory-file-name project-dir)))))