A comprehensive Model Context Protocol (MCP) server that provides complete access to Ethereum Virtual Machine (EVM) JSON-RPC methods. Works with any EVM-compatible node provider including Infura, Alchemy, QuickNode, local nodes, and more.
npm install -g @jamesanz/evm-mcpOr add to your project:
npm install @jamesanz/evm-mcp-
Install and build:
npm install npm run build
-
Configure Claude Desktop:
- Open Claude Desktop Settings (
Cmd/Ctrl + ,) - Add MCP server with command:
node /path/to/evm-mcp/build/index.js - Set environment variables:
{ "RPC_URL": "https://mainnet.infura.io/v3/YOUR_API_KEY", "CHAIN_ID": "1" }
- Open Claude Desktop Settings (
-
Test it: Ask Claude "What's the latest Ethereum block number?"
This MCP server provides access to all major EVM JSON-RPC methods through 20+ specialized tools:
Returns the current client version of the connected node.
Computes the Keccak-256 hash of the given data.
Returns the number of the most recent block.
Returns the balance of an account at a specified block.
Returns the number of transactions sent from an address (nonce).
Returns information about a block by block number.
Returns transaction information by transaction hash.
Returns the receipt of a transaction by transaction hash.
Returns the bytecode at a given contract address.
Returns the value from a storage position at a given address.
Executes a message call immediately without creating a transaction.
Estimates the gas required for a transaction.
Submits a pre-signed transaction for broadcast to the network.
Returns the current price per gas in wei.
Returns an array of all logs matching a given filter object.
Returns the chain ID of the current network.
Returns the current network ID.
Returns true if client is actively listening for network connections.
Returns the number of peers currently connected to the client.
This server works with any EVM-compatible network:
- Ethereum: Mainnet, Sepolia, Goerli
- Polygon: Mainnet, Mumbai
- Arbitrum: One, Sepolia
- Optimism: Mainnet, Sepolia
- BNB Smart Chain: Mainnet, Testnet
- Avalanche: C-Chain
- Fantom: Opera
- And many more EVM-compatible chains
npm install -g @jamesanz/evm-mcpAfter installation, run the configuration script:
# Set your RPC URL
export RPC_URL=https://mainnet.infura.io/v3/YOUR_API_KEY
export CHAIN_ID=1
# Configure Claude Desktop automatically
npm run -g configure-claude- Clone this repository:
git clone https://github.com/JamesANZ/evm-mcp.git
cd evm-mcp- Install dependencies:
npm install- Build the project:
npm run build- Set up environment variables:
export RPC_URL=https://mainnet.infura.io/v3/YOUR_API_KEY
export CHAIN_ID=1- Configure Claude Desktop:
npm run configure-claude# Infura
RPC_URL=https://mainnet.infura.io/v3/YOUR_API_KEY
# Alchemy
RPC_URL=https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY
# QuickNode
RPC_URL=https://YOUR_ENDPOINT.quiknode.pro/YOUR_TOKEN/
# Public endpoints (rate limited)
RPC_URL=https://bsc-dataseed.binance.org
RPC_URL=https://polygon-rpc.com
RPC_URL=https://arb1.arbitrum.io/rpc
# Local node
RPC_URL=http://localhost:8545- Build the project:
npm run buildTo use this EVM MCP server with Claude Desktop, you need to configure it in your Claude Desktop settings.
First, build the server:
npm run build-
Open Claude Desktop Settings:
- On macOS:
Cmd + ,or go to Claude Desktop → Settings - On Windows:
Ctrl + ,or go to File → Settings
- On macOS:
-
Add the MCP Server:
- Click "Add server" or the "+" button
- Fill in the configuration:
Server Name:
EVM MCP ServerCommand:
node /path/to/your/evm-mcp/build/index.js
Environment Variables:
{ "RPC_URL": "https://mainnet.infura.io/v3/YOUR_API_KEY", "CHAIN_ID": "1" } -
Example Configuration:
For Infura:
{ "RPC_URL": "https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID", "CHAIN_ID": "1" }For Alchemy:
{ "RPC_URL": "https://eth-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_API_KEY", "CHAIN_ID": "1" }For Polygon:
{ "RPC_URL": "https://polygon-mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID", "CHAIN_ID": "137" }For Arbitrum:
{ "RPC_URL": "https://arbitrum-mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID", "CHAIN_ID": "42161" } -
Save and Restart: Save the configuration and restart Claude Desktop.
Once configured, you should see the EVM MCP Server available in Claude. You can test it by asking Claude to:
- "Get the latest Ethereum block number"
- "Check the balance of address 0x742d35Cc6634C0532925a3b8D6Ac6e2F0C4C9B7C"
- "Get the current gas price"
You can also run the server directly:
# Set environment variables
export RPC_URL="https://mainnet.infura.io/v3/YOUR_API_KEY"
export CHAIN_ID="1"
# Start the server
npm startThe server runs on stdio and can be connected to any MCP-compatible client.
Run the test suite:
npm testRun tests in watch mode:
npm run test:watchHere are some example queries you can make with this MCP server:
{
"tool": "eth_blockNumber",
"arguments": {}
}{
"tool": "eth_getBalance",
"arguments": {
"address": "0x742d35Cc6634C0532925a3b8D6Ac6e2F0C4C9B7C",
"blockNumber": "latest"
}
}{
"tool": "eth_getTransactionByHash",
"arguments": {
"txHash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"
}
}{
"tool": "eth_call",
"arguments": {
"to": "0xA0b86a33E6441c8C06DDD46C310c0eF8D9441C8F",
"data": "0x70a08231000000000000000000000000742d35Cc6634C0532925a3b8D6Ac6e2F0C4C9B7C"
}
}{
"tool": "eth_estimateGas",
"arguments": {
"to": "0x742d35Cc6634C0532925a3b8D6Ac6e2F0C4C9B7C",
"from": "0x1234567890123456789012345678901234567890",
"value": "0xde0b6b3a7640000"
}
}{
"tool": "eth_getLogs",
"arguments": {
"fromBlock": "0x1234567",
"toBlock": "latest",
"address": "0xA0b86a33E6441c8C06DDD46C310c0eF8D9441C8F",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
]
}
}{
"tool": "eth_gasPrice",
"arguments": {}
}{
"tool": "eth_chainId",
"arguments": {}
}| Method | Description | Parameters |
|---|---|---|
eth_blockNumber |
Get latest block number | None |
eth_getBalance |
Get account balance | address, blockNumber |
eth_getTransactionCount |
Get transaction count (nonce) | address, blockNumber |
eth_getBlockByNumber |
Get block information | blockNumber, includeTransactions |
eth_getTransactionByHash |
Get transaction details | txHash |
eth_getTransactionReceipt |
Get transaction receipt | txHash |
eth_call |
Execute contract call | to, data, blockNumber, from, value, gas, gasPrice |
eth_estimateGas |
Estimate gas for transaction | to, data, from, value, gas, gasPrice |
eth_sendRawTransaction |
Send signed transaction | signedTransactionData |
eth_gasPrice |
Get current gas price | None |
eth_getCode |
Get contract bytecode | address, blockNumber |
eth_getStorageAt |
Get storage value | address, position, blockNumber |
eth_getLogs |
Get event logs | fromBlock, toBlock, address, topics |
| Method | Description | Parameters |
|---|---|---|
eth_chainId |
Get chain ID | None |
net_version |
Get network version | None |
net_listening |
Check if listening | None |
net_peerCount |
Get peer count | None |
| Method | Description | Parameters |
|---|---|---|
web3_clientVersion |
Get client version | None |
web3_sha3 |
Hash data with Keccak-256 | data |
- All hex values are returned in their original format
- Decimal conversions are provided for human readability
- Block numbers can be specified as hex strings or keywords:
latest,earliest,pending - Gas prices are displayed in both wei and gwei
- Timestamps are converted to ISO format when applicable
The server includes comprehensive error handling:
- Network errors are caught and reported with descriptive messages
- Invalid addresses or transaction hashes return appropriate error messages
- Rate limiting and API errors are handled gracefully
- Missing environment variables cause startup failures with clear messages
RPC_URL(required): Any EVM-compatible RPC endpointCHAIN_ID(optional): Chain ID for the network (defaults to 1)
When adding this MCP server to Claude Desktop, you'll need to configure it in the MCP settings. Here's a complete guide:
-
Build the Server:
npm run build
-
Open Claude Desktop Settings:
- macOS: Press
Cmd + ,or go to Claude Desktop → Settings - Windows: Press
Ctrl + ,or go to File → Settings
- macOS: Press
-
Navigate to MCP Settings:
- Look for "MCP" or "Model Context Protocol" in the settings menu
- Click "Add server" or the "+" button
-
Configure the Server:
Server Name:
EVM MCP ServerCommand:
node /full/path/to/your/evm-mcp/build/index.jsEnvironment Variables (JSON format):
{ "RPC_URL": "https://mainnet.infura.io/v3/YOUR_API_KEY", "CHAIN_ID": "1" }
Ethereum Mainnet (Infura):
{
"RPC_URL": "https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID",
"CHAIN_ID": "1"
}Ethereum Mainnet (Alchemy):
{
"RPC_URL": "https://eth-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_API_KEY",
"CHAIN_ID": "1"
}Polygon Mainnet:
{
"RPC_URL": "https://polygon-mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID",
"CHAIN_ID": "137"
}Arbitrum One:
{
"RPC_URL": "https://arbitrum-mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID",
"CHAIN_ID": "42161"
}Optimism Mainnet:
{
"RPC_URL": "https://optimism-mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID",
"CHAIN_ID": "10"
}BNB Smart Chain:
{
"RPC_URL": "https://bsc-dataseed.binance.org",
"CHAIN_ID": "56"
}After saving and restarting Claude Desktop, test the connection by asking Claude:
- "What's the latest Ethereum block number?"
- "Check the balance of address 0x742d35Cc6634C0532925a3b8D6Ac6e2F0C4C9B7C"
- "What's the current gas price?"
- "Get the chain ID of the current network"
If the server is working correctly, Claude should be able to execute these EVM RPC calls and return real blockchain data.
Common Issues and Solutions:
-
"Server not found" error:
- Make sure you've built the server:
npm run build - Verify the full path to
build/index.jsis correct - Check that Node.js is installed and accessible
- Make sure you've built the server:
-
"Environment variable not set" error:
- Ensure the JSON format is correct (no trailing commas)
- Make sure
RPC_URLis set in the environment variables section - Verify your API key is valid and has sufficient quota
-
"Connection failed" error:
- Test your RPC URL directly:
curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' YOUR_RPC_URL - Check if your provider requires authentication
- Verify the network is accessible from your location
- Test your RPC URL directly:
-
Server appears but tools don't work:
- Restart Claude Desktop after configuration changes
- Check the server logs in Claude Desktop settings
- Verify the server is running without errors
- Infura:
https://mainnet.infura.io/v3/YOUR_API_KEY - Alchemy:
https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY - QuickNode:
https://YOUR_ENDPOINT.quiknode.pro/YOUR_TOKEN/ - Public RPCs: Various public endpoints (rate limited)
- Local Nodes:
http://localhost:8545 - Custom Providers: Any JSON-RPC compatible endpoint
@modelcontextprotocol/sdk- MCP SDK for server implementationethers- Ethereum library for blockchain interactionzod- Schema validation for tool parameters
evm-mcp/
├── src/
│ └── index.ts # Main server implementation
├── test/
│ └── index.test.js # Test suite
├── build/ # Compiled JavaScript output
├── package.json # Dependencies and scripts
├── tsconfig.json # TypeScript configuration
├── jest.config.cjs # Jest test configuration
└── README.md # This file
The project uses Jest for unit testing. Tests are located in the test/ directory and can be run with:
npm testThe project uses TypeScript and compiles to JavaScript in the build/ directory:
npm run buildThis MCP server is perfect for:
- Blockchain Analytics: Query transaction data, balances, and contract states
- DeFi Applications: Monitor token balances, transaction receipts, and smart contract calls
- NFT Projects: Track transfers, metadata, and collection statistics
- Development Tools: Debug transactions, estimate gas, and test smart contracts
- Monitoring: Watch for specific events and transaction patterns
- Research: Analyze blockchain data across multiple EVM networks
This project is licensed under the MIT License - see the LICENSE.md file for details.
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests for new functionality
- Run the test suite
- Submit a pull request
For issues and questions:
- Check the Issues page
- Create a new issue with detailed information
- Include your RPC URL configuration and error messages