MCP Ethers Wallet

crazyrabbitLTC
MIT
Published: 2025-01-11
Last update: 6 months ago
# MCP Ethers Wallet

A Model Context Protocol (MCP) server that provides Ethereum wallet functionality using ethers.js v6.

## Overview

The MCP Ethers Wallet exposes Ethereum functionality to LLM applications through the Model Context Protocol. It provides tools for:

- Network information and management
- Wallet creation and management
- Transaction creation and sending
- Contract interaction (ERC20, ERC721, ERC1155)
- ENS resolution
- Unit conversion
- Gas estimation
- Transaction history

This server follows the MCP specification, making it compatible with any MCP client, such as Claude Desktop.

## Using with MCP Tools

To use this as an MCP server with tools like Claude Desktop, use the following configuration:

```json
{
  "ethers": {
    "command": "node",
    "args": [
      "pathTo/ethers-server/build/src/mcpServer.js"
    ],
    "env": {
      "ALCHEMY_API_KEY": "key goes here",
      "INFURA_API_KEY": "key goes here"
    }
  }
}
```

Replace `pathTo/ethers-server` with the actual path to your installation directory, and add your API keys.

## Installation

```bash
# Clone the repository
git clone https://github.com/yourusername/ethers-server.git
cd ethers-server

# Install dependencies
npm install

# Build the TypeScript code
npm run build
```

## Quick Start

### Starting the Server

```bash
# Using Node.js
npm start

# Using Bun (recommended for faster performance)
bun start
```

### Using with Claude Desktop

1. Configure Claude Desktop to use this server:
   - Go to Settings > Model Context Protocol
   - Set Command to: `node path/to/ethers-server/build/src/mcpServer.js`

2. Use the Ethers tools in your Claude conversations.

### Testing with MCP Inspector

The MCP Inspector is a tool for testing and debugging MCP servers.

```bash
# Install MCP Inspector globally
npm install -g @modelcontextprotocol/inspector

# Run it with your server
mcp-inspector --command "node build/src/mcpServer.js"
```

## Configuration

### Environment Variables

Create a `.env` file in the root directory with:

```
# Required
ALCHEMY_API_KEY=your_alchemy_api_key
INFURA_API_KEY=your_infura_api_key

# Optional
DEFAULT_NETWORK=mainnet  # Default: mainnet
LOG_LEVEL=info           # Default: info (options: error, warn, info, debug)
```

### Network Configuration

The server supports multiple Ethereum and EVM-compatible networks. The supported networks are defined in `src/config/networkList.ts`:

#### Mainnet Networks
- Ethereum (ETH)
- Polygon PoS (POL)
- Arbitrum (ETH)
- Arbitrum Nova (ETH)
- Optimism (ETH)
- Avalanche C-Chain (AVAX)
- Base (ETH)
- Polygon zkEVM (ETH)
- Linea (ETH)
- BNB Smart Chain (BNB)
- Scroll (ETH)
- Rari Chain Mainnet (ETH)
- Berachain (BERA)
- Sonic Mainnet (S)

#### Testnet Networks
- Monad Testnet (MON)
- MEGA Testnet (ETH)

You can specify a network when using tools with the `provider` parameter, e.g., `"provider": "polygon"` or `"provider": "bera"`.

### Custom RPC URLs

You can also use a custom RPC URL:

```
"provider": "https://my-custom-rpc.example.com"
```

## Available Tools

### Core Network Tools

- **getSupportedNetworks**: Get a list of all supported networks and their configurations
- **getBlockNumber**: Get the current block number
- **getBlockDetails**: Get details about a block
- **getTransactionDetails**: Get details about a transaction
- **getGasPrice**: Get the current gas price
- **getFeeData**: Get the current network fee data

### Wallet Tools

- **generateWallet**: Generate a new Ethereum wallet
- **loadWallet**: Load an existing wallet from a private key
- **checkWalletExists**: Check if a wallet is configured on the server
- **getWalletBalance**: Get the ETH balance of a wallet
- **getWalletTransactionCount**: Get the number of transactions sent by an address
- **signMessage**: Sign a message with the loaded wallet
- **ethSign**: Sign data using the Ethereum eth_sign method (legacy)

### Contract Tools

- **getContractCode**: Get a contract's bytecode
- **callContractMethod**: Call a read-only method on a contract
- **estimateGas**: Estimate gas for a transaction

### ENS Tools

- **lookupAddress**: Get the ENS name for an address
- **resolveName**: Get the address for an ENS name

### Unit Conversion Tools

- **formatEther**: Convert a wei value to a decimal string in ether
- **parseEther**: Convert an ether value to wei
- **formatUnits**: Convert a value to a decimal string with specified units

### ERC20 Tools

- **erc20GetTokenInfo**: Get basic token information (name, symbol, decimals)
- **erc20GetBalance**: Get token balance for an address
- **erc20Transfer**: Transfer tokens between accounts
- **erc20GetAllowance**: Get token approval allowance
- **erc20Approve**: Approve tokens for spending by another address

### ERC721 Tools

- **erc721GetTokenInfo**: Get basic NFT collection information
- **erc721GetBalance**: Get NFT balance for an address
- **erc721OwnerOf**: Get the owner of a specific NFT
- **erc721GetTokenURI**: Get token URI metadata for an NFT
- **erc721Transfer**: Transfer an NFT to another address
- **erc721SafeTransfer**: Safely transfer an NFT to another address

### ERC1155 Tools

