A document is UTF-8 JSON or a single restricted YAML document that decodes to the JSON data model: string keys only, no duplicate keys, tags, or aliases, no merge semantics, and only finite numbers. Rejected YAML is not validated further.
Requirement
Section titled “Requirement”A document uses a conforming serialization: RFC 8259 JSON in UTF-8, or exactly one YAML document within the restricted YAML profile.
Details
Section titled “Details”Rule ID: mcpdesc.serialization.conforming
Owner: mcpdesc
Surface: Document serialization
Kind: structural
Requirement level: must
Protocol versions: independent of the MCP protocol version
Status: delegated · Enforcement: external
Required by
Section titled “Required by”- MCP Description 0.9.0, Section 15
- 3. Document Structure: req-conforming-serialization
-
- Serialization: req-serialization-json
-
- Serialization: req-serialization-yaml-claims
-
- Serialization: req-serialization-yaml-single-document
-
- Serialization: req-serialization-yaml-string-keys
-
- Serialization: req-serialization-yaml-duplicate-keys
-
- Serialization: req-serialization-yaml-scalars
-
- Serialization: req-serialization-yaml-tags
-
- Serialization: req-serialization-yaml-aliases
-
- Serialization: req-serialization-yaml-merge-keys
-
- Serialization: req-serialization-yaml-validation
Checked when a serialization is decoded, before document validation, so a validator that receives decoded data reports this rule as delegated. Checked by decoding the serialization fixtures; scripts/test-serializations.mjs also checks that the equivalent JSON and YAML documents decode and validate identically.
Examples
Section titled “Examples”Decoding accepts
Section titled “Decoding accepts”Source: serialization-fixtures/equivalent/document.json · Selected: whole document
{ "mcpdesc": "0.9.0", "info": { "name": "example", "version": "1.0.0" }, "protocolVersions": ["2026-07-28"], "x-values": [true, false, null, 12, -1.5, 6.02e23, "2026-08-25"]}Decoding accepts
Section titled “Decoding accepts”Source: serialization-fixtures/equivalent/document.yaml · Selected: whole document
mcpdesc: 0.9.0info: name: example version: 1.0.0protocolVersions: ["2026-07-28"]x-values: [true, false, null, 12, -1.5, 6.02e23, 2026-08-25]Decoding accepts
Section titled “Decoding accepts”Source: serialization-fixtures/expected-valid/scalars-and-ordinary-merge-key.yaml · Selected: whole document
value: <<: a: 1scalars: - true - false - null - 0 - -12 - 1.5 - 6.02e23 - 2026-08-25 - ".nan"Decoding rejects
Section titled “Decoding rejects”Source: serialization-fixtures/expected-invalid/multiple-documents.yaml · Selected: whole document
---a: 1---b: 2Decoding rejects
Section titled “Decoding rejects”Source: serialization-fixtures/expected-invalid/non-string-key.yaml · Selected: whole document
1: valueDecoding rejects
Section titled “Decoding rejects”Source: serialization-fixtures/expected-invalid/duplicate-key.yaml · Selected: whole document
a: 1"a": 2Decoding rejects
Section titled “Decoding rejects”Source: serialization-fixtures/expected-invalid/positive-infinity.yaml · Selected: whole document
value: .infDecoding rejects
Section titled “Decoding rejects”Source: serialization-fixtures/expected-invalid/custom-tag.yaml · Selected: whole document
a: !example valueDecoding rejects
Section titled “Decoding rejects”Source: serialization-fixtures/expected-invalid/alias.yaml · Selected: whole document
a: &shared valueb: *sharedDecoding rejects
Section titled “Decoding rejects”Source: serialization-fixtures/expected-invalid/merge-alias.yaml · Selected: whole document
base: &base a: 1value: <<: *baseRule Source Code
Section titled “Rule Source Code”document.yaml at immutable tag v0.9.0-rc.3.