@@ -7,9 +7,10 @@ reason)` refunds what the order record says — `cents` is resolver-computed and
77does not appear in the input schema at all, so the model cannot supply or
88inflate the amount. Resolvers form a DAG (` load_order ` → ` refund_scope ` →
99` refund_amount ` / ` ask_restock ` ), may return ` Elicit[...] ` to ask the human,
10- and run at most once per call. A resolver's own plain parameters are filled
11- from the tool's arguments by name — ` load_order(order_id) ` receives the
12- ` order_id ` the model passed to ` refund_order ` .
10+ and ask each question at most once per call. A resolver's own plain
11+ parameters are filled from the tool's arguments by name —
12+ ` load_order(order_id) ` receives the ` order_id ` the model passed to
13+ ` refund_order ` .
1314
1415## Run it
1516
@@ -18,9 +19,9 @@ from the tool's arguments by name — `load_order(order_id)` receives the
1819uv run python -m stories.refund_desk.client
1920
2021# HTTP — the client self-hosts the server on a free port, runs, then tears it
21- # down (--legacy: resolver elicitation rides the push request today; the
22- # manifest pins this era, so bare --http runs the same leg )
23- uv run python -m stories.refund_desk.client --http --legacy
22+ # down (2026 protocol: the questions ride embedded input_required round-trips;
23+ # add --legacy to ride synchronous push elicitation instead )
24+ uv run python -m stories.refund_desk.client --http
2425```
2526
2627## What to look at
@@ -47,21 +48,36 @@ uv run python -m stories.refund_desk.client --http --legacy
4748
4849## Caveats
4950
51+ - ** Transport per era.** The framework picks the elicitation transport from
52+ the negotiated protocol: at >= 2026-07-28 the questions ride embedded
53+ ` input_required ` round-trips (a resolver that depends on another's answer is
54+ asked in a later round); at <= 2025-11-25 each is a synchronous
55+ ` elicitation/create ` push request mid-call. Author code is identical on
56+ both — this client runs unchanged on either era.
5057- ** Decline order.** A declined unwrapped dependency aborts resolution in
5158 tool-signature order — ` cents ` resolves before ` restock ` , so ` ask_restock `
5259 never runs. Don't rely on a later resolver's side effects after an earlier
5360 consumer can abort.
54- - ** Memoization scope.** Each resolver runs at most once per ` tools/call ` ,
55- keyed by function identity; nothing is cached across calls or connections.
61+ - ** Memoization scope.** Each question is asked at most once per call, and
62+ within a round each resolver runs at most once, keyed by function identity.
63+ Across 2026 rounds only * elicited* outcomes persist (in ` requestState ` ); a
64+ resolver that resolves without eliciting is pure and may re-run each round.
65+ An answer is matched back to its question when the call resumes, so an
66+ eliciting resolver must derive its question deterministically from the
67+ tool's arguments and earlier answers; a per-call generated value (a
68+ ` default_factory ` id, a timestamp) is re-derived each round and must not
69+ appear in a question the answer is meant to bind to. Nothing is cached
70+ across calls or connections.
5671- ** Validate elicited values.** Elicited answers are human-typed; check them
5772 against your records (as ` _scoped ` does) before acting on them.
5873
5974## Spec
6075
61- [ Elicitation — client features] ( https://modelcontextprotocol.io/specification/2025-11-25/client/elicitation )
76+ [ Elicitation — client features] ( https://modelcontextprotocol.io/specification/2025-11-25/client/elicitation ) ,
77+ [ Input required tool results — server features] ( https://modelcontextprotocol.io/specification/draft/server/tools#input-required-tool-results )
6278
6379## See also
6480
65- ` legacy_elicitation /` (the push mechanism resolver elicitation rides on today),
66- ` mrtr /` (the 2026 ` input_required ` carrier; resolver DI will ride it once the
67- SDK wires them together ).
81+ ` mrtr /` (the 2026 ` input_required ` carrier these questions ride at
82+ > = 2026-07-28), ` legacy_elicitation /` (the push mechanism they ride on
83+ handshake-era connections ).
0 commit comments