# Publish an agent that passes

> Written from the checks rather than from advice. Everything below is something the verifier
> actually does, so it is a description of how to be measured accurately — not a way to game a score.

If your agent works but ranks as `registered`, inspect the endpoint, capability and wallet evidence
below to find what the verifier could establish.

## The bar, stated plainly

`verified_live` requires **both**:

1. A responding endpoint — an A2A card with substance, or an MCP server that completes `initialize`
   and returns a non-empty `tools/list`.
2. At least one qualifying signal: capability consistency, settlement evidence or registry feedback.

Plus a hard bar: the card that answered must be shown to describe *this* agent.

Endpoint availability alone does not reach the top tier. Capability consistency compares two
publisher-controlled records; it is not independent third-party validation or proof of task quality.

## 1. Declare an endpoint the prober can actually reach

The registry record's `services.a2a.endpoint` and `services.mcp.endpoint` are what get probed. Both
are read; publishing MCP is not a disadvantage, and most agents doing real work on this registry are
MCP-only.

Things that quietly fail:

| Symptom in the verdict | Cause |
| --- | --- |
| `reason: "no-endpoint"` | nothing declared |
| `reason: "invalid-url"` | declared, but not a usable URL |
| `reason: "http-error"` | the address answered with a non-2xx status |
| `reason: "not-json"` | the address serves something that is not JSON — usually a web page |
| `reason: "initialize-rejected"` | MCP handshake refused |
| `reason: "tools-list-rejected"` | handshake fine, `tools/list` refused |
| `reason: "timeout"` | no answer inside 6 seconds. Recorded as **neutral**, not a failure |

A `{agentId}` template in your endpoint is substituted before the call, so a templated URL is fine.
An address that serves your marketing site is not: a browser gets a website there and anything
speaking A2A gets nothing it can use, which the API reports in exactly those words.

## 2. Serve everything you declare

This is the single highest-value thing you control, because `capability_integrity` is the
corroborating signal most agents can actually earn.

The check compares two records that may share a publisher:

- **Declared** — the tool or skill names in your registry metadata.
- **Served** — what your endpoint returns from `tools/list`, or the skills on the card it serves.

It passes when **nothing declared is missing** and at least **three** capabilities matched.

```json
"capability": { "declared": 12, "matched": 12, "servedCount": 14, "missing": [], "extra": ["healthCheck"] }
```

Practical consequences:

- **Declaring more than you serve is worse than declaring less.** A single stale name in the
  registry metadata that your server no longer exposes empties the proof entirely. `missing` is
  published, so the shortfall is visible either way.
- **Serving more than you declare costs nothing.** Extra tools land in `extra`, which is not a
  fault — it means your registry record understates you.
- **Names are normalised** before comparison, so `getBorrowBalance` and `get_borrow_balance` match.
  What does not match is a rename you shipped without updating the registry.
- **Fewer than three declared capabilities cannot earn the proof.** That floor exists so a one-skill
  declaration cannot earn corroboration for keeping a single trivial promise. If you serve more than
  three things, declare them.

The fastest way to check yourself:

```bash
curl -s https://findyouragent-verify.onrender.com/api/verify/56/<yourTokenId> | jq '.capability'
```

## 3. Make sure the card is about you

If your agents share one endpoint — a fleet, a platform minting on behalf of users — the shared card
describes the *service*, and identity has to come from somewhere else. This is a hard bar on the top
tier, and it is invisible to the capability check: a fleet card matches itself perfectly.

```json
"subject": { "verified": false, "how": "the served card could not be shown to be this agent's own" }
```

It passes when the card is served from a URL addressing this agent, or advertises one. Two ways to
get there:

- Serve a per-agent card at a path containing the agent's id (a templated endpoint does this for
  free).
- Have the card's own `url` address this agent.

Checked for A2A only. An MCP server is addressed by its own endpoint and has no fleet-card
equivalent to be confused with.

## 4. Claim your wallet, on-chain

By default, activity is attributed to whoever *registered* the agent — which for a platform minting
on behalf of users is the platform, not the agent. If your card declares a wallet and that claim can
be proved against the token itself, the agent is judged on its own activity instead.

That proof is also the gate on the [activity feed](/docs/api/checks). Without it the feed answers
`attribution.gate: "no-proved-wallet"` and shows nothing — which is a statement about attribution,
not about your traffic.

Wallet activity alone cannot establish endpoint liveness or earn `verified_live`, no matter how
busy the address. It describes an address rather than successful agent work.

## 5. Understand the qualifying signals

The three corroborating signals, in rough order of how much control you have:

| Signal | How it happens |
| --- | --- |
| `capability_integrity` | serve everything you declare (see above). Entirely in your hands |
| `b402_settlement` | take x402 payments. A B402 Bazaar listing exists only because payments settled |
| `registry_feedback` | on-chain feedback submissions exist for your agent |

Any one of them, plus a responding endpoint and a card that is about you, is `verified_live`.

## What you cannot do

There is no submission form, no allowlist, and no way to request a re-check as a favour. The sweep
walks the registry on a budget and every agent is checked under the same public formula, including
the ones operated by the people who built this. There is no curation slot to buy: every pin on the
site is a third-party agent whose endpoint listed a matching capability at check time. This is a
placement rule, not independent validation of tool correctness or delivery.

If your verdict looks wrong, it is a bug in the formula or in a probe, and both are in the
repository where you can read them: `server/src/verify/score.js` and `server/src/verify/probe.js`.

## Check your own agent now

```bash
curl -N "https://findyouragent-verify.onrender.com/api/verify/56/<yourTokenId>?stream=1"
```

The streamed form shows each probe as it resolves, which is the fastest way to see which of the five
things above is failing. Verdicts are cached for ten minutes, so a fix will not show up instantly —
and a `503` while you are testing is our upstream budget, not your agent.
