A daemon that fails during startup reported the reason via eprintln! in main's error arm. Under launchd stderr is discarded, so the failure was invisible: daemon.log was created and left empty — exactly the case the log file was added for. Found by the manual acceptance run: the launchd agent loaded correctly (RunAtLoad fired, runs=9) but every spawn exited 1 because a previously started daemon held the pidfile, and nothing recorded why. Fatal errors on the daemon path now go through tracing::error!, reaching both the log file and stderr. Other subcommands keep eprintln!, since their stderr is the user's terminal. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EGntTHCW3sEPy1VBRopNNp
xy — HTTP MCP server supervisor
Daemon + CLI that launches and supervises HTTP-based MCP servers.
Build
cargo build --release
Run
target/release/xy daemon # foreground
Drop a server definition into $XDG_CONFIG_HOME/xy/servers/<name>.kdl
(see examples/insikt.kdl) and xy reload.
Commands:
xy list
xy status <name>
xy start <name|--all>
xy stop <name|--all>
xy restart <name|--all>
xy reload
xy logs <name> [--tail N] [--follow]
Exit codes: 0 success, 1 operational error, 2 daemon unreachable, 3 config invalid.
Start on login (macOS)
xy service install # write the LaunchAgent, load it, start the daemon
xy service uninstall # unload and remove the agent
xy service start # load an installed agent
xy service stop # unload until the next login
xy service status # show agent state
xy service install snapshots the current PATH into the agent, because a
launchd agent otherwise inherits only /usr/bin:/bin:/usr/sbin:/sbin and
supervised servers would not find their toolchains. Re-run with --force
after installing a new toolchain to refresh the snapshot.
xy service stop lasts until the next login. To disable start-on-login
permanently, use xy service uninstall.
The daemon writes to $XDG_STATE_HOME/xy/logs/daemon.log. Failures that happen
before the daemon starts logging — a missing binary, a malformed plist — are
visible only to launchd:
launchctl print gui/$UID/se.aceofba.xy