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.
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, ...)
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.
{
"mcpServers": {
"onchain": {
"command": "bun",
"args": ["./index.ts"],
"cwd": "/path/to/onchain-mcp",
"env": {
"ALCHEMY_API_KEY": "your-key"
}
}
}
}
// .cursor/mcp.json { "mcpServers": { "onchain": { "command": "bun", "args": ["./index.ts"], "cwd": "/path/to/onchain-mcp", "env": { "ALCHEMY_API_KEY": "your-key" } } } }
// ~/.codeium/windsurf/mcp_config.json { "mcpServers": { "onchain": { "command": "bun", "args": ["./index.ts"], "cwd": "/path/to/onchain-mcp", "env": { "ALCHEMY_API_KEY": "your-key" } } } }
claude mcp add --transport http onchain https://onchain.condensate.dev/mcp
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
| env | unlocks |
|---|---|
| ALCHEMY_API_KEY | Primary RPC on ~128 networks + enhanced APIs (transfer history, token balances, traces) |
| QUICKNODE_SLUG / _KEY | Fallback RPC for networks your Alchemy app has disabled |
| ETHERSCAN_API_KEY | Verified ABIs and contract source (Sourcify is the keyless fallback) |
| ONCHAIN_LABELS_DIR | Your 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
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 self-hosted either way. Design doc: docs/x402-gateway.md.