Skip to content

mcpdo: detect a connection daemon from another release instead of failing downstream #2870

Closed

Description

@cliffhall

Found by Copilot's review of the v2.14.0 milestone merge (PR #2867, thread), and reproduced in the release smoke (#2865). A maintainer decided to fix it in v2.14.0.

What happens

mcpdo never checks that the connection daemon it talks to came from the same release as the client. A daemon stays up while any connection is open (it idles out only after 60 s with no connections), so it survives an upgrade. The upgraded client then talks to the old daemon's code.

On 2.14.0 that breaks --load. #2855 changed the load summary's shape, and the human formatter expects the new fields:

$ (2.13.0) mcpdo connect load --config mcp.json
$ (2.14.0) mcpdo @load tools/call echo message:=x --load --load-requests 20
{"error":{"code":"error","message":"Cannot read properties of undefined (reading 'min')"}}
exit 1

--format json prints the old daemon's summary, without okThroughput, errorLatencyMs or toolErrorMessages. mcpdo daemon status gives no sign that anything is wrong. Any later change to a daemon↔client payload has the same exposure.

Expected

When the running daemon is from a different release, the client says so with an actionable error rather than failing somewhere downstream:

  • The daemon reports its package version in its ping reply.
  • ensureDaemon() compares that version with the client's own. If they differ, or the daemon reports none (anything older than this change), it fails with a dedicated code that names both versions and says to run mcpdo daemon stop.
  • mcpdo daemon stop and daemon status keep working against a daemon of any version, because they do not go through ensureDaemon(). That is what makes recovery possible.

Out of scope

Restarting a mismatched daemon automatically. That would close the user's open connections without asking.

Activity

  1. added this to the v2.14.0 milestone on Nov 4, 2026
  2. added
    bugSomething isn't working
    v2Issues and PRs for v2
    on Nov 4, 2026
  3. self-assigned this
    on Nov 4, 2026
  4. cliffhall commented on Nov 4, 2026

    @cliffhall
    MemberAuthor

    Triage: Priority High (total 10)

    • Severity 3 — a real feature (mcpdo --load, human format) fails outright after an upgrade, until the daemon is stopped by hand; --format json and mcpdo daemon stop work around it
    • Urgency 5 — blocks the v2.14.0 release (Release 2.14.0 step 2: merge v2/main into main and cut the release #2865), by maintainer decision
    • Bonuses: +1 bug label, +1 milestone (v2.14.0)

    Board: #28, Status In Progress.

  5. cliffhall commented on Nov 4, 2026

    @cliffhall
    MemberAuthor

    Fixed by #2871 (merged to v2/main as 34ed9ec).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingv2Issues and PRs for v2

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions