以太坊MCP服务器
Rust内置的模型上下文协议(MCP)服务器,使AI代理能够查询以太坊上的余额并执行代币交换。
特性
- 查询余额:获取任何以太坊地址的ETH或ERC-20代币余额
- 代币价格:从CoinGecko API获取当前代币价格
- 构建掉期交易:使用Uniswap V3生成和模拟掉期交易
- JSON-RPC协议:通过stdin/stdout实现完整的MCP协议
先决条件
- 锈1.70或更高版本 -从以下位置安装 rustup.rs
- Node.js 16+ (可选)-仅需要
mcp-inspector测试工具 - 访问以太坊RPC端点 -默认为公共RPC
https://eth.llamarpc.com
安装
# Clone the repository
git clone
cd ethereum-mcp
# Install Rust dependencies
cargo build --release
# (Optional) Install MCP Inspector for testing
npm install配置
环境变量
创建一个 .env 在项目根目录中创建文件或导出这些环境变量:
# Ethereum RPC endpoint (optional, defaults to public RPC)
export ETH_RPC_URL=https://your-rpc-endpoint.com
# Private key for signing transactions (optional, required for building swap transactions)
export ETHEREUM_PRIVATE_KEY=0x1234567890abcdef...
# For mainnet, consider using Infura, Alchemy, or your own node
export ETH_RPC_URL=https://mainnet.infura.io/v3/YOUR_PROJECT_ID安全说明:切勿提交私钥或 .env 文件到版本控制。
用法
运行MCP服务器
# Development mode (with logging)
cargo run
# Release mode (optimized)
cargo run --release服务器通过JSON-RPC在stdin/stdout上进行通信,遵循模型上下文协议规范。
使用MCP检查员进行测试
# Start the server for inspection
mcp-inspector --transport stdio -- cargo run --release与AI客户端集成
配置您的AI客户端(例如Claude Desktop、Cline)以使用此服务器:
{
"mcpServers": {
"ethereum": {
"command": "cargo",
"args": ["run", "--release"],
"cwd": "/path/to/ethereum-mcp"
}
}
}MCP工具调用示例
以下是一个完整的MCP请求/响应交互示例:
请求(从AI客户端到服务器)
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "query_balance",
"arguments": {
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"tokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
}
},
"id": 1
}响应(从服务器到AI客户端)
{
"jsonrpc": "2.0",
"result": {
"content": [
{
"type": "text",
"text": "ERC-20 balance: 1000000 tokens"
}
],
"isError": false
},
"id": 1
}可用工具
1. query_balance
查询以太坊地址的ETH或ERC-20代币余额。
参数:
address(必填):要查询的以太坊地址token_address(可选):ERC-20令牌地址。如果未提供,则返回ETH余额
例子:
{
"name": "query_balance",
"arguments": {
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
"token_address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
}
}2. get_token_price
从CoinGecko API获取当前代币价格。
参数:
token(必填):代币地址、符号(例如“ETH”、“USDC”)或CoinGecko IDcurrency(可选):返回价格的货币(默认为“USD”)
例子:
{
"name": "get_token_price",
"arguments": {
"token": "ETH",
"currency": "USD"
}
}3. build_swap_transaction
使用Uniswap V3构建和模拟令牌交换交易。
参数:
fromToken(可选):要交换的令牌地址(默认为WETH)toToken(可选):要交换的代币地址(默认为USDC)amountIn(可选):要交换的金额(默认为0.0001)slippageTolerance(可选):最大可接受滑动百分比recipient(可选):接收交换令牌的地址
例子:
{
"name": "build_swap_transaction",
"arguments": {
"fromToken": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"toToken": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"amountIn": "0.1",
"slippageTolerance": 0.5
}
}建筑与设计决策
服务器分为以下模块:
src/lib.rs:主库入口点和服务器初始化src/mcp.rs:MCP协议实现和JSON-RPC处理src/types.rs:协议类型定义src/ethereum/:以太坊交互逻辑组织成子模块:
- mod.rs:主要 EthereumService 结构和公共API - balance.rs:ETH和ERC-20余额查询 - price.rs:从外部API获取代币价格 - pool.rs:Uniswap V3池操作和价格计算 - swap.rs:掉期交易构建和模拟 - utils.rs:用于编码/解码的辅助工具
src/main.rs:具有日志记录设置的应用程序入口点
设计决策
该实施优先考虑 安全、模块化和类型安全 通过以下设计选择:
- 合金框架:使用Alloy库进行以太坊交互,在原始RPC调用上提供类型安全的抽象,并消除智能合约交互中常见的编码/解码错误。
- 模拟优先法:所有掉期交易都使用
eth_call用于模拟而不是执行真实事务。这使得AI代理能够理解交易结果,而无需承担资金风险或需要复杂的签名基础设施。
- Uniswap V3 Focus:特别针对Uniswap V3的广泛采用和集中的流动性。该实现直接从区块链读取池状态,以计算准确的掉期报价,而不依赖于外部API。
- 只读默认模式:默认情况下,服务器以只读模式运行。交易构建需要明确配置
ETHEREUM_PRIVATE_KEY,迫使有意识地选择可以修改区块链状态的功能。
- 基于Rust的MCP实现:The
rmcpcrate为MCP协议处理提供了坚实的基础,内置异步支持和适当的错误处理,使服务器比ad-hoc JSON-RPC实现更健壮。
已知限制和假设
此实现具有以下限制和假设:
- 单一收费等级:仅支持Uniswap V3的0.05%费用级别(500)。其他费用等级(0.01%、0.3%、1%)不会自动尝试,这可能会错过替代池中更好的流动性。
- 无路由器聚合:报价直接从Uniswap V3池计算,不考虑可能无法提供最佳交换路由的替代路径或聚合器(1inch、Paraswap等)。
- 仅模拟:交易是模拟的,但不是在链上执行的。实际事务提交将需要超出此MCP服务器范围的额外签名和广播逻辑。
- 价格Oracle依赖:代币价格来自CoinGecko的免费API,该API有费率限制,可能无法反映实时DEX价格。这对于近似值是可以接受的,但不应用于精确的套利计算。
- 仅限主网:以太坊主网地址的硬编码(Uniswap V3合约、令牌地址)。支持测试网或第2层需要额外的配置和合约地址。
- 代币余额显示:ERC-20余额以原始令牌单位返回,没有十进制格式,如果不进行额外的客户端处理,很难解释大数字。
- 需要池可用性:输入令牌和输出令牌地址必须在所选费用级别具有现有的Uniswap V3池;否则交换将不会执行。
- 模拟的批准和平衡:由于没有发送交易,如果用户的帐户未获得路由器批准或缺乏足够的令牌余额,模拟仍然可能失败。
- 池相关价格计算:当前价格计算取决于查询链上的池地址;这增加了延迟,并可能使模拟比使用缓存定价服务慢。
- 未知错误:项目未完全测试,可能会出现未知行为。
发展
运行测试:
cargo test格式代码:
cargo fmt运行门楣:
cargo clippy安全考虑
⚠️ 重要:这是一个用于以太坊区块链交互的实验性MCP服务器:
- 环境变量:从不承诺
.env文件或私钥到版本控制。在生产中使用安全密钥管理。
- 私钥存储:The
ETHEREUM_PRIVATE_KEY直接加载环境变量。对于生产,考虑使用硬件钱包或安全密钥管理服务(AWS KMS、GCP Secret Manager等)。
- 只读模式:为了安全起见,服务器默认为只读模式。构建事务需要显式配置。
- 速率限制:公共RPC终结点有速率限制。为生产工作负载使用专用RPC提供程序(Infura、Alchemy)。
- 交易模拟:所有掉期交易都是模拟的。除非您构建自定义广播逻辑,否则不会执行任何实际事务。
- 输入验证:所有用户输入都经过验证,但生产使用可能需要额外的检查。
许可证
\[在此处添加您的许可证\]
贡献
欢迎投稿!请随时提交拉取请求。