- **erc1155GetTokenInfo**: Get basic multi-token information
- **erc1155GetBalance**: Get token balance for an address and token ID
- **erc1155GetBatchBalance**: Get multiple token balances in a single call
- **erc1155GetURI**: Get metadata URI for a token
- **erc1155SafeTransfer**: Safely transfer tokens to another address
- **erc1155SafeBatchTransfer**: Safely transfer multiple tokens in a single call

## Tool Usage Examples

### Getting Network Information

```json
{
  "name": "getSupportedNetworks",
  "arguments": {}
}
```

### Getting Wallet Balance

```json
{
  "name": "getWalletBalance",
  "arguments": {
    "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
    "provider": "mainnet"
  }
}
```

### Getting ERC20 Token Information

```json
{
  "name": "erc20GetTokenInfo",
  "arguments": {
    "tokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
    "provider": "mainnet"
  }
}
```

### Calling a Contract Method

```json
{
  "name": "callContractMethod",
  "arguments": {
    "contractAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
    "methodName": "symbol",
    "params": [],
    "abi": ["function symbol() view returns (string)"],
    "provider": "mainnet"
  }
}
```

## Caching

The server implements caching for certain operations to improve performance and reduce API calls:

- Token information (name, symbol, decimals)
- Token balances
- Contract method calls

The cache uses a time-to-live (TTL) mechanism that automatically expires entries after a configurable period.

## Rate Limiting

The server implements rate limiting for certain operations:

- Write operations (transfers, approvals)
- Wallet generation
- Contract interactions

This prevents abuse and ensures the server remains responsive.

## Error Handling

The server includes comprehensive error handling:

- Custom error classes for specific error types
- Detailed error messages
- Appropriate HTTP status codes
- Safe error serialization to prevent sensitive data leaks

## Development

### Building

```bash
npm run build
```

### Testing

The server includes comprehensive test suites:

#### Running All Tests with Bun (Recommended)

```bash
# Start a Hardhat node in a separate terminal
npx hardhat node

# Run all tests
bun test
```

#### Running MCP Client Tests

These tests validate the MCP protocol implementation by spawning the server and sending real MCP requests:

```bash
bun run test:client:mcp
```

#### Individual Test Categories

```bash
# Run ERC20 tests
bun test src/services/erc/erc20.test.ts

# Run ERC721 tests
bun test src/services/erc/erc721.test.ts

# Run ERC1155 tests
bun test src/services/erc/erc1155.test.ts

# Run core tool tests
bun test src/tests/write-methods.test.ts
```

#### Test Environment

Tests use the `bun.setup.ts` file to configure the test environment, including setting up Hardhat as the default provider.

## Security Considerations

- **Private Keys**: The server can store private keys in memory. Exercise caution with the `saveToEnv` option in wallet operations.
- **API Keys**: Your Alchemy and Infura API keys are used to connect to Ethereum networks. Never expose your `.env` file.
- **Eth Sign**: The `ethSign` method can sign transaction-like data, which is less secure than `signMessage`. Use with caution.

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

## License

MIT

## Author

Dennison Bertram ([email protected]) 

Related

MCP Sui Tools
MCP Sui Tools
  • 0xdwong
  • MIT
  • 2
Sensei MCP
Sensei MCP
  • dojoengine
  • MIT
  • 9
Name Description

Get the ETH balance of a wallet

Get the ERC20 token balance of a wallet

Get the number of transactions ever sent by an address

Get the current gas price

Get the address for an ENS name

Get the ENS name for an address

Convert an ether value to wei

Call a view/pure method on a smart contract (read-only operations)

Query historical logs

Send a raw transaction

Send a transaction with advanced options including gas limit, gas price, and nonce

Get details about transactions in a specific block.

Convert a wei value to a decimal string in ether

Check if there is a wallet configured on the server. Returns basic wallet info like address but never exposes private keys.

Get details about a block

Convert a decimal string to its smallest unit representation

Get the current network fee data

Get a contract's bytecode

Call a view/pure method on a smart contract (read-only operations)

Call a method on a smart contract with automatic gas estimation

Call a method on a smart contract and send a transaction with custom parameters

Call a method on a smart contract with advanced options

Call a method on a smart contract and send a transaction with custom parameters

Query historical events from a contract

Get a list of all supported networks and their configurations. Shows which network is the default (used when no provider is specified). Call this first to discover available networks before using other network-related functions.

Call a method on a smart contract and send a transaction with automatic gas estimation

Get the current block number

Convert a value to a decimal string with specified units

Sign a message using the server's wallet

Get details about a transaction

Send ETH from the server's wallet to a recipient
Joseph Parker 20 Dec 2021 - 05:47AM

I am getting message from customers that when they place order always get error message .

Reply
Alexis Clarke 22 Dec 2021 - 02:32PM

Please be sure to check your Spam mailbox to see if your email filters have identified the email from Dell as spam.

Reply
Donald Palmer 24 Dec 2021 - 05:20PM

If you have further questions, please contact Customer Support from the “Action Menu” on your Online Order Support.

Reply
Alexis Clarke 26 min ago

Your Online Order Support provides you with the most current status of your order. To help manage your order refer to the “Action Menu” to initiate return, contact Customer Support and more.

Reply
Donald Palmer 8 sec ago

Other shipping methods are available at checkout if you want your purchase delivered faster.

Reply
Please Enter a Message

Security

95%

Code quantity

97%

Total downloads

4,305

80%

User reviews

121

89%