SEP-2106: Tools `inputSchema` & `outputSchema` Conform to JSON Schema 2020-12 changedseps/2106-json-schema-2020-12
Upstream edited this page at 29 Jul 2026 22:46 UTC, give or take a minute or two: the time comes from Anthropic’s own sitemap rather than from a commit. This site recorded the change at 28 Sep 2026 22:07 UTC.
Upstream edited
Recorded here
Lines+19added
Lines−19removed
From line
20
where the diff opens
First seen
14 Aug 2026
this site's first read of the page
Recorded edits2to this page, all time
The whole hunk
from line 20, old and new numbered
/
from line 20
2020 requirements.
2121</Note>
2222
23| Field | Value |
24| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
25| **SEP** | 2106 |
26| **Title** | Tools `inputSchema` & `outputSchema` Conform to JSON Schema 2020-12 |
27| **Status** | Final |
28| **Type** | Standards Track |
29| **Created** | 2026-01-06 |
23| Field | Value |
24| - | - |
25| **SEP** | 2106 |
26| **Title** | Tools `inputSchema` & `outputSchema` Conform to JSON Schema 2020-12 |
27| **Status** | Final |
28| **Type** | Standards Track |
29| **Created** | 2026-01-06 |
3030| **Author(s)** | John McBride ([@jpmcb](https://github.com/jpmcb)) — original proposal; Ola Hungerford ([@olaservo](https://github.com/olaservo)) — current shepherd, post-SEP-1850 conversion |
31| **Sponsor** | Ola Hungerford ([@olaservo](https://github.com/olaservo)) |
32| **PR** | [#2106](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2106) |
31| **Sponsor** | Ola Hungerford ([@olaservo](https://github.com/olaservo)) |
32| **PR** | [#2106](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2106) |
3333
3434***
3535
from line 310
310310
311311OpenAPI 3.1 made the strategic decision to fully align with JSON Schema 2020-12, accepting breaking changes to eliminate the friction. The result: better tooling compatibility and less ecosystem confusion.
312312
313| OpenAPI's Problem | MCP's Parallel |
314| ----------------------------------- | ----------------------------------------- |
315| `type` must be string, not array | `inputSchema` only allows specific fields |
316| Couldn't use standard null handling | Can't use `oneOf`/`anyOf` in schemas |
317| Custom `nullable` keyword | Object-only `structuredContent` |
318| Caused tooling confusion | Causes SDK workarounds |
313| OpenAPI's Problem | MCP's Parallel |
314| - | - |
315| `type` must be string, not array | `inputSchema` only allows specific fields |
316| Couldn't use standard null handling | Can't use `oneOf`/`anyOf` in schemas |
317| Custom `nullable` keyword | Object-only `structuredContent` |
318| Caused tooling confusion | Causes SDK workarounds |
319319
320320MCP can learn from OpenAPI's experience rather than repeating the same evolution over several years.
321321
from line 325
325325
326326### Compatibility Matrix
327327
328| | New client (post-SEP) | Old client (pre-SEP) |
329| ------------------------- | ------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------- |
330| **New server (post-SEP)** | Fully compatible. | Compatible **only when the server returns object-typed `structuredContent`**. Arrays/primitives in `structuredContent` may break. |
331| **Old server (pre-SEP)** | Fully compatible. Existing object-only schemas remain valid. | Unchanged. |
328| | New client (post-SEP) | Old client (pre-SEP) |
329| - | - | - |
330| **New server (post-SEP)** | Fully compatible. | Compatible **only when the server returns object-typed `structuredContent`**. Arrays/primitives in `structuredContent` may break. |
331| **Old server (pre-SEP)** | Fully compatible. Existing object-only schemas remain valid. | Unchanged. |
332332
333333The asymmetry: a new server that takes advantage of array or primitive `structuredContent` (or composition keywords in `inputSchema`) cannot assume an old client will accept the response. Old clients written against the previous wire format may reject `structuredContent` that is not a JSON object, or fail to validate `inputSchema` containing keywords beyond `type`/`properties`/`required`.
334334
No line in this hunk matches that.