Protocol version stays "0.4"; nothing on the Labwire wire changed.
This release is the MCP boundary: the adapter moves to the MCP
2026-07-28 revision and the Python SDK v2, published one day earlier.
Breaking
labwire-mcpnow requiresmcp>=2,<3(was>=1.2,<2). Hosts pinned
to the v1 SDK should stay on labwire-mcp 0.4.1.
Added
- Dual-era MCP service. One adapter process serves 2026-07-28
clients (per-request metadata,server/discover, required cache
hints,-32602for unknown tools) and handshake-era clients
(initialize) with no configuration. Every adapter test runs in both
eras against the same server object. - Human-in-the-loop confirmation. On the 2026 era, an S2 command
called without a confirmation returnsinput_requiredwith an
elicitation showing the exact command and parameters; the host
surfaces it to a human, and approval injects the standing
confirmation (fromLABWIRE_MCP_CONFIRMATION, an environment
variable, never a CLI flag). S3 elicitations carry the refusal's
request id and thelabwire grant approvecommand; the human types
the minted grant id. Neither path identifies WHO approved
(identity_verified: false, as before); the docs say so plainly.
examples/mcp_confirmation.pyruns the round trip with zero
hardware. - Tasks (experimental). For 2026-era clients declaring the
io.modelcontextprotocol/tasksextension, commands with
estimated_duration_sof 10 s or more return pollable tasks. The
extension is hand-implemented from its spec text (the SDK excludes
it). Status mapping is honest about the two impedance points: task
failedis reserved for JSON-RPC faults, so instrument failures are
completedwithisErrorinside the result; acancelledtask
carries no result, so the settlement outcome ridesstatusMessage
and the signed bundle stays on the instrument host.tasks/cancel
is cooperative, which mapscancel_semanticsexactly. - SPEC-FINDINGS F11: settlement is structured inside Labwire and
prose at a foreign protocol boundary; the cooperative cancel design
of MCP tasks independently validates F10's resolution.
Changed
- All packages released as 0.5.0 in lockstep;
labwire-*
cross-dependency bounds move to>=0.5,<0.6.
Full changelog: https://github.com/benchwire/labwire/blob/main/CHANGELOG.md