Skip to content

io.github.89rat/x402-checks

by 89rat · remote · no sign-in to list tools · v1.3.0 · published by GitHub user 89rat

Machine-payable deterministic identifier checks + signed XDR-1 receipts for agents.

Final · 2Changes · 17

24 tools: 2 do something that can't be undone, 17 change things and 5 only read.

Scanned Oct 21, 2026

5 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http x402-checks https://api.code402.dev/mcp

Findings

Matches of fixed checks, with the text they matched.

5 warn
  • The input schema at examples[0].token_address contains a 42-character base64 string.

    Matched text

    inputSchema.examples[0].token_address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"

    What this check looks for
  • The input schema at examples[0].address contains a 42-character base64 string.

    Matched text

    inputSchema.examples[0].address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"

    What this check looks for
  • The server marks "calculate_fx_savings" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The input carries an amount (input.amount) and a currency, so it moves money.

    What this check looks for
  • The server marks "batch_validate" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The name "batch_validate" says "validate": a word for reading.

    What this check looks for
  • The server marks "pre_disbursement_guard" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The name "pre_disbursement_guard" says "disbursement": a word that usually means money moves, which cannot be taken back.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

24 tools

Can't be undone 2Claude Code: ask
  • calculate_fx_savingsArithmetic comparison of a USDC settlement against comparator percentages YOU supply (bank_fee_pct, custodial_fee_pct) across 14 global fiat currencies.1 finding

    Why it is in this group

    • The input carries an amount (input.amount) and a currency, so it moves money.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "calculate_fx_savings" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

      Matched text

      annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The input carries an amount (input.amount) and a currency, so it moves money.

      What this check looks for
    Description, as the server wrote it
    Arithmetic comparison of a USDC settlement against comparator percentages YOU supply (bank_fee_pct, custodial_fee_pct) across 14 global fiat currencies. The comparators are assumptions, not measurements of any bank or provider; no protocol fee is deducted on this rail.

    Annotations the server declares

    • title: Calculate cross-border FX savings
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • pre_disbursement_guardEvaluate supplied identifiers, domain-age evidence and mismatch signals.1 finding

    Why it is in this group

    • The name "pre_disbursement_guard" says "disbursement": a word that usually means money moves, which cannot be taken back.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "pre_disbursement_guard" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

      Matched text

      annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The name "pre_disbursement_guard" says "disbursement": a word that usually means money moves, which cannot be taken back.

      What this check looks for
    Description, as the server wrote it
    Evaluate supplied identifiers, domain-age evidence and mismatch signals. Requires a preceding receipt hash. An advisory result is not verified identity, fraud clearance or authorization to release funds.

    Annotations the server declares

    • title: Counterparty Risk Indicators
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
Changes things 17Claude Code: ask
  • balance_checkNative ETH and one ERC-20 balance (default USDC) for an address on Base, raw and formatted.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Native ETH and one ERC-20 balance (default USDC) for an address on Base, raw and formatted. Result carries a signed receipt.

    Annotations the server declares

    • title: Base Account Balance Snapshot
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • batch_validateRun up to 50 supported {tool, value} checks in one request.1 finding

    Why it is in this group

    • The name "batch_validate" says "validate": a word for reading.
    • The description's first verb is "run": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "batch_validate" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The name "batch_validate" says "validate": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Run up to 50 supported {tool, value} checks in one request. Each result states its scope. Compare the current batch quote with individual quotes; savings depend on batch size.

    Annotations the server declares

    • title: Batch Identifier Checks (up to 50 items)
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • block_infoBase block header: number, timestamp, transaction count and base fee for the latest or a given block.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Base block header: number, timestamp, transaction count and base fee for the latest or a given block. Result carries a signed receipt.

    Annotations the server declares

    • title: Base Block Header Info
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • check_priceInstant zero-cost pricing hook for code402 tools.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Instant zero-cost pricing hook for code402 tools. Returns the live price, an opaque quote_id, TTL, and the settlement URL. Free forever — feeds the price index into an agent planner's context without creating any financial obligation. If the planner acts on the quote, it hits the settlement_url with an EIP-3009 signed voucher.

    Annotations the server declares

    • title: Zero-cost price index and gasless x402 quote generator
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • context_distillDeterministic text digest: word count, top-5 most frequent meaningful words (stop words excluded), first sentence, and a keccak-256 content hash.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Deterministic text digest: word count, top-5 most frequent meaningful words (stop words excluded), first sentence, and a keccak-256 content hash. Pure function — no external calls, no ML.

    Annotations the server declares

    • title: Context distill
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • crypto_tickerSpot USD price for a crypto ticker or CoinGecko id from public price feeds, cached 60 s.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Spot USD price for a crypto ticker or CoinGecko id from public price feeds, cached 60 s. Result carries a signed receipt.

    Annotations the server declares

    • title: Crypto ticker
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • erc20_balanceRaw and formatted ERC-20 balanceOf for an address on Base, with decimals read from the token.1 finding

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The input schema at examples[0].token_address contains a 42-character base64 string.

      Matched text

      inputSchema.examples[0].token_address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"

      What this check looks for
    Description, as the server wrote it
    Raw and formatted ERC-20 balanceOf for an address on Base, with decimals read from the token. Result carries a signed receipt.

    Annotations the server declares

    • title: ERC-20 Token Balance Snapshot
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • fx_spot_price_oracleReference fiat and stablecoin conversion rate from a static table, not a live feed.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Reference fiat and stablecoin conversion rate from a static table, not a live feed. Returns rate and inverse; result carries a signed receipt.

    Annotations the server declares

    • title: FX spot price oracle
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • ifsc_checkCheck the 11-character Indian IFSC format, including its fifth-character zero.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Check the 11-character Indian IFSC format, including its fifth-character zero. No bank-branch registry lookup or account verification.

    Annotations the server declares

    • title: IFSC Format Check
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • india_supplier_checkOne call, one receipt: GSTIN + PAN + UPI VPA + IFSC for an Indian counterparty.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    One call, one receipt: GSTIN + PAN + UPI VPA + IFSC for an Indian counterparty. Four deterministic structural checks, each stating its own scope. Built for cross-border procurement where the buyer is an agent that cannot open an INR account.

    Annotations the server declares

    • title: India Supplier Verification Pack
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • receipt_verifyVerifies a signed XDR-1 receipt from ANY x402 service: recomputes the canonical digest and recovers the signer, then compares it to the declared signer.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Verifies a signed XDR-1 receipt from ANY x402 service: recomputes the canonical digest and recovers the signer, then compares it to the declared signer. Free forever — no account, no quota, no storage (stateless). A valid receipt proves the signer signed that tool call at that timestamp; it does NOT prove funds moved or any business claim.

    Annotations the server declares

    • title: Verify any XDR-1 receipt — free, stateless, any issuer
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • sanctions_address_screenExact EVM-address comparison against the identified address snapshot and existing operator block policy.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Exact EVM-address comparison against the identified address snapshot and existing operator block policy. Current legal status is unknown; is_sanctioned is null. valid=false preserves a local block; valid=null never authorizes a transaction. Names are not screened. Missing, stale or incomplete evidence is explicit; no UN/EU coverage or sanctions clearance is provided.

    Annotations the server declares

    • title: Address Snapshot & Operator Policy Comparison
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • swift_bic_checkCheck SWIFT/BIC structure and country code.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Check SWIFT/BIC structure and country code. Does not establish bank existence, active routing or beneficiary identity.

    Annotations the server declares

    • title: SWIFT/BIC Structure Check
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • token_contract_riskDeterministic Base contract facts: ERC-20 metadata, proxy slots, owner(), privileged-function selectors and flags.1 finding

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The input schema at examples[0].address contains a 42-character base64 string.

      Matched text

      inputSchema.examples[0].address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"

      What this check looks for
    Description, as the server wrote it
    Deterministic Base contract facts: ERC-20 metadata, proxy slots, owner(), privileged-function selectors and flags. Not a safety verdict. Result carries a signed receipt.

    Annotations the server declares

    • title: Token contract facts (Base)
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • tx_activityOutbound transaction count (nonce) and contract-or-EOA check for an address on Base.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Outbound transaction count (nonce) and contract-or-EOA check for an address on Base. Result carries a signed receipt.

    Annotations the server declares

    • title: Tx Activity & Contract Detection
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • vat_mod97_checkCheck the supported Belgian VAT format and MOD-97 checksum.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Check the supported Belgian VAT format and MOD-97 checksum. BE only; not VIES, other EU VAT formats, registration status or tax compliance.

    Annotations the server declares

    • title: Belgian VAT MOD-97 Check
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • vendor_onboarding_packCheck supplied IBAN, LEI, Belgian VAT and UK company-number fields in one result.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Check supplied IBAN, LEI, Belgian VAT and UK company-number fields in one result. Structural checks only; no ownership, registry or fraud clearance.

    Annotations the server declares

    • title: Vendor Identifier Check Pack
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
Only reads 5Claude Code: allow
  • clean_markdown_scraperFetch a public web page by URL (or take your HTML) and return Markdown plus headings.No findings

    Why it is in this group

    • The description's first verb is "fetch": a word for reading.
    Description, as the server wrote it
    Fetch a public web page by URL (or take your HTML) and return Markdown plus headings. No JavaScript rendering. Result carries a signed receipt.

    Annotations the server declares

    • title: Clean markdown scraper
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • gstin_checkValidate an Indian GSTIN by structure (2-digit state code + PAN + entity code + 'Z') and its mod-36 cross-sum checksum.No findings

    Why it is in this group

    • The description's first verb is "validate": a word for reading.
    Description, as the server wrote it
    Validate an Indian GSTIN by structure (2-digit state code + PAN + entity code + 'Z') and its mod-36 cross-sum checksum.

    Annotations the server declares

    • title: GSTIN check (India)
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • iban_checkValidate IBAN structure and MOD-97 checksum.No findings

    Why it is in this group

    • The description's first verb is "validate": a word for reading.
    Description, as the server wrote it
    Validate IBAN structure and MOD-97 checksum. Does not establish account ownership, beneficiary identity or absence of fraud.

    Annotations the server declares

    • title: IBAN Structure and Checksum Check
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • instant_json_schema_verifierValidate JSON data payloads against schema definitions.No findings

    Why it is in this group

    • The description's first verb is "validate": a word for reading.
    Description, as the server wrote it
    Validate JSON data payloads against schema definitions. Preflighted for agent tool call pipelines.

    Annotations the server declares

    • title: Instant JSON schema verifier
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]
  • lei_checkValidate a 20-character LEI and MOD-97 check digits.No findings

    Why it is in this group

    • The description's first verb is "validate": a word for reading.
    Description, as the server wrote it
    Validate a 20-character LEI and MOD-97 check digits. No registry lookup, active-registration check or legal-entity identity verification.

    Annotations the server declares

    • title: LEI Structure and Checksum Check
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
    • x402: [object Object]

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.3.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http x402-checks https://api.code402.dev/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__x402-checks__clean_markdown_scraper",
      "mcp__x402-checks__instant_json_schema_verifier",
      "mcp__x402-checks__iban_check",
      "mcp__x402-checks__lei_check",
      "mcp__x402-checks__gstin_check"
    ],
    "ask": [
      "mcp__x402-checks__crypto_ticker",
      "mcp__x402-checks__erc20_balance",
      "mcp__x402-checks__fx_spot_price_oracle",
      "mcp__x402-checks__block_info",
      "mcp__x402-checks__tx_activity",
      "mcp__x402-checks__token_contract_risk",
      "mcp__x402-checks__context_distill",
      "mcp__x402-checks__balance_check",
      "mcp__x402-checks__calculate_fx_savings",
      "mcp__x402-checks__vat_mod97_check",
      "mcp__x402-checks__swift_bic_check",
      "mcp__x402-checks__batch_validate",
      "mcp__x402-checks__vendor_onboarding_pack",
      "mcp__x402-checks__india_supplier_check",
      "mcp__x402-checks__pre_disbursement_guard",
      "mcp__x402-checks__ifsc_check",
      "mcp__x402-checks__sanctions_address_screen",
      "mcp__x402-checks__check_price",
      "mcp__x402-checks__receipt_verify"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as x402-checks. Review it before you use it.