chain-data
# chain-data ๐
**Live multi-chain on-chain data, aggregated in ONE call โ built for AI agents.**
Give it a wallet and get its whole **portfolio** across Ethereum, Base, Polygon, Arbitrum and Optimism โ native balances + top ERC-20 holdings, each priced in USD โ in a single response. Plus token/contract facts, live gas and prices. All read straight from **public RPCs** and **DefiLlama**; no API key, no node.
Available as an **MCP server** (free) and a **pay-per-call x402 API** (`$0.10` USDC on Base, no sign-up).
---
## Why
An agent that wants a wallet's multi-chain net worth would otherwise have to:
fan out N JSON-RPC calls to N chains โ ABI-encode `balanceOf`/`decimals`/`symbol` โ batch them โ join against a price feed โ repeat per chain. `chain-data` does all of that server-side and returns one fresh JSON object per call. That convenience on **live** data is the point โ agents pay for the aggregation, not for a static answer they could cache.
## Tools (MCP)
| Tool | What it does |
|---|---|
| `wallet_portfolio` | Native + ERC-20 balances with live USD value, across 5 chains, in one call |
| `token_info` | symbol, name, decimals, total supply, is-contract, EIP-1967 proxy + implementation, price |
| `gas_prices` | base fee / gas price / priority fee / latest block, per chain or all at once |
| `token_price` | live USD price by `chain`+`address`, CoinGecko id, or symbol |
## Use as an MCP server (free)
```json
{
"mcpServers": {
"chain-data": { "command": "npx", "args": ["-y", "chain-data-mcp"] }
}
}
```
Or over HTTP: `POST https://chain-data.vercel.app/mcp`.
## Free HTTP API
```
GET /portfolio?wallet=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
GET /token?chain=base&address=0x833589fcd6edb6e08f4c7c32d4f71b54bda02913
GET /gas
GET /price?chain=ethereum&address=0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
```
Rate-limited to 30 requests/hour/IP.
## Pay-per-call (x402)
The `/pro/*` routes are gated by [x402](https://x402.org). Your agent pays **$0.10 USDC** per call automatically โ no sign-up, no API key. Settles on-chain (Base) to the operator wallet. No rate limit.
```
GET /pro/portfolio?wallet=0x...
GET /pro/token?chain=base&address=0x...
GET /pro/gas
GET /pro/price?chain=ethereum&address=0x...
```
## Supported chains
Ethereum ยท Base ยท Polygon ยท Arbitrum One ยท OP Mainnet โ all via public, key-free RPCs with automatic failover.
## Data sources
- **Balances / token info / gas**: public JSON-RPC endpoints (`mainnet.base.org`, `eth.llamarpc.com`, `polygon-rpc.com`, โฆ).
- **Prices**: [DefiLlama](https://defillama.com) coins API (free) / CoinGecko ids.
No credentials are stored or required. The server holds **no private key** โ `payTo` is a public receiving address only.
## Local dev
```bash
npm install
npm run build
npm run test:engine # live smoke test against real RPCs
npm run dev:http # local HTTP server on :8080 (payments off unless X402_* set)
npm run dev:mcp # local stdio MCP server
```
## License
MIT
TDQS
Scored across 4 tools
Each tool targets a distinct facet of chain data: gas prices, token metadata, token pricing, and wallet portfolio. Overlap between token_info and token_price is minimal since token_info provides comprehensive on-chain facts while token_price is a focused price lookup.
All tool names follow a consistent snake_case pattern using noun phrases (gas_prices, token_info, token_price, wallet_portfolio). No mixing of styles or inconsistent verbs.
With 4 tools, the server is well-scoped for its purpose of providing on-chain data. Each tool serves a clear need without unnecessary bloat or redundancy.
The tools cover gas, token details, price, and portfolio. Missing features like block info or transaction history are acceptable given the focused scope, but a chain-data server could optionally include additional data points.