# evmcp [Health: Active]

**Category:** ⚖️ Legal  
**Repository:** https://github.com/SiriusLattice/evmcp  
**GitHub Stars:** 0  
**npm Downloads (last month):** 188  
**Views:** 0  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/evmcp

## Description
Multi-chain EVM blockchain data with companion smart contracts

## Tools
Capabilities this server exposes over MCP:

- **getBalance** — Get the native token balance (ETH/AVAX/CELO) of an address on a specific chain
- **getTokenBalance** — Get the ERC20 token balance of an address on a specific chain
- **getMultiChainBalance** — Get the native token balance of an address across all 5 supported chains in parallel
- **getBlock** — Get a block by its hash on a specific chain
- **getBlockByNumber** — Get a block by its number on a specific chain, or pass "latest" for the most recent block
- **getLatestBlock** — Get the latest block number, timestamp, and base fee for a specific chain
- **getTransaction** — Get a transaction by its hash on a specific chain
- **getTransactionReceipt** — Get the receipt for a transaction including status, gasUsed, and logs
- **decodeTransaction** — Decode a transaction's function call using a provided ABI
- **readContract** — Call a read-only function on a smart contract with a provided ABI
- **getContractCode** — Check if an address has contract code deployed, with bytecode length and hash
- **getStorageAt** — Read the raw value of a storage slot at a specific address
- **getERC20Info** — Get ERC20 token metadata including name, symbol, decimals, and total supply
- **getTokenAllowance** — Get the ERC20 token allowance granted by an owner to a spender
- **getGasPrice** — Get current gas price and EIP-1559 fee data for a specific chain
- **estimateGas** — Estimate gas for a transaction on a specific chain
- **compareGasAcrossChains** — Compare current gas prices across all 5 supported chains
- **resolveENS** — Resolve an ENS name (e.g. vitalik.eth) to an Ethereum address via Ethereum L1
- **lookupAddress** — Reverse lookup an address to its ENS name via Ethereum L1
- **getContractEvents** — Get event logs emitted by a contract on a specific chain
- **decodeEventLog** — Decode a raw event log using a provided ABI
- **getChainInfo** — Get chain name, chain ID, current block number, block time, and native symbol
- **isContractDeployed** — Check if an address has contract code deployed on all 5 supported chains
- **healthCheck** — Test connectivity to all 6 RPC endpoints (Ethereum, Base, Optimism, Avalanche, Celo, Arbitrum)
- **batchQuery** — Execute multiple read calls in a single RPC request using Multicall3
- **compareBalances** — Compare native token balances for an address across all 5 chains
- **crossChainActivity** — Check transaction counts for an address across all 5 chains
- **queryRegistry** — Read registered tool metadata from the on-chain MCPRegistry companion contract
- **gasOptimizer** — Recommends the cheapest chain for a transaction, accounting for L1 data fees on Base/Optimism/Arbitrum

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `npx` (confidence: high):

```json
"mcpServers": {
  "evmcp": {
    "command": "npx",
    "args": ["-y","evmcp"]
  }
}
```

## Documentation & README

# evmcp

> EVM + MCP — give your AI assistant blockchain superpowers.

MCP server providing real-time access to on-chain data across Base, Optimism, Avalanche, Celo, and Arbitrum, with companion smart contracts deployed on-chain for batch queries and cross-chain data.

## How it Works

