ADR 0003: use the official Rust MCP SDK
Status#
Superseded on 2026-08-02. Harn now uses rmcp 3.1 for MCP client lifecycle,
stdio transport, framing, request association, standard metadata, version
negotiation, and typed protocol errors.
The previous decision kept a hand-written implementation because rmcp 1.7
did not model the proposed 2026 protocol. The revisit condition recorded by
that decision has occurred: MCP 2026-07-28 is stable, and rmcp 3.1 supports
it together with the released 2025 and 2024 protocol versions.
Decision#
The official SDK owns commodity MCP protocol behavior:
server/discoverand legacyinitializelifecycle selection;- protocol-version negotiation for 2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26, and 2024-11-05;
- JSON-RPC framing, IDs, response association, cancellation, and bounded shutdown for child-process clients;
- stable error codes, method names, capabilities, request metadata, standard HTTP headers, MRTR types, and task types.
Harn continues to own product policy and host integration:
- VM values and builtin return shapes;
- egress and SSRF policy, OAuth state, capability fixtures, and audit records;
- roots, elicitation, sampling, and progress routing;
- workflow dispatch, task execution, authorization, and server persistence.
The boundary is the SDK handler and transport adapter, not a second protocol
model. Harn constants that must be emitted into generated bindings are checked
against rmcp's typed registry.
Compatibility#
The default client uses the stable discovery lifecycle and prefers
2026-07-28. It negotiates another SDK-supported released version when a
discovery-capable peer requires one. When a peer proves it is legacy by
returning Method not found for server/discover, the SDK performs the
2025-11-25 initialize/initialized handshake.
The former rc and explicit legacy modes were removed. Compatibility fallback
is available only where the SDK provides it as part of its standard automatic
lifecycle.
Consequences#
The raw stdio client framing, request-ID loop, response drain, lifecycle probe,
and child shutdown code have been deleted. Stable task names and result shapes
replace the draft tasks/list, tasks/result, nested task envelope, and
execution.taskSupport fields.
Harn's HTTP client and server adapters still contain Harn-owned authorization, request streaming, and dispatch policy. They use the SDK registry as their protocol oracle; moving more of those adapters behind SDK transports is appropriate only when it preserves Harn's egress, OAuth, audit, cancellation, and streaming contracts without duplicating them.
Evidence#
protocol_registry_matches_official_sdkchecks Harn's public version and error-code projections againstrmcp.- The MCP compatibility suite exercises stable discovery, standard headers, MRTR, task polling, and both Harn server surfaces; SDK-owned tests exercise released-version negotiation and the older stdio lifecycle.
- The canonical Harn stdio client test runs discovery over a real child-process
transport owned by
rmcp; released-version fallback remains covered by the SDK that implements it.
See the MCP and ACP integration reference for the public configuration contract.