Quickstart
Call Sigil from your agent in five minutes.
Sigil speaks MCP over streamable HTTP. Endpoint: POST /mcp. Discovery: GET /.well-known/sigil.json.
# discover the service (free)
curl -s https://<sigil-host>/.well-known/sigil.jsonThe five tools
| tool | price (USDT) |
|---|---|
sigil_screen_deep | 0.10 |
sigil_screen_transaction | 0.02 |
sigil_scan_token | 0.01 |
sigil_screen_address | 0.005 |
sigil_verify_verdict | 0 — free forever |
With an MCP client (any SDK), connect to /mcp and call tools normally. Raw JSON-RPC works too — the server is stateless, so a bare tools/call per request is fine:
1 · Screen a transaction
curl -s -X POST https://<sigil-host>/mcp \
-H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {
"name": "sigil_screen_transaction",
"arguments": {
"chainId": 196,
"from": "0x1111111111111111111111111111111111111111",
"to": "0x2222222222222222222222222222222222222222",
"value": "0",
"data": "0x095ea7b3…",
"mode": "standard"
}
}
}'OKX marketplace task buyers can also replay the headline service as plain JSON:
{
"chainId": 196,
"from": "0x1111111111111111111111111111111111111111",
"to": "0x2222222222222222222222222222222222222222",
"value": "0",
"data": "0x"
}The unpaid POST receives the standard 0.02 USD₮0 challenge. After a valid payment replay, the response is the sealed verdict directly rather than an MCP wrapper.
Response (result.content[0].text is the verdict JSON):
{
"receiptId": "sgl_01kwqqwevdyt9s1kvngng5",
"schemaVersion": "1",
"rubricVersion": "1.0.0",
"chainId": 196,
"subject": { "kind": "transaction", "digest": "0x…" },
"verdict": 1,
"riskScore": 45,
"action": { "kind": "erc20_approve", "summary": "Approve 0x5555…5555 to spend UNLIMITED …", "unlimited": true },
"simulation": { "success": true, "balanceDiff": [], "approvalsGranted": [ { "token": "0x2222…", "spender": "0x5555…", "amount": "unlimited" } ], "coverageGaps": ["state_fork_simulation"] },
"findings": [ { "id": "APPROVAL_UNLIMITED_UNVERIFIED", "severity": "high", "weight": 45, "hard": false, "title": "Unlimited approval to unverified spender", "detail": "…", "evidence": ["spender:0x5555…", "unlimited:true"] } ],
"reasons": ["Unlimited approval to unverified spender: …"],
"issuedAt": 1750000000, "expiresAt": 1750000900,
"coverage": { "consulted": ["reputation", "simulator", "tokenSafety"], "unavailable": [] },
"seal": { "signature": "0x…", "signer": "0x…", "leaf": "0x…" }
}verdict: 0 PASS · 1 WARN · 2 BLOCK. Your agent's rule is one line: refuse to sign on BLOCK, surface WARN to a human or policy layer, proceed on PASS.
2 · Scan a token
{ "name": "sigil_scan_token", "arguments": { "chainId": 196, "token": "0x8888…8888" } }Returns { token, honeypot: true|false|"unknown", buyTaxBps?, sellTaxBps?, mintable?, ownerCanBlacklist?, ownershipRenounced?, proxyUpgradeable?, topHolderPct?, liquidityUsd?, sources[] }.
3 · Screen an address
{ "name": "sigil_screen_address", "arguments": { "chainId": 196, "address": "0x098B716B8Aaf21512996dC57EB0615e2383E2f96" } }Returns { address, isContract, labels[], ageDays?, sourceVerified?, sources[] } — labels include sanctioned, known_drainer, known_scam, phishing, mixer, fresh_wallet, verified_protocol, exchange, unverified_contract, eoa.
4 · Deep screen
sigil_screen_deep accepts the same transaction fields, forces the three-persona panel, and bundles the sealed verdict with a token-safety report plus reputation profiles for every decoded counterparty.
5 · Verify a verdict — free, no auth
{ "name": "sigil_verify_verdict", "arguments": { "receiptId": "sgl_01kwqqwevdyt9s1kvngng5" } }Returns { found: true, verdict } with the full signed verdict. Verification is free forever because trust must be checkable. Receipts are also served over plain HTTP: GET /verdicts/:receiptId.
Paying for calls