Magneta Contract Risk

io.github.BosacksPublished by GitHub account Bosacksv0.1.1Updated Oct 24, 2026

Smart-contract risk reports for AI agents on 20 EVM chains, paid per call via x402 ($0.02 USDC).

VerifiedStreamable HTTPWeb executableFinanceSecurity & Monitoring

Overview

AI-generated overview

Remote MCP server that returns deterministic smart-contract risk reports for EVM chains, with a free bytecode preview and paid full reports via x402 USDC…

What you can do
  • Analyze a deployed contract and get a scored risk report (0-100 level, proxy/upgradeability, owner and pause state, risky selectors, SELFDESTRUCT/DELEGATECALL, verification, aderyn findings)
  • Preview a contract for free from bytecode only: proxy, ERC-20 probe, risky selectors, opcodes and a partial score
  • List supported EVM chains with chain IDs and testnet flags
  • Explain the scoring rubric: points per flag and level thresholds
When to use it
Useful when an assistant needs to triage an unfamiliar token or contract address before interacting with it, or to explain why a contract looks risky. The free preview covers quick checks; the paid report adds source verification and static-analysis findings.
Requirements
Remote streamable HTTP endpoint; no account or API key for the free tools. The full report is paid per call in USDC on Base through x402, so a funded wallet and an x402-capable client are needed. Network access to the endpoint.
Before you install
The paid report costs money per call and is charged even when a cached result is returned; only successful responses settle. Scores are heuristic triage signals, not audits, and selector presence does not prove reachability. Buyer wallet keys must stay client-side, never on the server.

Installation

In SourceWeft

  1. Open Magneta Contract Risk in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.Bosacks%2Fmagneta-contract-risk/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "magneta-contract-risk": {
      "type": "http",
      "url": "https://x402.magneta.finance/mcp"
    }
  }
}

README

Magneta Contract Risk (x402)

A small production-oriented service that sells an on-chain smart-contract risk report to AI agents, paid per call with x402 micropayments (USDC, EIP-3009 exact scheme). One express process, two paid surfaces:

SurfaceRoutePrice
HTTPGET /v1/risk/:chainId/:address$0.01
MCP (Streamable HTTP, stateless)POST /mcp, tool contract_risk_summary(chainId, address)$0.01
MCPtool supported_chainsfree
HealthGET /healthfree
OpenAPIGET /openapi.jsonfree

Both paid surfaces call the same analyzeContract(chainId, address) in src/risk/analyze.ts. The analysis is deterministic and uses public data only (RPC, Blockscout, Sourcify, a local aderyn binary). No LLM, no API key for analysis. Unknown chain or malformed address returns 400 before any payment is requested. If the analysis itself fails (not a contract, upstream error, timeout) the response is an error status and the buyer is not charged (x402 only settles successful responses).

Supported chains (v1, src/chains.ts): Base 8453, Base Sepolia 84532, Ethereum 1, Arbitrum One 42161. Override RPCs with RPC_URL_<chainId>.

Report

{ chainId, address, analyzedAt, isContract, bytecodeSize, proxy, erc20, opcodes, selectors: { found },  blockscout, sourcify?, aderyn, score, level, flags, notes }
  • proxy: { type, implementation, admin? } from EIP-1967 (implementation/admin/beacon), legacy zeppelinos slot, EIP-1822, EIP-1167 clones, or Blockscout's detection. The implementation bytecode is analysed too.
  • erc20: name, symbol, decimals, totalSupply, owner() (and whether it is the zero address), paused(). Each probe is individually try/catch.
  • opcodes: SELFDESTRUCT / DELEGATECALL presence from a real opcode walk that skips PUSH data (no substring matching).
  • selectors.found: risky signatures (mint, pause, blacklist, fee/tax setters, upgrade, ownership...) whose 4-byte selector appears as a PUSH4 in the bytecode. Heuristic: presence is not proof of reachability (also stated in notes).
  • blockscout / sourcify: verification status, compiler, contract name, creator and creation tx. Blockscout has a 5 s timeout; on failure blockscout: { available: false }. Sourcify is only queried as a fallback when Blockscout is unreachable or reports "unverified". For proxies, the implementation's verification is what counts.
  • aderyn: when verified Solidity source is available, sources are written to a temp dir (sanitised paths) and aderyn runs with a 15 s timeout: { ran, counts: { high, low }, top: [{ title, severity, instances }] }, else { ran: false, reason }. It never fails the request.
  • Total budget: hard deadline 24 s per analysis. Results are cached in memory for 10 minutes per chainId+address (the payment still happens on every call).

Score rubric (src/risk/score.ts)

Score 0..100, higher = riskier, additive, capped at 100.

PointsCondition
+25logic contract source not verified (Blockscout, then Sourcify)
+0 (flagged)verification unknown because every provider was unreachable
+15proxy / upgradeable
+10owner() exists and is not the zero address
+15mint selector
+15blacklist / bot-list selector
+10fee / tax / limit / trading-switch setters
+5 (+5 if currently paused)pause selector
+10SELFDESTRUCT opcode
+5 each, max +20aderyn high-severity findings

