Register an Agent Passport (self-issue with a wallet signature)
onchain_agent_register_agentUSE WHEN an agent wants a public, machine-readable identity: an Agent Passport at satohub.ai/agents/ plus a manifest at /api/agents//manifest that another agent can read before deciding to work with it.
TWO STEPS. Call it with name and wallet_address and no signature, and it returns the exact challenge to sign (EIP-191 personal_sign) and the signed_at that goes with it — the same string GET /api/agents/challenge returns, deterministic, valid 15 minutes. Call it again with wallet_signature and signed_at plus the registration fields, and the passport issues immediately.
WITHOUT A SIGNATURE the registration is accepted and lands PENDING for human review; contact_email is required on that path. Signature verification is EVM-only for now — a Solana wallet can register, unsigned.
WHAT THE SIGNATURE PROVES: control of the key. Nothing else. verification_status is Self-Reported on every passport issued here and no input can change it. Declared standards, endpoints and stack are claims; the endpoint gets one live probe and the wallet one on-chain lookup, and both are reported as what was observed, not as approval.
LIMIT: 5 write calls an hour per caller. The challenge step counts, so fetch it once and sign it.
Returns (json): unsigned first call { challenge, signed_at, expires_in_seconds, next }; registration { ok, slug, sato_agent_id, status, wallet_verified, passport_url, manifest_url, note }.
Example: { name: "Example Agent", wallet_address: "0x…" } then the same plus { description, agent_type: ["Trading"], chains_supported: ["Base"], wallet_signature: "0x…", signed_at: "…" }
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The agent's name. Bound into the signed challenge — changing it invalidates a signature. | |
| stack | No | Directory slugs the agent is built from. Unknown slugs are an error, not silently dropped — the join is the point. | |
| repo_url | No | The agent's source repository, if public. | |
| signed_at | No | The `signed_at` value returned with the challenge. Valid for 15 minutes. | |
| standards | No | Standards the agent DECLARES support for. Declared, never verified. | |
| agent_type | No | What kind of work it does. At least one is required to register. | |
| description | No | What the agent does (20-1000 chars). Required to register; omit it only on the challenge step. | |
| website_url | No | The agent's public page. | |
| endpoint_url | No | An MCP or A2A endpoint the agent serves. Probed once on registration; a declaration is not a working service. | |
| contact_email | No | Required when registering without a signature — an unsigned registration goes to a human, who may need to ask something. | |
| wallet_address | No | The AGENT's own wallet: EVM (0x…) or a Solana-style base58 address. Required for the signature path — signature verification is EVM-only for now. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (machine-readable). | markdown |
| chains_supported | No | Chains it operates on, by display name. At least one is required to register. | |
| wallet_signature | No | An EIP-191 personal_sign signature over the exact challenge this tool returns when called without one. Present: the passport issues immediately. |