@mcpdesc/validator 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,7 +6,40 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this package follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
  Dates for published releases are the UTC publication dates recorded by npm.
8
8
 
9
- ## [Unreleased]
9
+ ## [0.10.0] - 2026-09-07
10
+
11
+ ### Added
12
+
13
+ - Added the immutable `0.8.0-rc.3` selector with behavior equivalent to RC.2,
14
+ its RC.3 schema identity, and frozen fixtures.
15
+ - Added component reference resolution for RC.2 and RC.3 with deterministic
16
+ terminal-target provenance.
17
+
18
+ ### Changed
19
+
20
+ - Validator integrity now relies on package-owned schema, runtime, fixture, and
21
+ package bytes. Specification repository tags and commits are retained only as
22
+ informational provenance.
23
+ - Recorded maintainer-approved additive provenance corrections to the RC.2 and
24
+ RC.3 snapshot implementations. Their schemas, conformance results,
25
+ diagnostics, and frozen fixtures remain unchanged.
26
+
27
+ ## [0.9.0] - 2026-09-04
28
+
29
+ ### Added
30
+
31
+ - Added the immutable `0.8.0-rc.2` selector from specification tag
32
+ `v0.8.0-rc.2`, including its manifest-verified runtime, schema, and frozen
33
+ fixture corpus.
34
+ - Exported the RC.2 MCP extension catalogue metadata and maturity classifier.
35
+
36
+ ### Changed
37
+
38
+ - RC.2 preserves structurally valid pre-standard server extension maps and
39
+ reports `extensions-not-supported-by-version` as a warning while retaining
40
+ strict client extension requirements and independent reserved-identifier
41
+ diagnostics. This is a compatible validator relaxation; RC.1 and earlier
42
+ selectors are unchanged.
10
43
 
11
44
  ## [0.8.0] - 2026-09-03
12
45
 
@@ -94,7 +127,8 @@ Dates for published releases are the UTC publication dates recorded by npm.
94
127
  - Added synchronous structural and semantic validation for parsed JavaScript values with deterministic diagnostics and exact selector dispatch.
95
128
  - Added ESM browser support, TypeScript declarations, embedded schema provenance, frozen fixtures, and package-content checks.
96
129
 
97
- [Unreleased]: https://github.com/mcpdesc/core/compare/validator-v0.8.0...HEAD
130
+ [Unreleased]: https://github.com/mcpdesc/core/compare/validator-v0.9.0...HEAD
131
+ [0.9.0]: https://github.com/mcpdesc/core/compare/validator-v0.8.0...validator-v0.9.0
98
132
  [0.8.0]: https://github.com/mcpdesc/core/compare/validator-v0.7.1...validator-v0.8.0
99
133
  [0.7.1]: https://github.com/mcpdesc/core/compare/validator-v0.7.0...validator-v0.7.1
100
134
  [0.7.0]: https://github.com/mcpdesc/core/releases/tag/validator-v0.7.0
package/README.md CHANGED
@@ -25,7 +25,7 @@ npm install @mcpdesc/validator
25
25
  import { validateMcpDescription } from '@mcpdesc/validator';
26
26
 
27
27
  const result = validateMcpDescription(parsedDocument, {
28
- specification: '0.8.0-rc.1',
28
+ specification: '0.8.0-rc.2',
29
29
  });
30
30
 