EVMCP implements the [Model Context Protocol](https://modelcontextprotocol.io/) (MCP), a standard that lets AI assistants call external tools. When connected, your AI assistant gains 28 read-only blockchain tools it can invoke to query balances, decode transactions, compare gas prices, and more across five EVM chains.

What sets EVMCP apart is its **companion smart contracts** — four Solidity contracts deployed on Avalanche and Celo that enable batch queries via Multicall3, an on-chain tool registry, event aggregation, and cross-chain balance caching. The MCP server reads from these contracts; all write operations are performed separately by an admin CLI.

## Quick Start

### With Claude Desktop
Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json`):
```json
{
  "mcpServers": {
    "evmcp": {
      "command": "npx",
      "args": ["-y", "evmcp"],
      "env": { "ALCHEMY_API_KEY": "your_key_here" }
    }
  }
}
```

### With Claude Code
```bash
claude mcp add evmcp -- npx -y evmcp
```

## Supported Chains

| Chain | Chain ID | Native Token | Companion Contracts |
|-------|----------|--------------|---------------------|
| Base | 8453 | ETH | Not yet deployed |
| Optimism | 10 | ETH | Not yet deployed |
| Avalanche C-Chain | 43114 | AVAX | Deployed |
| Celo | 42220 | CELO | Deployed |
| Arbitrum One | 42161 | ETH | Not yet deployed |

Ethereum mainnet (chain ID 1) is also supported for ENS resolution only.

## Tools (29 total)

### Balance (3)
| Tool | Description |
|------|-------------|
| `getBalance` | Get the native token balance (ETH/AVAX/CELO) of an address on a specific chain |
| `getTokenBalance` | Get the ERC20 token balance of an address on a specific chain |
| `getMultiChainBalance` | Get the native token balance of an address across all 5 supported chains in parallel |

### Block (3)
| Tool | Description |
|------|-------------|
| `getBlock` | Get a block by its hash on a specific chain |
| `getBlockByNumber` | Get a block by its number on a specific chain, or pass "latest" for the most recent block |
| `getLatestBlock` | Get the latest block number, timestamp, and base fee for a specific chain |

### Transaction (3)
| Tool | Description |
|------|-------------|
| `getTransaction` | Get a transaction by its hash on a specific chain |
| `getTransactionReceipt` | Get the receipt for a transaction including status, gasUsed, and logs |
| `decodeTransaction` | Decode a transaction's function call using a provided ABI |

### Contract (3)
| Tool | Description |
|------|-------------|
| `readContract` | Call a read-only function on a smart contract with a provided ABI |
| `getContractCode` | Check if an address has contract code deployed, with bytecode length and hash |
| `getStorageAt` | Read the raw value of a storage slot at a specific address |

### Token (2)
| Tool | Description |
|------|-------------|
| `getERC20Info` | Get ERC20 token metadata including name, symbol, decimals, and total supply |
| `getTokenAllowance` | Get the ERC20 token allowance granted by an owner to a spender |

### Gas (3)
| Tool | Description |
|------|-------------|
| `getGasPrice` | Get current gas price and EIP-1559 fee data for a specific chain |
| `estimateGas` | Estimate gas for a transaction on a specific chain |
| `compareGasAcrossChains` | Compare current gas prices across all 5 supported chains |

### ENS (2)
| Tool | Description |
|------|-------------|
| `resolveENS` | Resolve an ENS name (e.g. vitalik.eth) to an Ethereum address via Ethereum L1 |
| `lookupAddress` | Reverse lookup an address to its ENS name via Ethereum L1 |

### Events (2)
| Tool | Description |
|------|-------------|
| `getContractEvents` | Get event logs emitted by a contract on a specific chain |
| `decodeEventLog` | Decode a raw event log using a provided ABI |

### Chain and Health (3)
| Tool | Description |
|------|-------------|
| `getChainInfo` | Get chain name, chain ID, current block number, block time, and native symbol |
| `isContractDeployed` | Check if an address has contract code deployed on all 5 supported chains |
| `healthCheck` | Test connectivity to all 6 RPC endpoints (Ethereum, Base, Optimism, Avalanche, Celo, Arbitrum) |

### Batch (1)
| Tool | Description |
|------|-------------|
| `batchQuery` | Execute multiple read calls in a single RPC request using Multicall3 |

### Cross-Chain (2)
| Tool | Description |
|------|-------------|
| `compareBalances` | Compare native token balances for an address across all 5 chains |
| `crossChainActivity` | Check transaction counts for an address across all 5 chains |

### Registry (1)
| Tool | Description |
|------|-------------|
| `queryRegistry` | Read registered tool metadata from the on-chain MCPRegistry companion contract |

### Optimizer (1)
| Tool | Description |
|------|-------------|
| `gasOptimizer` | Recommends the cheapest chain for a transaction, accounting for L1 data fees on Base/Optimism/Arbitrum |

## Resources (4)

| URI Pattern | Description | Cache TTL |
|-------------|-------------|-----------|
| `chain://{chainId}/status` | Current block height and gas price for a chain | 12s |
| `chain://{chainId}/gas` | Base fee, gas price, and priority fee in gwei | 12s |
| `chain://{chainId}/tokens/popular` | Popular token addresses and decimals (hardcoded for v1) | 1 hour |
| `evmcp://chains` | All supported chains with IDs, symbols, and companion contract addresses | Static |

Supported chain IDs for templated resources: `8453` (Base), `10` (Optimism), `43114` (Avalanche), `42220` (Celo), `42161` (Arbitrum).

## Prompts (4)

| Prompt | Arguments | Description |
|--------|-----------|-------------|
| `analyze-wallet` | `address` | Multi-chain balance and activity analysis of a wallet |
| `audit-contract` | `contractAddress`, `chain` | Basic inspection and audit workflow for a smart contract |
| `compare-chains` | *(none)* | Compare gas costs, speed, and characteristics across all chains |
| `investigate-tx` | `txHash`, `chain` | Decode, analyze, and trace a transaction in detail |

## Companion Contracts

Four Solidity contracts are deployed on Avalanche and Celo. The MCP server reads from these contracts to provide batch queries, on-chain tool metadata, and cross-chain data. Base and Optimism deployments are planned.

### Avalanche C-Chain (43114)

| Contract | Address |
|----------|---------|
| MCPRegistry | `0x62402b65bfb4Fd022285A6FC2F26d8caEEc3D055` |
| BatchQuery | `0xfDc19e0617AdF1811A68Aa1575409F3769f39491` |
| EventAggregator | `0xECE24a53A28F088351EC2Da258f78479e81A8007` |
| CrossChainCache | `0x0899a6Ef23c6B39A4D9B877B219645B89209A670` |

### Celo (42220)

| Contract | Address |
|----------|---------|
| MCPRegistry | `0x62402b65bfb4Fd022285A6FC2F26d8caEEc3D055` |
| BatchQuery | `0xfDc19e0617AdF1811A68Aa1575409F3769f39491` |
| EventAggregator | `0xECE24a53A28F088351EC2Da258f78479e81A8007` |
| CrossChainCache | `0x0899a6Ef23c6B39A4D9B877B219645B89209A670` |

### Contract Descriptions

- **MCPRegistry** -- On-chain metadata for all EVMCP tools (names, descriptions, versions). Owner-only writes.
- **BatchQuery** -- Optimized batch reads via Multicall3. Includes multi-balance, multi-contract-check, and multi-token-balance helpers.
- **EventAggregator** -- Caches event count summaries per contract. Updated by the admin CLI.
- **CrossChainCache** -- Stores balance snapshots for cross-chain queries. Updated by the admin CLI.

## Environment Variables

| Variable | Required | Description |
|----------|----------|-------------|
| `ALCHEMY_API_KEY` | Yes* | Alchemy API key (covers all chains) |
| `BASE_RPC_URL` | No* | Override RPC URL for Base |
| `OPTIMISM_RPC_URL` | No* | Override RPC URL for Optimism |
| `AVALANCHE_RPC_URL` | No* | Override RPC URL for Avalanche |
| `CELO_RPC_URL` | No* | Override RPC URL for Celo |
| `ARBITRUM_RPC_URL` | No* | Override RPC URL for Arbitrum |
| `ETHEREUM_RPC_URL` | No | Override RPC URL for ENS resolution |
| `CACHE_TTL_SECONDS` | No | Cache TTL in seconds (default: 15) |
| `CACHE_MAX_ENTRIES` | No | Max cache entries (default: 1000) |
| `LOG_LEVEL` | No | debug, info, warn, or error (default: info) |
| `USE_TESTNETS` | No | Use testnet chains (default: false) |

| `TRANSPORT` | No | `stdio` (default) or `http` for Streamable HTTP transport |
| `HTTP_PORT` | No | Port for HTTP transport (default: 3402) |
| `X402_ENABLED` | No | Enable x402 payment gating on HTTP transport |
| `X402_PAYEE_ADDRESS` | No** | USDC receive address on Base |
| `X402_FACILITATOR_URL` | No | x402 facilitator URL (has default) |

*Provide either `ALCHEMY_API_KEY` or all five individual chain RPC URLs.
**Required when `X402_ENABLED=true`.

## Development

```bash
pnpm install
pnpm build
pnpm inspect          # MCP Inspector UI at localhost:6274
pnpm test             # Unit tests
pnpm typecheck        # Type check
pnpm lint             # ESLint
```

## License

MIT