Level: 0-24 low, 25-49 medium, 50-74 high, 75-100 critical. A non-contract address is an error, not a score. The score is a triage signal, not an audit.

Supported chains

Mainnets: Ethereum (1), OP Mainnet (10), BNB Smart Chain (56), Gnosis (100), Unichain (130), Polygon (137), Sonic (146), World Chain (480), Mantle (5000), Base (8453), Arbitrum One (42161), Celo (42220), Avalanche C-Chain (43114), Linea (59144), Blast (81457), Scroll (534352). Testnets: Base Sepolia (84532), Sepolia (11155111), OP Sepolia (11155420), Arbitrum Sepolia (421614). Chains without a Blockscout instance (BNB, Sonic, Mantle, Avalanche) rely on Sourcify for verified sources. zkSync Era is excluded on purpose: EraVM bytecode defeats the opcode and selector heuristics. Compiler remappings from Blockscout or Sourcify are written to remappings.txt so aderyn can resolve @openzeppelin/...-style imports.

Errors

Machine-readable description: GET /openapi.json (OpenAPI 3.1, free). Error bodies are JSON with an error code.

StatuserrorWhenRouteCharged?
400unsupported_chainchainId is not in the supported list (body carries supportedChains)bothno (answered before the 402 challenge)
400invalid_addressaddress is not 0x + 40 hex charactersbothno (answered before the 402 challenge)
402n/aPayment required: base64 x402 challenge in the PAYMENT-REQUIRED header (USDC, exact scheme)paidno, it is the price quote
422not_a_contractthe address has no contract code on that chain (EOA)bothno
429rate_limitedmore than 30 requests per minute from one IP (retryAfterSeconds, Retry-After header)free /v1/flags onlyn/a (free)
502analysis_failedan upstream data source (RPC, explorer) failedbothno
504timeoutthe analysis exceeded its 24 s budgetbothno

Only a 200 response is settled. Over MCP, the same failures return an isError result with an error message and are not charged.

Payment networks

Buyers pay in USDC on Base (eip155:8453). When SOLANA_PAY_TO is set, the same routes and tools also accept USDC on Solana mainnet (solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp), settled by the same Coinbase CDP facilitator, which pays the Solana fees. The Solana receiving address must already own a USDC token account (the SDK does not create it). pnpm buy-once-svm pays one call from a Solana keypair (SVM_PRIVATE_KEY, base58 64-byte secret key).

Free tier, agent skill and client package

  • Free preview: GET /v1/flags/:chainId/:address and the MCP tool contract_quick_flags return the bytecode-only part of the report (proxy, owner/pause state, risky selectors, opcodes, partial score) with no payment. Rate-limited to 30 requests per minute per IP. Source verification and aderyn findings are only in the paid report.
  • Agent skill: npx skills add Bosacks/magneta-risk-x402 --skill magneta-contract-risk installs skills/magneta-contract-risk/SKILL.md, which teaches an agent when and how to buy a report over HTTP, MCP or a Coinbase Agentic Wallet. [skills.sh]
  • Client package: @magnetafinance/contract-risk (npm i @magnetafinance/contract-risk @x402/[email protected] @x402/[email protected] @x402/[email protected] [email protected], source in packages/contract-risk-client) wraps the x402 payment flow in a typed client and ships tool adapters for LangChain.js, the Vercel AI SDK and OpenAI/Anthropic function calling.
  • ElizaOS plugin: packages/plugin-elizaos (@magnetafinance/plugin-contract-risk) adds the actions CONTRACT_QUICK_FLAGS (free) and CONTRACT_RISK_REPORT (paid, capped per payment) to an Eliza agent.
  • ERC-8004 identity: the registration file erc8004/agent-registration.json is served at /.well-known/agent-registration.json; scripts/erc8004-register.ts prints the register(string) call for the Base IdentityRegistry 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432.

Run

bash
pnpm install --ignore-scriptscp .env.example .env.local      # fill PAY_TO, X402_NETWORK, FACILITATOR_URL (+ CDP keys if cdp)pnpm dev                        # tsx, or: pnpm build && pnpm startpnpm type-check && pnpm test    # unit tests, no networkpnpm analyze 84532 0x036CbD53842c5426634e7929541eC2318f3dCF7e   # free local run, prints the report

Buying (needs a funded buyer key, spend cap $0.01 = the price; never put this key on the server):

bash
BUYER_PRIVATE_KEY=0x... pnpm buy-once        # HTTP; prints the report and the PAYMENT-RESPONSE tx hashBUYER_PRIVATE_KEY=0x... pnpm buy-once-mcp    # same through the MCP tool

Environment

  • PUBLIC_URL (https, no trailing slash): advertised as the MCP resource URL for Bazaar discovery. Behind a reverse proxy the server trusts the loopback proxy (trust proxy = loopback) so HTTP resource URLs are advertised as https://; without that, the facilitator rejects discovery with "resource must start with https://".
