set_state computed uptime_secs from started_at.elapsed() and pushed the result into the watch channel. do_start sets started_at immediately before calling set_state(Running), so the published value was always ~0, and the list/status handlers copied that frozen snapshot straight out. A server that stayed healthy reported 0s forever, because the value was only recomputed on the next state transition. Status now carries started_at (an Instant, in-process only) and the handlers derive uptime_secs when they build ServerSummary. The wire type is unchanged. 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