# VetAgent > A pre-trade safety check for AI agents. Before an agent buys, holds or > recommends a crypto token, it calls VetAgent and gets an actionable verdict > instead of forty raw fields. MCP endpoint: https://vetagent.dev/mcp (streamable-http, no auth, no API key) HTTP API: https://vetagent.dev/assess/{address}?chain_hint={chain} Source: https://github.com/jakegu1/vetagent (MIT) Contact: hello@vetagent.dev (no signup; the maintainer answers) Terms: https://vetagent.dev/terms · Privacy: https://vetagent.dev/privacy Registry: dev.vetagent/vetagent on registry.modelcontextprotocol.io ## What it does assess_token_risk(address, chain_hint?, verbose?) Returns risk_level (low | medium | high | unknown), a 0-100 risk_score, a confidence level, and every signal that fired with its evidence. Checks: sell simulation (honeypot detection), buy/sell/transfer taxes, liquidity depth, trading-pair age, cross-chain presence, whether the contract is open source, upstream scanner verdicts, and on Solana the mint/freeze authority plus top-10 holder concentration. get_token_liquidity(address, chain_hint?) Price, 24h volume, pair count and chains for the primary trading pair. Check `status` first: ok | not_found | unpriced | drained | unavailable. `unpriced` means nobody costed the pools, not that liquidity is zero. find_new_hot_pools(chain?, limit?) Newest and most active pools on a chain. Discovery only, never an endorsement. ## The four verdicts low No fatal signal in the checks that ran. NOT the same as "safe to buy". medium Real risk signals present, none fatal. Surface them to the user. high A fatal or high-severity signal fired. Do not proceed unreviewed. unknown A critical check could NOT be completed. This is NOT a low-risk result and must not be used to justify a trade. evidence.data_gaps lists exactly what was missing. `confidence` measures how complete the input data was — not how safe the token is. ## Measured accuracy (n=576, published) False positives (healthy tokens flagged high) ....... 3.1% Answers returned as unknown ......................... 21.2% Centralised tokens (oracle-tagged) rated high ....... 22.3% Dead tokens not rated low ........................... 86.7% (26 of 30) What that last line does and does not say. Recall was unmeasurable here until recently: every public data source ranks by liquidity, so rugged pools drop off the list and sampling produced no dead tokens at all. Pools are now recovered from chain history instead -- any past day is readable from the logs of the contract that created the pool -- which produced a cohort of 30 confirmed-dead tokens. The honest reading is not flattering. Only 3 of those 30 are rated high; 11 land at medium. That is close to correct rather than a miss: 13 of the 30 dead tokens still hold $5,000 or more of liquidity, so those positions can still be sold. "Dead" means the project died, a market outcome, while this tool scores whether you can get out, a safety property. The number we would most like to publish -- recall against deliberately adversarial contracts -- is still measured on 17 tokens, because the oracle that labels them raises its honeypot flag whenever its own sell simulation fails, and that happens against any empty pool whatever the contract does. Until that cohort grows, read this tool as answering "can I still get out of this" rather than "is this a scam". Labels come from sources the engine itself never reads, and the benchmark exits non-zero if the two endpoint sets ever intersect. Full method: https://github.com/jakegu1/vetagent/blob/master/bench/results.md ## Limits Covers observable on-chain risk only. Not investment advice. Does not size positions. Cannot detect off-chain risk: team behaviour, social engineering, or a rug executed through governance. Does not yet check LP lock status or EVM holder concentration; open gaps are listed in docs/SCORECARD.md. ## Privacy Token addresses you look up are not logged. They are used to query public sources and discarded with the response. Aggregate counts only: which tool, which verdict, a coarse client name, a country code, and for an unknown answer which check could not run (e.g. "liquidity: dexscreener 429"). No IPs, no addresses. ## Business model Free tier, paid tiers for volume and SLA. Takes no referral fees, no order flow, and no payment from token projects — revenue that correlated with saying "low risk" would destroy the only asset the tool has. ## Reference pages https://vetagent.dev/api how to call it over MCP or HTTP, and every field https://vetagent.dev/unknown what unknown means, and when to retry or abstain https://vetagent.dev/method how accuracy is measured, including the worst numbers ## Tool reference (generated from the server's tools/list) ### assess_token_risk Safety check to run BEFORE buying, holding, or recommending a token. Returns an actionable verdict (low / medium / high / unknown), a 0-100 risk score, and the individual signals behind it. Covers: sell simulation (honeypot detection, buy/sell/transfer taxes), liquidity depth, trading-pair age, cross-chain presence, whether the contract is open source, and on Solana the mint/freeze authority and holder concentration — plus the aggregate verdicts of upstream security scanners. IMPORTANT: risk_level 'unknown' means a critical check could not be completed. It is NOT a low-risk result and must not be used to justify a trade; evidence.data_gaps lists exactly what was missing, and unknown_kind says whose gap it is: 'infrastructure' comes with next_action 'retry' and retry_after_seconds; 'coverage' or 'mixed' come with next_action 'abstain'. 'confidence' measures how complete the input data was, not how safe the token is. Reports observable on-chain risk only. Not financial advice, does not size positions, and cannot see off-chain risk such as team behaviour, social engineering, or a rug executed through governance. Treat 'low' as 'no fatal signal found in the checks that ran', never as 'safe to buy'. address: Token contract address: ERC-20 (0x + 40 hex) or Solana (base58) chain_hint (optional): Optional chain name (ethereum / bsc / base / polygon / arbitrum / solana). Strongly recommended: Ethereum forks such as PulseChain inherit contract addresses, so the same address exists on several chains at wildly different prices. Without it, an answer covers one chain -- the one holding the most depth -- and names it. verbose (optional): Return full upstream evidence. Off by default to save tokens. ### get_token_liquidity Liquidity snapshot for a token's primary trading pair: price, 24h volume, pair count and the chains it trades on. Check 'status' before using the numbers. 'ok' means real data. 'unavailable' means the upstream request failed, which does NOT mean the token has no liquidity. 'not_found' means no trading pair exists for this address at all. 'unpriced' means pairs exist but no source has costed them, so liquidity_usd is null and the depth is unknown -- this is NOT a report of zero liquidity. 'drained' means every pool on the token's own chain reports its depth and every one is empty: there is nothing to sell into. address: Token contract address chain_hint (optional): Optional chain name; disambiguates forks that share addresses ### find_new_hot_pools Scan a chain for the newest and most active trading pools, returning name, token_address, price, liquidity, 24h volume and pool age. Discovery only. New pools carry inherently high risk and appearing here is NOT a safety endorsement — pass token_address straight to assess_token_risk for anything you intend to act on. chain (optional): Chain name, e.g. solana / ethereum / base / bsc limit (optional): integer