以太坊交易MCP服务器
Rust内置的模型上下文协议(MCP)服务器,使AI代理能够查询以太坊上的余额并执行代币交换。
特性
- get_balance -查询任何地址的ETH和ERC20代币余额
- get_token_price -通过Uniswap获取美元或以太坊的实时代币价格
- swap_tomates -使用气体估计模拟Uniswap V2代币交换(仅模拟,不在链上执行)
技术栈
- 锈 使用异步运行时(tokio)
- 合金 -Rust以太坊库
- RMCP -Rust模型上下文协议SDK
- Uniswap V2 -DEX集成用于价格报价和掉期模拟
- rust_decimal -用于金融计算的高精度十进制算法
设置
先决条件
- 锈蚀1.70+(
cargo --version) - 以太坊RPC端点(Infura、Alchemy或公共端点)
安装
- 克隆存储库:
git clone https://github.com/uu-z/rust-eth-mcp
cd rust-eth-mcp- 设置环境变量:
cp .env.example .env
# Edit .env with your RPC URL (optional, defaults to public endpoint)- 构建项目:
cargo build --release- 运行服务器:
cargo run --release服务器将于启动 http://127.0.0.1:8000/mcp
环境变量
ETH_RPC_URL-以太坊RPC端点(默认值:https://eth.llamarpc.com)PRIVATE_KEY-用于交易签名的私钥(可选,用于未来的链上执行)RUST_LOG-日志级别(默认值:info)
使用示例
MCP工具调用
1.获取ETH余额
请求:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_balance",
"arguments": {
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
}
}
}答复:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "{\"address\":\"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\"balance\":\"1.234567890123456789\",\"symbol\":\"ETH\",\"raw_balance\":\"1234567890123456789\"}"
}
],
"isError": false
}
}2.获取ERC20代币余额
请求:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_balance",
"arguments": {
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"token": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
}
}
}答复:
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"content": [
{
"type": "text",
"text": "{\"address\":\"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\"token\":\"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\"symbol\":\"USDC\",\"balance\":\"1000.500000\",\"decimals\":6,\"raw_balance\":\"1000500000\"}"
}
],
"isError": false
}
}3.获取代币价格
请求:
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_token_price",
"arguments": {
"token": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"quote": "ETH"
}
}
}答复:
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [
{
"type": "text",
"text": "{\"token\":\"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\"quote\":\"ETH\",\"price\":\"0.000285\",\"path\":[\"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\"]}"
}
],
"isError": false
}
}4.模拟代币交换
请求:
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "swap_tokens",
"arguments": {
"from_token": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"to_token": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"amount": "1000",
"slippage": "0.5"
}
}
}答复:
{
"jsonrpc": "2.0",
"id": 4,
"result": {
"content": [
{
"type": "text",
"text": "{\"simulation\":\"success\",\"from_token\":\"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\"to_token\":\"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\",\"amount_in\":\"1000\",\"estimated_output\":\"0.285\",\"minimum_output\":\"0.283575\",\"slippage\":\"0.5%\",\"gas_estimate\":\"150000\",\"gas_cost_eth\":\"0.0045\",\"note\":\"This is a simulation only. Transaction not executed on-chain.\"}"
}
],
"isError": false
}
}设计决策
- 合金框架:因其现代、类型安全的以太坊交互方法而被选中,该方法具有出色的异步支持和编译时ABI验证,使用
sol!宏。
- 仅模拟掉期:The
swap_tokens该工具通过以下方式构建真实的Uniswap V2交易和链数据查询getAmountsOut,但使用RPC将其作为模拟执行eth_call语义(通过alloy的视图函数调用)。这提供了准确的估计,而无需链上执行。
- 十进制精度:用途
rust_decimal用于所有余额和价格计算,以避免金融应用程序中常见的浮点精度错误。
- 模块化架构:以太坊交易逻辑在
ethereum模块,使其易于扩展额外的DEX或功能,同时保持MCP服务器逻辑的整洁。
- 错误处理:所有错误都映射到符合MCP的错误响应,并带有详细的调试上下文。
已知限制
- 仅限主网:当前配置为以太坊主网。测试网支持需要更新合约地址。
- 仅限Uniswap V2:报价和掉期使用Uniswap V2。可以添加V3支持,以便更好地定价某些货币对。
- 无链上执行:仅模拟掉期。实现了私钥管理和事务签名,但为了安全起见,故意禁用执行。
- 公共RPC限制:默认公共RPC终结点可能有速率限制。使用Infura/炼金术进行生产。
- 令牌白名单:价格查询假设代币有WETH对。异国情调的代币可能会失败。
测试
运行测试:
cargo test注意:测试需要网络访问才能查询以太坊主网。由于RPC调用,某些测试可能会很慢。
项目结构
src/
├── main.rs # MCP server setup and HTTP endpoint
├── ethereum/
│ └── mod.rs # Ethereum trading tools (balance, price, swap)
└── common/ # Example counter (can be removed)许可证
麻省理工学院
贡献
欢迎拉取请求。请确保:
- 代码编译时使用
cargo build - 测试通过
cargo test - 新功能包括文档
