The extensions field in ClientCapabilities/ServerCapabilities used bare
`object` as the value type, while the sibling experimental field (same
semantic concept — open-ended vendor-prefixed config) uses JSONObject.
This was the only use of bare `object` in the entire schema file.
Over the wire the two validate identical JSON — both mean 'any object'.
The difference is TypeScript ergonomics: JSONObject catches accidental
Date/Map/function values at compile time. Normal extension config
interfaces (including optional fields under exactOptionalPropertyTypes)
remain assignable.
Ref: SEP-2133
Change the extensions capability value type from object to JSONObject, matching experimental and every other open-ended record in the schema.
Motivation and Context
SEP-2133 added extensions using bare object:
This is the only use of bare object in the entire schema file. Over the wire the two validate identical JSON documents (JSON parsing already guarantees JSON-serializable values), but at the TypeScript level JSONObject catches accidental Date/Map/function values at compile time.
The practical impact: the typescript-sdk's nightly spec-sync workflow has a type-parity test that asserts bidirectional assignability between spec types and Zod-inferred types. The SDK's Zod schemas for extensions (correctly) use JSONObject semantics, so the parity test fails when spec.types.ts reverts to object. See modelcontextprotocol/typescript-sdk#1782 for context.
How Has This Been Tested?
Breaking Changes
None on the wire. TypeScript consumers who were passing non-JSON-serializable values (class instances, Dates, functions) as extension configs will get a compile error, which is the intended effect.
Types of changes
Checklist
Additional context
No type discussion in the SEP-2133 review — the object choice appears to have been unintentional. schema.json and schema.mdx regenerated.