Attested Context — an MCP extension for server-vouched context

Extension identifier: org.webgcp/attested-context · Version: 0.1 (draft) Anchor: the Model Context Protocol, 2026-07-28 specification.

MCP standardises how a client calls tools and receives context. Nothing in it says what context the server is willing to assemble and vouch for. Attested Context is that missing assurance layer: the serving side assembles the context bundle under its own authority, serves it with an independently verifiable vouch, and keeps a receipt of what it served. The payload noun is the Attested Context Bundle.

1. The anchor, as published

MCP 2026-07-28 fact Why it matters here
Stateless core — every request self-contained; version + capabilities ride _meta A self-verifying, content-addressed bundle is the natural payload of a stateless protocol
Extensions framework{vendor-prefix}/{extension-name} identifiers, capability negotiation, settings per extension This extension is org.webgcp/attested-context, riding official carrier machinery
_meta key rules — vendor-prefixed, reverse-DNS All wire surfaces below are _meta keys under org.webgcp/
Tool annotations are untrusted ("clients MUST consider tool annotations to be untrusted unless they come from trusted servers") A vouch cannot be merely asserted — it must be independently verifiable (content address + signature)
tools/list MAY vary by the authorization presented The sanctioned hook audience-scoping rides; this extension supplies the vocabulary and the enforcement rule
CacheableResultttlMs + cacheScope on list/read results Composes with audience scoping (a varying list is never publicly cacheable) and bounds the two freshness planes
Self-reported identity is not a trust surface (serverInfo "SHOULD NOT [be relied on] for security decisions") Issuer identity in the vouch binds to a published key, never to serverInfo

What the anchor deliberately does not cover (verified against the ratified text, 2026-07-30)

Property MCP 2026-07-28 state
Provenance per context item Content annotations are audience / priority / lastModified — display, ranking, and recency hints; no source, no evidence tier
Denied fields absent, not masked "Implement proper access controls" — an obligation without a mechanism
Audience-scoped tools No authorization field on Tool; the content-annotation audience is a display hint, not an authorization boundary
Server-held receipt Clients "SHOULD log tool usage" — client-side, advisory; no signing or content-addressing in core
Retrieval comparability No embedding, vector, or retrieved-item concept — see the webGCP substrate property this extension carries

The anchor holds on extension point plus governance, not coverage — which is exactly what an extension wants.

2. The delta

Four properties plus one precondition:

  1. Provenance per item — every field of a served bundle names its source, evidence tier, retrieval mode, and (where vector-ranked) its embedding-space identity. (AC-2)
  2. Absent, not masked — a denied field is omitted entirely; a response never discloses that denial occurred. (AC-3)
  3. Audience-scoped tools — tools carry an audience class enforced server-side at call time and reflected in per-authorization listings. (AC-4)
  4. The vouch and the receipt — the served bundle is content-addressed and signed, and the server retains a receipt. (AC-6)

The precondition (mediated assembly): the serving side queries its own substrate under its own identity. The client's credentials authorize the MCP call — they are never forwarded to, replayed against, or exchanged for access to the underlying substrate. A client never holds a substrate grant. (AC-5) This is what makes the vouch meaningful: a server that proxies the caller's credentials cannot attest to what it assembled.

3. Normative requirements

Key words MUST / MUST NOT / SHOULD / MAY per BCP 14.

AC-1 — Negotiation and degradation

AC-2 — Provenance per item

A result serving an Attested Context Bundle MUST carry _meta["org.webgcp/attested-context"].provenance: a map from JSON Pointer into structuredContent to a provenance record:

Field Req Meaning
source MUST URI or URN of the item's origin
tier MUST evidence tier, per the published truth-class ladder (canonical | derived | inferred | synthetic)
retrieved_at MUST when the item was read from its source (RFC 3339)
retrieval_mode MUST where retrieval ranked results vector | lexical — declared degradation; a lexical response is honest, never silently counted as semantic
space MUST where retrieval_mode is vector the declared space identity (model, dim, distance) per the webGCP Declared Space Identity substrate property — carried, not defined, here

The map MUST cover every leaf of structuredContent (a record on an ancestor pointer covers its descendants).

AC-3 — Absent, not masked

AC-4 — Audience-scoped tools

AC-5 — Mediated assembly

AC-6 — The vouch and the receipt

A result serving an Attested Context Bundle MUST carry _meta["org.webgcp/attested-context"].attestation:

Field Req Meaning
bundle_hash MUST sha256: content address over the RFC 8785 (JCS) canonical form of structuredContent
issued_at MUST RFC 3339
issuer MUST stable issuer identifier resolvable to a published verification key
sig MUST detached signature (EdDSA RECOMMENDED) over the JCS canonical form of {bundle_hash, issued_at, issuer} — exactly those three fields
receipt_ref MUST at the governed level the retained receipt's identifier

AC-7 — Two freshness planes, never conflated

ttlMs/cacheScope govern response caching; retrieved_at and staleness bounds in provenance govern content currency. An implementation MUST NOT derive one from the other. An attested bundle MAY be cached within ttlMs and remains verifiable — the vouch binds to content, not transport.

4. L0 conformance

Twelve assertions across three fixtures, with a stdlib-only runner, golden transcripts, and negative controls — published at /conformance/attested-context/:

The runner evaluates captured transcripts, never live endpoints, so verdicts are reproducible from artifacts. It is positive-controlled (a conformant golden transcript must pass 12/12), negative-controlled (eleven broken variants must each trip their declared assertions — no check in the suite is incapable of failing), and its embedded Ed25519 verifier is checked against RFC 8032 test vector 1 before any run. Run python3 runner.py --self-test first, then python3 runner.py --transcripts <your-captured-dir>.

AC-5 deliberately has no fixture assertion: mediation is not observable from the wire; it is verified by architecture review. The governed receipt posture is likewise declared and discoverable rather than L0-asserted.

5. Status — read the flags before citing this page

6. What this extension deliberately does not do

7. Open questions (v0.1)

  1. Canonicalization is decided (RFC 8785 JCS; the L0 runner refuses content outside its integer-restricted subset rather than approximate); the request digest's argument normalizations remain open.
  2. Per-item Merkle proofs (excerpt one item with proof) — deferred until a consumer exists.
  3. Serving-cost budgets for server-side assembly — to be answered with measurements, not asserted.
  4. Whether mixed public/audience deployments need a third cache posture.