Skip to content

ServerPilot 1.9.1

Choose a tag to compare

@JinPLu JinPLu released this 27 Aug 11:52
· 21 commits to master since this release

1.9.1 - 2026-08-27

ServerPilot 1.9.1 makes the new MCP entry panel work on an ordinary installation.

  • The Settings page reported no MCP entry at all after uv tool install, which is the ordinary macOS layout. The lookup followed the interpreter symlink before looking beside it, which walks out of the directory that holds serverpilot-mcp and into the base interpreter's own. The daemon runs from launchd with no PATH of its own, so nothing else could find it either.
  • Backing up the database works on Windows. Each SQLite connection is now closed before the finished copy is published, instead of being left open by a context manager that only ends the transaction — Windows refuses to replace a file that still has a handle. The copy is flushed through a writable handle: Windows cannot fsync a file opened only for reading, so after the connections were closed the backup still failed there while working everywhere else.
  • A Slurm submission that really went through is no longer reported as a failure. sbatch does not drain its stdin on the paths where it exits early, which killed the process feeding it the script and turned that signal into the pipeline's exit status. Its own verdict was lost: a quota refusal or a bad partition arrived as a meaningless 141, and a job that had actually been accepted was left running with nothing here pointing at it.
  • The mcpServers block you copy out of the App shows the executable path as it is, instead of escaping every slash into \/.
  • A GPU row that marks itself unavailable while its own status text still claims the card is free is rejected again. Keying that check on the state code alone let the contradiction through whenever the state was something other than allocatable.

1.9.0 - 2026-08-27

ServerPilot 1.9.0 lets an agent reach it from a Windows machine and read everything it says, and stops the allocator breaking up your fleet one card at a time.

  • Connecting an agent is one command: serverpilot mcp install --client codex|claude|cursor registers through each client's own mechanism, and merges into ~/.cursor/mcp.json without disturbing servers already there. serverpilot mcp config prints the registration instead of writing it, and the README and agent guide now carry the standard mcpServers block.
  • The desktop app Settings page now shows this installation's MCP entry as an absolute path and a pasteable mcpServers block, so you can copy them into Codex, Claude, or Cursor without reconstructing the command. If the executable is missing, the same panel says so and tells you how to install it.
  • The Windows archive ships serverpilot-mcp.exe next to the app. The download previously contained only the GUI, so there was no MCP entry point on the machine at all and the documented registration commands only ever worked from a source install.
  • The MCP instructions, the three tool descriptions, and every value ServerPilot sends back are English. An allocatable card reports available; a busy one reports why in a stable code such as running, held_idle, or busy_unmanaged. The desktop app stays in Chinese — the two are separate surfaces now, so changing one no longer disturbs the other.
  • gpu_apply takes the server with the fewest free GPUs that can still serve the whole request, and one lease always lands on a single machine. This is the difference between a fleet that keeps working and one that fills with holes: cards used to be taken in alphabetical server order, so a single-card request landed on the first eight-GPU machine, and a few of those left nothing able to start an eight-GPU run. An eight-GPU request could also come back as 5+3 across two machines — useless for a single-node job, while holding all eight away from someone who could use them.
  • no_capacity comes back as data rather than an error string, so an agent can tell a full fleet from a broken connection instead of retrying an answer. Releasing a lease that is already released confirms it instead of failing.
  • Shared scheduler clusters register through a local plugin instead of as bare metal. The plugin registers only the cards in your own jobs; gpu_status reports cluster headroom as scheduler_servers before you request anything, real GPU identities appear after, and idle reclaim cancels the job. A Slurm reference plugin, slurm-immediate, ships with the package.
  • A cluster that refused you no longer looks like a cluster that is merely full. A quota refusal, an unreachable scheduler, or a broken plugin reaches you as a failure with its reason, instead of no_capacity for an agent to wait out.
  • Two ways a cluster job could be left running are fixed: ServerPilot no longer asks a plugin to allocate again after the cards are already assigned, and on a lease spanning several machines every job is now recorded, so releasing leaves nothing behind. Requesting or releasing cluster resources also no longer blocks everything else — other local work previously waited up to a minute.
  • A cluster job ServerPilot could not cancel while reclaiming an idle lease is now recorded in the audit trail. It used to vanish silently, leaving the job running against your quota with nothing here pointing at it. Releasing a lease yourself still refuses outright rather than reporting a success it did not achieve.
  • When the control plane is unreachable, serverpilot keepalive inspect and serverpilot keepalive stop report and stop the workers still holding cards, and serverpilot daemon reclaim takes the port back. None of them needs the daemon running. The port-ownership error now names the process holding it and its command line instead of only saying the port is foreign.
  • The MCP handshake reports ServerPilot's own version rather than the MCP SDK's, and each tool declares its effect, so a client can tell a read from a lease mutation instead of gating all three the same way.
  • The standalone Windows app can create its database again. The packaged build was dropping the migration scripts, which left a source deployment as the only working option.
  • ServerPilot installs from PyPI. A release refuses to publish when the tag and the package version disagree, or when the wheel is missing its migration scripts or arrives with a bundled plugin that is not executable — a plugin without that bit is invisible to discovery rather than failing loudly.
  • serverpilot --version exists.
  • The security documentation matches the implementation: the control plane has no authentication, ServerPilot manages its own occupancy processes and plugin-side allocations but never your workloads, and fail-closed admission trusts the SSH user and the remote collector. Keepalive workers keep holding GPUs after the control plane stops, until it returns and reconciles or someone stops them on the server.
  • A slow or hanging local daemon call no longer stalls every other MCP tool on the same connection, and each tool now advertises a real input schema instead of free-form arguments.

中文更新说明