Conversation
- Adds docs/building/implementation/request-signing.mdx — practical step-by-step guide covering key generation, JWKS/brand.json publication, client-side signing, server-side verification, webhook signing, capability declaration, key rotation, and conformance testing. - Adds a Request Signing section to docs/building/build-an-agent.mdx showing requireSignatureWhenPresent composition and webhook signer config. - Adds request-signing to the Implementation Patterns nav in docs.json. - Adds a cross-link Note in the security.mdx quickstart section pointing to the new guide. Ported from adcontextprotocol/adcp-client#914.
- Replace requireSignatureWhenPresent manual composition with requireAuthenticatedOrSigned in Step 4 and build-an-agent.mdx — the higher-level helper also enforces request_signature_required for the unsigned-no-credentials path - Use mcpToolNameResolver instead of inline JSON-RPC resolver boilerplate throughout - Fix resolveOperation in the Express middleware example (was incorrectly using req.body.method) - Add conformance vector counts: 39 total (12 positive, 27 negative) Addresses feedback from adcontextprotocol/adcp-client#914 comment by bokelley; tracks mcpToolNameResolver landing in adcp-client#916.
|
Heads-up: two SDK ergonomics PRs landed on
Specific tightening once the release shipsStep 4 — Express middleware ( createExpressVerifier({
capability: { supported: true, covers_content_digest: 'required', required_for: ['create_media_buy', 'update_media_buy'] },
jwks: new StaticJwksResolver(buyerPublicKeys),
- replayStore: new InMemoryReplayStore(),
- revocationStore: new InMemoryRevocationStore(),
resolveOperation: mcpToolNameResolver,
})Step 4 — Step 3 — Capability-aware signing: the import { createAgentSignedFetch } from '@adcp/client/signing';
export const signedFetch = createAgentSignedFetch({
signing: {
kid: 'my-agent-2026',
alg: 'ed25519',
private_key: privateJwk,
agent_url: 'https://agent.example.com',
},
sellerAgentUri: 'https://seller.example.com',
});Worth keeping the longer No need to wait — happy for this to merge as-is and follow up with a tightening PR after the next |
|
we should also have examples for python and go |
|
SDK ergonomics PRs are now out across all three official SDKs — happy to update this guide once they ship in a release. Posting the cross-SDK status so the docs can cite them in lockstep.
All three land the same security-by-default story:
Once Python and Go merge and release-please cuts new versions, the docs here can:
Happy to send a follow-up tightening PR after the Python/Go releases ship, or to push the rewrite directly into this branch — your call. Either way no need to block this PR on it. cc @benminer |
|
Heads up — three SDK PRs landed (or are in flight) on 1. Step 1.3 "Storing the private key" — add KMS option. adcp-client#1017 (merged) ships
2. Step 3 "Sign outbound requests" — show the
const provider = await createGcpKmsSigningProvider({
versionName: process.env.ADCP_KMS_VERSION!,
kid: 'my-agent-2026',
algorithm: 'ed25519',
client: kmsClient,
});
const signingFetch = buildAgentSigningFetch({
upstream: fetch,
signing: { kind: 'provider', provider, agent_url: 'https://agent.example.com' },
getCapability: () => capabilityCache.get('https://seller.example.com'),
});Wire format unchanged — counterparties can't tell the difference between in-process and KMS-backed signing. 3. Step 4 "Verify inbound signatures" — call out multi-instance verifier deployments. adcp-client#1018 (merged) ships
4. Step 6 "Sign outbound webhooks" — flag the in-process-only caveat.
5. Testing — add adcp-client#1019 (open, all CI green, accumulates into the same 5.20.0 release) ships the signer-side grader: # KMS-backed signer via signing oracle
adcp grade signer https://addie.example.com \
--signer-url https://signer.internal/sign --signer-auth "Bearer ${SIGNER_TOKEN}" \
--kid addie-2026-04 --alg ed25519 \
--jwks-url https://addie.example.com/.well-known/jwks.jsonPairs with My spec-side PR #3255 (docs(security): production key storage subsection for RFC 9421 signing) adds a "Production key storage" subsection to Happy to push these as a follow-up commit on this branch, or land yours as-is and I file a separate guide-update PR after #1019 merges and 5.20.0 publishes — whichever fits your release rhythm. Either order works. cc @bokelley |
Summary
Ported documentation from adcontextprotocol/adcp-client#914, which was accidentally opened against the wrong repo.
docs/building/implementation/request-signing.mdx— practical step-by-step guide covering key generation, JWKS/brand.json publication, buyer-side signing, seller-side verification, webhook signing, capability declaration, key rotation, and conformance testingdocs/building/build-an-agent.mdxshowing therequireSignatureWhenPresent+verifySignatureAsAuthenticatorcomposition pattern and webhook signer configrequest-signingto the Implementation Patterns nav indocs.json<Note>in thesecurity.mdxquickstart section pointing to the new guide (framing the spec as the normative source the guide implements)Notes
The normative RFC 9421 spec already lives in
docs/building/implementation/security.mdx. This guide is the approachable complement — what you actually run and configure — pointing back to the spec for the verifier checklist, canonicalization rules, and error taxonomy.