VarMeaning
PORTlistening port (default 3011)
PAY_TOreceiving address (required)
X402_NETWORKCAIP-2 network, default eip155:84532 (Base Sepolia); production: eip155:8453
FACILITATOR_URLcdp (Coinbase CDP facilitator, needs CDP_API_KEY_ID + CDP_API_KEY_SECRET) or an HTTP facilitator URL such as https://x402.org/facilitator (testnet)
ADERYN_BINaderyn 0.6.8 binary, default /home/dominique/bin/aderyn
RPC_URL_<chainId>optional RPC override per chain
BUYER_PRIVATE_KEY, TARGET_URL, MCP_URL, CHAIN_ID, ADDRESSbuyer scripts only

Deploy (systemd + Caddy)

bash
pnpm install --ignore-scripts && pnpm buildrsync -a --exclude node_modules --exclude .env.local --exclude 'scripts/logs' ./ server:/srv/magneta/risk-x402/    # never overwrite the server's .env.local; then pnpm install --prod --ignore-scripts theresudo cp deploy/magneta-risk-x402.service /etc/systemd/system/ && sudo systemctl enable --now magneta-risk-x402# add deploy/Caddyfile.snippet to the Caddyfile (vhost x402.magneta.finance -> 127.0.0.1:3011), reload Caddy

The unit reads /srv/magneta/risk-x402/.env.local. For mainnet set X402_NETWORK=eip155:8453 and FACILITATOR_URL=cdp. Aderyn needs its solc download/cache available to the service user (HOME writable).

Bazaar discovery

Both paid surfaces declare x402 Bazaar discovery metadata with declareDiscoveryExtension from @x402/extensions/bazaar (HTTP route with path-parameter schema and output example; MCP tool with input schema), and the bazaarResourceServerExtension is registered on the resource server. The metadata appears in the PAYMENT-REQUIRED header (extensions.bazaar). Actual cataloguing depends on the facilitator: it indexes resources when it settles a payment, so the listing appears only after the first real paid call through a Bazaar-enabled facilitator (CDP). The public x402.org testnet facilitator is not expected to list it.

Production status (2026-10-16)

Live at https://x402.magneta.finance on Base mainnet (eip155:8453), Coinbase CDP facilitator, $0.01 per call, listed in the x402 Bazaar (route /v1/risk/:chainId/:address). Buyers need USDC on Base and no ETH. The facilitator rejects payments where the payer equals payTo (self_send_not_allowed).

License

MIT, Copyright (c) 2026 Magneta Finance. See LICENSE.

Source: README.md at commit 2b717b3

Tools

4

contract_risk_summary

Contract risk summary

Analyze a deployed smart contract and return a deterministic risk report: 0-100 score with level (low/medium/high/critical), proxy/upgradeability, owner and pause state, risky selectors found in the bytecode (mint, blacklist, fee/tax setters, pause, upgrade), SELFDESTRUCT/DELEGATECALL opcodes, source verification (Blockscout, Sourcify) and aderyn static-analysis findings. Use it before trading, bridging, approving or integrating a token or protocol contract; Use contract_quick_flags first for a free bytecode-only preview when you are not sure the full report is worth paying for. Use supported_chains first if you are unsure the chain id is covered, and scoring_rubric to interpret the score. Paid: $0.02 in USDC on Base per call via x402. The first call answers with an x402 payment challenge; an x402-enabled client pays automatically and the same call then returns the report. Read-only, no side effects; failed analyses (not a contract, upstream data source down) are not charged; identical requests within 10 minutes return the cached report.

ParametersaddressrequiredchainIdrequired

contract_quick_flags

Contract quick flags (free)

Free, no payment: bytecode-only preview of a deployed smart contract. Covers proxy/upgradeability, ERC-20 probe (name, symbol, owner, paused), risky selectors found in the bytecode (mint, blacklist, fee/tax setters, pause, upgrade), SELFDESTRUCT/DELEGATECALL opcodes, and a partialScore/partialLevel computed from those on-chain signals only. Does NOT cover source verification (Blockscout, Sourcify) nor aderyn static analysis, so partialScore can be lower than the real risk. contract_risk_summary ($0.02 in USDC via x402) is the full report. Read-only, no side effects; an EOA is rejected; identical requests within 10 minutes return the cached result; the HTTP twin GET /v1/flags/:chainId/:address is rate limited to 30 requests per minute per IP.

ParametersaddressrequiredchainIdrequired

supported_chains

Supported chains

List the EVM chains contract_risk_summary can analyze, as { chainId, name, testnet } objects. Free, read-only, no payment and no parameters. Call it when you need to map a chain name to its id or to check coverage before paying for a report.

Takes no parameters.

scoring_rubric

Scoring rubric

Return the exact rubric behind contract_risk_summary scores: points per flag, the level thresholds and what each flag means. Free, read-only, no parameters. Call it to explain a score to a user or to decide your own threshold before acting on a report.

Takes no parameters.

Version history

2
  1. v0.1.1LatestOct 18, 2026
  2. v0.1.0Oct 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts