使用说明
以太坊交易MCP服务器
一个模型上下文协议(MCP)服务器,使AI代理能够与以太坊区块链进行交互。查询余额,获取代币价格,并模拟Uniswap V2代币交换。
特性
- get_balance:查询任何地址的ETH和ERC20代币余额
- get_token_price:从CoinGecko获取美元和以太坊的当前代币价格
- swap_tomates:使用gas估计模拟Uniswap V2代币交换(仅模拟,不在链上执行)
先决条件
安装说明
1.克隆和导航
git clone <your-repo-url>
cd eth_mcp
2.配置环境变量
复制示例环境文件并对其进行配置:
cp .env.example .env
编辑 .env 并添加您的Infura API密钥:
INFURA_API_KEY=your_infura_api_key_here
ETHEREUM_RPC_URL=https://mainnet.infura.io/v3/your_infura_api_key_here
RUST_LOG=info
备注:对于测试,您可以在没有API密钥的情况下使用公共端点,但它们可能是有速率限制的。
3.建设项目
cargo build --release
4.运行服务器
cargo run --release
服务器将启动并监听stdin/stdout上的MCP协议请求。
用法示例
示例1:获取ETH余额
请求:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_balance",
"arguments": {
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
}
}
}
答复:
{
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"token": null,
"balance": "1234567890123456789",
"decimals": 18,
"symbol": "ETH",
"formatted_balance": "1.234567890123456789"
}
示例2:获取代币余额
请求:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_balance",
"arguments": {
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"token_address": "USDC"
}
}
}
答复:
{
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"token": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"balance": "1000000000",
"decimals": 6,
"symbol": "USDC",
"formatted_balance": "1000"
}
示例3:获取代币价格
请求:
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_token_price",
"arguments": {
"token": "WETH"
}
}
}
答复:
{
"token": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"symbol": "WETH",
"price_usd": "2450.32",
"price_eth": "1"
}
示例4:模拟令牌交换
请求:
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "swap_tokens",
"arguments": {
"from_token": "WETH",
"to_token": "USDC",
"amount": "1",
"slippage_tolerance": 0.5
}
}
}
答复:
{
"from_token": "WETH",
"to_token": "USDC",
"input_amount": "1",
"estimated_output": "2450.123456",
"minimum_output": "2437.872839",
"price_impact": "< 1%",
"estimated_gas": "0.003",
"route": [
"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
]
}
支持的代币
服务器按符号支持常见的以太坊代币:
- 以太坊 / WETH:包裹的乙醚
- USDC:美元硬币
- 泰达币:Tether美元
- 戴:戴稳定币
- WBTC:包裹比特币
您还可以通过提供其合约地址来使用任何ERC20代币。
测试
运行测试套件:
# Run all tests
cargo test
# Run tests including network-dependent ones (requires RPC connection)
cargo test -- --ignored --test-threads=1
备注:网络相关测试标记为 #[ignore] 并且需要有效的RPC连接。
设计决策
该实施优先考虑 模块化和可维护性 通过将关注点分为不同的模块:以太坊客户端操作、价格获取、Uniswap集成和MCP服务器处理。的使用 使用Tokio进行异步/等待 确保高效处理RPC调用和HTTP请求等I/O绑定操作。 财务精准度 使用管理 rust_decimal 并在整个系统中仔细处理令牌小数。对于 掉期模拟,服务器构建真实的Uniswap V2事务并使用 eth_call 模拟以提供准确的产量估算和天然气成本,而无需在链上执行。这 价格获取 利用CoinGecko的免费API来避免需要额外的API密钥,同时为普通代币提供可靠的价格数据。
建筑
┌─────────────────────────────────────┐
│ MCP Server Layer │
│ (Protocol handling, JSON-RPC) │
└────────────┬────────────────────────┘
│
┌────────┴───────┬─────────────┬──────────┐
│ │ │ │
┌───▼──────┐ ┌──────▼────┐ ┌─────▼───┐ ┌────▼────┐
│Ethereum │ │ Price │ │Uniswap │ │ Types │
│ Client │ │ Fetcher │ │ Client │ │& Errors │
└────┬─────┘ └─────┬─────┘ └────┬────┘ └─────────┘
│ │ │
│ ┌────▼─────┐ │
└─────────► ethers ◄───────┘
│ RPC │
└──────────┘
│
┌────▼────┐
│ Infura │
│Ethereum │
│ Node │
└─────────┘
已知限制和假设
-
价格数据:目前仅限于CoinGecko免费API支持的流行代币(ETH、WETH、USDC、USDT、DAI、WBTC)。其他令牌需要手动输入合约地址。
-
仅限Uniswap V2:交换模拟是为Uniswap V2设计的。不支持流动性集中的V3池。
-
天然气估算:天然气估计值可能是掉期的近似值,因为它们没有考虑用户特定的代币批准或余额。当估算失败时,将使用默认值。
-
价格影响:简化了价格影响计算,并将“<1%”显示为占位符。生产系统应查询池储量以进行准确计算。
-
无交易执行:The
swap_tokens该工具仅模拟掉期交易。实际的链上执行将需要私钥管理和交易签名。 -
依赖网:所有功能都需要工作的以太坊RPC连接。公共端点的速率限制可能会影响可用性。
-
十进制精度:当我们使用
rust_decimal对于计算,当转换到U256或从U256转换时,极大的数字可能会失去精度。
安全考虑
- 永远不要承诺你的
.env文件或公开API密钥 - 服务器不需要或处理用于余额查询和价格查找的私钥
- 交换模拟是不执行事务的只读操作
- 在与未知合约交互之前,始终验证令牌地址
贡献
欢迎投稿!请确保:
- 代码编译时没有警告:
cargo build - 测试通过:
cargo test - 代码的格式为:
cargo fmt - Clippy满意:
cargo clippy
许可证
MIT许可证-有关详细信息,请参阅许可证文件