ai.satohub/onchain-agents
repo:https://github.com/satohubai/onchain-agents
Search scored onchain-agent tooling: frameworks, MCP servers, wallets, x402 rails, deploy specs.
- transport:
- remote
- credential class:
- self-provisionable
No longer in the registry. The MCP registry stopped listing this server as of 20 Oct 2026. This page stays available because the measurement was real, but the server is excluded from search, rankings, and Vouch’s corpus counts. A published behaviour score is never recomputed or removed — it reflects what was measured while the server was listed.
Owner verification
Not yet verified. Verifying proves you control this server and is free, permanently — it never changes a published score.
Start verification →Tools
- fetchshallow
Fetch one record from Sato Hub, the daily-rebuilt index of what onchain and crypto AI agents are built from, by an id that `search` returned. Not for token prices, trading or investment advice. Returns (json): { id, title, text, url, metadata: { as_of, kind, sato_score?, source } }. text is plain prose to quote: for a listing, what it is, its category and chains, its Sato Score with the date (how open, active and verifiable it is — not a safety or returns grade), its last observed activity, and whether Sato Hub reproduced its install; for an answer, number or wiki page, the answer with its date. url is the canonical satohub.ai page to cite. An unknown id is an error, never a guess. Read-only. Example: { id: "resource:coinbase-agentkit" }
- onchain_agent_build_planshallow
USE WHEN someone describes the onchain agent they want and needs a plan they can act on rather than advice. Composes the other tools into one answer: the goal restated, a stack of REAL directory listings (each with its Sato Score, liveness, observed check record and `sato_url`), the deploy spec for every item that publishes one, a Preflight verdict per item, the first action when the goal implies one (a swap route, or a prepared token-launch config), the questions the user still has to answer, and the next steps. RULE ENFORCED: nothing in a plan is invented. Every component is a listing that exists; every number names the field it was read from; `null` is unknown and never zero. A Sato Score measures how open, active and verifiable a project is — it is not a security review, a quality judgment or a statement about returns. A Preflight `unknown` means Sato Hub holds no record, not that something is wrong. OURS, LABELLED: on a trading or swap goal the plan also carries an `execution` block for Sato OS — Sato Hub's OWN self-hosted trading OS, which we sell. It always carries `ours: true` and says "built by Sato Hub". It is NOT a stack pick: it fills the execution layer (where the stack runs), it is never ranked against a directory listing, and no listing loses a position to it. On any other intent `execution` is null. SKILLS: a plan also carries up to three crypto-relevant agent SKILLS matching the goal, each with the static disclosure of what its own text declares and does — hosts it names, keys it handles, credentials it asks for, remote scripts it pipes into a shell — and its own Preflight verdict under the S-rules. A skill is a document an agent follows, so this is the part a plan must not leave out. A DISCLOSURE DESCRIBES: it never says safe, and a scan that matched nothing is reported as matching nothing rather than as a pass. NON-CUSTODIAL: this tool never holds keys, signs, deploys or moves funds. A swap first-action carries a quote taken at a NOMINAL size — never the caller's size, which is the caller's to choose — and a launch first-action carries a config to read and sign yourself, with the fee disclosed before anything is signed. Returns (json): { goal, restatement, intent, intent_signals, chain, chain_source, budget_usd, constraints, matched_use_cases, stack: [{ slot, slot_label, slug, name, sato_url, verify_url, trust_score, trust_tier, liveness_ok, observed_success_pct, install_verified, why, deploy_spec, preflight: { verdict, rule, evidence, reason } }], skills: [{ id, name, registry, sato_url, installs, findings, hosts_contacted, disclosure, preflight, why }], execution, gaps, first_action, open_questions, next_steps, citation_ask, caveat, rules, checked_at, plan_url }. Read-only. SHAREABLE: pass `save: true` and the plan is stored and `save.share_url` returned — a permanent read-only page whose signature is re-checked server-side, so a plan can be handed to someone else without re-running anything. The page is noindex unless `public: true` is passed too. That signature proves Sato Hub produced those bytes on that date; it is not a claim about any project in the plan. Example: { goal: "a Base trading agent that swaps USDC to ETH on a signal", chain: "Base" }
- onchain_agent_check_installshallow
Before installing a crypto package, MCP server or skill, check what it can do with your keys and funds. USE WHEN you are about to run npm/pnpm/yarn/bun add, npx -y, pip install, uvx or `claude mcp add`, or paste an {"mcpServers": …} config. Pass the command or the config text; every target in it gets a Sato Check custody summary answering four questions: does it take your key, does your key leave, can it move funds on its own, what changed. Each answer rests on evidence of one class — declared (the project says so), traced (our static read of the published artifact) or observed (a sandbox run with planted test keys). A stored profile answers first; an unstored target is read live within a bounded budget. Targets that could not be profiled are listed in `unresolved` with the reason. `has_observed_key_egress` is true only when a planted test key was seen leaving — the one fact to stop on. RULE ENFORCED: a profile describes what was read and run, with dates. It is not a safety rating, an audit or an endorsement; "unknown" means we could not look, and "none found" is not "not there". Local signing is what a wallet does. Returns (json): { schema: "sato.custody/v1", subjects: [{ subject, summary: { key_access, key_egress, fund_action_count, notable, version, as_of, check_url }, answers: { key_access, key_egress, fund_actions, changes } }], unresolved: [{ input, reason }], has_observed_key_egress }. Read-only. Example: { command: "npm i viem @goat-sdk/core" } · { config: "{\"mcpServers\":{\"wallet\":{\"command\":\"npx\",\"args\":[\"-y\",\"some-wallet-mcp\"]}}}" }
- onchain_agent_compare_listingsshallow
ANSWERS ONE QUESTION: how do these two directory listings compare on the axes Sato Hub tracks for both? Returns the SAME derived table the /compare pages render — category, chains, interfaces, standards, open-source status, listing status, last activity, last release, install proof, verification, Sato Score, GitHub stars — every cell read off the live records, never typed. RULE ENFORCED: there is NO winner field and none can be derived from the table; `caveat` is mandatory and names what the data cannot settle (for a curated pair, the comparison page's own caveat). The Sato Score is openness/activity/verifiability, not a safety, quality or returns grade. Returns (json): { a: { slug, name, liveness, observed_success_pct, sato_url }, b: {...}, rows: [{ label, a, b, note? }], caveat, rules, comparison_page, source }. Read-only. Example: { a: "coinbase-agentkit", b: "solana-agent-kit" }
- onchain_agent_create_agentshallow
USE WHEN someone wants the code for an onchain agent, not advice: describe the goal and get a runnable TypeScript repo generated from a template that is re-checked every night. Same handler as POST /api/create and the create-sato-agent CLI. The goal picks the template; it never changes a template code file. A goal no template answers returns no_template with the nearest templates instead of improvised code — each with its id, framework, intents, chains and `mismatched` (what differs from the request), so the next call can name one. TEMPLATES, as template (intents: frameworks): base-guarded-trader (trading, swap: agentkit, ai-sdk, claude-agent-sdk, openai-agents, plain-ts); persona-agent (general, payments: claude-agent-sdk); research-report (data, research: plain-ts); treasury-monitor (data, treasury: plain-ts); x402-seller (payments: plain-ts). Any other intent × framework pair answers no_template. The repo carries policy.json (spending caps, allowed chains and tokens), sato.lock.json (dependency custody readings) and sato.create.json (the manifest, signed when a key is configured). It generates for a local fork by default and testnet on request; mainnet is refused unless network is "mainnet" and mainnet_risk_accepted is true, and a template that does not run on the network says so. RULE ENFORCED: the goal is not stored or logged. A refusal names its error code and, where one applies, the rule. `last_green` is the day the template last passed its nightly checks, or null — never invented. Nothing is audited, and nothing here signs, holds keys or moves funds. Returns (json): { schema: "sato.create.response/v1", ok: true, template: { id, version, digest, framework }, files: [{ path, encoding, content }], zip_base64?, env_names, next_commands, manifest, last_green, status_url, cli } or { ok: false, error, message, rule?, nearest?, blocked? }. Writes nothing. Example: { goal: "swap USDC to ETH on Base with a per-trade cap", framework: "plain-ts" }
- onchain_agent_explain_numbershallow
ANSWERS ONE QUESTION: where does a published Sato Hub number come from? Returns one finding from the State of Onchain Agents report by slug — the figure with its stage, method, sample, as-of date, the SQL query that reproduces it, and its citable page at https://satohub.ai/numbers/<slug>. RULE ENFORCED: a number never travels without its stage, method, sample and date; it is never summed across venues, chains or stages. CITE THE URL in the payload, not this response. Returns an error while the report is unpublished. Returns (json): { slug, title, number, unit, stage, method, sample, lines, query, as_of, url, cite, rules }. Read-only. Example: { slug: "erc-8004-agents-registered-on-base" }
- onchain_agent_find_x402_serviceshallow
USE WHEN an agent needs a paid API or data service it can call and pay per request with x402, and wants the ones with evidence behind them first. Find a paid API/data service an agent can call and pay per request with x402: market data, onchain data, web data, search, inference, security checks, identity lookups, dev tools and more. Describe the need in plain words; optional category, chain and max_price_usd narrow it. RULE ENFORCED: results are ranked by what Sato Hub observed, never by what a seller says about itself and never by anything paid to us. Order: (1) x402-style payments to the payout address on Base in the last seven days from several outside payers, not machine noise (counted when the transaction carries a signed USDC authorization, EIP-3009, the settlement x402's exact scheme uses; some non-x402 gasless sends use it too); (2) the listed URL answered HTTP 402 with a payment payload when we asked; (3) everything else, unknown before no. All USDC received at a payout address is context only and never ranks. Ties go to the lower per-call price. Each hit carries both readings with their dates and method, and links to the one canonical page for its payout address. `unknown` means we hold no reading, never that the service failed. A price is what the seller registered, not a charge we observed; `price_usd` appears only where the asset is USDC on Base or Solana. A hit is a description of what was observed, not an endorsement, and nothing here pays for or calls a service. NO HIT IS INVENTED: when nothing matches, the answer says so and names how to broaden (fewer words, drop a filter, another category). Returns (json): { hits: [{ url, network, chain, description, category, price_usd, merchant: { slug, display_host, pay_to, answers_402, payments, claimed_at, is_ours }, sato_url }], matched, capped, match_mode, evidence_as_of, ranking, guidance, unavailable }. `merchant.payments` carries the x402-style reading (the x402_* fields, which rank) and, as context only, the all-USDC reading. `sato_url` is the canonical page for the payout address. Read-only. Example: { need: "token prices", chain: "Base", max_price_usd: 0.01 }
- onchain_agent_get_agent_economyshallow
What is actually happening on-chain across the agent venues Sato Hub tracks — registries, launchpads, payment rails and account infrastructure — measured weekly from public chain reads. Returns (json): { week, as_of, rules, evidence_tiers, venues: [{ id, name, unit, entry_cost, measurable, overlaps_with, headline_safe, contracts:[...], chains:[{ chain, stages:[{ stage, value, unit, method, evidence_tier, sample_size, denominator, covered_days, publishable, caveat }] }], platforms:[...] }] }. HOW TO USE THESE NUMBERS. Never add them together: an ERC-8004 registration, an Olas staked service, a Virtuals launch and a Mech task are four different objects, and each venue's `unit` says which. Every number names its stage — "19,180 launched, 1,233 graduated" is true, "58,400 agents" is not. A null value means UNKNOWN, never zero. A rate whose sample_size is below 20 is returned with `publishable: false` and should not be quoted. Solana identity registries are covered as UPPER BOUNDS (program-account counts, the unit says so); Solana payment settlement is not covered by any row, and by transaction count x402 mostly settles there. Read-only. Cite https://satohub.ai/agent-economy. Examples: - "how many agents are actually registered onchain" -> {} - "what is happening on Base" -> { chain: "Base" } - "who is producing ERC-8004 registrations" -> { venue: "erc8004", include_platforms: true }
- onchain_agent_get_agent_passportshallow
Get the full Sato Agent Passport manifest (sato.agent.manifest/v1) for one REGISTERED agent by slug: identity (sato_agent_id), agent types, chains, model/framework, the stack of Sato Hub directory resources it runs on, links, payment/x402 endpoint metadata, and verification + liveness status. Use onchain_agent_search_agents to find slugs. Payment metadata is self-configured by the creator — published for interoperability, not as an endorsement. Returns an error if the slug is unknown or the agent is not listed. Read-only. Example: { slug: "my-trading-agent" }
- onchain_agent_get_changesshallow
What changed in the Onchain Agent directory since a given date — additions, per-resource change events, and retirements. Use this to keep a local copy in sync instead of re-fetching the whole catalog. Returns (json): { since, until, window_days, counts:{added,changed,removed}, added:[...], changed:[{slug,name,url,events:[...]}], removed:[...], coverage:{...}, full_export }. COVERAGE (also stated in the response): `added` is exact. `changed` only reflects recorded events — score movements, status and verification changes, releases, star milestones, enrichment — so a quiet copy edit will not appear. `removed` is approximate. Treat this as change notification, not a complete replication log, and re-pull the full export periodically. Read-only. Examples: - "what's new this week" -> { since: "2026-08-23" } - "sync my copy" -> { since: <your last sync date> }
- onchain_agent_get_data_freshnessshallow
USE WHEN you are about to quote a Sato Hub number, score, count or feed item and want to know how old it is — or when a figure looks stale and you need to know whether the pipeline behind it is late. Returns, per data surface (directory activity, news, Sato Score, liveness checks, snapshots, ERC-8004 counts, the weekly agent-economy measurements, x402, LP pools, skills, deploy verification and more): when it was last collected successfully, when a collection was last attempted and how that ended, how often it is expected to run, whether it is late, the next scheduled run, and the ledger step it was read from. RULE ENFORCED: late = now − last success > 1.5 × the expected cadence (daily 36h, weekly 252h). A surface built from several pipeline steps is as fresh as its stalest step, and one of its steps never succeeding makes it late. A surface with no recorded success at all returns `last_success_at: null` and `late: null` — unknown, never an invented date. If the ledger cannot be read, every surface is `unknown`, never "fresh". A late surface still serves its last good data: quote it WITH its date. Returns (json): { generated_at, ledger, rule, surfaces: [{ surface, what, expected_every, last_success_at, last_attempt_at, last_status, late, state, age_hours, late_after_hours, next_update, source, steps: [{ step, last_success_at, last_attempt_at, last_status }], served_by }], note, source_url, sato_url }. Timestamps and statuses of data jobs only — no usage figures. Read-only. Example: { surface: "sato_score" }
- onchain_agent_get_deploy_specshallow
Get the structured deploy manifest for one resource by slug — the essential, install-and-instantiate information an agent needs to BUILD from it: runtime, install command(s), entry snippet, required keys/env/wallet/RPC, chains, license, whether it is itself an MCP server, and a deploy_status. deploy_status is a trust signal, NOT a safety guarantee: "verified" = the install path was reproduced/confirmed from the project's docs; "self_reported" = parsed from the project's README and not independently reproduced. Always verify keys, permissions, and funds before running anything. Returns (json): { slug, name, github_url, docs_url, deploy_spec: { runtime, install[], entry, requires[], chains[], license, mcp_native, mcp_invocation?, deploy_clarity, deploy_status, source_url, as_of }, note }. Returns an error if the resource has no manifest yet (they are being rolled out resource by resource). Read-only. Example: { slug: "solana-agent-kit" }
- onchain_agent_get_listing_historyshallow
ANSWERS ONE QUESTION: has this listing been answering Sato Hub's daily checks, and has its tool inventory moved? Returns a bounded 30-day shape from the listing's observed record — days observed, share of OUR checks that succeeded, current state and streak — plus the MCP tool-inventory changes in the window (date, count after the change, added, removed) and the current Sato Score. RULE ENFORCED: success_rate_pct is the share of Sato Hub's own checks that succeeded, never "uptime" — a failure can be on our side. At most 30 entries; the daily rows are not returned (rule 24: shape, not rows). Absence of a record is unknown, not down. Returns (json): { slug, days, observed: { days_observed, window_days, success_rate_pct, current_state, current_streak_days, last_check }, tool_history: [{ date, count, added, removed }], tools_now, tools_peak, trust_score, trust_tier, rules, sato_url }. Read-only. Example: { slug: "jupiter-mcp", days: 30 }
- onchain_agent_get_metricsshallow
Get live ecosystem metrics: the ERC-8004 Identity Registry registered-agent count (read from Ethereum mainnet) and the curated Top Project Tokens index (only tokens of directory-listed projects — never the whole agent-token category or its aggregate market cap). Returns (json): { erc8004: { network, registered_agents, live, checked_at }, top_agent_tokens: [{ symbol, name, current_price, market_cap, price_change_percentage_24h, resource_slug }] }. Read-only.
- onchain_agent_get_newsshallow
Get the Onchain Agent news feed — official releases (GitHub), announcements (project X posts), and reputable RSS. Strongly filtered to the agent economy. Filter by kind (release/tweet/news/research) and/or chain; paginate via limit/offset. Returns (json): { total, count, offset, has_more, next_offset?, news: [{ kind, title, summary, url, source, author_handle, chains, resource_slug, published_at }] }. Read-only. Example: { kind: "release", limit: 10 }
- onchain_agent_get_resourceshallow
Get the full record for one directory resource by slug, optionally with its recent activity feed (releases/posts). Use onchain_agent_search_resources first to find a slug. Returns (json): { resource: {...full record incl. marketplace + liveness fields}, recent_activity: [...] }. Returns an error if the slug is unknown or the resource is Deprecated. Read-only. Example: { slug: "coinbase-agentkit" }
- onchain_agent_get_score_methodologyshallow
USE WHEN you are about to describe, apply or compare the Sato Score — or when asked how to tell whether a crypto-agent project is real, maintained or open — so you quote the rubric instead of guessing it. Returns the six components with their maximum points and what each measures, the tier cutoffs, what "provisional" means, what is deliberately NOT in the score, how it is computed and reproduced, and where a dispute goes. RULE ENFORCED: the Sato Score is a 0–100 measure of how OPEN, ACTIVE and VERIFIABLE a project is, from public evidence, recomputed daily. It is NOT a safety, security, quality, legitimacy or returns grade, and this tool says so in the payload. Self-reported claims earn nothing in it. CITE https://satohub.ai/sato-score when you explain it. Returns (json): { name, scale, components: [{ key, label, max, measures }], tiers, provisional, not_in_score, computed, reproduce, dispute, caveat, url }. Read-only.
- onchain_agent_get_trendshallow
ANSWERS ONE QUESTION: is this measurement going up or down? Returns a bounded series (at most 30 points, default 8) for ONE venue, ONE chain and ONE stage from Sato Hub's own weekly (or daily) chain reads — each point with its date, value, sample_size and method. RULE ENFORCED: points are never summed across venues, chains or stages — the tool refuses to blend chains and tells you which chains exist when you omit one. A null point is UNKNOWN for that period, never zero. The weekly point is the citable one; daily points feed a trend and never a headline. Raw rows are not returned. Returns (json): { venue, chain, stage, grain, unit, points: [{ date, value, sample_size, method, evidence_tier }], direction_first_to_last, known_points, rules, as_of, source }. Read-only. Examples: - "are ERC-8004 registrations on Base growing" -> { venue: "erc8004", chain: "Base", stage: "registered" } - "x402 sellers week over week" -> { venue: "x402", chain: "Base", stage: "settled_to_catalogued_seller", points: 12 } - "do registered endpoints answer, day by day" -> { venue: "erc8004", chain: "Base", stage: "mcp_endpoint_answers", grain: "daily", points: 30 }
- onchain_agent_get_wiki_pageshallow
Get a full Onchain Agent wiki page by slug — an editorial explainer (summary, why it matters, how it works, key components, examples, risks, related resources/pages). Use onchain_agent_list_wiki_pages to find slugs. Returns (json): the full page object. Returns an error if the slug is unknown. Read-only. Example: { slug: "what-are-mcps" }
- onchain_agent_inspect_listingshallow
USE WHEN you have a package slug and need what it does, what it needs and what is on record about it before recommending a download or fork. Returns the package's public fields only: task, description, creator display name, version digest and signing state, recipe, input/output schemas, required services and permissions, model support ("configured, not evaluated"), operating-cost basis as the creator wrote it, license and whether fork is permitted, support, evidence freshness for this digest, integrity, and acquisition modes (download, fork — there is no deploy or buy). RULE ENFORCED: never a signed URL, account id or project id. "integrity: stale_evidence" means the stored artifact no longer matches the seal and download is withheld. Cite sato_url. manifest_url is the public signed release manifest a downloader checks the zip against offline with /verify-release.mjs — it proves the bytes are what Sato sealed, not that they are safe. Read-only.
- onchain_agent_list_categoriesshallow
List all resource categories with counts, most populated first. Useful before filtering onchain_agent_search_resources by category. Returns (json): { total, categories: [{ name, count }] }. Read-only.
- onchain_agent_list_chainsshallow
List all blockchains represented in the directory with resource counts, spotlight chains first (Base, Ethereum, Solana, COTI, Injective…). Returns (json): { total, chains: [{ name, count }] }. Read-only.
- onchain_agent_list_wiki_pagesshallow
List all Onchain Agent wiki pages (slug, title, keyword, summary, last_updated). Returns (json): { total, pages: [...] }. Read-only.
- onchain_agent_preflightshallow
USE WHEN you are about to install a package, clone a repo, connect to an MCP endpoint, pay an agent, or trade a token, and you want to know what is on record about it FIRST. Pass exactly one of repo, package, endpoint, agent or token. Returns a verdict — go | caution | no | unknown — with one evidence line per check, each naming the field it was read from and when that field was written. The rules are written down in lib/preflight.ts and cited by id in `rule`. RULE ENFORCED: a verdict names WHAT WAS CHECKED AND WHEN. It is never a security review, a quality judgment or a statement about returns, and `unknown` means Sato Hub holds no record — not that something is wrong. An unlisted endpoint gets ONE live handshake (initialize + tools/list, 8 s cap) and can never come back `go`: a handshake is not a record. For agent=<chain>:<id> we confirm the ERC-8004 registration exists, fetch its registration file, and report the services it DECLARES; only a declared MCP service is probed. TOKEN LANE (token + chain, EVM only): keyless chain reads — bytecode presence and size, the ERC-20 views, the Clanker v4 factory's OWN deployment record (`tokenDeploymentInfo`, not a bytecode heuristic), and the Uniswap v3 factory across the four standard fee tiers against wrapped native. Every field is nullable and a null carries the reason it is null. PERMANENTLY NULL, and said so in the evidence: holder concentration (no keyless public source — explorers are not scraped) and Uniswap v4 / non-Uniswap liquidity (a v4 poolId cannot be reconstructed without the PoolKey). The deployer address needs an optional explorer key. A pool existing is not depth; a locker holds a position on the terms its own code enforces. Nothing in this lane says safe, audited, rug or scam — those are not readings. SKILL LANE (skill): a skill is a DOCUMENT an agent follows, which is exactly why it is worth checking first — the ClawSwarm skills needed no malware, only text telling the agent to generate a wallet and post the private key. Evidence is the static disclosure the weekly sweep already produced: hosts the text names, whether it generates or handles keys, whether it asks for a credential, whether it pipes a remote script into a shell, what tools it grants itself — each finding WITH the lines that produced it — plus installs, when it was last seen in its registry, and whether a host it names belongs to a listed project. Nothing is fetched from a registry and no skill is executed. A DISCLOSURE DESCRIBES: it never says safe, it never says malicious, an empty flag list is "nothing matched" rather than a pass, and the registry's own scan result is attributed to that registry by name. Returns (json): { verdict, rule, target: { kind, value, slug, name, sato_url, verify_url }, evidence: [{ check, result, source_field, checked_at }], checked_at, caveat, rules, token?, skill? }. `token` and `skill` are the raw reports for those lanes. Read-only. Example: { repo: "coinbase/agentkit" } · { endpoint: "https://mcp.example.com/v1" } · { agent: "base:42" } · { token: "0x1bc0c42215582d5A085795f4baDbaC3ff36d1Bcb", chain: "Base" } · { skill: "clawhub/solana-wallet" }
- onchain_agent_recent_changesshallow
Get recorded changes across the directory — the auditable Listing History. Omit slug for the SITE-WIDE feed (what changed across all listings); pass slug for ONE resource's history. Events: status flips, verification grants, Sato Score tier moves, liveness (a project going dormant or active again), new releases, and field enrichment. Derived from the daily snapshot time-series + the change-event log; high-signal only (passive score/liveness drift is suppressed). Returns (json): { scope, total, changes: [{ date, kind, slug, name, title, detail?, tone }] }. tone is positive | negative | neutral. Read-only. Example: { days: 7 } · { slug: "coinbase-agentkit" }
- onchain_agent_recommend_stackshallow
Given a goal in plain words, returns a trust-ranked stack of directory resources to build it with — bucketed into slots (framework, wallet, payments, trading, data, MCP tooling, security), each pick carrying its Sato Score, liveness, and deploy-spec status, plus honest gaps where the directory has no strong match. Ranking reflects openness/activity/verifiability — never a safety, quality, or returns judgment. Read-only. Example: { goal: "trading agent on Base with x402 payments", chain: "Base" }
- onchain_agent_register_agentshallow
USE WHEN an agent wants a public, machine-readable identity: an Agent Passport at satohub.ai/agents/<slug> plus a manifest at /api/agents/<slug>/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: "…" }
- onchain_agent_route_agentshallow
USE WHEN an agent needs another agent for a task and wants the pick explained by registration, answering service, feedback and liveness. Candidates are the listed Sato Agent Passports; the top 3 by the static ranking get one live MCP handshake before the pick is made. RULE ENFORCED: a route is a RECOMMENDATION, chosen by the listed fields at checked_at. `chosen_by` names every signal, its value and the exact field it was read from. An ERC-8004 registration proves a claim was made on-chain, not that the agent works; wallet_verified proves the key, not the product; a probe proves the declared service answered once. A null feedback count is unknown and ranks below every number, including zero. No job-outcome data exists yet. COVERAGE: agents registered on-chain but holding no Sato passport are absent from the pool — there is no keyless ERC-8004 enumeration callable from a request. Absent means unseen, not unqualified. When nothing qualifies the answer is `unknown` with a reason, never a low-confidence pick. Returns (json): { route: { agent, chosen_by: [{ signal, value, source_field }], checked_at, alternatives: [{ id, name, source, behind_on }], caveat } | { unknown, reason }, preflight, candidates_considered, probed, coverage, rules, caveat, checked_at }. Example: { capability: "trading", chain: "Base", requires_mcp: true }
- onchain_agent_route_launchshallow
USE WHEN an agent or a builder is about to launch a token and wants the venue chosen on published facts, with the fee disclosed before anything is signed. Venues covered: Clanker v4, Bankr, Virtuals, Zora creator coins. RULE ENFORCED: a launch route is a RECOMMENDATION. `chosen_by` names every fact it was chosen on, each with the venue page it was read from and the date it was read (`facts_as_of`). A fee schedule says nothing about what a token will do after it launches, and nothing here is a security review or an audit. `null` is unknown and never zero — a venue that publishes no per-party fee split is unread, not generous. NON-CUSTODIAL: this tool NEVER deploys, signs, holds keys or moves funds. For the Clanker lane it returns a PREPARED CONFIG in the documented clanker-sdk v4 `deploy()` shape (the SDK is deliberately not a dependency of this service) which the caller reads and signs itself. Other venues are recommend-only: named, with a stated reason why no config is emitted. THE FEE: Sato's slice is one entry in the venue's own reward-recipient list — the deployer takes `10000 - bps`, Sato takes `bps`, and the two always total 10000. It is disclosed in `fee` on EVERY response, including when it is 0, and at 0 no Sato recipient appears in the config at all. A launch that is never signed pays nothing. Returns (json): { route_id, goal, chain, venue: { slug, name, lane, pool_fee_pct, creator_share_pct, programmable_fee_split, facts: [{ fact, source_url, as_of }], unconfirmed, docs_url }, reason, chosen_by: [{ signal, value, source_field }], checked_at, alternatives: [{ slug, name, behind_on }], fee: { bps, recipient, basis, disclosed }, prepared_deploy, prepared_deploy_unavailable, facts_as_of, caveat, rules }. When no venue documents the chain: { unavailable, tried, supported_chains, supported_goals, checked_at, caveat }. Example: { chain: "Base", goal: "agent_token", name: "Example Agent", symbol: "EXMPL", deployer: "0x…" }
- onchain_agent_route_lpshallow
USE WHEN an agent is deciding which Uniswap pool and fee tier to provide liquidity to for a pair Sato Route already quotes, and wants the observed readings rather than an opinion. Returns every v3 pool the weekly LP lane found across the four standard fee tiers, each with its in-range liquidity, the swaps and volume actually counted, the window that count covered, and a fee-revenue proxy. RULE ENFORCED: a route is a RECOMMENDATION. `chosen_by` names every field the pick was made on and where each was read. THE LARGEST TERM IS MISSING ON PURPOSE: impermanent loss is not modelled, not approximated and not bounded, and it appears in `chosen_by` as an explicit null rather than being quietly omitted. A fee-revenue figure here is a PROXY — the pool's published fee rate multiplied by volume we counted, in token0's own units — and is never called revenue, an APR or a yield. Readings are never scaled up from the window covered to a full week. THE PICK: highest observed fee-revenue proxy per day per unit of in-range liquidity, among pools whose window could be read. When nothing is rankable the answer is `chosen: null` with a reason per pool, never a low-confidence pick. COVERAGE: Uniswap v3 on Base and Ethereum, for the pairs the router quotes. Uniswap v4 rows come back `null` WITH THEIR REASON — v4 is a singleton PoolManager and publishes no per-pair pool id — and null is unknown, never zero. Every non-Uniswap venue is outside the reading entirely. NON-CUSTODIAL: this tool never signs, holds, moves or provides liquidity, and nothing it returns is advice. Returns (json): { chain, pair, week, pools: [{ venue, pool, fee_tier_ppm, fee_tier_pct, liquidity, swaps_observed, volume_token0_observed, fee_revenue_proxy, fee_revenue_proxy_per_day, proxy_per_day_per_liquidity, token0, token1, covered_days, window_days, window_complete, method, evidence_tier, caveat, as_of, unknown_reason }], chosen: { pool, venue, fee_tier_ppm, because, chosen_by } | null, unranked, as_of, checked_at, caveat, rules }. When the pair is not collected: { unavailable, supported, checked_at, caveat }. Example: { chain: "Base", pair: "WETH-USDC" }
- onchain_agent_route_swapshallow
USE WHEN an agent needs to execute a swap and wants the venue chosen by liveness, verification and price, with the fee disclosed. Asks every aggregator adapter that quotes on the chain, in parallel, and returns the chosen venue's quote and calldata. RULE ENFORCED: a route is a RECOMMENDATION, not a verdict and not an assurance. `chosen_by` names every field it was chosen on — liveness, the observed record of Sato Hub's OWN daily checks (never "uptime"), verification state, then quoted price — with the field each was read from and `checked_at`. Nothing here is called best, safe or guaranteed. A quote is a quote, not a fill. NON-CUSTODIAL: this tool NEVER signs, holds, moves or broadcasts funds. It returns calldata the caller may sign. The Sato fee (3 bps stable-to-stable, 15 bps on any volatile leg) is a parameter on the aggregator's own quote, taken inside the swap transaction by the router, and is stated in `disclosure` before anything is signed. A failed, reverted or unsigned trade pays nothing. Returns (json): { route: { slug, name, listed, sato_url, liveness, observed_success_pct, install_verified }, quote: { venue, amount_in, amount_out, token_in, token_out, chain, calldata, tx, source_url }, sato_fee_bps, sato_fee_recipient, disclosure, chosen_by: [{ signal, value, source_field }], checked_at, alternatives, caveat, preflight, unavailable_venues, rules }. When no adapter answered: { unavailable, tried: [{ venue, reason }], checked_at, caveat }. Example: { chain: "Solana", token_in: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", token_out: "So11111111111111111111111111111111111111112", amount: "1000000" }
- onchain_agent_scaffold_planshallow
USE WHEN a plan has been agreed and the next step is a repository rather than more advice. Builds the plan (same brain as `onchain_agent_build_plan`) and writes it into a small starter repo, returned as a base64 zip plus a manifest naming every file. WHAT IS IN THE ARCHIVE: `README.md` (the plan rendered, every source URL, and the disclosure that Sato OS is ours) · `sato.plan.json` (the plan, signed at its own checked_at when a signing key is configured) · `.env.example` (every environment variable the stack's own deploy specs ask for, values BLANK, each under a comment naming which listing wants it) · `install.sh` (the documented install lines in order, each under its Preflight verdict) · `agent.config.json` (chain, tokens and the venue Sato Route chose, with `chosen_by`) · `.mcp.json` (Sato Hub's MCP server plus any MCP-native stack item) · `docker-compose.yml` ONLY when every stack item documents a docker install. RULE ENFORCED: nothing is generated. Every line is a template constant or a field of the plan, copied verbatim. An install line we were not told is never invented, and a value we do not hold is left blank with a comment rather than filled with a plausible default. THE ONE SAFETY RULE: a documented install that pipes a remote script into a shell (`curl … | sh`) is written as a COMMENTED line with a warning above it, never as an executable one, and it is reported in `quarantined_installs`. Uncommenting it is the reader's decision to take deliberately. DETERMINISTIC: the same plan produces a byte-identical archive — the timestamps come from the plan's `checked_at`, not the clock. NON-CUSTODIAL: the archive holds no keys and no secrets, and nothing here signs, deploys or moves anything. Returns (json): { name, files: [{ path, note, bytes }], env_names, quarantined_installs, zip_base64, bytes, plan: { goal, intent, chain, plan_url, checked_at, stack_slugs }, caveat }. Example: { goal: "a Base trading agent that swaps USDC to ETH on a signal", chain: "Base" }
- onchain_agent_scan_recipientshallow
USE WHEN an agent is about to pay or transfer to an address: an x402 payTo, a treasury sweep, a top-up. Pass the chain and the recipient; add the token, the origin whose 402 named the address and the paying wallet for a fuller reading. Sato Scan answers five questions, each with its own date and gap. WHAT IT READS: (1) does the recipient only LOOK like an address the payer pays, matching its first and last characters without being it; (2) is the token the issuer's contract, keyed by contract address and never by symbol; (3) did the paid party declare the address, through the origin that served it or an identity that names it; (4) does the address carry a structural mark from what it did onchain; (5) is the paying wallet itself the target of address poisoning. RULES: a reading describes what was looked at inside the stated limits, on the date given. `unknown` means Sato Hub holds no record either way. `go` means the payee was declared, the token is the issuer's contract and nothing was found within the limits: it is never a clearance. `caution` and `no` name the rule and the observed fact that decided them. A mark describes what an address did, not who controls it. The recipient, token, paying wallet, origin and amount are not stored; only the chain is. Nothing is signed or sent. Returns (json): { schema: "sato.scan.recipient/v1", verdict: go | caution | no | unknown, rule, reason, answers: { token, lookalike, declared, marks, targeted }, limits, limits_text, as_of, method_version, caveat }. Read-only. Example: { chain: "Base", to: "0x1bc0c42215582d5A085795f4baDbaC3ff36d1Bcb", token: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", origin: "https://api.example.com/paid" }
- onchain_agent_search_agentsshallow
Search REGISTERED onchain agents in the Sato Agent Registry — running agents whose creators registered them for a Sato Agent Passport (distinct from the resource directory, which lists the things agents are built FROM). Filter by free-text query, chain, agent_type, or x402_only. Only human-review-listed agents are returned. Trust rule: registration is self-reported by the creator; verification_status distinguishes Self-Reported from evidence-reviewed Verified/Audited. Nothing here implies safety or performance. Returns (json): { total, agents: [{ sato_agent_id, slug, name, description, agent_type, chains_supported, stack, payment/x402 metadata, verification_status, profile_url, manifest_url }] }. Read-only. Example: { chain: "Base", x402_only: true }
- onchain_agent_search_listingsshallow
USE WHEN someone wants a ready-made onchain agent package to download or fork rather than assemble one. Searches Sato Hub's published agent packages — each a public view of one sealed, immutable version: its task, inputs/outputs, required permissions, model support ("configured, not evaluated"), license, and evidence freshness for that exact digest. Returns (json): { listings: [{ slug, title, task, version: { digest }, recipe, license, fork_permitted, evidence_freshness, integrity, acquisition_modes, sato_url, ... }], next_cursor }. RULE ENFORCED: evidence counts only rows recorded against the package's exact digest — "not_checked" means none exist. A result is scoped to its test; it is not a safety, security or returns claim. No signed download URL is ever returned; cite sato_url. Read-only.
- onchain_agent_search_resourcesshallow
Search the Onchain Agent directory of onchain agents, frameworks, skills, and tooling. Filters: query (free text, AND-matched terms), chain, status, liveness, featured, and the taxonomy facets (docs/taxonomy.md): entity_class (resource | agent | reference), resource_type (Framework | Tool/Service | Infrastructure | Venue | Network | Standard), use_case (trading, payments, wallets, data, identity, privacy, launch, security, build), standard (x402, erc-8004, …), iface (mcp, sdk, …). Legacy flags still work: category, is_agent, is_skill, is_harness. Sort by priority (default), newest_release, stars, or name. Paginates via limit/offset. Deprecated resources are never returned. Returns (json): { total, count, offset, has_more, next_offset?, resources: [...] } where each resource includes chains, status, liveness, github_stars, verification_status, and the marketplace fields (is_agent/is_hirable/is_licensable). Read-only. Examples: - "Active hirable agents on Base" -> { chain: "Base", is_agent: true, liveness: "Active" } - "newest releases" -> { sort: "newest_release", limit: 10 } - "wallet tooling" -> { query: "wallet" }
- onchain_agent_search_skillsshallow
Crypto-relevant agent skills from ClawHub and skills.sh, each with a static DISCLOSURE: hosts it contacts, whether it generates or handles private keys, whether it asks the user to paste a credential, whether it pipes a remote script into a shell, whether it grants itself unrestricted tools, whether it registers the agent with a third-party host, whether it schedules itself. Each flag carries evidence lines on the skill's page. Returns (json): { total, skills: [{ id, name, registry, canonical_url, installs, stars, disclosure_flags, hosts_contacted, declared_env, registry_scan, belongs_to_slug, skill_md_sha256, as_of }], note }. A disclosure is a description, not a safety verdict — a wallet skill that generates keys is doing its job, and no flags is not a clearance. The registry's own scan status is attributed to the registry. Read-only. Cite https://satohub.ai/skills. Examples: - "solana skills that don't touch keys" -> { query: "solana" } then filter disclosure_flags - "which skills phone home" -> { flag: "registers_with_third_party" } - "skills for Coinbase AgentKit" -> { slug: "coinbase-agentkit" }
- onchain_agent_submit_projectshallow
USE WHEN an agent has found, built or maintains a crypto-agent project that is not in the directory and wants it considered. This WRITES: it files the same row the /submit form files, into the same queue, and the daily triage run evaluates it through the same single apply path — probe the public evidence, validate against the listing schema, list it or hold it or decline it with a reason. WHAT HAPPENS NEXT: the website, the repository and any declared endpoint are probed from public sources. A project that clears that evidence is listed; one that does not is held for a person, or declined with the reason. If `contact_email` is given you get exactly ONE email, and only if it is listed. A hold sends nothing — silence means a person is looking. SUBMISSION IS NOT VERIFICATION. It is a request to be looked at. Being listed says what was observed about a project on a date, not that it is safe, audited, profitable or endorsed. Copy carrying profit, safety or risk claims is refused here rather than quietly cleaned up. DEDUPE: the website host and the repository are checked against the live directory and against submissions already waiting. A match returns that existing entry instead of filing a second row — correcting a listing that already exists goes through the claim flow on its page, which proves control of the domain first. LIMIT: 5 write calls an hour per caller. Nothing is written when it trips. Returns (json): { ok, duplicate, submission_id | slug, next, caveat }. Example: { name: "Example Agent Kit", website_url: "https://example.dev", repo_url: "https://github.com/example/kit", category: "Agent Framework", description: "A TypeScript toolkit for wiring agents to Base with viem and an MCP server.", chains: ["Base"] }
- onchain_agent_swapshallow
USE WHEN an agent is about to swap and wants the venue chosen, the fee disclosed, and the trade CHECKED before anything is signed. Two modes: `recommend` returns the choice, the fee sentence and the verdicts and NEVER a transaction; `build-tx` returns an UNSIGNED transaction, and only when the gate allowed it and a simulation did not revert. NON-CUSTODIAL: this tool NEVER signs, holds, moves or broadcasts funds, and it never asks for a key. What comes back is an unsigned object the caller signs or discards. The response signature proves Sato Hub produced those bytes; it is not a claim that anyone authorised a transfer. WHAT IS CHECKED, and under what: four targets — token_in, token_out, the venue endpoint, and the recipient — each with its own verdict, the rule id that produced it and the reason. Then the caller's policy (caps per trade and per period, allowed chains, tokens, venues, recipients, slippage and deadline). Manage policies at https://satohub.ai/api/swap/policies; with no stored policy the default applies. UNKNOWN REFUSES BY DEFAULT. A target we could not read, or a simulation that could not run, WITHHOLDS the transaction unless the policy says otherwise — and the response says which lane could not be read. "We did not check" and "we checked and it is fine" never look alike. A refusal is an ANSWER: it is not an error, and retrying it unchanged will refuse again. A COUNTERPARTY WITH NO PASSPORT IS `no_record`. That is the ordinary case and is not a finding against the address. A Passport is self-registered, and wallet_verified proves control of a key, never anything about the product behind it. There is no list of trusted counterparties here. THE FEE: disclosed verbatim in `disclosure`, per venue, before anything is signed — a fee sentence has to be true for the venue it describes. A trade that is never signed pays nothing. RECEIPT: a `build-tx` response is recorded and `receipt_url` points at the public record of what was checked, under which policy, at what instant. A receipt is not a claim the trade filled. Returns (json): { mode, lane, route_id, venue, chain, token_in, token_out, amount_in, amount_out, sato_fee_bps, sato_fee_recipient, disclosure, chosen_by, alternatives, unavailable_venues, preflight, gate: { verdict, refusals, policy_id, policy_version }, gate_result: { allowed, verdicts, verdicts_digest, counterparty, policy }, simulation, tx | null, withheld: { reason, rule } | null, receipt_url, non_custodial, checked_at, caveat, meta: { signature } }. When no adapter answered: { unavailable, tried, checked_at, caveat }. Example: { chain_in: "Base", token_in: "USDC", token_out: "WETH", amount_in: "1000000", mode: "recommend" }
- onchain_agent_watchshallow
USE WHEN an agent (or the person it works for) wants to be told if something in its stack stops checking out — rather than re-running a Preflight on a schedule of its own. Goes through the SAME path the public form uses: same validation, same normalisation, same rate limit, one row per address and target. WHAT HAPPENS: the target is re-checked once a day by the public Preflight path, and an email is sent ONLY when the verdict CHANGES. Never on a schedule, never a digest. A transition INTO `unknown` (a check that failed to run) is recorded and never mailed — a failed check is not news about the target. FREE WHILE IN PREVIEW. A paid tier will be announced. No price is quoted here and none exists to quote. WHAT IS STORED: the normalised target, the address (a notice has to be delivered), an HMAC of it for counting, and the baseline verdict. No IP address and no name. Asking twice is idempotent; `action: "unsubscribe"` stops the mail and answers the same way whether a row existed or not. RULE ENFORCED: a verdict describes what was checked and when. It is not a safety, security or returns judgment, and a CHANGE is a change in what was observed — not a warning. Returns (json): { ok, action, target_kind, target, watch_id, verdict, notice, caveat }. Example: { target_kind: "package", target: "solana-agent-kit", notify_to: "me@example.com" }
- searchshallow
Search Sato Hub, the daily-rebuilt index of what onchain and crypto AI agents are built from (frameworks, MCP servers, wallets, x402 and stablecoin payment rails, data tools), plus its dated answers, agent-economy numbers and wiki. Not for token prices, trading or investment advice. Takes one query string. Returns (json): { results: [{ id, title, url }] }, at most 10, best first; url is the canonical satohub.ai page to cite. Pass an id to `fetch` for the full text. A query nothing matches returns results: [] — never padded with unrelated records. Read-only. Examples: "coinbase agentkit", "x402 payment rails on Base", "how many ERC-8004 agents by chain", "MCP servers that answer".
Embed this server’s score
Tool count and median score across every tool in this server’s corpus — honest in a way a single cherry-picked tool’s badge wouldn’t be.
[](https://vouch.tools/servers/a8c6910e-0c34-4776-b518-2c9f8f3e4917)