The generated JSON Schema artifact previously failed to encode several
normative requirements, forcing non-TypeScript implementations to
maintain their own mirrors of core shapes and discriminators:
- InputRequest/InputResponse collapsed to anyOf:[{},{},{}] because the
imported request/result types resolved to empty schemas, accepting
any instance.
- The required resultType discriminators ('task' on CreateTaskResult,
'complete' on Get/Update/CancelTaskResult) appeared nowhere in the
artifact despite being normative MUSTs in the extension prose.
- Strip-mode object emission produced additionalProperties:false inside
allOf intersections, making CreateTaskResult unsatisfiable: every
spec-conformant instance (with resultType or _meta) was rejected.
The canonical specification is now the sole source of truth for all
core-spec shapes — no SDK package is consulted at any layer.
scripts/fetch-spec-schema.ts vendors spec.schema.json and spec.types.ts
from the same recorded spec commit with provenance headers:
- schema.ts imports every core type (JSON-RPC envelopes, Result,
NotificationParams, the MRTR InputRequests/InputResponses, and the
JSON-RPC Error object) from the vendored spec.types.ts, deleting the
local mirrors that had already drifted from upstream.
- generate-schemas.ts emits $ref for all spec-owned types — including
the JSON-RPC envelopes intersected by the extension's own types — and
splices their transitive $ref closure verbatim from the vendored
canonical schema.json. Core-spec corrections flow in via an explicit,
reviewable refresh (npm run fetch:spec-schema) instead of silently
diverging. The @modelcontextprotocol/sdk devDependency is removed.
- Runtime Zod stand-ins for imported types are permissive locals whose
shapes never reach the artifact; generation fails on any unmapped
placeholder, and on any definition that cannot be converted.
- JSON Schema emission uses io:'input' so TypeScript's open interface
semantics are preserved and intersections remain satisfiable.
- resultType discriminators are encoded structurally in schema.ts.
- FailedTask.error now requires the canonical JSON-RPC Error shape;
ttlMs and pollIntervalMs are integers per the prose.
- createdAt/lastUpdatedAt deliberately remain unconstrained strings:
the prose requires ISO 8601 generally, and JSON Schema's date-time
format/pattern machinery can only express RFC 3339, which would
reject valid basic-form timestamps.
Validated with a Draft 2020-12 jsonschema matrix covering union
rejection/acceptance, discriminator enforcement, JSON-RPC envelope
enforcement, error-shape and integer constraints, byte-fidelity of all
56 spliced canonical definitions, complete $ref resolution, and
check-mode idempotency.
* Port SEP-2663 content
* Commit package-lock.json
* Add TODOs to import new types from SDK
* Copy InputRequests/InputResponses types from main repo
* Specify error for servers that require tasks
* Allow servers to require tasks
* Move "existing code" note to separate section
* Update 2663-tasks-extension.md
Co-authored-by: Caitie McCaffrey <caitiem20@github.com>
* Update 2663-tasks-extension.md
Co-authored-by: Caitie McCaffrey <caitiem20@github.com>
* Task Update Requests
* Link to MRTR spec for inputRequests
* Add auth check requirement
* Rename notifications/tasks/status
* Move detailed task types into task status section
* Add back explicit polling response requirements
* Disallow progress/logging notifications for now
* Add spec language for client behavior on inputRequests
* Mark Accepted
* Mark Final
* regenerate schema
* Fix check mode in generate-schemas.ts
Check mode previously compared the gitignored intermediate
schema/draft/generated/schema.ts against fresh output, then wrote a
temp file under that same directory to dynamic-import for JSON Schema
generation. On fresh checkouts (every CI run, since schema/**/generated/
is gitignored) the directory does not exist, so the temp-file write
crashed with ENOENT before reporting any real result. Local runs hid
the bug because once a developer runs the generator the directory
sticks around.
Drop the comparison against the gitignored intermediate (it cannot be
stale on CI by definition) and check only the committed schema.json.
The Zod schemas file is now written unconditionally so the dynamic
import resolves.
---------
Co-authored-by: Caitie McCaffrey <caitiem20@github.com>