以太坊交易MCP服务器

一个基于Rust实现的模型上下文协议(MCP)服务器,使AI代理能够查询以太坊余额并在Uniswap上模拟代币交换。

  • by itscheems
  • Rust
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 chenjjiaa/eth-mcp

使用说明

以太坊交易MCP服务器

英语 | 简体中文

在Rust中实现的模型上下文协议(MCP)服务器,使AI代理能够查询以太坊余额并在Uniswap上模拟代币交换。

快速入门指南 -迅速起身并奔跑。

特性

服务器提供三个MCP工具:

  1. get_balance -查询ETH和ERC20代币余额

    • 输入:钱包地址,可选代币合约地址
    • 输出:带有适当小数的余额信息
  2. get_token_price -获取美元和ETH的当前代币价格

    • 输入:令牌地址(0x…)或符号(例如“USDC”、“WETH”)
    • 输出:CoinGecko API的价格数据
  3. 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编码/解码

安装说明

先决条件

  1. 安装Rust(如果尚未安装):

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    
  2. 克隆存储库:

    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 到有效的端口号。

构建并运行

  1. 构建项目:

    cargo b
    # Or for release:
    cargo b --release
    
  2. 运行服务器:

    # Stdio mode (default, for MCP clients)
    cargo r --bin server
    
    # Or directly:
    ./target/debug/server
    
  3. 运行测试:

    # 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}"
      }
    ]
  }
}

设计决策

  1. MCP协议实现:使用 rmcp 用于处理MCP协议通信的SDK,提供类型安全的工具注册和请求/响应处理。服务器支持stdio(标准MCP模式)和TCP传输,以实现灵活性。

  2. 以太坊交互:杠杆 ethers-rs 对于以太坊RPC交互,使用直接 eth_call 用于ERC20余额查询和掉期模拟。这种方法确保我们使用真实的链上数据,而不需要对读取操作进行事务签名。

  3. 金融精准度:已使用 rust_decimal 在整个代码库中进行所有财务计算,以避免浮点精度错误。所有令牌金额都根据令牌的小数字段以适当的小数位处理。

  4. 交换模拟:对于交换操作,实现构建了真实的Uniswap V2/V3事务,并使用 eth_call (通过 provider.call()),它在本地执行交易,而不将其广播到网络。这提供了包括天然气成本在内的准确估计,而不需要实际执行交易。

  5. 价格数据:集成CoinGecko API,用于代币价格数据,支持合同地址和符号查找。该实现处理常见的令牌符号,并为价格查询提供回退机制。

已知限制和假设

  1. 仅限以太坊主网:服务器当前已配置为以太坊主网。支持测试网(Goerli、Sepolia)需要额外的配置和可能不同的Uniswap路由器地址。

  2. 价格API相关性:代币价格查询取决于CoinGecko的免费API,该API有费率限制。高频率查询可能会达到速率限制,API可能不支持所有令牌。

  3. Uniswap路由器地址:该实现为主网使用硬编码的Uniswap V2和V3路由器地址。不同的网络或未来的路由器升级将需要更改代码。

  4. 天然气估算:天然气估算是近似的,基于交易模拟。实际天然气成本可能因执行时的网络状况而异。

  5. 无钱包管理或交易签名:服务器只模拟交换,不在链上执行它们。未实现钱包管理、私钥处理和交易签名功能。服务器无法对区块链的交易进行签名或广播。

  6. 滑移计算:最小产出计算使用简单的基于百分比的滑动。没有实施更复杂的滑点模型(例如,基于池流动性的动态滑点)。

  7. 价格影响:并非所有掉期场景都完全实现了价格影响计算,特别是对于可能影响池价的大型交易。

TODO/未来改进

未来改进

更新日志

更新日志

许可证

该项目根据 Apache许可证2.0.