以太坊交易MCP服务器

一个模型上下文协议(MCP)服务器,使AI代理能够与以太坊区块链交互,查询余额、获取代币价格并模拟Uniswap V2代币交换。

  • by daylilyg
  • Rust
  • 本地部署
  • 更新于
在 GitHub 查看 daylilyg/Ethereum-Trading-MCP-Server

使用说明

以太坊交易MCP服务器

一个模型上下文协议(MCP)服务器,使AI代理能够与以太坊区块链进行交互。查询余额,获取代币价格,并模拟Uniswap V2代币交换。

特性

  • get_balance:查询任何地址的ETH和ERC20代币余额
  • get_token_price:从CoinGecko获取美元和以太坊的当前代币价格
  • swap_tomates:使用gas估计模拟Uniswap V2代币交换(仅模拟,不在链上执行)

先决条件

  • Rust 1.70+(从以下位置安装 rustup.rs)
  • Infura API密钥(在 伊芙拉.io)
  • 用于区块链和价格API访问的互联网连接

安装说明

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  │
               └─────────┘

已知限制和假设

  1. 价格数据:目前仅限于CoinGecko免费API支持的流行代币(ETH、WETH、USDC、USDT、DAI、WBTC)。其他令牌需要手动输入合约地址。

  2. 仅限Uniswap V2:交换模拟是为Uniswap V2设计的。不支持流动性集中的V3池。

  3. 天然气估算:天然气估计值可能是掉期的近似值,因为它们没有考虑用户特定的代币批准或余额。当估算失败时,将使用默认值。

  4. 价格影响:简化了价格影响计算,并将“<1%”显示为占位符。生产系统应查询池储量以进行准确计算。

  5. 无交易执行:The swap_tokens 该工具仅模拟掉期交易。实际的链上执行将需要私钥管理和交易签名。

  6. 依赖网:所有功能都需要工作的以太坊RPC连接。公共端点的速率限制可能会影响可用性。

  7. 十进制精度:当我们使用 rust_decimal 对于计算,当转换到U256或从U256转换时,极大的数字可能会失去精度。

安全考虑

  • 永远不要承诺你的 .env 文件或公开API密钥
  • 服务器不需要或处理用于余额查询和价格查找的私钥
  • 交换模拟是不执行事务的只读操作
  • 在与未知合约交互之前,始终验证令牌地址

贡献

欢迎投稿!请确保:

  • 代码编译时没有警告: cargo build
  • 测试通过: cargo test
  • 代码的格式为: cargo fmt
  • Clippy满意: cargo clippy

许可证

MIT许可证-有关详细信息,请参阅许可证文件

资源