protocol-droid-schema 0.5.0

Per-revision Model Context Protocol wire types generated from the official schema.json for every published revision.
# MANIFEST.toml — provenance for every vendored MCP spec revision.
#
# This file is the single source of truth for what is vendored and where it came
# from. `cargo xtask refresh-spec <version>` rewrites it; a test and build.rs
# both verify the files on disk against the digests recorded here.
#
# NEVER hand-edit a digest. Re-run the xtask.
#
# The revision keys are quoted: `[revisions."2024-11-05"]`, not
# `[revisions.2024-11-05]`. Both are legal TOML 1.0, but taplo's parser reads a
# bare key beginning with a digit as a number and reports "expected identifier",
# so the unquoted form lights up the editor with parse errors. Do not
# "normalise" these back to bare keys.

[meta]
schema_version = 1
# Upstream repository, in the form `owner/name`.
repository = "modelcontextprotocol/specification"
# Base for raw file downloads, pinned by tag or by full commit SHA.
raw_base = "https://raw.githubusercontent.com/modelcontextprotocol/specification"

# ─── A2A protocol ─────────────────────────────────────────────────────────────
# Phase 9 added A2A. The A2A project's canonical wire definition is the proto
# at `a2aproject/A2A/specification/a2a.proto`; the JSON Schema is a non-normative
# build artifact derived from it (see the README at
# `specification/json/README.md`). We vendor the proto for now and the JSON
# artifact will be generated by `cargo xtask refresh-spec-a2a` once the
# codegen pipeline lands. The repository URL is `a2aproject/A2A`.
# Verdicts on the tags this project deliberately does not vendor, so the
# exclusion is a recorded decision rather than an oversight. Re-verify with
# `curl https://api.github.com/repositories/862570523/tags`.
[meta.excluded_tags]
"2024-10-07" = "Superseded by 2024-11-05; predates the first published revision."
"2024-11-05-final" = "Same revision as 2024-11-05. Differs only in repository layout (adds the per-version schema/ directory)."
"2025-11-25-RC" = "Release candidate, superseded by the 2025-11-25 final."
"2026-07-28-RC" = "Release candidate, superseded by the 2026-07-28 final."

# ─── 2024-11-05 ───────────────────────────────────────────────────────────────
# The first published revision. Its schema lives at the repository root's
# `schema/` directory rather than `schema/<version>/` — the per-version layout
# was introduced later. Do not "fix" this path; it 404s at the newer layout.

[revisions."2024-11-05"]
tag = "2024-11-05"
commit = "0d63bea927001bedf3be3e59be735c979ba0aacb"
schema_prefix = "schema"
# No `changelog` key. Upstream ships no changelog for this revision, so the
# vendored CHANGELOG.md is hand-written. An absent key is what marks a changelog
# as authored: the verifier then expects the file on disk but holds no digest
# for it, so it can be edited without breaking the build.

[revisions."2024-11-05".files]
"schema.json" = "56d9e706cc8b0daf690a483960aa4ba62217c863d36ff1d7f8bbb83ab049903d"
"schema.ts"   = "3cc60f4f2ab5d6129d2bab47954d534546be6f3f1920ffb9ff9a60cb04339586"
# CHANGELOG.md is deliberately absent: it is authored, not vendored (see
# `changelog = "authored"` above), so it carries no digest. Digest-locking a
# hand-written file would break the build on every edit to it. The verifier
# reconciles this in both directions and will fail if an unlisted, undeclared
# file ever appears in this directory.

# ─── 2025-03-26 ───────────────────────────────────────────────────────────────

[revisions."2025-03-26"]
tag = "2025-03-26"
commit = "9236eb1cbfa02c17ab45c83a7bdbe55c450070be"
schema_prefix = "schema/2025-03-26"
changelog = "docs/specification/2025-03-26/changelog.md"

[revisions."2025-03-26".files]
"schema.json"   = "dd1619bf96fcd8c50fe46f0dd05b4b9bb9356010040ae985fa595fee226ff4ed"
"schema.ts"     = "d76b5f653af272c2d58681c68bde24cece1bea7216debedeb108b60a0116d6cc"
"CHANGELOG.md"  = "ce11e369a38616efdd4003caf8ea3f930cb6a63736215eff45715669a620fe73"

# ─── 2025-06-18 ───────────────────────────────────────────────────────────────

[revisions."2025-06-18"]
tag = "2025-06-18"
commit = "f5ccad944fdf2b7d9cc70cf817f66ca5a8aa03a4"
schema_prefix = "schema/2025-06-18"
changelog = "docs/specification/2025-06-18/changelog.mdx"

