SDK migration

Make every effect-capable request explicit.

Proxy 0.5.0 and Lite 0.9.0 reject an unselected tool call before authentication mutation, rate limiting, policy, HIL, Ledger, receipt, or upstream work. Upgrade the gateway and client together, then choose exactly one of the two contracts below.

Docs verified for v1.239.0 Normative migration guide Contract fixture
Versions

Upgrade to these versions or newer.

These are the first releases that package the exact clavenar.client-migration/v1 fixture and use explicit request selection.

ComponentMinimum safe version
Proxy0.5.0
Lite0.9.0
Rust SDK0.3.0
TypeScript SDK1.5.0
Python SDK1.4.0
Go SDK1.3.0
Java SDK1.4.0
.NET SDK1.5.0
Selection

Choose one execution owner before the network call.

The idempotency value is a canonical lowercase UUID. Decision and server-execution headers are mutually exclusive; the removed legacy execution selector is not accepted.

SDK executesSide-effect free

Use this when an SDK inspects first and its registered executor performs the eventual tool effect.

X-Clavenar-Decision-Contract: clavenar.decision/v1
X-Clavenar-Idempotency-Id: 8f1d3a40-7c0e-4d2b-9c9a-3b1d0e6a2c5a
Gateway executesDurable effect

Use this only when Proxy or Lite owns the upstream call and retained result. Allocate the UUID before any network attempt.

X-Clavenar-Server-Execution-Contract: clavenar.server-execution/v1
X-Clavenar-Idempotency-Id: 8f1d3a40-7c0e-4d2b-9c9a-3b1d0e6a2c5a

Control methods stay unselected. Session negotiation and enumeration such as initialize, notifications/*, ping, and tools/list cannot create a tool effect and do not carry an execution selector.

Cutover

Upgrade clients before enforcing the gateway boundary.

A staged rollout keeps mixed fleets observable and makes the final rejection predictable.

  1. Inventory callers

    Classify every POST /mcp caller as an SDK decision client, a gateway server executor, or safe MCP control traffic.

  2. Upgrade maintained SDKs

    Move to the minimum versions above and verify the decision selector plus canonical idempotency UUID on every tool call.

  3. Migrate server executors

    Allocate one durable UUID before network I/O, send the server-execution selector, and retain that same identity for any operator-driven replay.

  4. Canary the rejection

    Send an unselected tool call and require HTTP 426, executable:false, no Ledger row, and no upstream effect.

  5. Deploy the gateway

    Promote Proxy 0.5.0 or Lite 0.9.0 only after the caller inventory is clean.

Legacy clients

Unselected tool calls fail with HTTP 426.

This response is intentionally non-executable and points back to this guide. It happens before mutable authorization, policy, approval, audit, receipt, or upstream work.

HTTP/1.1 426 Upgrade Required
content-type: application/json

{
  "contract": "clavenar.client-migration/v1",
  "error": "client_contract_required",
  "executable": false,
  "migration_guide": "https://clavenar.com/docs/sdk-migration/"
}
Retries

Retry decisions; do not blindly retry effects.

A decision request is side-effect free and may use bounded transport retries with its original UUID. A server execution does not enter an automatic transport retry loop. Polling and receipt delivery never resubmit the original tool request.