Skip to main content
reticle kill frees the bridge port. It asks who is listening on the port and signals that one process, which is the whole difference between this command and the shell pipeline everybody reaches for.
Never free the port with lsof -ti tcp:4400 | xargs kill -9. reticle mcp holds a client socket on that port, so -ti lists the proxy right beside the daemon and the pipeline kills both. When the proxy dies, the agent’s next tool calls get no reply at all — not an error, not a timeout — and nothing is written to the proxy log, because the process that writes it is the one that died. That is the mechanism behind most “my MCP disconnected” reports.

Flags

kill or stop?

They target different things, and the distinction matters exactly when you are stuck. Reach for stop in a script that shuts down a daemon it started. Reach for kill when the port is held and you want it back.

How it decides

  1. Look up the listener with lsof -nP -iTCP:<port> -sTCP:LISTEN. Client sockets are excluded by construction, so the proxy is never a candidate.
  2. It is Reticle’s if it answers /status, or if it is the pid Reticle recorded for the port. /status outranks the pid file, so a daemon started from another checkout is still recognised as ours.
  3. Anything else is refused, by name, unless --force.
  4. SIGTERM, then SIGKILL after 5 seconds, then report that it survived and exit 1.

What it prints

Real captures. Killed:
Refused, because the listener is not ours:
Nothing to free:
listenerIdentified: false means lsof could not run and the pid came from Reticle’s records rather than from an observed listener. Those are different claims, so the field says which one you got.

Exit codes

Worked example

Last modified on August 14, 2026