# Etherscan MCP Server A Go implementation of an Etherscan API client for the [Model Context Protocol (MCP)](https://github.com/mark3labs/mcp-go) that enables LLM applications to access Etherscan blockchain data. ## Features - Access Etherscan API V2 for multi-chain support - Use a single API key for over [50 supported chains](https://docs.etherscan.io/etherscan-v2/getting-started/supported-chains) - Supports various blockchain data retrieval methods: - Account balances - Block information - Contract data (ABI, source code) - Gas oracle - Token information - Transaction data - And more ## Requirements - Etherscan API key (get from https://etherscan.io/myapikey) ## Installation 1. Clone the repository: ```bash git clone https://github.com/huahuayu/etherscan-mcp-server.git cd etherscan-mcp-server ``` 2. Set Etherscan API key env variable: ```bash ETHERSCAN_API_KEY=your_api_key_here ``` 3. Build the server: ```bash make build ``` 4. Install the server: ```bash make install # install to /usr/local/bin ``` ## Usage ### Default Mode (Standard Input/Output) Run the server using stdin/stdout communication (default mode): ```bash ./bin/etherscan-mcp-server ``` This mode is useful for direct integration with LLM applications that communicate via stdin/stdout. MCP config: ```json { "mcpServers": { "etherscan-mcp-server": { "command": "etherscan-mcp-server", "env": { "ETHERSCAN_API_KEY": "$your_api_key" } } } } ``` Restart cursor and check if it's success: ![](https://cdn.0xbuilder.com/img/20250407121209988.png) ### SSE Mode Run the server in Server-Sent Events mode: ```bash ./bin/etherscan-mcp-server --sse ``` In SSE mode, the server listens on HTTP and provides an SSE endpoint. SSE MCP config: ```json { "mcpServers": { "etherscan-mcp-server": { "url": "http://localhost:4000/sse", "env": { "ETHERSCAN_API_KEY": "$your_api_key" } } } } ``` #### Server Options - `--sse`: Enable SSE server mode (default is stdin/stdout mode) - `--port `: Specify the port for SSE server (defaults to PORT env var or 4000) ### Connection Endpoints (SSE Mode) When running in SSE mode, the server provides: - **SSE Endpoint**: `http://localhost:4000/sse` ## Supported Chains 50+ chains supported, please refer to the [Etherscan V2 Supported Chains](https://docs.etherscan.io/supported-chains) for a complete list and their corresponding Chain IDs. > **Note on Free Tier Limitations & RPC Fallback:** > According to Etherscan's [supported chains policy](https://docs.etherscan.io/supported-chains), some networks are **not available** under the Free API plan. These include (but are not limited to): > > - **BNB Smart Chain (BSC)** — Chain ID: 56 > - **Base** — Chain ID: 8453 > - **Avalanche C-Chain** — Chain ID: 43114 > > For these three chains, this server has a **built-in RPC fallback mechanism**: when the Etherscan API returns `NOTOK`, it automatically falls back to free public RPC endpoints using standard JSON-RPC methods. **No paid plan is needed** for the following tools on these chains: > > | Tool | JSON-RPC Method | > | ----------------------- | --------------------------------- | > | `getLatestBlockNumber` | `eth_blockNumber` | > | `getAccountBalance` | `eth_getBalance` | > | `getTokenBalance` | `eth_call` (balanceOf) | > | `getTokenDetails` | `eth_call` (name/symbol/decimals) | > | `getTransactionByHash` | `eth_getTransactionByHash` | > | `getTransactionReceipt` | `eth_getTransactionReceipt` | > | `getTransactionCount` | `eth_getTransactionCount` | > | `executeContractMethod` | `eth_call` | > > **RPC Endpoints Used:** > > - BSC: `https://binance.llamarpc.com` > - Base: `https://base.llamarpc.com` > - Avalanche C-Chain: `https://api.avax.network/ext/bc/C/rpc` > > Other Etherscan-specific tools (e.g., `getContractABI`, `getTransactionsByAddress`) still require the Etherscan paid plan for these chains. ## Example Queries You can use natural language queries like these: ### Account and Balance Information - "What's the ETH balance of address 0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae?" - "Show me the token balance for USDT on address 0x123abc... on BSC" - "How many transactions has 0xvitalik.eth made from this address?" ### Block Information - "Get information about the latest Polygon block" - "What are the rewards for miners in block 17000000?" - "Who mined block 16900000 on Ethereum?" ### Contract Interaction - "Show me the source code at 0x1f9840a85d5af5bf1d1762f925bdaddc4201f984" - "What's the ABI for the USDC contract on Polygon?" - "Call the balanceOf function of USDT contract with my address as parameter" ### Transaction Information - "Give me details for transaction 0x123456789abcdef..." - "Has transaction 0xabcdef... been confirmed yet?" - "What was the gas price used in transaction 0x789abc..." ### Gas and Network - "What are the current gas prices on Ethereum?" - "What's the recommended gas price for a fast transaction right now?" - "How many transactions are pending on Ethereum network?" ### Token Information - "Tell me about the LINK token contract" - "What ERC-721 NFTs does address 0x123... own?" - "Show recent token transfers for 0xvitalik.eth" ### Custom Queries - "Track all USDC transfers to Binance hot wallet in the last 1000 blocks" - "Which addresses received the most ETH in block 17000000?" - "Compare gas usage on Ethereum vs Arbitrum for similar transactions" ## Available Tools The Etherscan MCP Server provides the following tools for accessing blockchain data: 1. **getAccountBalance** - Get the balance of an account on a specific blockchain 2. **getBlockByNumber** - Get block information by block number 3. **getBlockRewards** - Get block rewards by block number 4. **getContractABI** - Get the ABI for a verified contract 5. **getContractSourceCode** - Get the source code of a verified contract 6. **executeContractMethod** - Execute a read contract function 7. **getGasOracle** - Get current gas price oracle output 8. **getTokenBalance** - Get the token balance of an account on a specific blockchain 9. **getTokenDetails** - Get comprehensive token information 10. **getTransactionByHash** - Get transaction details by hash 11. **getTransactionByBlockNumberAndIndex** - Get transaction by block number and index 12. **getTransactionCount** - Get the number of transactions sent from an address 13. **getTransactionReceipt** - Check transaction receipt status 14. **getTransactionStatus** - Check contract execution status 15. **getTransactionsByAddress** - Get list of transactions by address 16. **getInternalTransactionsByAddress** - Get list of internal transactions by address 17. **getTokenTransfersByAddress** - Get list of token transfers by address 18. **getERC721Transfers** - Get list of ERC721 token transfers by address 19. **getLatestBlockNumber** - Get the latest block number Each tool accepts specific parameters and provides blockchain data in a structured format. ## License MIT