Give your agent a radar
Radartrade is one endpoint your agent calls before it buys a Solana token. It answers with a score, a call and the evidence for each flag. This page covers setup, the report format and every rule.
Quick start
The fastest path is Claude Code. Run this once:
claude mcp add --transport http radartrade /mcp
Then tell your agent the rule, for example in your CLAUDE.md or system prompt:
Before buying any Solana token, call radartrade scan_token with its mint. Never buy on HOSTILE. On WATCH, use at most a quarter of normal size.
MCP setup
The server speaks MCP over Streamable HTTP at /mcp. It is stateless, needs no session and returns plain JSON.
Claude Code
claude mcp add --transport http radartrade /mcp
Claude Desktop and claude.ai
Open Settings → Connectors → Add custom connector, name it Radartrade and paste the URL:
/mcp
Cursor
Add to ~/.cursor/mcp.json (or .cursor/mcp.json in a project):
{
"mcpServers": {
"radartrade": { "url": "/mcp" }
}
}With an API key
Send the key as a header. In Claude Code:
claude mcp add --transport http radartrade /mcp --header "x-api-key: YOUR_KEY"
Tools
| Tool | Input | Returns |
|---|---|---|
scan_token | { "mint": "…" } | The full report (below). Counts against the daily limit. |
trending_tokens | none | Up to 12 boosted Solana tokens with market cap, liquidity, 1h volume and age. Free. |
REST
Same report, plain HTTP. CORS is open, so browsers can call it too.
| Endpoint | What it does |
|---|---|
GET /v1/scan/{mint} | Sweep one token. Reports are cached for 60 seconds. |
GET /v1/trending | The live list shown on the home page. |
GET /v1/health | Service status and the free daily limit. |
curl /v1/scan/MINT_ADDRESS curl -H "x-api-key: YOUR_KEY" /v1/scan/MINT_ADDRESS
Responses carry x-ratelimit-limit and x-ratelimit-remaining headers.
The report
Abridged. Open any sweep and expand Raw JSON to see a full one.
{
"mint": "…",
"token": { "name", "symbol", "image", "program", "decimals", "supply", "launchpad", "createdAt", "ageHours" },
"score": 0-100,
"verdict": "CLEAR" | "WATCH" | "HOSTILE",
"summary": "Hostile: freeze authority is live and launch bundle still holds. Do not buy.",
"flags": [
{ "id": "freeze_authority", "severity": "high", "penalty": 40,
"label": "Freeze authority is live", "detail": "…" }
],
"checks": {
"authorities": { "mint", "freeze", "metadataUpdate", "issuer" },
"token2022": { "extensions", "permanentDelegate", "transferHook", "transferFeeBps", … } | null,
"launch": { "traced", "slot", "time", "creator", "dev": {…}, "bundle": {…} },
"holders": { "top10Pct", "top": [{ "owner", "pct" }], "programPct", "burnedPct" },
"copycat": { "mint", "symbol", "marketCap", "ratio" } | null,
"market": { "priceUsd", "marketCap", "liquidityUsd", "volume24h", "buys24h", "sells24h", … } | null
},
"partial": [ { "check": "holders", "error": "…" } ],
"scannedAt": "…", "ms": 4210
}partial lists checks that could not finish (a slow RPC, say). A failed check adds no penalty of its own, so an incomplete sweep gets an incomplete flag and is capped at 74: it can be WATCH or HOSTILE, never CLEAR.
Rules and penalties
The score starts at 100. Each rule that fires takes its penalty off. Some rules also set a ceiling the score can't go above. Calls: CLEAR 75–100, WATCH 45–74, HOSTILE 0–44.
| Rule | Penalty | Fires when |
|---|---|---|
mint_authority | 40, max 40 | Someone can still mint new supply. |
freeze_authority | 40, max 40 | Someone can freeze holders' tokens. |
t22_non_transferable | 60, max 10 | The token can't be moved at all. |
t22_permanent_delegate | 45, max 30 | A delegate can move or burn tokens from any wallet. |
t22_default_frozen | 35, max 40 | New token accounts start frozen. |
t22_pausable | 30, max 40 | All transfers can be paused. |
t22_transfer_hook | 25, max 60 | A program runs on every transfer. |
t22_transfer_fee | 10 / 25 | Transfers are taxed (25 at 5% or more). |
t22_close_authority | 10 | The mint account can be closed. |
metadata_mutable | 5 | Name and image can still change. |
bundle_holding | 8 / 18 / 30 | Launch-block buyers still hold 2% / 7% / 15% or more. |
bundle_launch | 5 | The launch block took 10% or more, since moved on. |
dev_holding | 10 / 20 | The creator holds 5% / 15% or more. |
dev_sold | 5 / 10 | The creator sold 50% / 90% or more of their launch buy. |
top10 | 6 / 15 / 25 | Top 10 wallets hold 25% / 40% / 60% or more. |
copycat | 20 | The same ticker trades at 10x the market cap (and at least $250K) elsewhere. |
no_market | 10 | No pool is listed anywhere. |
no_trades | 15 | No trades in 24 hours. |
thin_liquidity | 5 / 12 | Pool liquidity under $20K / $5K (not on a bonding curve). |
wash_volume | 8 / 12 | Oversized average trades, or 24h volume above 5x market cap. |
no_socials | 5 | No website or social links. |
brand_new | 5 | Under an hour old. |
How the launch block is traced
Radartrade walks the mint's history back to its first transaction (up to 6,000 deep), reads every successful transaction in that slot, and records each wallet that received tokens. The creator is the fee payer of the transaction that initialised the mint. Current balances come from each wallet's associated token account. Tokens with deeper history still get the creator and dev buy from the creation transaction, but not the full list of launch-block buyers.
Limits and keys
Without a key you get 30 sweeps a day per IP, reset at 00:00 UTC. Trending and health calls are free and unlimited. Agents that need more can get an API key with a higher daily allowance. Contact the team through the official channels in the footer.
Errors
| Status | error | Meaning |
|---|---|---|
| 400 | invalid_mint | Not a base58 Solana address. |
| 401 | invalid_key | The API key is unknown. |
| 404 | not_found | No account exists at that address. |
| 422 | not_a_mint | The account exists but isn't a token mint (a wallet, say). |
| 429 | quota_exceeded | Daily limit used up. |
| 502 | upstream | Solana RPC or DexScreener failed. Retry shortly. |
Over MCP, the same errors come back as a tool result with isError: true and the message as text.