phase: [1] status: Publication-ready (PR) draft — composition reference authored: 2026-05-21 authority: standards/webgcporg/CLAUDE.md (engineer-to-engineer prose; peer-documents rule) publishes_to: webgcp.org/composition/ (proposed path; deploy when ready) license: spec text CC-BY-4.0; schemas + fixtures Apache-2.0
Audience: implementers asking "if I already use MCP / WebMCP / AP2 / x402 / A2A, where does webGCP fit?" + standards-body reviewers checking webGCP's composition claims against the actual external specs.
TL;DR. webGCP is the protocol layer between discovery and settlement. It composes with — does not replace — the major-vendor wire standards. This document gives the wire-level pairing for each one.
Audit history (2026-05-21). First-publish version of this doc carried per-cell
MUST/SHOULDclaims in §9 that were not all backed line-by-line by source authority. Audit pass on 2026-05-21 tightened claims to one of three states: (a) cite the specific source MUST in v0.1 or v0.2-candidate, (b) downgrade to SHOULD/MAY where the source only implies, or (c) flag explicitly as v0.2+ candidate scope (not yet v0.1 normative). No claim in this doc adds new authority; every assertion either cites a normative MUST in source or is marked as composition guidance.
webGCP layers. It does not rebuild upstream.
| Layer | Owner | Concern |
|---|---|---|
| Discovery | DNSAID / SEP-1649 / WebMCP | "Where is the agent?" |
| Transport | MCP / WebMCP | "How do I call it?" |
| Protocol | webGCP | "What does the call carry?" |
| Settlement | x402 V2 | "How is it paid for?" |
| Authorization | AP2 | "Who authorized this invocation?" |
| Cross-vendor agent fabric | A2A | "How do agents talk to each other?" |
Each row is an existing standard; webGCP is the protocol row. The pairings below show how the layers meet.
The locked positioning frame: "building the registry, settlement, and reputation infrastructure that the MCP ecosystem currently lacks" (per brainstorming/arch/session-research-2026-05-13.md §8). Every pairing in this doc reflects that frame.
Model Context Protocol — Anthropic Foundation, governance Jan 2026. Five-vendor co-governance. The callable transport for AI tools: tools/list, tools/call, resources/read, prompts/get, sampling/createMessage. JSON-RPC over stdio or HTTP+SSE.
MCP defines how to call; webGCP defines what's in the response body. An MCP tools/call to a webGCP-conformant server returns a typed bundle with applicability gating, provenance _meta, idempotency-key honoring, ACL-at-retrieval (absent-not-masked), and content-addressed identifiers.
MCP request (standard MCP):
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "local_search",
"arguments": {
"query": "refund policy for retail orders",
"idempotency_key": "ik_2026-05-21_a3b4c5"
}
}
}
MCP response carrying a webGCP bundle:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [{
"type": "text",
"text": "<webGCP bundle below>"
}],
"_meta": {
"webgcp": {
"kb_id": "urn:webgcp:myparallel:skill:refund-triage-v3",
"kb_version": "v3.2.1",
"manifest_hash": "sha256-7c2f...",
"bundle_hash": "sha256-9d1a...",
"provenance": {
"source_uri": "urn:webgcp:myparallel:knowledge:refund-policy-2024q3",
"freshness": "2026-05-20T14:00:00Z",
"content_origin": "first-party"
},
"applicability": "in_scope"
}
}
}
}
The _meta.webgcp block is what an MCP server adds when it implements webGCP. Everything outside that block is standard MCP. An MCP client that doesn't know webGCP can still consume the call — it just gets the content[].text and ignores _meta.
services/cognition-engine-mcp/ — M3a backend, live since 2026-05-17spec/mcp-protocol-leverage.md — how we adopt MCPspec/milestone-3-mcp-surfaces.md — the per-service MCP surface inventoryWebMCP — W3C Community Group draft (Apr 2026). A manifest pattern for advertising MCP server availability on a web property. Four-method API: registerTool, unregisterTool, provideContext, requestUserInteraction. The web page hosts (or links to) an MCP server; the manifest tells crawlers + agents where it is.
WebMCP says "there's an MCP server here." webGCP says "and here's the typed protocol it speaks." A WebMCP-discoverable server can also be webGCP-conformant if it publishes the descriptor at .well-known/webgcp + carries the §5 bundle contract.
WebMCP manifest (standard):
<link rel="webmcp" href="https://example.com/webmcp/manifest.json">
The manifest at that URL:
{
"$schema": "https://webmcp.org/manifest/v0.1.json",
"name": "example-refund-agent",
"tools": [
{
"name": "local_search",
"endpoint": "https://example.com/mcp",
"description": "Refund policy retrieval"
}
],
"webgcp": {
"spec_version": "v0.1",
"descriptor": "https://example.com/.well-known/webgcp",
"level": "L1",
"features": ["applicability_gating", "provenance_meta", "idempotency"]
}
}
The webgcp block in the manifest is the opt-in pairing: any WebMCP consumer that knows webGCP can route to the typed protocol; consumers that don't, see a regular MCP tool.
webmcp_origin block." This MUST is triggered by origin, not by conformance level./.well-known/webgcp is the canonical handshake (v0.1 §5.1); the WebMCP manifest's webgcp.descriptor field points to it when present.spec/webmcp-manifest-pattern.md — the pattern we followspec/webmcp-onboarding.md — how we onboard existing WebMCP users (supply flywheel per CLAUDE.md §"Primary goal")services/cognition-app/ — M3b WebMCP projection targetSEP-1649 is the MCP Server Discovery Convention — a .well-known/mcp.json route on any host advertising "I have an MCP server here." Reuses the IETF .well-known URI scheme.
SEP-1649 advertises an MCP server's existence at /.well-known/mcp.json; webGCP advertises the typed-protocol server's existence at /.well-known/webgcp. Both descriptors can coexist on the same host — they describe the same server from two perspectives.
SEP-1649 at https://example.com/.well-known/mcp.json:
{
"name": "example-refund-agent",
"version": "v3.2.1",
"tools": [
{
"name": "local_search",
"endpoint": "https://example.com/mcp"
}
]
}
webGCP at https://example.com/.well-known/webgcp:
{
"name": "example-refund-agent",
"role": "webgcp-server",
"spec_version": "v0.1",
"kbs": [
{
"kb_id": "urn:webgcp:example:skill:refund-triage-v3",
"version": "v3.2.1"
}
],
"endpoints": {
"query": "https://example.com/mcp",
"manifest": "https://example.com/webgcp/manifest"
},
"conformance_level": "L1"
}
The two descriptors share the endpoints.query URL — same MCP server, two discovery surfaces.
.well-known/mcp.json); webGCP defers. SEP-1649 governs MCP descriptors, NOT webGCP descriptors./.well-known/webgcp at L0+ — that's webGCP's own descriptor, NOT SEP-1649's .well-known/mcp.json. The two are sibling descriptors on different paths; don't confuse them..well-known/mcp.json alongside .well-known/webgcp when they're also MCP-callable; doing so aids discoverability for MCP-only clients.webgcp.org/.well-known/webgcp — live; the canonical descriptor handshake (NOT SEP-1649 — that's the MCP descriptor at a sibling path)webgcp-v01-final.md §5.1 — webGCP descriptor MUSTAgent Payments Protocol — Linux Foundation x402 working group. Mandate-signing protocol for agent payments. A mandate_ref is an EdDSA-signed authorization from the principal (the user or org) to the agent, scoped to a payment or class of payments.
webGCP v0.2 receipts (Commerce Layer per ADR-0001) carry the AP2 mandate reference in the invoker block. webGCP records that an invocation happened; AP2 records who authorized it. They compose: per v0.2-candidate §5.12 receipt schema, the invoker.mandate_ref field references an AP2 mandate. The MUST is on receipt emission at L2+, not on AP2 per se — but if you emit receipts (L2+ MUST), the schema includes AP2 fields.
webGCP v0.2 receipt fragment (per webgcp-v02-candidate.md §5.12):
{
"receipt_id": "urn:webgcp:receipt:sha256-abc...",
"issuer": "urn:webgcp:server:example.com",
"issuer_sig": "<EdDSA over receipt body>",
"request": {
"kb_id": "urn:webgcp:example:skill:refund-triage-v3",
"invoker": {
"principal_id": "urn:user:alice@example.com",
"mandate_ref": "urn:ap2:mandate:m_2026-05-21_abc123",
"ap2_signature": "<EdDSA signature over mandate body — verifiable independently>"
}
},
"response": { "...": "..." },
"settlement": { "...": "..." }
}
The invoker.mandate_ref is a URN that resolves to the AP2 mandate; the ap2_signature is the EdDSA proof. Anyone can verify: fetch the mandate, verify the signature against the principal's known key, confirm the invocation was authorized.
invoker.mandate_ref + ap2_signature fields. The receipt-emission MUSTs are: L0 MAY emit; L1 SHOULD emit if paid; L2+ MUST emit receipts (unconditionally, not "if paid" as previously stated); L3+ MUST be cross-server-verifiable. Since receipts include AP2 fields, this implicitly requires AP2-shaped invoker data at L2+.webgcp-v02-candidate.md §5.12 — receipts wire shapestandards/marketplace-protocol-standard/protocols/ — AP2 reference materialspec/request-for-development-knowseedev.md §3 — KNowsee Vertex AI + AP2 integrationx402 V2 — Linux Foundation. HTTP 402 + stablecoin settlement. Payment URIs encode (facilitator, asset, amount, payer); facilitators (Circle, self-hosted) confirm the payment.
webGCP v0.2 receipts carry a settlement.x402_uri field with a v2 payment URI. Settlement is out-of-band: the server records the URI; the payer satisfies it via their wallet; the facilitator confirms. webGCP records that it happened; x402 is the wire-level payment.
webGCP v0.2 receipt settlement block:
{
"settlement": {
"x402_uri": "x402:base:usdc:0xfc3b62...?amount=100&payer=urn:user:alice",
"amount_nano_usdc": 100,
"facilitator": "circle",
"facilitator_confirmation": {
"tx_hash": "0x4a7c...",
"confirmed_at": "2026-05-21T14:23:00Z"
}
}
}
The x402_uri is the v2 payment URI; the facilitator_confirmation block records the on-chain confirmation. webGCP does not re-specify x402; it embeds the URI and records the result.
Compile-once / serve-many economics (resolves §12 #7 from v0.1): when a KB version is published once but served N times, each invocation's receipt records amount_nano_usdc. Authorship economics (refactor-author royalty per webGCP-network.md N7) is a roll-up at the receipt batch level, not per-receipt; specified at Commerce Layer §5.13.
settlement.amount_nano_usdc > 0. L2+ MUST emit receipts for every invocation (unconditionally); receipts include settlement.x402_uri when payment happens. L3+ receipts MUST be cross-server-verifiable.webgcp-v02-candidate.md §5.14 — Settlement integrationstandards/marketplace-protocol-standard/protocols/X402-OPERATIONS-ROADMAP.md — operational playbookAgent-to-Agent — Google. Cross-vendor agent fabric over the Vertex AI ecosystem. Agent cards (descriptors); message passing; capability discovery; auth federation. Companion to AP2 (which lives in the same Google repo).
A2A is the cross-vendor agent fabric; webGCP is the typed-protocol the discovered agent speaks. An A2A-discoverable agent can also be webGCP-conformant if its agent card declares the webGCP spec version + descriptor path.
A2A agent card fragment (standard):
{
"schema_version": "v1",
"name": "example-refund-agent",
"description": "Refund policy retrieval and triage",
"capabilities": [
{
"name": "local_search",
"endpoint": "https://example.com/a2a"
}
],
"extensions": {
"webgcp": {
"spec_version": "v0.1",
"descriptor": "https://example.com/.well-known/webgcp",
"level": "L1"
}
}
}
The extensions.webgcp block is the opt-in pairing, mirroring the WebMCP manifest pattern. An A2A consumer that knows webGCP routes to the typed protocol; consumers that don't, see a regular A2A capability.
spec/request-for-development-knowseedev.md — KNowsee RFD; the conditional integration path through Vertex AI Agent Builderstandards/marketplace-protocol-standard/protocols/agent-marketplace.md — agent-marketplace patternsDNSAID is a draft IETF spec (draft-mozleywilliams-dnsop-dnsaid-01, March 2026) — not yet adopted. webGCP v0.1's normative DNS-discovery MUST is at _webgcp.<host> SVCB (§5.1.1), NOT at DNSAID's _agents.<host>.
v0.1 §8.4 is "Forbidden federation behaviors", NOT a DNSAID profile. (Prior version of this doc cited "v0.1 §8.4 dual-publication" — that was a transcription error; corrected 2026-05-21.) The DNSAID composition pattern lives in ../positioning-dnsaid.md as a proposal, NOT in the v0.1 frozen spec.
Proposed dual-publication pattern (per positioning-dnsaid.md; not v0.1 normative):
; webGCP-native namespace (v0.1 §5.1.1 — MUST at L0+)
_webgcp.example.com. SVCB 1 example.com.
; DNSAID-compliant namespace (proposed; awaits DNSAID adoption)
webgcp._agents.example.com. SVCB 1 example.com.
Conformance. webGCP servers MAY dual-publish at the DNSAID name as cheap insurance for IETF adoption. No webGCP MUST currently requires DNSAID. If DNSAID gets adopted by IETF DNSOP, future webGCP versions may add a SHOULD; today it's purely optional.
The full picture, all seven pairings (every claim cites or downgrades to MAY):
| External | Layer | What it owns | What webGCP adds | What v0.1 / v0.2-candidate actually says |
|---|---|---|---|---|
| MCP | Transport | tools/call JSON-RPC |
Typed bundle + _meta.webgcp in response |
v0.1 §1.3: "composes with"; no MUST. v0.2-candidate §1.5 Property 3: nodes expose contract per MCP/WebMCP (OR) at L1+ — implies L1+ SHOULD; v0.2+ scope. |
| WebMCP | Discovery (web) | <link rel="webmcp"> manifest |
webgcp block in manifest |
v0.1 §7.3: conditional MUST on webmcp_origin block when KB originates from WebMCP page. No level-based MUST/SHOULD. |
| SEP-1649 | Discovery (.well-known) | .well-known/mcp.json |
Sibling descriptor at .well-known/webgcp |
v0.1 §5.1: MUSTs webGCP's own descriptor at .well-known/webgcp at L0+. SEP-1649's .well-known/mcp.json itself is MAY at all levels. |
| AP2 | Authorization | mandate_ref + EdDSA signature |
invoker.mandate_ref in receipts (v0.2+) |
v0.1 §1.3: "consumes AP2 assertions in invoker identity field" — composition language, no MUST. v0.2-candidate §5.12: L2+ MUST emit receipts (unconditional); receipts include AP2 fields. v0.2+ scope. |
| x402 V2 | Settlement | Payment URI + facilitator confirmation | settlement.x402_uri in receipts (v0.2+) |
v0.1 §1.3: "settlement-agnostic; carries x402 references when present" — permissive. v0.2-candidate §5.12 + §5.14: L0 MAY, L1 SHOULD if paid, L2+ MUST emit receipts unconditionally. v0.2+ scope. |
| A2A | Cross-vendor fabric | Agent card + message passing | extensions.webgcp block in agent card |
NOT MENTIONED in v0.1 or v0.2-candidate. All pairing in this doc is composition guidance, no normative basis. MAY at all levels. |
| DNSAID | DNS discovery | _agents.<host> SVCB |
Proposed dual-publication (positioning-dnsaid.md) | v0.1 §5.1.1 MUSTs _webgcp.<host> SVCB at L0+. DNSAID dual-publication is a proposal in positioning-dnsaid.md, NOT v0.1 normative. MAY at all levels. |
Each cell cites the source MUST or is downgraded to SHOULD/MAY. Cells marked v0.2+ are candidate-scope; v0.2 publication is gated per webgcp-v02-candidate.md §5.
| webGCP level | MCP | WebMCP | SEP-1649 (.well-known/mcp.json) |
AP2 (v0.2+) | x402 (v0.2+) | A2A | DNSAID |
|---|---|---|---|---|---|---|---|
| L0 Local | MAY | MAY (cond.¹) | MAY | MAY | MAY | MAY | MAY |
| L1 Manifest | SHOULD² | MAY (cond.¹) | MAY | MAY | SHOULD if paid³ | MAY | MAY |
| L2 Governed | SHOULD² | MAY (cond.¹) | MAY | MUST receipt-include⁴ | MUST receipt-emit³ | MAY | MAY |
| L3 Federated | SHOULD² | MAY (cond.¹) | MAY | MUST receipt-include + cross-verify⁴ | MUST receipt-emit + cross-verify³ | MAY | MAY |
| L4 Anchored | SHOULD² | MAY (cond.¹) | MAY | MUST receipt-include⁴ | MUST receipt-emit³ | MAY | MAY |
Footnotes (source citations):
webmcp_origin block. Triggered by origin, not by conformance level. Publishing a WebMCP manifest at all is MAY at every level (no level-based requirement).settlement.x402_uri when payment happens (§5.14). v0.2+ candidate scope; not yet v0.1 normative.invoker.mandate_ref + ap2_signature). The MUST is on receipt emission; AP2 is the embedded schema. v0.2+ candidate scope; not yet v0.1 normative.The one unconditional MUST in v0.1 (frozen): L0+ MUST publish .well-known/webgcp descriptor (§5.1) AND _webgcp.<host> SVCB (§5.1.1). These are webGCP's own MUSTs; they do not derive from any external standard. Listed here for completeness but they're webGCP-native, not pairings.
What v0.2-candidate ships normative (when published): L1+L2 with receipt-emit MUSTs (footnotes ²/³/⁴). L3+L4 are design targets for v0.3+.
L4 is the design target for v0.3+; v0.1 ships L0; v0.2-candidate sketches L1+L2 with explicit candidate flag.
A single L2 webGCP invocation, tracing through every external protocol it touches:
_webgcp.example.com. SVCB → finds host. Or fetches https://example.com/.well-known/webgcp directly. Or reads <link rel="webmcp"> from the page and follows the manifest.urn:user:alice) signs an AP2 mandate authorizing the agent to spend up to $X for refund-triage queries this session.tools/call to the webGCP server, including the mandate reference in the request envelope.settlement.x402_uri → client pays via wallet → facilitator confirms.kb_id rollup at the L2 server; reputation is recomputable from receipts deterministically (anti-collusion).Every layer composes; no layer reinvents another.
webgcp-v01-final.md (frozen v0.1) and webgcp-v02-candidate.md (the candidate v0.2). Pairings cited from those specs; this doc is the operator-facing summary. Audit pass 2026-05-21: every cell in §9 either cites a source MUST or is downgraded to SHOULD/MAY. No claim in this doc adds new authority./spec/v0.2/ per the URL-stability rule; the candidate-sourced Commerce-Layer pairings (AP2 + x402) are marked "v0.2+" throughout.standards/webgcporg/CLAUDE.md locked decision #2.webgcp-v01-final.md — frozen v0.1 normative authoritywebgcp-v02-candidate.md — v0.2 candidate; source of §4 + §5 pairings (Commerce Layer)../positioning-dnsaid.md — full DNSAID pairing (this doc summarizes; positioning-dnsaid is canonical)../README.md §1.1 — external-standards inventory (where each one lives in catalog)../external-communication.md — public framing rules; this doc adheres to them../establishing-a-standard.md — 6-step playbook; webGCP's position vs each external../webgcp-standard.md §"How webGCP composes with MCP" — catalog-internal peer-document; sibling framing../../docs/adr/0001-receipts-out-of-webgcp-v01-core.md — Context/Commerce boundary that fences AP2/x402 pairings to v0.2+../../docs/adr/0021-cf-agents-as-coordination-plane.md — coordination/data plane split (substrate Property 5; affects A2A pairing claims)../../spec/mcp-protocol-leverage.md, ../../spec/webmcp-manifest-pattern.md, ../../spec/webmcp-onboarding.md — per-protocol internal specsComposition reference. Six external protocols, six pairings, one stable principle: webGCP layers, it does not compete. When in doubt, cite the external spec; when extending, use the explicit pairing pattern shown here.