[revisions."2025-06-18".files]
"schema.json"   = "05020a692319467847cdb1794b1306567f52860353b5ff2f2bc2b0140819305b"
"schema.ts"     = "0838332b90a9188c09fecddcaced2cd2d626126925d181bef8fc4785884706cf"
"CHANGELOG.md"  = "d2b6024c301f3c7ef5948b458eb9a553ca7bd19ee990fb2cfbbe41354a9900b5"

# ─── 2025-11-25 ───────────────────────────────────────────────────────────────

[revisions."2025-11-25"]
tag = "2025-11-25"
commit = "38c84e9f93ad191d9eb26d92b945d17bd0efcaf3"
schema_prefix = "schema/2025-11-25"
changelog = "docs/specification/2025-11-25/changelog.mdx"

[revisions."2025-11-25".files]
"schema.json"   = "1ffe4c5577974012f5fa02af14ea88df4b7146679df1abaaad497c8d9230ca8a"
"schema.ts"     = "0845473b20273dae35df6651b831540be3d5866a42d0ad324e4a06caaa398a07"
"CHANGELOG.md"  = "d21083d5ada5706026550ed13ec2ccfb0a8b3b271918698c33d18d2c41d942ae"

# ─── 2026-07-28 ───────────────────────────────────────────────────────────────

[revisions."2026-07-28"]
tag = "2026-07-28"
commit = "5f5440bb26a62e2cf3440b92da5a667efa03b267"
schema_prefix = "schema/2026-07-28"
changelog = "docs/specification/2026-07-28/changelog.mdx"

[revisions."2026-07-28".files]
"schema.json"   = "ef70b61f99b6d2e5e3b46863822eab08dff6a45bedc7a08914e0e5b133f40203"
"schema.ts"     = "742750af0bb8c716e7030c4977c992b55d1adc4407e9e66997db5846baedc2cd"
"CHANGELOG.md"  = "ba4d0ba299ff0b45d26c52111d41dc0c862dd04ef973f63f93570c2b020f3974"

# ─── draft ────────────────────────────────────────────────────────────────────
# `draft` is a floating revision with no tag. It is pinned to an explicit commit
# so builds stay reproducible, and is refreshed only by an explicit
# `cargo xtask refresh-spec draft` — never during a build.

[revisions.draft]
tag = ""
commit = "db788e34ffc0c7253f099f647a5e25e0396fadfe"
schema_prefix = "schema/draft"
# A floating revision has no tag, so a refresh resolves this branch to a commit
# and pins the result. "Whatever main pointed at when we last looked" is not a
# reproducible pin; a commit is.
branch = "main"
changelog = "docs/specification/draft/changelog.mdx"
floating = true
# Upstream's draft changelog is a placeholder ("Changes since the most recent
# release will accumulate here."). Vendored verbatim; not a defect in this repo.
changelog_is_placeholder = true

[revisions.draft.files]
"schema.json"   = "ef70b61f99b6d2e5e3b46863822eab08dff6a45bedc7a08914e0e5b133f40203"
"schema.ts"     = "b2d3a00d4094e413a48628560fec60652169a3d2b427e8c629238e13f987723f"
"CHANGELOG.md"  = "09d94d1a4525a5296627636774c7145bd837f736aaa5ea3ed6e4c8474200f77e"

# ─── Cited external documents ─────────────────────────────────────────────────
# Normative documents the MCP authorization sections cite. These are NOT MCP
# artifacts: they are fetched from their own publishers at their own URLs, and
# they live in one shared directory rather than per revision because a single
# document is cited by several revisions.
#
# `cited_by` records which revisions' authorization sections require each
# document. It is a judgement, recorded here so it appears in a reviewable
# diff rather than being recomputed by code from the changelog.

[rfc_documents."rfc6749"]
title = "The OAuth 2.0 Authorization Framework"
url = "https://www.rfc-editor.org/rfc/rfc6749.txt"
file = "rfc6749.txt"
sha256 = "f204fc8661d6c92d2ec6e0b54808f961a9ad26e792f57f312d9528335519bd71"
cited_by = ["2025-03-26"]

[rfc_documents."rfc7591"]
title = "OAuth 2.0 Dynamic Client Registration Protocol"
url = "https://www.rfc-editor.org/rfc/rfc7591.txt"
file = "rfc7591.txt"
sha256 = "f9cd8b8eefdb2d1b1bd5734310f246926db0abb4ec1b2f933f358d58327964e3"
cited_by = ["2025-03-26", "2026-07-28"]

[rfc_documents."rfc7636"]
title = "Proof Key for Code Exchange by OAuth Public Clients"
url = "https://www.rfc-editor.org/rfc/rfc7636.txt"
file = "rfc7636.txt"
sha256 = "1972e5d81cbaba7066cfd46374207bc2b4546b085ed5dd9b034e79e023e0ca31"
cited_by = ["2025-03-26"]

