DNS of Money: Agent Quickstart

Give your AI agent a payment address book with verifiable compliance built in.

DNS of Money resolves a human-readable pay: name to deterministic payment endpoints. Your agent pays from its own wallet over x402. You can also buy a signed sanctions screen of a counterparty before you pay it.

DNS of Money serves deterministic, verifiable tools. We resolve, verify, screen and record. We never hold your funds. Your agent makes the decisions and owns the keys.

Install

This is a remote streamable-HTTP MCP server. There is no package to install and no local process. For Claude Code:

claude mcp add --transport http dnsofmoney https://api.dnsofmoney.com/mcp/rpc

For any MCP client that uses a config file:

{
  "mcpServers": {
    "dnsofmoney": {
      "type": "http",
      "url": "https://api.dnsofmoney.com/mcp/rpc"
    }
  }
}

To send an API key:

claude mcp add --transport http dnsofmoney https://api.dnsofmoney.com/mcp/rpc \
  --header "X-API-Key: YOUR_KEY"

The official MCP registry lists this server as io.github.sparkmastergrape/dns-of-money.

MCP tools

All six tools are read-only.

ToolWhat it does
resolve_aliasResolves a pay: name to its preferred rail, fallback endpoints and ISO 20022 hint. The caller's tier controls the fields you get.
check_alias_availableReturns available, taken or reserved for a name.
discover_agentReturns the AP2/A2A agent-commerce block for a name. It returns capabilities only, never credentials.
get_payment_requirementsReturns the x402 accepts block for a name, so an agent can quote a payment. It needs no key.
get_payment_statusChecks whether an attempted payment was recorded. Call it before you retry, so you do not pay twice.
get_agent_registration_infoExplains how to register a free pay:agent.<label> name.

No resource below needs an API key to read the price. A bare GET returns 402 Payment Required with the challenge.

ResourceWhat you getAPI key to settle
GET /api/v1/x402/screen/{target}A signed OFAC and resolution screen of a pay: name or a raw addressNo
GET /api/v1/x402/resolve/{alias}The full resolve of a name (tier 2 view)No
GET /api/v1/x402/presend?target=...&chain=...Signed pre-send evidence about an address: lookalike collisions, contract status, activity, cross-chain consistency and a sanctions verdictNo
GET /api/v1/x402/pay/{alias}Pays a name and returns a signed resolve, settlement and screen attestationYes

The fee for screen, resolve and presend is 0.01 USDC or 0.01 XRP. The server sets the fee. pay uses the name's declared price, or the amount you send if the name declares none.

resolve returns 404 for a name that does not resolve, and you pay nothing. presend takes optional repeated payee parameters, which are addresses you paid before. We do not store them.

A risky target is a finding inside a 200 response. A 402 on these routes always means that payment is required.

Rails

A bare GET on screen, resolve or pay advertises five rails. Your agent picks one it holds funds on. To request one rail, add ?currency=.

currencyAssetNetworkFees
XRPXRPxrpl:0The payer pays the ledger fee
USDCUSDCAlgorand mainnetThe facilitator co-signs the fee leg
USDC-BASEUSDCeip155:8453 (Base)The facilitator pays gas
USDT0-XLAYERUSD₮0eip155:196 (X Layer)See the 402 challenge
USDC-SOLUSDCSolana mainnetThe facilitator is the fee payer

External agents have paid on Base and on Solana with zero native gas token.

Solana fee-payer addresses rotate for each invoice. Read extra.feePayer from each 402 challenge, and do not cache it. Each accept also has its own invoiceId.

presend is a single-rail route. Its fee is USDC-BASE by default.

API keys and tiers

An API key is free. Request one, then click the link in the verification email. The server issues the key when you click.

curl -X POST https://api.dnsofmoney.com/api/v1/access-requests \
  -H 'Content-Type: application/json' \
  -d '{"name":"Your Name","email":"you@example.com","use_case":"agent payments"}'

GET /.well-known/api-access describes this flow in JSON.

The key sets how much resolve_alias and /resolve return:

TierCallerYou get
0No keyName, status, IDs and resolve time
1starter keyPlus display name, entity type and preferred rail
2developer, business or enterprise key, or a paid resolvePlus endpoints and compliance
3system or agent keyPlus routing metadata and agent_commerce

The free key has the developer plan, which is tier 2.

You never need a key to read a price. get_payment_requirements returns a payable address to any caller.

Rate limits

CallerLimit
No key, per client IP60 requests per minute
starter, developer60 requests per minute
enterprise1200 requests per minute
Any caller, per IP10 requests per second at the edge

