presign-guard
Pre-sign, token and approval checks for agents: green/orange/red for signatures, tokens, wallets.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"presign-guard": {
"url": "https://presign-guard.onrender.com/mcp"
}
}
}Remote endpoints
https://presign-guard.onrender.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (6)
🟢presign_quick_check(type, chainId, token, spender, amount, ...)
Free: the green/orange/red verdict only, for a transaction, token approval or EIP-712 signature your agent is about to sign. Limited to 10 calls per hour. For the reason codes and details use presign_check ($0.01); for a plain-language explanation presign_check_explain ($0.03).
Input Schema
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"approval",
"transaction",
"signature"
],
"description": "What the agent is about to sign"
},
"chainId": {
"type": "integer",
"description": "EVM chain id: 1, 10, 56, 137, 8453, 42161 (8453 = Base)"
},
"token": {
"type": "string",
"description": "approval: the token contract"
},
"spender": {
"type": "string",
"description": "approval: who gets the allowance"
},
"amount": {
"type": "string",
"description": "approval: amount in base units (0 = revoke)"
},
"to": {
"type": "string",
"description": "transaction: the target contract"
},
"data": {
"type": "string",
"description": "transaction: 0x-prefixed calldata"
},
"value": {
"type": "string",
"description": "transaction: native value in wei"
},
"typedData": {
"anyOf": [
{
"type": "object",
"additionalProperties": {}
},
{
"type": "string"
}
],
"description": "signature: the exact eth_signTypedData_v4 payload (Permit, Permit2, EIP-3009 x402 payment, Seaport)"
},
"origin": {
"type": "string",
"description": "optional: the site asking for the signature or transaction (URL or hostname); a domain under 30 days old is orange"
}
},
"required": [
"type",
"chainId"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢token_quick_verdict(chain, address)
Free: the green/orange/red verdict and grade only, for a Solana or EVM token your agent is about to buy, hold or accept. Limited to 10 free calls per hour (shared with presign_quick_check). For the reasons, one-line summary and market data use token_verdict ($0.01).
Input Schema
{
"type": "object",
"properties": {
"chain": {
"type": "string",
"enum": [
"solana",
"base",
"ethereum",
"arbitrum",
"optimism",
"polygon",
"bsc"
],
"description": "Chain the token lives on"
},
"address": {
"type": "string",
"description": "Solana mint address (base58) or EVM token contract (0x...)"
}
},
"required": [
"chain",
"address"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢presign_check(type, chainId, token, spender, amount, ...)
Paid ($0.01 USDC via x402 on Base): call this before you sign. Send the transaction, token approval or EIP-712 signature (Permit, Permit2, EIP-3009 x402 payment, Seaport) your agent is about to sign; get back green, orange or red with reason codes: who gets access, whether the spender or recipient is flagged, sanctioned (OFAC SDN) or unverified, unlimited allowances, and the token itself (honeypot, fake look-alike, high tax). Only proceed on green; on orange ask your user; never sign on red. Same as POST /v1/check.
Input Schema
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"approval",
"transaction",
"signature"
],
"description": "What the agent is about to sign"
},
"chainId": {
"type": "integer",
"description": "EVM chain id: 1, 10, 56, 137, 8453, 42161 (8453 = Base)"
},
"token": {
"type": "string",
"description": "approval: the token contract"
},
"spender": {
"type": "string",
"description": "approval: who gets the allowance"
},
"amount": {
"type": "string",
"description": "approval: amount in base units (0 = revoke)"
},
"to": {
"type": "string",
"description": "transaction: the target contract"
},
"data": {
"type": "string",
"description": "transaction: 0x-prefixed calldata"
},
"value": {
"type": "string",
"description": "transaction: native value in wei"
},
"typedData": {
"anyOf": [
{
"type": "object",
"additionalProperties": {}
},
{
"type": "string"
}
],
"description": "signature: the exact eth_signTypedData_v4 payload (Permit, Permit2, EIP-3009 x402 payment, Seaport)"
},
"origin": {
"type": "string",
"description": "optional: the site asking for the signature or transaction (URL or hostname); a domain under 30 days old is orange"
}
},
"required": [
"type",
"chainId"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢presign_check_explain(type, chainId, token, spender, amount, ...)
Paid ($0.03 USDC via x402 on Base): the same verdict and reason codes as presign_check, plus a 3 to 5 sentence plain-language explanation a person can read before approving (lang en or nl). Same as POST /v1/check/explain.
Input Schema
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"approval",
"transaction",
"signature"
],
"description": "What the agent is about to sign"
},
"chainId": {
"type": "integer",
"description": "EVM chain id: 1, 10, 56, 137, 8453, 42161 (8453 = Base)"
},
"token": {
"type": "string",
"description": "approval: the token contract"
},
"spender": {
"type": "string",
"description": "approval: who gets the allowance"
},
"amount": {
"type": "string",
"description": "approval: amount in base units (0 = revoke)"
},
"to": {
"type": "string",
"description": "transaction: the target contract"
},
"data": {
"type": "string",
"description": "transaction: 0x-prefixed calldata"
},
"value": {
"type": "string",
"description": "transaction: native value in wei"
},
"typedData": {
"anyOf": [
{
"type": "object",
"additionalProperties": {}
},
{
"type": "string"
}
],
"description": "signature: the exact eth_signTypedData_v4 payload (Permit, Permit2, EIP-3009 x402 payment, Seaport)"
},
"origin": {
"type": "string",
"description": "optional: the site asking for the signature or transaction (URL or hostname); a domain under 30 days old is orange"
},
"lang": {
"type": "string",
"enum": [
"en",
"nl"
],
"description": "Language of the explanation (default en)"
}
},
"required": [
"type",
"chainId"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢token_verdict(chain, address)
Paid ($0.01 USDC via x402 on Base or Solana): call this before your agent buys, holds or accepts a token. Send the chain (solana, base, ethereum, arbitrum, optimism, polygon, bsc) and the token address or mint; get back green/orange/red, a grade (SAFE, CAUTION, RISKY, AVOID), reason codes (mint or freeze authority still active, honeypot, tax or transfer fee, LP not locked, low liquidity, new token, concentrated holders, rugged), a one-line summary, and market data (price, liquidity, market cap, 24h volume, age). Same as GET /v1/token.
Input Schema
{
"type": "object",
"properties": {
"chain": {
"type": "string",
"enum": [
"solana",
"base",
"ethereum",
"arbitrum",
"optimism",
"polygon",
"bsc"
],
"description": "Chain the token lives on"
},
"address": {
"type": "string",
"description": "Solana mint address (base58) or EVM token contract (0x...)"
}
},
"required": [
"chain",
"address"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢wallet_approvals(chain, address)
Paid ($0.02 USDC via x402 on Base or Solana): audit the open token approvals of an EVM wallet (base, ethereum, arbitrum, optimism, polygon, bsc), for example your agent's own wallet as a periodic check. Get back green/orange/red, a grade, a one-line summary and every ERC-20 allowance with its spender: flagged malicious (red), a plain wallet, on a doubt list, an unverified contract or an unlimited allowance to a spender not on the GoPlus trust list (orange), plus which ones to revoke and a revoke.cash link. NFT approvals are not covered. Same as GET /v1/approvals.
Input Schema
{
"type": "object",
"properties": {
"chain": {
"type": "string",
"enum": [
"base",
"ethereum",
"arbitrum",
"optimism",
"polygon",
"bsc"
],
"description": "EVM chain to audit"
},
"address": {
"type": "string",
"description": "Wallet address (0x...)"
}
},
"required": [
"chain",
"address"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Community
Evidence