31
31
  for (const diagnostic of result.diagnostics) {
@@ -44,15 +44,21 @@ a later draft is published.
44
44
 
45
45
  ## Supported snapshots
46
46
 
47
- Version `0.8.0` supports these immutable snapshots, newest first:
47
+ The current workspace supports these immutable selectors, newest first:
48
48
 
49
- | Selector | Tag | Embedded schema SHA-256 |
49
+ | Selector | First validator release | Embedded schema SHA-256 |
50
50
  |---|---|---|
51
- | `0.8.0-rc.1` | `v0.8.0-rc.1` | `936a0f24ade501fcabf3d6498c0440c445daa672a575573a35954cee49430ac4` |
52
- | `0.8.0-draft.4` | `v0.8.0-draft.4` | `93ed03f74059b5b3ce7509a96b59161bdab2c3cf7734397a9bec5a7588d0b03b` |
53
- | `0.8.0-draft.3` | `v0.8.0-draft.3` | `8823c1f1946360b2a44d00920e2092e5e4acd139a1964befad4eb0bf3ce96002` |
54
- | `0.8.0-draft.2` | `v0.8.0-draft.2` | `ab692c1a5a0f7e5f29be1940aa8c64a56d4620be0a19d00cf0a64680b7e517fa` |
55
- | `0.8.0-draft.1` | `v0.8.0-draft.1` | `4ceb6042c3fd31703199cd3db869ec5c35c17d2fe9ab7b2f5b96a2a3af0cebe4` |
51
+ | `0.8.0-rc.3` | `0.10.0` | `a9c3ff77ba37c72362909f538f6e957d055e6fdb372f8b3d529e3651af3fecf4` |
52
+ | `0.8.0-rc.2` | `0.9.0` | `40f6775dde052224114e91d6aa484d826eecf56b77f7ac87b4cf707ffbcb6ce8` |
53
+ | `0.8.0-rc.1` | `0.5.0` | `936a0f24ade501fcabf3d6498c0440c445daa672a575573a35954cee49430ac4` |
54
+ | `0.8.0-draft.4` | `0.4.0` | `93ed03f74059b5b3ce7509a96b59161bdab2c3cf7734397a9bec5a7588d0b03b` |
55
+ | `0.8.0-draft.3` | `0.3.0` | `8823c1f1946360b2a44d00920e2092e5e4acd139a1964befad4eb0bf3ce96002` |
56
+ | `0.8.0-draft.2` | `0.2.0` | `ab692c1a5a0f7e5f29be1940aa8c64a56d4620be0a19d00cf0a64680b7e517fa` |
57
+ | `0.8.0-draft.1` | `0.1.0` | `4ceb6042c3fd31703199cd3db869ec5c35c17d2fe9ab7b2f5b96a2a3af0cebe4` |
58
+
59
+ The validator package embeds the schema and executable behavior for each
60
+ selector. npm integrity and trusted-publishing provenance identify released
61
+ package bytes; specification repository tags and commits are informational.
56
62
 
57
63
  ## Usage
58
64
 
@@ -131,14 +137,20 @@ Structural paths start with AJV's instance path. A `required` error appends its
131
137
 
132
138
  ## Support metadata
133
139
 
134
- The package exports frozen `supportedSpecifications`, `supportedProtocolVersions`, and `specificationProvenance` values. Provenance records include the snapshot tag, recorded schema URI, and embedded schema SHA-256 digest. Public validation dispatches through a registry keyed by exact specification selectors. The current repository selector set is `0.8.0-draft.1`, `0.8.0-draft.2`, `0.8.0-draft.3`, `0.8.0-draft.4`, and `0.8.0-rc.1`; the protocol-version export is the deduplicated union supported by those snapshots.
140
+ The package exports frozen `supportedSpecifications`, `supportedProtocolVersions`, and `specificationProvenance` values. Provenance records include the snapshot tag, recorded schema URI, and embedded schema SHA-256 digest. Public validation dispatches through a registry keyed by exact specification selectors. The current repository selector set is `0.8.0-draft.1`, `0.8.0-draft.2`, `0.8.0-draft.3`, `0.8.0-draft.4`, `0.8.0-rc.1`, `0.8.0-rc.2`, and `0.8.0-rc.3`; the protocol-version export is the deduplicated union supported by those snapshots.
141
+
142
+ RC.2 and RC.3 also export the frozen `mcpExtensionCatalogue` and
143
+ `mcpExtensionMaturity` classifier. The catalogue pins its authoritative source,
144
+ effective date, and official or experimental identifier assignments. Catalogue
145
+ recognition establishes authority and maturity only; it does not validate
146
+ extension-specific settings.
135
147
 
136
148
  npm package SemVer tracks implementation releases independently from specification snapshot identity. Adding a later snapshot is additive: it must use a sibling implementation and selector rather than changing an existing snapshot's schema, semantics, metadata, fixtures, or results.
137
149
 
138
- The RC.1 component resolver has one maintainer-approved additive tooling
139
- correction: successful substitutions also report authored and terminal target
140
- paths. The correction does not change the RC.1 schema, validation results,
141
- diagnostics, or fixtures and is recorded in the integrity manifest.
150
+ The RC.1, RC.2, and RC.3 component resolvers report authored and terminal target
151
+ paths for successful substitutions. The additive tooling corrections do not
152
+ change snapshot schemas, validation results, diagnostics, or fixtures and are
153
+ recorded in the integrity manifest.
142
154
 
143
155
  The runtime bundles its schema, performs no network fetches for external schema references, and imports no Node.js built-ins. Unresolved external Tool-schema references produce incomplete-validation warnings and are preserved. All three ESM entry points support Node.js 20 or later and browser bundlers.
144
156
 
package/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type McpDescriptionSpecification = '0.8.0-draft.1' | '0.8.0-draft.2' | '0.8.0-draft.3' | '0.8.0-draft.4' | '0.8.0-rc.1';
1
+ export type McpDescriptionSpecification = '0.8.0-draft.1' | '0.8.0-draft.2' | '0.8.0-draft.3' | '0.8.0-draft.4' | '0.8.0-rc.1' | '0.8.0-rc.2' | '0.8.0-rc.3';
2
2
 
3
3
  export type SupportedProtocolVersion =
4
4
  | '2024-11-05'
@@ -38,7 +38,21 @@ export interface McpDescriptionComponentResolutionResult {
38
38
  }
39
39
 
40
40
  export interface ResolveMcpDescriptionComponentReferencesOptions {
41
- readonly specification: '0.8.0-rc.1';
41
+ readonly specification: '0.8.0-rc.1' | '0.8.0-rc.2' | '0.8.0-rc.3';
42
+ }
43
+
44
+ export type McpExtensionMaturity = 'official' | 'experimental' | 'uncatalogued';
45
+
46
+ export interface McpExtensionCatalogue {
47
+ readonly effectiveDate: '2026-09-04';
48
+ readonly source: 'https://modelcontextprotocol.io/extensions/overview';
49
+ readonly officialIdentifiers: readonly [
50
+ 'io.modelcontextprotocol/enterprise-managed-authorization',
51
+ 'io.modelcontextprotocol/oauth-client-credentials',
52
+ 'io.modelcontextprotocol/tasks',
53
+ 'io.modelcontextprotocol/ui'
54
+ ];
55
+ readonly experimentalIdentifiers: readonly [];
42
56
  }
43
57
 
44
58
  export interface SpecificationProvenance {
@@ -67,6 +81,16 @@ export interface SpecificationProvenance {
67
81
  readonly schemaUri: 'https://mcpdesc.org/schema/mcp-description/0.8.0-rc.1.json';
68
82
  readonly schemaSha256: '936a0f24ade501fcabf3d6498c0440c445daa672a575573a35954cee49430ac4';
69
83
  };
84
+ readonly '0.8.0-rc.2': {
85
+ readonly snapshotTag: 'v0.8.0-rc.2';
86
+ readonly schemaUri: 'https://mcpdesc.org/schema/mcp-description/0.8.0-rc.2.json';
87
+ readonly schemaSha256: '40f6775dde052224114e91d6aa484d826eecf56b77f7ac87b4cf707ffbcb6ce8';
88
+ };
89
+ readonly '0.8.0-rc.3': {
90
+ readonly snapshotTag: 'v0.8.0-rc.3';
91
+ readonly schemaUri: 'https://mcpdesc.org/schema/mcp-description/0.8.0-rc.3.json';
92
+ readonly schemaSha256: 'a9c3ff77ba37c72362909f538f6e957d055e6fdb372f8b3d529e3651af3fecf4';
93
+ };
70
94
  }
71
95
 
72
96
  export interface ResolveMcpDescriptionSpecificationOptions {
@@ -90,7 +114,7 @@ export type McpDescriptionSpecificationResolution =
90
114
  | ResolvedMcpDescriptionSpecification
91
115
  | UnresolvedMcpDescriptionSpecification;
92
116
 
93
- export declare const supportedSpecifications: readonly ['0.8.0-draft.1', '0.8.0-draft.2', '0.8.0-draft.3', '0.8.0-draft.4', '0.8.0-rc.1'];
117
+ export declare const supportedSpecifications: readonly ['0.8.0-draft.1', '0.8.0-draft.2', '0.8.0-draft.3', '0.8.0-draft.4', '0.8.0-rc.1', '0.8.0-rc.2', '0.8.0-rc.3'];
94
118
 
95
119
  export declare const supportedProtocolVersions: readonly [
96
120
  '2024-11-05',
@@ -101,6 +125,8 @@ export declare const supportedProtocolVersions: readonly [
101
125
  ];
102
126
 
103
127
  export declare const specificationProvenance: Readonly<SpecificationProvenance>;
128
+ export declare const mcpExtensionCatalogue: Readonly<McpExtensionCatalogue>;
129
+ export declare function mcpExtensionMaturity(identifier: string): McpExtensionMaturity;
104
130
 
105
131
  export declare function resolveMcpDescriptionSpecification(
106
132
  document: unknown,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcpdesc/validator",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "description": "Structural and semantic validation for MCP Description snapshots",
5
5
  "type": "module",
6
6
  "types": "./index.d.ts",
package/src/index.js CHANGED
@@ -3,14 +3,32 @@ import * as draft2 from './snapshots/0.8.0-draft.2/index.js';
3
3
  import * as draft3 from './snapshots/0.8.0-draft.3/index.js';
4
4
  import * as draft4 from './snapshots/0.8.0-draft.4/index.js';
5
5
  import * as rc1 from './snapshots/0.8.0-rc.1/index.js';
6
+ import * as rc2 from './snapshots/0.8.0-rc.2/index.js';
7
+ import * as rc3 from './snapshots/0.8.0-rc.3/index.js';
6
8
  import { resolveComponentReferences as resolveRc1ComponentReferences } from './snapshots/0.8.0-rc.1/semantic.js';
9
+ import { resolveComponentReferences as resolveRc2ComponentReferences } from './snapshots/0.8.0-rc.2/semantic.js';
10
+ import { resolveComponentReferences as resolveRc3ComponentReferences } from './snapshots/0.8.0-rc.3/semantic.js';
11
+ import {
12
+ mcpExtensionCatalogue,
13
+ mcpExtensionMaturity
14
+ } from './snapshots/0.8.0-rc.2/semantic.js';
15
+
16
+ export { mcpExtensionCatalogue, mcpExtensionMaturity };
7
17
 
8
18
  const snapshots = Object.freeze({
9
19
  [draft1.specification]: draft1,
10
20
  [draft2.specification]: draft2,
11
21
  [draft3.specification]: draft3,
12
22
  [draft4.specification]: draft4,
13
- [rc1.specification]: rc1
23
+ [rc1.specification]: rc1,
24
+ [rc2.specification]: rc2,
25
+ [rc3.specification]: rc3
26
+ });
27
+
28
+ const componentResolvers = Object.freeze({
29
+ '0.8.0-rc.1': resolveRc1ComponentReferences,
30
+ '0.8.0-rc.2': resolveRc2ComponentReferences,
31
+ '0.8.0-rc.3': resolveRc3ComponentReferences
14
32
  });
15
33
 
16
34
  const schemaUris = Object.freeze({
@@ -18,7 +36,9 @@ const schemaUris = Object.freeze({
18
36
  '0.8.0-draft.2': 'https://mcpdesc.org/schema/0.8.0.json',
19
37
  '0.8.0-draft.3': 'https://mcpdesc.org/schema/0.8.0.json',
20
38
  '0.8.0-draft.4': 'https://mcpdesc.org/schema/mcp-description/0.8.0-draft.4.json',
21
- '0.8.0-rc.1': 'https://mcpdesc.org/schema/mcp-description/0.8.0-rc.1.json'
39
+ '0.8.0-rc.1': 'https://mcpdesc.org/schema/mcp-description/0.8.0-rc.1.json',
40
+ '0.8.0-rc.2': 'https://mcpdesc.org/schema/mcp-description/0.8.0-rc.2.json',
41
+ '0.8.0-rc.3': 'https://mcpdesc.org/schema/mcp-description/0.8.0-rc.3.json'
22
42
  });
23
43
 
24
44
  export const supportedSpecifications = Object.freeze(Object.keys(snapshots));
@@ -149,9 +169,9 @@ export function resolveMcpDescriptionComponentReferences(document, options) {
149
169
  if (!options || typeof options !== 'object' || Array.isArray(options) || !Object.hasOwn(options, 'specification')) {
150
170
  throw new TypeError('options.specification is required');
151
171
  }
152
- if (options.specification !== '0.8.0-rc.1') {
172
+ if (!Object.hasOwn(componentResolvers, options.specification)) {
153
173
  throw new RangeError(`Component reference resolution does not support specification: ${String(options.specification)}`);
154
174
  }
155
175
 
156
- return resolveRc1ComponentReferences(document);
176
+ return componentResolvers[options.specification](document);
157
177
  }