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

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

Signature

(claude-code-ide-mcp-create-session PROJECT-DIR SESSION-ID &optional INSTANCE-NAME)

Documentation

Create a new MCP session for PROJECT-DIR with SESSION-ID.

INSTANCE-NAME is the user-visible instance name, or nil for the unnamed instance. Always creates a fresh session with its own WebSocket server, port and lockfile; a project may own any number of concurrent sessions. Returns the session object.

Source Code

;; Defined in /nix/store/yjvbhwl7p6zrbw9xlnni7y4hra8sa3pl-emacs-packages-deps/share/emacs/site-lisp/claude-code-ide-mcp.el
;;; Public API

(defun claude-code-ide-mcp-create-session (project-dir session-id &optional instance-name)
  "Create a new MCP session for PROJECT-DIR with SESSION-ID.
INSTANCE-NAME is the user-visible instance name, or nil for the
unnamed instance.  Always creates a fresh session with its own
WebSocket server, port and lockfile; a project may own any number of
concurrent sessions.  Returns the session object."
  (claude-code-ide-debug "=== Starting MCP server ===")
  (let* ((project-dir (expand-file-name project-dir))
         (session (make-claude-code-ide-mcp-session
                   :session-id session-id
                   :instance-name instance-name
                   :project-dir project-dir
                   :last-used (float-time)
                   :deferred (make-hash-table :test 'equal)
                   :active-diffs (make-hash-table :test 'equal)
                   :original-tab (when (fboundp 'tab-bar--current-tab)
                                   (tab-bar--current-tab))))
         (server-and-port (claude-code-ide-mcp--find-free-port session))
         (server (car server-and-port))
         (port (cdr server-and-port)))

    ;; Set port and server in session
    (setf (claude-code-ide-mcp-session-port session) port
          (claude-code-ide-mcp-session-server session) server)

    ;; Anything fallible must happen BEFORE the session is registered:
    ;; a failure past registration would leak a phantom session holding
    ;; a live server that no cleanup path can ever reap
    (claude-code-ide-debug "Project directory: %s" project-dir)
    (claude-code-ide-debug "Creating lockfile for port %d" port)
    (condition-case err
        (claude-code-ide-mcp--create-lockfile port project-dir)
      ((error quit)
       (ignore-errors (websocket-server-close server))
       (signal (car err) (cdr err))))

    ;; Store session
    (puthash session-id session claude-code-ide-mcp--sessions)

    ;; Set up hooks for selection and buffer tracking (add-hook is idempotent)
    (add-hook 'post-command-hook #'claude-code-ide-mcp--track-selection)
    (add-hook 'post-command-hook #'claude-code-ide-mcp--track-active-buffer)

    (claude-code-ide-debug "MCP server ready on port %d" port)
    (claude-code-ide-debug "MCP server started on port %d for %s" port
                           (file-name-nondirectory (directory-file-name project-dir)))
    session))