Any contract
Read state by address. No ABI files, ever.
Human-readable queries, auto-resolved ABIs, proxy-aware — on every EVM chain.
const abi = parseAbi([
"function allowance(address, address) view returns (uint256)",
]);
const contract = getContract({ address: USDC, abi, client });
const allowance = await contract.read.allowance([vitalik, router]); await q("usdc.allowance(vitalik, router)") Free to start — no credit card
You know this loop. You just want one value. You get a week of plumbing.
Every contract needs its ABI. Every proxy needs its implementation. Every chain has its quirks. You end up checking in JSON files and writing loaders.
Batching, retries, rate limits, fallback providers. None of it is your product. All of it is on your plate.
Feeding Claude or Cursor the raw RPC response burns context and confuses the model. You end up hand-rolling decoders just to make an agent useful.
TypeScript SDK here, Python script there, a Postman collection for ops. Same data, five implementations, all drifting.
Point your client at one URL. We handle ABIs, proxies, batching, typing, and multi-chain routing. You write expressions.
Verified contracts just work. Proxies resolve to their implementation. No local files, no manual wiring.
BigInt, address, struct — decoded and ready. No ABI-decoder boilerplate, no loose any-types.
One expression touches N contracts across N chains and returns in a single round-trip.
Drop the MCP URL into Claude or Cursor. Call the REST API from your code. Wire onchain reads into an n8n workflow. Same query language everywhere.
No plugins, no SDKs. Your MCP client authenticates automatically; your REST service uses an API key.
claude mcp add evmquery \
--transport http \
https://api.evmquery.com/mcp
Read any EVM contract without wiring providers, ABIs, or decoders by hand.
Read state by address. No ABI files, ever.
EIP-1967, transparent, beacon — resolved automatically.
BigInt, address, struct — decoded and ready.
{
"result": "2847.193021",
"type": "uint256",
"chain": "evm_ethereum"
} Aave, Uniswap, Curve in a single query — independent reads auto-batched into one Multicall3 round.
q({
health: formatUnits(
aave.getUserAccountData(me).healthFactor, 18),
position: uniswap.positions(solInt(42)),
}) MCP for Claude, Cursor, VS Code, Windsurf. REST for everything else.
claude mcp add evmquery \ --transport http \ https://api.evmquery.com/mcp
Ethereum, Base, and BNB Smart Chain today. More EVM chains are being added actively — follow the changelog or ping us if you need a specific one prioritised.
No. evmquery auto-resolves ABIs for verified contracts on every supported chain. For unverified contracts, pass an ABI inline in the schema field of your query.
For MCP connections, evmquery uses OIDC — your client (Claude Code, Cursor, VS Code, Windsurf) handles sign-in automatically. For REST, you authenticate with an API key over HTTPS. Generate and rotate keys from the dashboard.
Any client that speaks the Model Context Protocol. Tested with Claude Code, Cursor, VS Code, Windsurf, and Zed. Setup is a single URL — no plugins or SDKs.
Yes. The evmquery n8n community node lets you read onchain state as a workflow step. Wire it into any n8n flow — triggers, Slack alerts, Airtable syncs, you name it.
Rate limits are applied per API key. Auto-batching means one expression touching multiple contracts counts as one request. Median response time is under 50ms for single-contract calls, under 200ms for cross-protocol reads.
Free tier included. No credit card. Your first expression runs in under a minute.