Pre-release Harn is pre-1.0 — the language, standard library, and CLI may change between releases. See the release notes

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/discover and legacy initialize lifecycle 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_sdk checks Harn's public version and error-code projections against rmcp.
  • 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.