Trust registry
The wallet's answer to "who may be paid at all". An open format of signed receiver descriptors + a federation of commercial verification providers. The first provider is 4agents (verified merchants and, by extension, verified paid MCP servers).
Why a separate layer
A mandate that lists receivers directly works for a couple of tools but does not scale: a principal cannot manually vet every new MCP server or shop. The registry moves the vetting ("the receiver is real: owns the domain, paid for verification, has history") to a provider the principal trusts once — with one line in the mandate:
"allow": [ "registry:4agents/verified" ]
Semantics: "anyone whose descriptor is signed by provider 4agents at level
verified or above may be paid."
Receiver descriptor
One format for both the registry and self-hosted /.well-known/stipendex.json:
{
"stipendex": "receiver/0.1",
"id": "mcp:exa-search",
"name": "Exa Search",
"keys": [ "ed25519:GfHq…" ],
"endpoints": { "mcp": "https://mcp.exa.ai", "http": "https://api.exa.ai" },
"rails": [ { "scheme": "account", "facilitator": "https://pay.4agents.io" } ],
"profiles": [ "service" ],
"trust": {
"provider": "4agents",
"level": "verified",
"verified_at": "2026-06-01T00:00:00Z",
"expires_at": "2026-09-01T00:00:00Z",
"evidence": [ "domain", "payment", "feed" ]
},
"sig": "<registry provider JWS>"
}
Key rules:
- T1. The key in
quote.receiver.keyMUST match one of the descriptor'skeys[]— receiver substitution under a trusted name is impossible. - T2. A descriptor expires (
trust.expires_at, SHOULD ≤ 90 days) and is re-issued; revocation = non-reissue + the provider's revocation list, which the wallet checks on the first payment to a receiver and then per cache TTL. - T3.
trust.levelis the provider's scale; the provider must publish what each level means (what was checked). For 4agents:verified= domain ownership + a working payment + a valid feed;trusted+= KYC + transaction history.
Provider API (minimum)
GET /registry/receivers/{id} → descriptor (JWS)
GET /registry/revocations → revoked ids/keys (JWS, incremental)
GET /registry/meta → provider keys, level definitions
Wallets cache descriptors per TTL; offline validation — by the provider's signature.
Federation
There can be many registries (per industry, jurisdiction, ecosystem). The principal lists trusted providers in the mandate; the wallet accepts a descriptor from any of them. Providers compete on verification quality — like certificate authorities, but with a transparent scale and no single global root.
Provider economics
Verification is paid by the receiver (the 4agents model: a subscription for
verified). That is both a spam barrier and the provider's business. For wallets
and principals the registry is free — they are the customers of trust, not a
revenue source.
Abuse
| Threat | Control |
|---|---|
A fraudster buys verified |
a level honestly means "checked by X"; transaction and dispute history moves the level down/up; incident-driven revocation |
| Receiver key compromise | key rotation in the descriptor; the revocation list; short descriptor lifetime |
| A malicious/compromised provider | multiple providers in a mandate are logged, not merged: the wallet shows whose signature admitted each payment; the principal removes a provider with one line |
Name squatting (mcp:exa-search by an impostor) |
id is bound to domain/key at verification; the provider does not issue conflicting ids |