Sato Hub
Free check

Preflight

Check a repo, package, endpoint, agent or token before you use it.

A verdict is a description of evidence

A Preflight verdict names what was checked and when, from Sato Hub's own records and probes. It is not a security review, a quality judgment, or a statement about returns. Unknown means we hold no record — not that anything is wrong.

Try it

This form calls the same endpoint an agent calls, and prints what came back — nothing is added or softened in between.

owner/name, or a GitHub URL

The four verdicts

go

The listing is active, scores in the High Sato Score tier, and carries at least one earned check: a reproduced install, a fresh successful daily probe, or 95%+ observed success over at least 14 days of our checks.

Not a security review, and not a statement that it will work for you.

caution

Something resolved or answered, but it did not clear the go bar — the default once we hold a record at all.

Not an accusation. Most of the index sits here, because most projects have not been independently checked.

no

A retired listing, a probed endpoint that did not answer, an ERC-8004 id that is not registered, or an observed record that is mostly failure attributed to the host over at least the minimum window.

Not a fraud finding and not a security judgment. It names one reading that failed, on a date.

unknown

Nothing resolved and nothing was probed. Sato Hub holds no record of this target.

Not a warning. Absence of a record is absence of a record.

The lanes, and what each can honestly say

repo?repo=coinbase/agentkit
Exact match against the directory's own repository field — no fuzzy matching, so a fork never answers for the original. A retired listing answers 410: we knew this and it is gone.
package?package=solana-agent-kit
The same exact resolver over the install lanes of every deploy spec, so an npm name maps to the listing that publishes it.
endpoint?endpoint=https://mcp.example.com/v1
A listed endpoint resolves to its record. An unlisted one gets one live MCP handshake capped at 8 seconds — a single handshake is not a record, so this lane never returns go.
agent?agent=base:42
An ERC-8004 id against the Identity Registry: ownerOf confirms the id exists, the tokenURI document is read, and only a DECLARED MCP service is probed. A2A and x402 declarations are reported as declared and unprobed — we do not call them.
skill?skill=clawhub/<id>
An agent skill, read from the disclosure the weekly sweep already produced: which hosts its text names, whether it generates or handles keys, whether it asks you to paste a credential, whether it pipes a remote script into a shell, what tools it grants itself — each finding shown with the line that produced it. Nothing is fetched from the registry and no skill is run. A disclosure describes; the registry's own scan is quoted as the registry's.
token?token=0x…&chain=base
An ERC-20 address on Base, Ethereum or Arbitrum, read keyless from public RPC: bytecode present, the four ERC-20 views, a Clanker v4 deployment record if one exists, Uniswap v3 pools against wrapped native and who holds the LP position. Holder concentration and Uniswap v4 depth are reported as not checked, never guessed. Solana answers unknown.

The token lane reads only what public RPC answers. A pool existing is not depth, a deployer is unknown without an explorer key, and no holder table is scraped — every one of those is written as not checked rather than filled in.

ours

Run it on Sato OS

from $299

A token verdict is the check before a swap, not the swap. Sato OS is our own self-hosted trading agent: it runs this same check, then routes and signs the trade on your own machine with your own keys.

Sato OS is built by Sato Hub and sold by Sato Hub, so it is shown here as ours rather than as a find. It is self-hosted and non-custodial — it runs on your machine and signs with your keys — and it was not ranked against any listing on this page.

Checking a token because an agent is about to trade it? Sato Swap runs these same lanes on both legs, the venue and the recipient, applies your policy, simulates the route, and returns an unsigned transaction or the rule that withheld one — no keys, no signing, no broadcasting. The method.

Call it

HTTP

curl -s "https://satohub.ai/api/preflight?repo=coinbase/agentkit"

Exactly one of ?repo=, ?package=, ?endpoint=, ?agent=. Contract: OpenAPI.

MCP

{
  "mcpServers": {
    "satohub": { "url": "https://satohub.ai/api/mcp" }
  }
}

The same verdict engine answers in an agent’s tool loop. Full tool list on /mcp.

Run it in CI

One call per push, over the whole manifest. The action posts your package.json or requirements.txt to /api/preflight/batch, prints a table in the job summary, annotates the manifest lines, and writes a SARIF log for code scanning.

GitHub Action

- uses: satohubai/preflight-action@v1
  with:
    manifest: package.json
    fail_on: none   # warn-only

Composite, no dependencies, no token: satohubai/preflight-action. Up to 50 targets per run.

Or call the batch endpoint directly

curl -s -X POST "https://satohub.ai/api/preflight/batch" \
  -H "content-type: application/json" \
  -d "{\"manifest\": $(jq -Rs . package.json),
       \"manifest_kind\": \"package.json\"}"

Returns summary, an exit_code a build can use, and findings in SARIF shape.

Two things it will never do. unknown never fails a build, at any setting — it means we hold no record, which is a fact about our index rather than about your dependency. And nothing in your manifest is ever contacted: names are looked up against records we already hold, and only an endpoint you type on purpose reaches a live probe.

Any repo can embed the badge, with no account and no setup: ![preflight](https://satohub.ai/api/badge/preflight/package/solana-agent-kit) — repo and package only, because a badge is rendered by whoever opens a README and must never become a probe of somebody’s server.

Reference

QuestionsShowHide

Questions Preflight answers

What is Preflight?
One HTTP call an agent makes before it installs a tool, connects to an endpoint, pays one or trades a token. It returns one of four verdicts — go, caution, no, unknown — with every reading it decided on, the field each reading came from, and the date that field was written.
Does a "go" verdict mean a project is free of risk?
No. A verdict names what was checked and when. "go" means the listing is active, scores in the High Sato Score tier, and carries at least one earned check such as an install Sato Hub reproduced in a container. It is not a security review, a code audit, or a statement about returns.
How do I check whether an npm package for a crypto agent is maintained?
Call Preflight with ?package=<name>. It resolves the name against the install lanes of every deploy spec in the directory and returns the listing's last code activity (its last commit and release where known; posts are not counted), its Sato Score and whether the documented install was reproduced in a container — each with the date it was read. A package Sato Hub does not list returns unknown rather than a guess.
Can Preflight tell me who deployed a Base token?
It reads what public RPC answers: bytecode present, the four ERC-20 views, a Clanker v4 deployment record where one exists, Uniswap v3 pools against wrapped native and who holds the LP position. Holder concentration and Uniswap v4 depth are reported as not checked rather than guessed, and Solana answers unknown.
What does "unknown" mean?
That Sato Hub holds no record of that target and nothing was probed. It is an honest absence, not a warning, and it is returned rather than a low-confidence guess.
What can Preflight check?
Five lanes: a GitHub repository, an npm package, an https endpoint, an ERC-8004 agent reference in <chain>:<id> form, and an ERC-20 token address with a chain. Exactly one target per call.
Is Preflight free, and can an agent call it?
Yes to both. GET /api/preflight is open, CORS-enabled and documented in the OpenAPI contract, and the same engine answers over MCP as onchain_agent_preflight so an agent can call it mid-task without leaving its tool loop.
Where do the readings come from?
Sato Hub's own records: the daily liveness refresh, the Sato Score, the reproduced-install flag, the observed record of our daily checks, and the daily live probe — plus, for the endpoint, agent and token lanes, one live read taken at request time. The verdict engine itself is pure, so the HTTP lane and the MCP lane cannot disagree.
SourcesShowHide

Preflight reports readings Sato Hub holds or took. It is not a security audit, a code review or financial advice. Related: Every rule, in full · House rules · Sato Score · Reliability · Sato Route · Sato Bot