Haris Guardian
Kiểm tra rủi ro lừa đảo/rug chỉ đọc cho token Solana (SPL + Token-2022): điểm rủi ro 0-100 (điểm càng cao = rủi ro càng lớn), kèm lý do bằng ngôn ngữ dễ hiểu (quyền kiểm soát, bẫy Token-2022, thanh khoản, khóa LP, người nắm giữ, mô phỏng honeypot). Gói miễn phí; công cụ trả phí qua x402 USDC trên Solana hoặc Base. Không cần API key, không bao giờ ký giao dịch hay giao dịch.
Máy chủ MCP được lưu trữ
npx add-mcp 'https://haris-api.vercel.app/mcp'Cài vào Claude Code, Codex, Cursor và nhiều công cụ khác
Tài liệu
Haris Guardian — Solana token risk check (MCP + REST + x402)
Read-only scam/rug-risk checks for Solana SPL and Token-2022 tokens. Give it a mint address; get a 0–100 risk score (higher = riskier), a verdict, and plain-English reasons. It never signs, trades, or holds keys.
What it checks
- Mint and freeze authority
- Token-2022 traps: permanent delegate, transfer hooks, transfer fees
- Holder concentration
- Liquidity, LP burn/lock %, Streamflow locks
- Simulated buy + sell (honeypot test)
Endpoints
| Interface | URL |
|---|---|
| MCP (streamable-http) | https://haris-api.vercel.app/mcp — tools check_solana_token, diff_solana_token, deep_check_solana_token, batch_check_solana_tokens |
| REST (free, 3/day) | GET https://haris-api.vercel.app/v1/check/{mint} |
| REST (paid, x402) | POST https://haris-api.vercel.app/v1/paid/check · GET /v1/paid/check/{mint} |
| Deep check (x402) | POST https://haris-api.vercel.app/v1/paid/deep-check {"mint"} |
| Batch check (x402) | POST https://haris-api.vercel.app/v1/paid/batch-check {"mints": [up to 20]} |
| Watch/diff (x402) | POST https://haris-api.vercel.app/v1/paid/diff {"mint", "previous"} |
| OpenAPI | https://haris-api.vercel.app/openapi.json |
| Docs | https://haris-api.vercel.app/docs |
| llms.txt | https://haris-api.vercel.app/llms.txt |
| A2A agent card | https://haris-api.vercel.app/.well-known/agent.json |
Pricing
- 3 free checks per day per IP.
- After that: $0.01 USDC per check via x402, on Solana or Base (HTTP 402 → pay → retry). Every 402 lists both options; pay with whichever chain you hold USDC on:
- Base (
eip155:8453, USDC0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913, exact / EIP-3009): pays0xCf2187a039c9ac286Ee43ECc46cBc6DaEB4Fa633 - Solana (
solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp, USDCEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v): pays7ZpBTGZ7mBm81esAq77FFm293zAuGM3Hi249fKPnVDfJ - The facilitator pays network fees on both chains, so you need USDC only.
- Base (
- Deep check $0.10: holder concentration (top1/top5/top10 %), top wallets linked by a shared funder (bundles/insiders), creator-funded and fresh wallets, LP lock/burn, authorities, score + reasons.
- Batch check $0.10 per batch of up to 20 mints (charged only if at least one mint is checked).
- Watch/diff $0.02: send a previous result, get alerts on what changed (authority re-enabled, LP unlocked, liquidity pulled, sell blocked). Stateless.
- Failed calls are never charged. See docs/API.md.
Quick start
1. Free, no wallet (3 checks per UTC day per IP):
curl https://haris-api.vercel.app/v1/check/DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263
2. Paid, $0.01 USDC per check via x402 on Solana or Base. Unpaid calls get HTTP 402 with one accepts[] entry per chain;
an x402 client signs a USDC payment and retries. Your wallet needs USDC only (the facilitator pays network fees), and a
check that fails is never charged.
curl -i -X POST https://haris-api.vercel.app/v1/paid/check -H 'content-type: application/json' -d '{"mint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"}'
# -> 402, v1 challenge in the body, v2 challenge base64 in the PAYMENT-REQUIRED header
| Chain | Network (CAIP-2) | Asset | payTo |
|---|---|---|---|
| Base | eip155:8453 | USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 | 0xCf2187a039c9ac286Ee43ECc46cBc6DaEB4Fa633 |
| Solana | solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp | USDC EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v | 7ZpBTGZ7mBm81esAq77FFm293zAuGM3Hi249fKPnVDfJ |
Python (pip install "x402[httpx,evm,svm]"):
import asyncio, os
from x402 import x402Client
from x402.http.clients import x402HttpxClient
client = x402Client()
if os.getenv("EVM_PRIVATE_KEY"): # Base
from eth_account import Account
from x402.mechanisms.evm.exact import register_exact_evm_client
from x402.mechanisms.evm.signers import EthAccountSigner
register_exact_evm_client(client, EthAccountSigner(Account.from_key(os.environ["EVM_PRIVATE_KEY"])))
if os.getenv("SOLANA_PRIVATE_KEY"): # Solana (base58 secret key)
from solders.keypair import Keypair
from x402.mechanisms.svm.exact import register_exact_svm_client
from x402.mechanisms.svm.signers import KeypairSigner
register_exact_svm_client(client, KeypairSigner(Keypair.from_base58_string(os.environ["SOLANA_PRIVATE_KEY"])))
async def main():
async with x402HttpxClient(client, timeout=60) as http:
r = await http.post("https://haris-api.vercel.app/v1/paid/check", json={"mint": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"})
print(r.status_code, r.json())
asyncio.run(main())
TypeScript (npm i @x402/fetch @x402/evm @x402/svm viem @solana/kit @scure/base):
import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { ExactSvmScheme } from "@x402/svm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
import { createKeyPairSignerFromBytes } from "@solana/kit";
import { base58 } from "@scure/base";
const client = new x402Client();
if (process.env.EVM_PRIVATE_KEY) // Base
client.register("eip155:8453", new ExactEvmScheme(privateKeyToAccount(process.env.EVM_PRIVATE_KEY as `0x${string}`)));
if (process.env.SOLANA_PRIVATE_KEY) // Solana
client.register("solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
new ExactSvmScheme(await createKeyPairSignerFromBytes(base58.decode(process.env.SOLANA_PRIVATE_KEY))));
const fetchWithPayment = wrapFetchWithPayment(fetch, client);
const r = await fetchWithPayment("https://haris-api.vercel.app/v1/paid/check", {
method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ mint: "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263" }),
});
console.log(r.status, await r.json());
Other paid endpoints work the same way (POST JSON): /v1/paid/deep-check {"mint"} $0.10,
/v1/paid/batch-check {"mints": [...]} (up to 20) $0.10, /v1/paid/diff {"mint", "previous"} $0.02.
MCP: https://haris-api.vercel.app/mcp (streamable HTTP), tools check_solana_token, diff_solana_token (free tier),
deep_check_solana_token, batch_check_solana_tokens.
Full runnable examples: https://github.com/fitness9991/haris-guardian/tree/main/examples
MCP client config:
{ "mcpServers": { "haris-guardian": { "type": "http", "url": "https://haris-api.vercel.app/mcp" } } }
Cline: use "type": "streamableHttp" (see llms-install.md).
LLM-friendly summary: https://haris-api.vercel.app/llms.txt
Limits / honesty
A score is a heuristic signal, not financial advice or a guarantee. A low score does not mean a token is safe or will go up.
Links
Website https://harisguardian.netlify.app · X @HarisGuard_SOL · Telegram bot: Haris Guardian · Contact mansor791@gmail.com