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