Token Safety Check

io.github.lx1112由 GitHub 帳號 lx1112 發布v0.4.1更新於 Oct 26, 2026

Rug check tokens on Base, Ethereum, Arbitrum, Optimism, Polygon, Solana: 0-100 risk score + reasons

發布方自己的服務:check.tattoo: tattoo size and placement guide

已驗證STDIO僅桌面金融安全與監控

概覽

AI 產生的概覽

在 Base、以太坊、Arbitrum、Optimism、Polygon 或 Solana 上對代幣做跑路風險檢查,回傳 0-100 風險評分與白話原因,每次呼叫以 USDC 付費。

可以做什麼
  • 對單一代幣做完整安全檢查:風險評分、等級與原因,以及擁有者、權限、供給量、持有者、資金池、價格與流動性
  • 產生適合聊天回覆的結論:評級、一句話總結、簡短評論與分享卡片連結
  • 一次呼叫複查最多五個代幣,並針對自上次指紋以來的變化給出單行提醒
  • 與先前的指紋比對,查看新增風險、權限變更、流動性或價格變動
適用情境
當助理被問到某個代幣是否安全、是否值得買入時,或需要對上述鏈上少量代幣做定時監控時適用。它只是依規則做的篩檢,不構成投資建議。
執行需求
透過 npx 在本機執行(需要 Node.js)。需要在 X402_PRIVATE_KEY 提供專用錢包私鑰,且該錢包在 Base 上持有少量 USDC,因為每次檢查透過 x402 花費 0.01 美元;不需帳號或 API 金鑰。選用 TOKEN_SAFETY_MAX_USD 設定單次呼叫花費上限(預設 0.05),TOKEN_SAFETY_ENDPOINT 可指向其他部署。需要能連線到付款端點。
安裝前請注意
此伺服器持有錢包私鑰(X402_PRIVATE_KEY),每次檢查、結論或觀察清單呼叫都會在 Base 上簽署真實 USDC 付款,請使用餘額很少的專用錢包。花費上限只限制單次價格,不限制總支出。代幣地址與查詢內容會傳送到第三方端點。評分依規則產生,不構成投資建議。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Token Safety Check,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

token-safety-check

[Lumière PayCheck grade]

Is this token safe? A rug check for any token on Base, Ethereum, Arbitrum, Optimism, Polygon or Solana, for AI agents and scripts. Each check returns:

  • a 0–100 risk score and level (low, medium, high, critical) with plain-language reasons:
    • who can mint, freeze, blacklist, pause or change fees
    • upgradeable contract code
    • Token-2022 permanent delegates, transfer fees and hooks
    • holder concentration
    • thin or missing liquidity
    • a deployer whose earlier tokens lost their liquidity, or who launches tokens in bulk
  • the facts behind the score: owner, authorities, supply, top holders, pools, and the deployer's launch record when we saw the token launch;
  • USD price and liquidity;
  • a fingerprint. Pass it back as since and the next check tells you what changed: new risks, authority changes, liquidity or price moves. That makes it easy to monitor tokens on a schedule.

A verdict call turns the same facts into a grade (CLEAN, MID, SKETCHY or RUGGY), a one-liner, a short take and a link to a share card, for chat replies and quests.

A watchlist call re-checks up to 5 tokens at once for the same $0.01, returning a compact entry per token and one-line alerts for whatever changed since your last call.

Checks, verdicts and watchlist calls cost $0.01 each in USDC on Base, paid automatically with x402 from a wallet you control. There's no account or API key. Errors and invalid input are never charged, and a spending cap stops any call priced above your limit (default $0.05).

The score is rules-based and is not investment advice. Powers count for less on tokens with deep liquidity, where they're usually a large issuer's compliance controls (USDC can freeze and mint, for example).

Use it from Claude Desktop, Cursor or any MCP client

