使用说明
以太坊交易MCP服务器
在Rust中实现的模型上下文协议(MCP)服务器,使AI代理能够查询以太坊余额并在Uniswap上模拟代币交换。
快速入门指南 -迅速起身并奔跑。
特性
服务器提供三个MCP工具:
-
get_balance-查询ETH和ERC20代币余额- 输入:钱包地址,可选代币合约地址
- 输出:带有适当小数的余额信息
-
get_token_price-获取美元和ETH的当前代币价格- 输入:令牌地址(0x…)或符号(例如“USDC”、“WETH”)
- 输出:CoinGecko API的价格数据
-
swap_tokens-在Uniswap V2或V3上模拟代币交换- 输入:从_代币、到_代币、金额、滑动容差
- 输出:显示估计输出和天然气成本的模拟结果
- 备注:构造真实的Uniswap交易,并使用
eth_call无需在链上执行
项目结构
src/
├── main.rs # Server entry point and transport configuration
├── server.rs # MCP server implementation with tool handlers
├── swap.rs # Uniswap V2/V3 swap simulation logic
└── bin/
├── client.rs # MCP client for testing
├── test_eth_balance.rs # Test for ETH balance queries
├── test_erc20_balance.rs # Test for ERC20 balance queries
├── test_token_price.rs # Test for token price queries
└── test_swap.rs # Test for swap simulations
依赖项
- 锈 (最新稳定版本)
- 东京 -异步运行时
- 醚类 -以太坊RPC客户端库
- rmcp -MCP SDK for Rust
- rust_decimal -财务精准处理
- 追踪 -结构化日志记录
- reqwest -用于价格API调用的HTTP客户端
- 乙胺 -ABI编码/解码
安装说明
先决条件
-
安装Rust(如果尚未安装):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -
克隆存储库:
git clone https://github.com/chenjjiaa/eth-mcp; cd eth-mcp
环境变量
创建 .env 项目根目录中的文件(或使用环境变量):
# Ethereum RPC endpoint (required)
ETH_RPC_URL=https://eth.llamarpc.com
# Or use Infura/Alchemy:
# ETH_RPC_URL=https://mainnet.infura.io/v3/YOUR_API_KEY
# Server configuration (optional)
SERVER_HOST=127.0.0.1 # Default: 127.0.0.1
SERVER_PORT=0 # Default: 0 (stdio mode). Set to >0 for TCP mode
# Logging (optional)
RUST_LOG=info # Default: info. Options: trace, debug, info, warn, error
# Wallet address
WALLET_ADDRESS=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
# USDC contract addr
TOKEN_ADDRESS=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
备注:在以下情况下,服务器默认为stdio模式(MCP标准) SERVER_PORT=0.对于TCP模式,设置 SERVER_PORT 到有效的端口号。
构建并运行
-
构建项目:
cargo b # Or for release: cargo b --release -
运行服务器:
# Stdio mode (default, for MCP clients) cargo r --bin server # Or directly: ./target/debug/server -
运行测试:
# Run all tests cargo test # Run specific test binaries cargo r --bin test_eth_balance cargo r --bin test_erc20_balance cargo r --bin test_token_price cargo r --bin test_swap
MCP工具调用示例
1.获取ETH余额
请求:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_balance",
"arguments": {
"wallet_address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"
}
}
}
回应:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "{\n \"wallet_address\": \"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb\",\n \"token_address\": null,\n \"balance\": \"0.000000000000000000\",\n \"decimals\": 18,\n \"raw_balance\": \"0\"\n}"
}
]
}
}
2.获取ERC20代币余额
请求:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_balance",
"arguments": {
"wallet_address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
"token_address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
}
}
}
回应:
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"content": [
{
"type": "text",
"text": "{\n \"wallet_address\": \"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb\",\n \"token_address\": \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n \"balance\": \"1000.000000\",\n \"decimals\": 6,\n \"raw_balance\": \"1000000000\"\n}"
}
]
}
}
3.获取代币价格
请求:
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_token_price",
"arguments": {
"token": "USDC"
}
}
}
回应:
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [
{
"type": "text",
"text": "{\n \"token\": \"USDC\",\n \"token_address\": null,\n \"price_usd\": \"1.000000\",\n \"price_eth\": \"0.000300\",\n \"last_updated\": null\n}"
}
]
}
}
4.模拟代币交换
请求:
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "swap_tokens",
"arguments": {
"from_token": "ETH",
"to_token": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"amount": "1.0",
"slippage_tolerance": "0.5",
"version": "v2"
}
}
}
回应:
{
"jsonrpc": "2.0",
"id": 4,
"result": {
"content": [
{
"type": "text",
"text": "{\n \"from_token\": \"ETH\",\n \"to_token\": \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n \"input_amount\": \"1.0\",\n \"estimated_output\": \"3200.123456\",\n \"minimum_output\": \"3184.122842\",\n \"slippage_tolerance\": \"0.5\",\n \"estimated_gas\": \"150000\",\n \"estimated_gas_eth\": \"0.003000\",\n \"price_impact\": null,\n \"involves_eth\": true,\n \"version\": \"v2\"\n}"
}
]
}
}
设计决策
-
MCP协议实现:使用
rmcp用于处理MCP协议通信的SDK,提供类型安全的工具注册和请求/响应处理。服务器支持stdio(标准MCP模式)和TCP传输,以实现灵活性。 -
以太坊交互:杠杆
ethers-rs对于以太坊RPC交互,使用直接eth_call用于ERC20余额查询和掉期模拟。这种方法确保我们使用真实的链上数据,而不需要对读取操作进行事务签名。 -
金融精准度:已使用
rust_decimal在整个代码库中进行所有财务计算,以避免浮点精度错误。所有令牌金额都根据令牌的小数字段以适当的小数位处理。 -
交换模拟:对于交换操作,实现构建了真实的Uniswap V2/V3事务,并使用
eth_call(通过provider.call()),它在本地执行交易,而不将其广播到网络。这提供了包括天然气成本在内的准确估计,而不需要实际执行交易。 -
价格数据:集成CoinGecko API,用于代币价格数据,支持合同地址和符号查找。该实现处理常见的令牌符号,并为价格查询提供回退机制。
已知限制和假设
-
仅限以太坊主网:服务器当前已配置为以太坊主网。支持测试网(Goerli、Sepolia)需要额外的配置和可能不同的Uniswap路由器地址。
-
价格API相关性:代币价格查询取决于CoinGecko的免费API,该API有费率限制。高频率查询可能会达到速率限制,API可能不支持所有令牌。
-
Uniswap路由器地址:该实现为主网使用硬编码的Uniswap V2和V3路由器地址。不同的网络或未来的路由器升级将需要更改代码。
-
天然气估算:天然气估算是近似的,基于交易模拟。实际天然气成本可能因执行时的网络状况而异。
-
无钱包管理或交易签名:服务器只模拟交换,不在链上执行它们。未实现钱包管理、私钥处理和交易签名功能。服务器无法对区块链的交易进行签名或广播。
-
滑移计算:最小产出计算使用简单的基于百分比的滑动。没有实施更复杂的滑点模型(例如,基于池流动性的动态滑点)。
-
价格影响:并非所有掉期场景都完全实现了价格影响计算,特别是对于可能影响池价的大型交易。
TODO/未来改进
更新日志
许可证
该项目根据 Apache许可证2.0.