condensate

A block explorer your agent can call.

One self-hosted MCP server, 22 tools, every EVM chain Alchemy serves — plus live discovery of ones it doesn't. Reads, traces, logs, verified source, address labels, and cross-chain status. Your keys, your machine, no explorer tab.

Get started
trace_transaction · chainId 8453
CALL  UniversalRouter::execute(commands=0x0b08, deadline=...)  
├─ CALL  [lookup_address → "Permit2"]  permitTransferFrom(...)   
├─ STATICCALL  Pool::slot0()   sqrtPriceX96 = 79231...
└─ CALL  Pool::swap(recipient, zeroForOne=true, ...)              
   └─ emit Swap(sender, recipient, -420690000, 1337000000, ...)
        
22tools
~128networks via one Alchemy key
0keys required to start
1file to self-host

Quickstart

Wire it into any MCP client.

Add the server to your MCP config and you're live. Works with Claude Code, Cursor, Windsurf, or any client that speaks stdio. First smoke test: ask for get_chains_list.

mcp config
{
  "mcpServers": {
    "onchain": {
      "command": "bun",
      "args": ["./index.ts"],
      "cwd": "/path/to/onchain-mcp",
      "env": {
        "ALCHEMY_API_KEY": "your-key"
      }
    }
  }
}

Or clone and install: git clone https://github.com/dextracker/onchain-mcp && cd onchain-mcp && bun install

The tool surface

deep inspection 4 tools

  • trace_transaction — full call tree, cast-run style
  • get_contract_abi — Etherscan v2, Sourcify fallback
  • get_contract_source — verified Solidity
  • decode_calldata — selectors + event topics

read 5 tools

  • get_block_number / get_block_info
  • get_address_info — balance, nonce, code
  • get_transaction_info — tx + receipt
  • read_contract — human-readable ABI calls
  • direct_rpc_call — raw JSON-RPC escape hatch

chains 4 tools

  • get_chains_list — registry + provider per chain
  • discover_chain — add unlisted chains live
  • add_chain — register by slug or RPC URL
  • check_alchemy_networks — probe your key's reach

history 5 tools

  • get_transactions_by_address
  • get_token_transfers_by_address
  • get_tokens_by_address — ERC20 balances
  • get_transaction_receipts_by_block
  • get_logs — ranged event queries

identity 2 tools

  • lookup_address — infra/token labels + yours
  • get_address_by_ens_name

cross-chain 1 tool

  • trace_crosschain — Across, LayerZero, Relay, 0x status fan-out from one tx hash

Bring your own keys

envunlocks
ALCHEMY_API_KEYPrimary RPC on ~128 networks + enhanced APIs (transfer history, token balances, traces)
QUICKNODE_SLUG / _KEYFallback RPC for networks your Alchemy app has disabled
ETHERSCAN_API_KEYVerified ABIs and contract source (Sourcify is the keyless fallback)
ONCHAIN_LABELS_DIRYour address-constant TS files, scraped into lookup_address

No keys is a valid configuration: public RPCs, calldata decoding, ENS, labels, logs, and cross-chain status all still work. Full per-tool matrix in docs/byok.md.

Pay per call

planned

For agents without provider accounts: an x402 metering gateway — HTTP 402 quote, signed USDC payment, verified before your call touches pooled keys. BYOK stays free and local; the gateway is a wrapper, never a fork. Design: docs/x402-gateway.md.