|
| 1 | +# SEP-1330: ElicitResult and EnumSchema redesign (SEP issue #1330). Part of |
| 2 | +# the released 2025-11-25 spec version — the changelog entry reads: "Update |
| 3 | +# `ElicitResult` and `EnumSchema` to use a more standards-based approach and |
| 4 | +# support titled, untitled, single-select, and multi-select enums". |
| 5 | +# |
| 6 | +# Attribution: sentences were assigned to this SEP by diffing the released |
| 7 | +# elicitation page (docs/specification/2025-11-25/client/elicitation.mdx) |
| 8 | +# against the 2025-06-18 version. The page co-locates three SEPs: every RFC |
| 9 | +# 2119 keyword sentence in the diff belongs to SEP-1036 (URL mode / mode |
| 10 | +# negotiation — see sep-1036.yaml) or SEP-1034 (default values, including the |
| 11 | +# `default` members inside the enum examples and the "Clients that support |
| 12 | +# defaults SHOULD pre-populate form fields" sentence — see sep-1034.yaml). |
| 13 | +# SEP-1330's page delta is keyword-less: the Enum Schema subsection rewrite |
| 14 | +# (four variants replacing the 2025-06-18 `enum` + `enumNames` example) plus |
| 15 | +# the "(beyond enums)" carve-out. The ElicitResult half of the SEP has no |
| 16 | +# prose on the elicitation page at all — it lives in the Schema Reference |
| 17 | +# (content values gained `string[]` for multi-select submissions). |
| 18 | +# |
| 19 | +# Severity ruling (proposed — pending maintainer sign-off): treat the |
| 20 | +# keyword-less rows below as MUST-equivalent → FAILURE, because the enum |
| 21 | +# variant shapes and the ElicitResult content type are the definitional wire |
| 22 | +# contract this SEP establishes (same precedent as sep-1303's error-taxonomy |
| 23 | +# rows). |
| 24 | +# |
| 25 | +# Check IDs: rows 1–5 point at the IDs actually emitted by the existing |
| 26 | +# scenario src/scenarios/server/elicitation-enums.ts (they predate this yaml, |
| 27 | +# hence the elicitation-sep1330-* prefix rather than sep-1330-*). That |
| 28 | +# scenario also emits a failure-only gate ID, elicitation-sep1330-general, |
| 29 | +# which is deliberately not a requirement row (scenario gates stay in the |
| 30 | +# manifest's `untracked` bucket). |
| 31 | +# |
| 32 | +# In the quoted enum examples below, "…" elides the `title`, `description`, |
| 33 | +# and `default` members: title/description are unchanged decoration and the |
| 34 | +# `default` members belong to SEP-1034 (claimed there, not here). |
| 35 | +sep: 1330 |
| 36 | +spec_url: https://modelcontextprotocol.io/specification/2025-11-25/client/elicitation#requested-schema |
| 37 | +requirements: |
| 38 | + # ── Enum Schema variants (form mode `requestedSchema`) ──────────────────── |
| 39 | + # The four rows below quote the Enum Schema item of "The schema is |
| 40 | + # restricted to these primitive types:" — the shapes are given as JSON |
| 41 | + # examples, flattened here per the table/example-flattening style used in |
| 42 | + # sep-1036.yaml. The corresponding Schema Reference types are |
| 43 | + # UntitledSingleSelectEnumSchema, TitledSingleSelectEnumSchema, |
| 44 | + # UntitledMultiSelectEnumSchema, and TitledMultiSelectEnumSchema. |
| 45 | + - check: elicitation-sep1330-untitled-single |
| 46 | + text: 'The schema is restricted to these primitive types: 4. Enum Schema — Single-select enum (without titles): { "type": "string", …, "enum": ["Red", "Green", "Blue"], … }' |
| 47 | + |
| 48 | + - check: elicitation-sep1330-titled-single |
| 49 | + text: 'The schema is restricted to these primitive types: 4. Enum Schema — Single-select enum (with titles): { "type": "string", …, "oneOf": [ { "const": "#FF0000", "title": "Red" }, { "const": "#00FF00", "title": "Green" }, { "const": "#0000FF", "title": "Blue" } ], … }' |
| 50 | + |
| 51 | + - check: elicitation-sep1330-untitled-multi |
| 52 | + text: 'The schema is restricted to these primitive types: 4. Enum Schema — Multi-select enum (without titles): { "type": "array", …, "minItems": 1, "maxItems": 2, "items": { "type": "string", "enum": ["Red", "Green", "Blue"] }, … }' |
| 53 | + |
| 54 | + - check: elicitation-sep1330-titled-multi |
| 55 | + text: 'The schema is restricted to these primitive types: 4. Enum Schema — Multi-select enum (with titles): { "type": "array", …, "minItems": 1, "maxItems": 2, "items": { "anyOf": [ { "const": "#FF0000", "title": "Red" }, { "const": "#00FF00", "title": "Green" }, { "const": "#0000FF", "title": "Blue" } ] }, … }' |
| 56 | + |
| 57 | + # ── Legacy titled enum (backwards compatibility) ────────────────────────── |
| 58 | + # The released elicitation page dropped 2025-06-18's `enumNames` example |
| 59 | + # entirely; the legacy shape survives only as the deprecated |
| 60 | + # LegacyTitledEnumSchema in the Schema Reference (quoted below). The check |
| 61 | + # asserts a server can still emit a well-formed legacy titled enum |
| 62 | + # (`enumNames` parallel to `enum`) during the deprecation window. |
| 63 | + - check: elicitation-sep1330-legacy-enumnames |
| 64 | + text: 'LegacyTitledEnumSchema — Use TitledSingleSelectEnumSchema instead. This interface will be removed in a future version. / enumNames?: string[] — (Legacy) Display names for enum values. Non-standard according to JSON schema 2020-12.' |
| 65 | + url: https://modelcontextprotocol.io/specification/2025-11-25/schema#legacytitledenumschema |
| 66 | + |
| 67 | + # ── ElicitResult content redesign ───────────────────────────────────────── |
| 68 | + # Gap — untested: this is the ElicitResult half of the SEP. In 2025-06-18 |
| 69 | + # the content values were `string | number | boolean`; 2025-11-25 adds |
| 70 | + # `string[]` so multi-select submissions can be returned. Wire-observable |
| 71 | + # on the server suite: the harness-as-client returns array-valued content |
| 72 | + # for the multi-select fields and asserts the server accepts it (the |
| 73 | + # originating tools/call completes without error). The existing |
| 74 | + # elicitation-sep1330-enums scenario already replies with array content but |
| 75 | + # emits no check for the acceptance — fold this assertion into that |
| 76 | + # scenario rather than adding a new one. The "only present when action is |
| 77 | + # accept and mode was form" conditionality in the surrounding prose is |
| 78 | + # SEP-1036's mode split, not claimed here. |
| 79 | + - check: sep-1330-elicit-result-array-content |
| 80 | + text: 'content?: { [key: string]: string | number | boolean | string[] } — The submitted form data … Contains values matching the requested schema.' |
| 81 | + url: https://modelcontextprotocol.io/specification/2025-11-25/schema#elicitresult |
| 82 | + # ── Dispositioned without rows (deliberate skips) ───────────────────────── |
| 83 | + # - "Note that complex nested structures, arrays of objects (beyond enums), |
| 84 | + # and other advanced JSON Schema features are intentionally not supported |
| 85 | + # to simplify client user experience." — the base restriction predates |
| 86 | + # this SEP (2025-06-18: "arrays of objects"); SEP-1330's delta is only |
| 87 | + # the "(beyond enums)" carve-out, whose operative content (enum option |
| 88 | + # arrays are permitted) is covered by the two multi-select check rows |
| 89 | + # above. Keyword-less and framed as design rationale, so no row. |
| 90 | + # - "To simplify client user experience, form mode elicitation schemas are |
| 91 | + # limited to flat objects with primitive properties only." — reworded |
| 92 | + # from 2025-06-18 ("To simplify implementation for clients, elicitation |
| 93 | + # schemas are limited to flat objects with primitive properties only"); |
| 94 | + # no new obligation from this SEP (the "form mode" qualifier is |
| 95 | + # SEP-1036's), so no row. |
0 commit comments