[rfc_documents."rfc8414"]
title = "OAuth 2.0 Authorization Server Metadata"
url = "https://www.rfc-editor.org/rfc/rfc8414.txt"
file = "rfc8414.txt"
sha256 = "16c816e4e0fdbffb7e910ff3017867bf39debe9cb7f52f5cbc508a052ed660e8"
cited_by = ["2025-03-26"]

[rfc_documents."rfc8707"]
title = "Resource Indicators for OAuth 2.0"
url = "https://www.rfc-editor.org/rfc/rfc8707.txt"
file = "rfc8707.txt"
sha256 = "3b89844a938b9219571931b664ed4a7b380555a4dda1df4e9445a2f72188e76b"
cited_by = ["2025-06-18"]

[rfc_documents."rfc9207"]
title = "OAuth 2.0 Authorization Server Issuer Identification"
url = "https://www.rfc-editor.org/rfc/rfc9207.txt"
file = "rfc9207.txt"
sha256 = "c9c17b9824315aca9bda5c0b5e3627cb24aa28d54324292f3761006209b705fd"
cited_by = ["2026-07-28"]

[rfc_documents."rfc9728"]
title = "OAuth 2.0 Protected Resource Metadata"
url = "https://www.rfc-editor.org/rfc/rfc9728.txt"
file = "rfc9728.txt"
sha256 = "b65bcd0d9daf90fd7006a42cf48e0ac3ba24b7f5637d5197f2de41c6b91c8a89"
cited_by = ["2025-06-18"]

[rfc_documents."draft-parecki-oauth-client-id-metadata-document-03"]
title = "OAuth Client ID Metadata Document"
url = "https://www.ietf.org/archive/id/draft-parecki-oauth-client-id-metadata-document-03.txt"
file = "draft-parecki-oauth-client-id-metadata-document-03.txt"
sha256 = "23b69586234b7ff17b351e5d448056f10dccb6eeebea82696cf6bfc826a04ced"
cited_by = ["2025-11-25"]

# ─── A2A revisions ────────────────────────────────────────────────────────────
# Each A2A revision is keyed by its tag. The `package` key mirrors the proto
# file's `package` declaration (`lf.a2a.v1`, etc.), so the codegen can route
# the per-version types to the right Rust module. A future revision with a
# different `package` line will need its own entry; the [meta.a2a] section
# above is the version-independent part.
#
# `files` is the same shape as `revisions.<mcp>.files`: a flat
# `name -> sha256` map. The MCP entries are a flat map, and keeping the
# A2A entries the same shape means one map type can serve both — a
# future codegen that takes a `BTreeMap<String, String>` and locks
# each entry against the disk digest needs no A2A-vs-MCP branch.

[a2a_revisions."v1.0"]
tag = "v1.0.0"
commit = "173695755607e884aa9acf8ce4feed90e32727a1"
package = "lf.a2a.v1"
spec_prefix = "specification"

[a2a_revisions."v1.0".files]
"a2a.proto" = "4b74c0baa923ae0acb55474e548f1d6e5d3f83b80d757b65f8bf3e99a3c2257f"
# Versions older than v1.0 (0.1.0 through 0.3.0) used a JSON-RPC binding
# without a version header; the negotiation model in domain/a2a
# does not cover them. They are deliberately not vendored; a consumer
# who needs them implements the v1 wire format and translates.

# ─── ACP protocol ─────────────────────────────────────────────────────────────
# Phase 9 added ACP. The agent-client-protocol project's canonical wire
# definition is the JSON Schema at
# `agentclientprotocol/agent-client-protocol/schema/v1/schema.json`,
# pinned by release tag (the release tag is `schema-v<version>` to
# disambiguate from the JSON-RPC namespace). The schema is published
# alongside a hand-written `meta.json` that names every method
# (the schema is method-agnostic; methods are layered on top by the
# `meta.json`).
#
# ACP is pre-1.0 (the first release was `schema-v0.0.1` in late 2024; the
# current pin is `schema-v1.25.0`). Per the task's experimental carve-out,
# the version stays pinned to a single release; future bumps are
# separate tasks that re-verify the wire contract.
#
# `repo` mirrors the A2A entry: `agentclientprotocol/agent-client-protocol`.

[acp_revisions."v1.25.0"]
tag = "schema-v1.25.0"
commit = "4cf3dd858c819fc3ab99ae53f76883ede0345a10"
spec_prefix = "schema/v1"

[acp_revisions."v1.25.0".files]
"schema.json"  = "4bcd1d2051ff7ed379bd9b234fb9b09c5ab9245478698e9fab805bd9b52a33a6"
"meta.json"    = "061edb6efa8fb2aa2792459a86ec7268de5fe665bba48b2ffe7939df01481f88"
"CHANGELOG.md" = "c0d3aa8303b9ffea59f1def821083ba487ccca0b5d04c64c3a9fb5d8a2481470"