Stack: SDK V2 + New Spec — 4 of 10 (needs era model from card 3).
Teach the History view the new modern-era message vocabulary — most importantly, that one logical operation can span multiple JSON-RPC ids. This is probably the single most valuable new visualization in the whole stack.
Scope
- MRTR conversation grouping: render
resultType (complete | input_required), and group an MRTR conversation as one expandable unit: original call → inputRequests → user answers → retried request with a new id (linked by requestState) → final result. The request/response pairing logic must stop assuming one id per operation.
- Drive MRTR manually (
inputRequired: { autoFulfill: false } + withInputRequired()) so the Inspector keeps its pending-request UX and full visibility, rather than letting the SDK hide the retry loop. Existing usePendingClientRequests panels (sampling/elicitation/roots) are era-agnostic and survive; the semantics shown ("server sent a request" vs. "server returned input_required; answer goes back as a retry") must be accurate per era.
- Render the new modern frames:
server/discover, subscriptions/listen + notifications/subscriptions/acknowledged + subscriptionId tagging.
- Transcript-classification caveat: the modern probe carries the
_meta envelope before era is known — "saw an envelope" ≠ "modern negotiated" when labeling captured traffic.
Key files
clients/web/src/components/screens/HistoryScreen/*, groups/HistoryEntry/*, groups/historyUtils.ts, core/mcp/messageTrackingTransport.ts, pending-request panels under groups/.
Acceptance
- An MRTR round-trip displays as one grouped, expandable conversation.
- Modern notifications/discover frames render correctly and are labeled by era.
npm run ci green.
Ref: specification/v2_new_spec_impact.md §7.2–7.4, §8.3, §9.2, §9.5(4).
Stack: SDK V2 + New Spec — 4 of 10 (needs era model from card 3).
Teach the History view the new modern-era message vocabulary — most importantly, that one logical operation can span multiple JSON-RPC ids. This is probably the single most valuable new visualization in the whole stack.
Scope
resultType(complete | input_required), and group an MRTR conversation as one expandable unit: original call →inputRequests→ user answers → retried request with a new id (linked byrequestState) → final result. The request/response pairing logic must stop assuming one id per operation.inputRequired: { autoFulfill: false }+withInputRequired()) so the Inspector keeps its pending-request UX and full visibility, rather than letting the SDK hide the retry loop. ExistingusePendingClientRequestspanels (sampling/elicitation/roots) are era-agnostic and survive; the semantics shown ("server sent a request" vs. "server returned input_required; answer goes back as a retry") must be accurate per era.server/discover,subscriptions/listen+notifications/subscriptions/acknowledged+subscriptionIdtagging._metaenvelope before era is known — "saw an envelope" ≠ "modern negotiated" when labeling captured traffic.Key files
clients/web/src/components/screens/HistoryScreen/*,groups/HistoryEntry/*,groups/historyUtils.ts,core/mcp/messageTrackingTransport.ts, pending-request panels undergroups/.Acceptance
npm run cigreen.Ref:
specification/v2_new_spec_impact.md§7.2–7.4, §8.3, §9.2, §9.5(4).