Create a new wallet just for this and send it a little USDC on Base: $1 covers 100 checks. Then add to your MCP config (for Claude Desktop, that's claude_desktop_config.json):

json
{  "mcpServers": {    "token-safety-check": {      "command": "npx",      "args": ["-y", "token-safety-check"],      "env": { "X402_PRIVATE_KEY": "0x<private key of the dedicated wallet>" }    }  }}

The server has three tools:

  • check_token_safety (address, optional chain and since): the full check for one token.
  • token_verdict (address, optional chain): a grade, one-liner, short take and share-card link.
  • watch_tokens (tokens: up to 5 of { address, chain?, since? }): re-checks them all in one paid call and, given each token's earlier fingerprint, reports what changed with one-line alerts.

Optional environment variables:

  • TOKEN_SAFETY_MAX_USD: per-check spending cap, default 0.05.
  • TOKEN_SAFETY_ENDPOINT: point at another deployment.

Use it from code

bash
npm install token-safety-check
ts
import { createTokenSafetyClient } from "token-safety-check";
const client = createTokenSafetyClient({ privateKey: process.env.X402_PRIVATE_KEY as `0x${string}` });
const first = await client.checkToken({ chain: "base", address: "0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed" });console.log(first.risk.score, first.risk.level, first.risk.summary);// 15 low Low risk: the owner can pause all transfers; ownership is not renounced.
// Later: what changed since then?const later = await client.checkToken({ address: first.address, chain: "base", since: first.watch.fingerprint });if (later.watch.changes?.anythingChanged) console.log(later.watch.changes);

A verdict for a chat reply

ts
const v = await client.verdict({ address: "0xe468f13905669748bf312611b9ebcc8ccc6db5d9" });console.log(v.grade, v.oneLiner); // SKETCHY Liquidity: two coins and a prayerconsole.log(v.take, v.card);       // "$KTI: 60/100 risk. ..." and a signed share-card link// Pass requestKey (8-128 letters, digits or _.:-) and a retry with the same key is never charged twice.

Watch what you hold

ts
let list = [  { chain: "base", address: "0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed" },  { chain: "solana", address: "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN" },] as const;let fingerprints: (string | undefined)[] = [];
// Every hour (or however often): one $0.01 call for the whole list.const w = await client.watchlist(list.map((t, i) => ({ ...t, since: fingerprints[i] })));for (const alert of w.alerts) console.log(alert); // e.g. "PEPINA (eth): risk 0 -> 30 (medium); liquidity -99.99%"fingerprints = w.tokens.map((t) => t.fingerprint);

Use it in the Vercel AI SDK or Mastra

token-safety-check/ai gives three ready tools (checkTokenSafety, tokenVerdict, watchTokens), plain { description, inputSchema, execute } objects that both take as tools:

ts
import { generateText } from "ai";import { createTokenSafetyClient } from "token-safety-check";import { tokenSafetyTools } from "token-safety-check/ai";
const tools = tokenSafetyTools(createTokenSafetyClient({ privateKey: process.env.X402_PRIVATE_KEY as `0x${string}` }));const { text } = await generateText({ model, tools, prompt: "Is 0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed on Base safe to buy?" });

Use it in ElizaOS

token-safety-check/eliza is an ElizaOS 1.x plugin with one action, CHECK_TOKEN_SAFETY. When a message names a token address ("is 0x… on Base safe?", "rug check "), the agent replies with the verdict and a share-card link.

ts
import { tokenSafetyPlugin } from "token-safety-check/eliza";
export const character = {  name: "trader",  plugins: [tokenSafetyPlugin],  settings: { secrets: { TOKEN_SAFETY_PRIVATE_KEY: process.env.TOKEN_SAFETY_PRIVATE_KEY } },};

Settings: TOKEN_SAFETY_PRIVATE_KEY (a dedicated wallet with a little USDC on Base; falls back to X402_PRIVATE_KEY), optional TOKEN_SAFETY_MAX_USD (default 0.05) and TOKEN_SAFETY_ENDPOINT.

Use it in Coinbase AgentKit

ts
import { customActionProvider } from "@coinbase/agentkit";import { z } from "zod";import { createTokenSafetyClient } from "token-safety-check";
const safety = createTokenSafetyClient({ privateKey: process.env.X402_PRIVATE_KEY as `0x${string}` });
export const tokenSafety = customActionProvider({  name: "check_token_safety",  description: "Rug check a token on Base, Ethereum, Arbitrum, Optimism, Polygon or Solana: 0-100 risk score with reasons.",  schema: z.object({    address: z.string().describe("Token contract or Solana mint address"),    chain: z.enum(["base", "eth", "arbitrum", "optimism", "polygon", "solana"]).optional(),  }),  invoke: async (args) => JSON.stringify(await safety.checkToken(args)),});// Add tokenSafety to the actionProviders you pass to AgentKit.from(...).

Use it in LangChain (JS)

ts
import { tool } from "@langchain/core/tools";import { z } from "zod";import { createTokenSafetyClient } from "token-safety-check";
const safety = createTokenSafetyClient({ privateKey: process.env.X402_PRIVATE_KEY as `0x${string}` });
export const checkTokenSafety = tool(async (args) => JSON.stringify(await safety.checkToken(args)), {  name: "check_token_safety",  description: "Rug check a token on Base, Ethereum, Arbitrum, Optimism, Polygon or Solana: 0-100 risk score with reasons.",  schema: z.object({    address: z.string(),    chain: z.enum(["base", "eth", "arbitrum", "optimism", "polygon", "solana"]).optional(),  }),});

Example output (trimmed)

json
{  "address": "0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed",  "chain": "base",  "name": "Degen",  "symbol": "DEGEN",  "risk": {    "score": 15,    "level": "low",    "reasons": [      { "code": "can-pause", "points": 10, "text": "The owner can pause all transfers." },      { "code": "owner-not-renounced", "points": 5, "text": "Ownership is not renounced." }    ],    "summary": "Low risk: the owner can pause all transfers; ownership is not renounced."  },  "market": { "dex": "uniswap-v3", "pairedWith": "WETH", "priceUsd": 0.000963, "quoteSideLiquidityUsd": 134000 },  "watch": { "fingerprint": "eyJzIjoxNSwi…", "changes": null }}

Without this package

Both are plain x402 endpoints, so any x402 client can call them directly: GET https://onchaincheck.dev/token?chain=<chain>&address=<address>[&since=<fingerprint>] and GET https://onchaincheck.dev/watchlist?tokens=<chain>:<address>,...[&since=<fp>,...]. It's also listed in the x402 Bazaar.

Safety notes

  • Use a dedicated wallet with a small balance. The key never leaves your machine; it only signs USDC payments of the quoted price.
  • Each check's price is read from the server's payment request before paying, and anything above maxUsdPerCheck / TOKEN_SAFETY_MAX_USD is refused.

MIT licensed.

來源:README.md,提交 a2e05c8

工具

0
SourceWeft 曾在隔離沙箱中以無憑證方式啟動該軟體包一次,以列出其工具,但未能完成:伺服器未能啟動。

版本歷史

5
  1. v0.4.1最新Oct 26, 2026
  2. v0.4.0Oct 26, 2026
  3. v0.3.0Oct 25, 2026
  4. v0.2.0Oct 24, 2026
  5. v0.1.0Oct 23, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

其他 Check 整合