Extension identifier: org.webgcp/site-embed · Version: 0.1 (draft)
Anchors — three, all published elsewhere:
| Anchor | Standing (verified 2026-08-23) | What this extension takes from it |
|---|---|---|
| webGCP v0.1 | frozen 2026-05-16 | §5.1 descriptor, §5.1.1 SVCB, §8 link-driven discovery |
| WebMCP | Draft Community Group Report (W3C Web Machine Learning CG, 19 Aug 2026) — "not a W3C Standard nor on the W3C Standards Track" | document.modelContext tool registration, ToolAnnotations, the origins/Permissions-Policy isolation model |
| x402 | open, neutral standard for internet-native payments over HTTP 402 |
the metered-lane payment mechanism: 402 + X-PAYMENT, settled-only, nano granularity |
⚠ WebMCP is cited accurately on purpose. It is an actively incubating community-group draft
with a real implementation — a strong position, but not a ratified standard, and this document does
not describe it as one. Its surface has already moved once (the API migrated from navigator to
document, and most secondary documentation has not caught up), so implementers should feature-detect
and re-verify rather than trust any explainer, including this one, on a fixed date.
This extension invents no identity scheme, no payment scheme, and no tool-registration API. It composes three published surfaces and adds only the participant shape that none of them defines.
WebMCP declares what a site can do. webGCP declares what a network knows. This extension is the packaged thing a webmaster installs to join the second without giving up the first: a descriptor entry that says the site participates, a domain-bound identity it can be held to, and a client split so that no credential capable of spending money ever reaches a browser.
Nothing here is new machinery. Every part rides a v0.1 surface that already exists.
| webGCP v0.1 fact | Why it matters here |
|---|---|
§5.1 descriptor at /.well-known/webgcp — HTTPS, application/json, cacheable 1–24 h |
The descriptor is the installation. There is nothing else to register with. |
| §8 discovery is link-driven — "No central registry... Aggregators MAY exist; they are not the protocol" | A participant is found the same way everything else is. This extension adds no directory. |
role discriminates document classes — the spec host carries role: "specification_authority" instead of conformance_level, and its live descriptor calls itself "distinct from server descriptors that implementations publish" |
A third document class — the participant — needs no new mechanism, only a new value. See the framing note below. |
§5.1.1 SVCB — _webgcp.<host> RR TYPE 64, binding "a webGCP server" |
Participants are not servers. This is the one place the anchor does not cleanly cover the case; see SE-7. |
| §4 conformance levels are self-declared and externally verifiable | A participant profile must be testable, or it is decoration. |
Framing note — what this extension does to role. v0.1 names exactly one role value, in
one place: the spec host carries role: "specification_authority" instead of a
conformance_level. There is no role enumeration in v0.1, and knowledge servers are
discriminated by conformance_level, not by a role value. So this extension does something
slightly larger than add a second value — it generalizes role into a document-class
discriminator for hosts that are neither the specification authority nor a conforming knowledge
server, with participant meaning consumer. That is an extension and not a spec change (there is
no enum to violate), but implementers should understand it as a generalization rather than assume
v0.1 already shipped a role vocabulary.
| Property | webGCP v0.1 state |
|---|---|
| A consumer that publishes but serves nothing | Undefined. §5.1's descriptor is written for servers; §4's levels grade served capability. A site that only calls has no level to claim and no shape to publish. |
| Identity for a non-server domain | Undefined. Trust roots (§5.1) are for servers that sign. |
| Where a credential may live | Unaddressed. v0.1 has no client model at all, so nothing forbids the failure that matters most here. |
| Composition with a site's own tool card | Out of scope for v0.1; the composition reference is informative. |
The anchor holds on extension point plus governance, not coverage — which is what an extension wants.
Four properties:
did:web:<domain>, proven by control of the well-known path. The
site is an agent; receipts carry it; credibility accrues to the domain. (SE-2)Key words MUST / MUST NOT / SHOULD / MAY per BCP 14.
/.well-known/webgcp per §5.1 (HTTPS, application/json, cacheable
1–24 h) carrying role: "participant".consumes: a non-empty array of absolute HTTPS origins of the network host(s) it
consumes.conformance_level. A participant serves no knowledge surface and has no level
to claim; it follows the spec-host precedent of carrying role in that field's place.endpoints it does not serve.{
"role": "participant",
"spec_version": "0.1",
"extensions": ["org.webgcp/site-embed@0.1"],
"identity": "did:web:example.com",
"consumes": ["https://catalog.example-network.org"],
"svcb_status": "live 2026-08-23"
}
did:web:<domain>, where <domain> is the host serving
the descriptor, per the W3C did:web method.did:web is it.did:web — is not a credential and MAY ship in the
page. The test is capability, not secrecy: if presenting this value alone can cause a metered
call to succeed, it is a credential.The payment mechanism is x402 — not a webGCP invention. Internet-native machine payments
already have an open, neutral standard built on HTTP's own 402 Payment Required, and this
extension anchors on it rather than defining a parallel scheme. The same reasoning that made site
identity did:web instead of a bespoke URN applies here with more force: payments are precisely
where a private scheme costs an ecosystem the most.
402 Payment Required with the payment
requirements, and MUST accept the client's payment payload in the X-PAYMENT request header
on retry.402, never 429. A rate limit and a price are different refusals; conflating them makes a
free-lane throttle indistinguishable from a charge, and an agent cannot choose correctly between
waiting and paying.The lane cascade. A participant's server half SHOULD resolve payment in fixed priority — free
→ session budget → x402 → 402 — falling through to a 402 refusal rather than failing open.
The free lane sits first by construction: the common case costs nothing and never reaches a payment
rail at all.
⚠ What this extension does NOT do: take a percentage of every transaction. Fees attach to operated rails by scope, not as a tax on each call. A participant that installs the embed and stays on the free lane pays nothing, forever, and that is the intended common case — the metered lanes price work performed, not access granted.
authority: "derived" and a source naming the network
skill it materializes.untrustedContentHint annotation.
The two labels answer different questions and an agent needs both: untrustedContentHint warns
about a tool's output, our authority/source pair states a tool's origin. Where the
platform ships an annotation for the concern, use it rather than relying only on vocabulary this
extension minted.readOnlyHint,
giving an agent a native signal that the call neither costs nor changes anything.document.modelContext — note the spelling. The API lives on the
document, not on navigator; most secondary documentation still carries the older form, and code
written from it does not run.Why this is composition and not the disintermediation WebMCP guards against. The WebMCP proposal names an explicit aim of preventing disintermediation of web apps by backend integrations, and surfacing another party's tools into a site's card superficially resembles exactly that. It is worth answering directly rather than leaving the reader to wonder. Four properties, each required above, distinguish the two:
Note also that WebMCP is "primarily designed for local browser workflows with a human in the loop", and names fully autonomous workflows an explicit non-goal. The browser half of SE-3 sits inside that model deliberately; nothing in this extension asks WebMCP to carry unattended execution.
Ruled SHOULD by the specification authority, 2026-08-23.
svcb_status: "live <date>".svcb_status: "unavailable" with an
svcb_unavailable_reason naming the platform or registrar.The question, and why it needed a ruling. §5.1.1 binds its MUST to "a webGCP server"; the
frozen text then generalizes it to any host serving the descriptor, spec hosts included. A
participant serves the descriptor and is not a server, so the two readings disagree for exactly
the class this extension defines. Worse, the spec's restricted-domain escape hatch lands in
conformance_level — a field a participant does not carry — so the caveat as written could not be
applied here at all.
The case that was weighed. For MUST (uniformity): the DNS signal is what lets an agent ask
"does this domain speak webGCP?" without an HTTPS round-trip, and a population-scanning agent would
find participants the same way it finds servers; precedent leaned this way, since the spec host
carries role instead of conformance_level and is still bound by §5.1.1. For SHOULD
(adoption): requiring an RR TYPE 64 to install a script is the difference between a webmaster
installing this and a webmaster filing a ticket with a DNS provider that may not support the type
at all — and the spec's own restricted-domain caveat exists precisely because that population is
large.
What was preserved either way. The disclosure is MUST under both readings. A participant without the record is legible — it says so, in the descriptor, with a reason — rather than silently non-conformant. That was the part worth protecting, and the ruling keeps it.
⚠ Scope of the ruling: it binds this extension, not the frozen spec. v0.1 §5.1.1 is unchanged
and, per §10.4 normative immutability, will stay unchanged. A participant conformant to
org.webgcp/site-embed@0.1 may therefore still read as non-conformant to a strict application of
the frozen text's generalization. Closing that gap is a v0.2 clarification — that the SVCB MUST
binds servers, not every host that serves a descriptor — and it is listed as owed below.
The participant conformance profile — assertions, controls, and what is verifiable from the wire versus only by architecture review — is a separate document. The runnable fixture suite is owed, not shipped; until it exists this profile is a specification of tests, not a passing result. The anchor's own §16 is the standard being held to here: a standard without runnable conformance tests is aspirational.
svcb_status is
what keeps that determinable rather than hidden, and the v0.2 clarification below is the real
close-out.Owed by v0.2 of the anchor spec (not by this extension):
role in place of conformance_level, which today it lacks.Owed by v0.2 of this extension:
consumes should carry a per-host lane declaration (free-only vs metered-enabled),
which would make the SE-4 opt-in externally verifiable rather than an internal posture.