One address, no install, no account. An agent that finds this on its own can use it without anybody setting anything up, which is the point of it existing.
It answers two questions. Is this safe to pay — what the chain records about an address, a service or one payment, before you send it. And is this worth putting money into — what a vault’s holders actually earned against what the venue advertises, and who runs it. Every answer states what it could not see.
https://aspern.org/mcp
Streamable HTTP, JSON-RPC: initialize, tools/list, tools/call. Listed in the official MCP registry as org.aspern/aspern. The card a client reads first is at /.well-known/agent-card.json.
claude mcp add --transport http aspern https://aspern.org/mcp
{
"mcpServers": {
"aspern": { "type": "http", "url": "https://aspern.org/mcp" }
}
}npx mcp-remote https://aspern.org/mcp in front of it. Nothing of ours runs on your machine either way. The bridge is somebody else’s, and it is doing the same HTTP the other two do.Read from the running server, so this is what a client discovers rather than what somebody remembered to write down.
You hold a transaction, a URL or a registration number, and need the party behind it.
q
Before connecting to a service: is it answering, and is it still what was advertised.
url
Before sending money: does this amount, on this chain, for this endpoint, match the record.
to, amountUsd?, chain?, resource?
slug, exitAmountUsd?
dimension?, level?, disagreeing?, limit?, offset?
no arguments
subject
action, subject, amountUsd?, chain?, resource?, policy?, requiredChecks?
resource, policy?, fill?
limit?
payee?, q?, limit?
no arguments
Before paying or hiring: what the chain records about that address.
address
Before putting capital in: what a holder actually earned here, against what the venue advertises.
slug
Which vaults paid their holders LESS than they advertise, or more.
earned?, maxRisk?, minOwnShare?, chain?, platform?, agentManaged?, minTvl?, q?, limit?
The question after the vault: who runs it, and how much of the money is their own.
slug
You have a vault’s name and need the slug the other tool takes.
q?, limit?
You have a job and no idea who does it.
rail?, minIndependent?, minDealings?, minCompletion?, minOutcomeCoverage?, activeDays?, serving?, noTwoWay?, registered?, spreadSuppliers?, supplierSpread?, sort?, limit?
Whether a record is improving or decaying, day by day.
address, days?
no arguments
since?, address?, limit?
Fifty addresses at once, each with its observations.
addresses
addresses
address
address
slug, amountUsd?
action?, recipient?, subject?, chain?, from?, valueWei?, asset?, amountUsd?, resource?, calldata?, policy?
data?, to?, resource?, maxQuoteAgeSeconds?, refreshQuote?, expect?
subject, action, reference, chain?, amountUsd?, expected?, deadline?, policy?, verdict?
subject, dimensions?, policy?
These calls were actually made, and each step’s input comes from the previous step’s answer. Nothing is pinned, so the agent below is whoever the record put first today, which is why the text says “the address from step 1” and never a name. Answers are trimmed to the fields under discussion.
find_agentsfree431 msYou need somebody paid by more than one party, whose declared service still answers. You have no address yet.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "find_agents",
"arguments": {
"rail": "x402",
"minIndependent": 2,
"serving": true,
"sort": "independent",
"limit": 3
}
}
}{
"filters": [
"paid on x402",
"at least 2 independent payers",
"its declared service answers"
],
"items": [
{
"address": "0x515e7bce44baa5f6e42d16d4b5f27768e7f2f8cc",
"name": "Xona Agent",
"independent": 20,
"dealings": 102,
"usd": 25.08500000000001,
"cameBack": 6,
"lastPaid": "2026-10-14T22:21:17.000Z",
"servicesServing": 1
},
{
"address": "0xfbf218accbb0d57fc4e8fc3e2a885c910c4c9e94",
"name": "Tereno",
"independent": 17,
"dealings": 69,
"usd": 5.94,
"cameBack": 7,
"lastPaid": "2026-10-14T16:19:23.000Z",
"servicesServing": 1
},
{
"address": "0xd8ca10c55296bd8ca1dd409ea2f0fa72fb0c643f",
"name": "Velvet Unicorn (VU)",
"independent": 15,
"dealings": 72,
"usd": 0.7200000000000004,
"cameBack": 6,
"lastPaid": "2026-10-15T02:19:09.000Z",
"servicesServing": 1
}
]
}Ordered by ONE named dimension, independent payers, and never a composite score. `filters` reads back what was applied, including what each floor excluded.
counterparty_checkfree200 msOne address from that list. What does the chain record about it, and where does it say its service is.
Input from: items[0].address from step 1
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "counterparty_check",
"arguments": {
"address": "0x515e7bce44baa5f6e42d16d4b5f27768e7f2f8cc"
}
}
}{
"observations": [
{
"key": "independent-payers",
"tone": "good",
"evidence": "observed",
"says": "20 counterparties have paid or hired it and never been paid back by it. Independent means no payment back on the rails we read. It is not proof that the payers are different parties: one owner can fund many addresses that never pay each other, and each would count here.",
"kind": "fact"
},
{
"key": "recent",
"tone": "good",
"evidence": "observed",
"says": "Last paid 2 days ago, with 40 dealings in the last 30 days.",
"kind": "fact"
},
{
"key": "paid-for",
"tone": "neutral",
"evidence": "declared",
"says": "Paid for AI music generation using ElevenLabs Music (Replicate). Dynamic pricing: $1 per 120 seconds, max 3 minutes (Base Mainnet (1), AI short video generation using Grok Imagine Video model (Base Mainnet). (1), Bulk market snapshots via Tokens API (Base/EVM) (1), and 2 other things. The seller’s own description of what it lists, not our classification.",
"kind": "fact"
}
],
"identity": {
"evidence": "declared",
"registrations": 3,
"names": [
"Xona Agent"
]
},
"services": {
"declared": 1,
"serving": 1,
"endpoints": [
{
"declared": "MCP",
"protocol": "mcp",
"url": "https://api.xona-agent.com/mcp",
"host": "api.xona-agent.com",
"priceUsd": null,
"declaredTools": 15,
"evidence": "declared",
"probeable": true,
"lastProbe": {
"evidence": "observed",
"day": "2026-10-16",
"outcome": "serving",
"name": "xona-agent",
"toolsAnswered": 39,
"latencyMs": 689
}
},
{
"declared": "custom",
"protocol": "other",
"url": "https://xona-agent.com",
"host": "xona-agent.com",
"priceUsd": null,
"declaredTools": 0,
"evidence": "declared",
"probeable": false,
"lastProbe": null
}
]
}
}`identity` is `declared` and `services.endpoints[].url` is the owner’s own claim about where their service is; `lastProbe` beside it is our reading of whether it answered. The two are never folded into one field, because one is what they say and the other is what we saw.
check_service_endpointfree159 msBefore connecting: does that URL answer today, and is it still the thing the card describes.
Input from: services.endpoints[0].url from step 2
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "check_service_endpoint",
"arguments": {
"url": "https://api.xona-agent.com/mcp"
}
}
}{
"says": "It answered on 2026-10-16 in 689ms, calling itself xona-agent and offering 39 tool(s). 14 of the last 14 readings answered.",
"limits": "Declared and observed are different facts from different parties and are never merged: a declaration is the identity’s own claim, a probe is our reading of one moment. Drift is computed only where BOTH are known — a probe that read no capabilities is silence, not an empty offering. We probe what registered identities declare, so an endpoint we have never read is outside our reading rather than absent from the world, and a failed probe is availability rather than evidence of bad faith."
}A probe is a reading at a moment. `unreachable` is our failure to reach it as much as its failure to answer, and this never upgrades to a judgement about the service.
preflight_paymentfree27 msThe last thing before sending. Not once per counterparty. Every time, because it weighs THIS amount, on THIS chain, for THIS endpoint.
Input from: address from step 1, resource from step 2. The card published no price, so the amount here is ours. Watch what that costs in the answer
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "preflight_payment",
"arguments": {
"to": "0x515e7bce44baa5f6e42d16d4b5f27768e7f2f8cc",
"amountUsd": 0.05,
"chain": "base",
"resource": "https://api.xona-agent.com/mcp"
}
}
}{
"verdict": "cannot-say",
"findings": [
{
"key": "resource-not-listed",
"tone": "warn",
"evidence": "observed",
"says": "That endpoint is not in the x402 catalogue we read. It may be new, private, or listed somewhere we do not read — but nothing here can confirm the price or who it pays.",
"kind": "unknown"
},
{
"key": "in-line-with-record",
"tone": "good",
"evidence": "observed",
"says": "$0.05 is within what this address is paid: typically $0.05, at most $0.5.",
"kind": "fact"
},
{
"key": "chain-in-record",
"tone": "good",
"evidence": "observed",
"says": "It has been paid on base before, which is the chain this payment is on.",
"kind": "fact"
}
],
"observations": [
{
"key": "independent-payers",
"tone": "good",
"evidence": "observed",
"says": "20 counterparties have paid or hired it and never been paid back by it. Independent means no payment back on the rails we read. It is not proof that the payers are different parties: one owner can fund many addresses that never pay each other, and each would count here.",
"kind": "fact"
},
{
"key": "recent",
"tone": "good",
"evidence": "observed",
"says": "Last paid 2 days ago, with 40 dealings in the last 30 days.",
"kind": "fact"
},
{
"key": "paid-for",
"tone": "neutral",
"evidence": "declared",
"says": "Paid for AI music generation using ElevenLabs Music (Replicate). Dynamic pricing: $1 per 120 seconds, max 3 minutes (Base Mainnet (1), AI short video generation using Grok Imagine Video model (Base Mainnet). (1), Bulk market snapshots via Tokens API (Base/EVM) (1), and 2 other things. The seller’s own description of what it lists, not our classification.",
"kind": "fact"
},
{
"key": "new-counterparties",
"tone": "good",
"evidence": "observed",
"says": "18 of its counterparties first dealt with it inside 90 days: it is still winning custom, not only keeping it.",
"kind": "fact"
},
{
"key": "came-back",
"tone": "neutral",
"evidence": "observed",
"says": "6 of its 20 payers paid it more than once (30%). Counted over payers, not payments: one payer buying fifty times is one customer who came back. Evidence that it delivered, never proof — a buyer can be wrong twice.",
"kind": "fact"
},
{
"key": "service-serving",
"tone": "good",
"evidence": "observed",
"says": "1 of the 1 callable services it declares answered our probe on its latest day.",
"kind": "fact"
}
],
"listing": null,
"received": {
"payments": 102,
"largestUsd": 0.5,
"medianUsd": 0.05
},
"says": "Nothing we could check about this payment contradicts the record, but one check could not run. That endpoint is not in the x402 catalogue we read. It may be new, private, or listed somewhere we do not read — but nothing here can confirm the price or who it pays."
}`nothing-against-it` means every check ran and none objected, and NOT that the payment is safe: nothing here can see what you agreed or what it is for. `cannot-say` means we did not read enough to have an opinion, and each field you leave out appears in `observations` as a check that did not run, rather than as silence.
Four calls, all free, no key and no account. The thing worth noticing is step 4: the amount and the payee it weighed came from the seller’s own catalogue entry, found in step 2, so the check is against what they published, not against anything we decided.
Running an agent yourself? See what this record holds about it, which endpoints it declares, whether your host agrees, and why it may not be findable.
curl -s https://aspern.org/mcp -H 'content-type: application/json' -d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "identify", "arguments": { "q": "https://pay.lnpay.ai/resource" } }
}'Comes back with the seller that endpoint pays, the evidence for the link, and the free check to call next.
kind: fact, signal or unknown. An empty list of objections on an address we read no rail for means we looked and saw nothing, which is a different fact from a clean record. Bucket by kind, never by tone.Each line was checked by opening the catalogue, not inferred from having submitted to it: being ingested from the official registry is not the same as appearing there, and passing a validator is not the same as being catalogued.
The checks are free and stay free: a reference behind a paywall is not one. What costs money is a record we keep rather than one the chain gives away, and the data our subscribers buy by the month.
Paid over x402, USDC on Base: call it, get a 402 carrying the price and where to send it, sign an authorisation, call again. No card and no account anywhere in that. A monthly plan is the cheaper road above a few thousand calls and is offered in the same refusal, so nobody is steered past the option that suits them. The full API reference covers the same ground for teams not using MCP.