Responses carry X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Back off when X-RateLimit-Remaining is low. A plan with a monthly quota also gets X-Quota-* headers.

Try it

These calls need no key and cost nothing.

curl https://api.dnsofmoney.com/.well-known/x402
curl https://api.dnsofmoney.com/mcp/tools
curl -i https://api.dnsofmoney.com/api/v1/x402/screen/pay:dnsofmoney

Call a tool over REST:

curl -s -X POST https://api.dnsofmoney.com/mcp/tools/call \
  -H 'Content-Type: application/json' \
  -d '{"tool":"resolve_alias","arguments":{"alias_uri":"pay:dnsofmoney"}}'

The /mcp/tools views and /mcp/rpc use the same dispatch. REST is easier to debug. JSON-RPC is what MCP clients speak.

Pay over x402

  1. GET the resource with no payment. The server returns 402 and a JSON body with accepts[].
  2. Pick one accept. Keep its network, payTo, amount and invoiceId.
  3. Pay with your own wallet. On XRPL, submit the payment first. On Algorand, Base, X Layer and Solana, sign the x402 payload with an x402 client.
  4. Send the same GET again with the proof in X-PAYMENT or PAYMENT-SIGNATURE.
  5. Read the deliverable from the 200 body and the receipt from PAYMENT-RESPONSE.

Amounts are in base units: drops for XRP, and 6 decimals for USDC and USD₮0.

The XRPL proof is a base64 JSON envelope around a validated transaction hash. Echo the accept you chose in accepted, so the server knows which rail you paid on:

# X-PAYMENT = base64( {"x402Version":2,"accepted":<the-chosen-accept>,
#                      "payload":{"txHash":"<HASH>","payer":"<rYourAddress>"}} )
curl "https://api.dnsofmoney.com/api/v1/x402/screen/pay:dnsofmoney" \
  -H "Idempotency-Key: <128-bit-random-value>" \
  -H "X-PAYMENT: <base64-envelope>"

For the other rails, use a client library:

Retry safely

Send a random Idempotency-Key of 128 bits or more with each paid request, and keep it. If the result is unclear, call get_payment_status with that value as request_key before you pay again.

The key is a bearer secret. Anyone who presents it gets the receipt, so keep it private.

The deliverable

screen returns a W3C Verifiable Credential, CounterpartyScreenCredential, signed by did:web:dnsofmoney.com. pay returns a fas1.resolve-verify-screen attestation:

{
  "success": true,
  "settled": true,
  "transaction_id": "...",
  "attestation": {
    "type": "fas1.resolve-verify-screen",
    "alias": "pay:dnsofmoney",
    "resolved":   { "rail": "crypto", "payTo": "r...", "network": "xrpl:0", "asset": "XRP" },
    "settlement": { "txid": "...", "invoiceId": "...", "amount": "0.01", "currency": "XRP" },
    "screen": {
      "payee": { "address": "r...", "verdict": "CLEAR" },
      "payer": { "address": "r...", "verdict": "CLEAR" },
      "verdict": "CLEAR"
    },
    "issued_at": "..."
  }
}

The screen verdict is the worst result of the two parties: CLEAR, REVIEW, BLOCKED or UNKNOWN. We report a BLOCKED verdict. We do not stop a transaction that already settled on-chain, so your own policy must act on the verdict.

Verify the signature

The proof uses Data Integrity with the eddsa-jcs-2022 cryptosuite. It covers the full binding, so a relay cannot change a field or replay the result against another payment.

  1. Get the issuer document: GET https://dnsofmoney.com/.well-known/did.json.
  2. Find the key at proof.verificationMethod.
  3. Verify the proof with a2a-protocol-core (PyPI and npm), or with any W3C Data Integrity library.

Register a free agent name

An agent can register its own pay:agent.<label> name. Registration needs an AgentAuthorityCredential and a Verifiable Presentation bound to the request. The limit is 10 names for each controlling principal in 24 hours.

Agent protocols

curl -X POST https://api.dnsofmoney.com/api/v1/ap2/purchase \
  -H 'Content-Type: application/json' \
  -d '{"intent":{"natural_language_description":"pay invoice","intent_expiry":"2030-01-01T00:00:00Z"},
       "alias":"pay:dnsofmoney","amount":"0.01","currency":"XRP","tx_hash":"<settled-hash>"}'

SDKs and examples

LanguageInstall
TypeScriptnpm install dnsofmoney
Gogo get github.com/dnsofmoney/dns-of-money-go
PythonSource in sdk/python

Examples for curl, Python and TypeScript are in examples/. The FAS-1 specification, which defines pay: resolution, is in docs/FAS-1-spec.md (CC BY 4.0).

Guarantees