(ns dev-mcp "Leiningen task: start nREPL + web server on random ports." (:require [clojure.java.io :as io] [nrepl.server :as nrepl]) (:import [java.net ServerSocket])) (defn available-port [] "Pick a random available TCP port." (with-open [s (ServerSocket. 0)] (.getLocalPort s))) (defn- mcp-repl-task [& _args] "Start nREPL server and HTTP server on random ports. Writes ports to nrepl-port and .http-port files. Connect with: clj-nrepl-eval -p $(cat nrepl-port)" (let [nrepl-port (available-port) http-port (available-port)] (spit "nrepl-port" (str nrepl-port)) (spit ".http-port" (str http-port)) (println (format "nREPL port: %d (nrepl-port)" nrepl-port)) (println (format "HTTP port: %d (.http-port)" http-port)) (nrepl/start-server :port nrepl-port) (require 'user) ((resolve 'user/start-dev) http-port) (println "Ready.") @(promise))) (defn -main "Entry point for: lein trampoline run -m dev-mcp" [& args] (apply mcp-repl-task args))