以太坊交易MCP服务器

一个基于Rust实现的模型上下文协议(MCP)服务器,支持查询以太坊余额、获取代币价格以及模拟Uniswap V3交易。

  • by hmqgg
  • Rust
  • 本地部署
  • 更新于
在 GitHub 查看 hmqgg/eth_mcp_server

使用说明

以太坊交易MCP服务器

Rust实现 模型上下文协议(MCP) 它使AI代理能够查询以太坊余额、获取代币价格并模拟Uniswap V3掉期。

根据 任务.

特性

此MCP服务器提供三个核心工具:

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

    • 输入:钱包地址、可选令牌符号或地址
    • 输出:带正确小数的格式化余额
  2. get_token_price -获取当前代币价格

    • 输入:代币符号/地址、货币符号/地址
    • 输出:代币价格(查询所有Uniswap V3费用级别并返回最佳价格)
  3. swap_tokens -模拟Uniswap V3代币交换

    • 输入:从代币到代币、金额、滑点容差
    • 产量:预计产量和天然气成本
    • 备注:仅模拟-不会向区块链广播任何交易

技术栈

  • 锈/东京
  • 合金 -以太坊RPC客户端库
  • rmcp -模型上下文协议Rust SDK
  • rust_decimal -高精度财务计算
  • 追踪 -结构化日志记录

先决条件

  • Rust(通过安装 生锈)
  • 以太坊主网RPC端点(Infura、Alchemy或公共节点) 必须 支持 statesOverride 为了 eth_call
  • 以太坊私钥(仅用于签名,不会广播任何交易)

安装说明

1.克隆存储库

git clone <repository-url>
cd eth_mcp_server_private

2.配置环境变量

创建一个 .env 在shell中文件或导出以下变量:

# Ethereum mainnet RPC URL
export ETH_RPC_URL="https://eth.llamarpc.com"

# Ethereum private key (64-character hex string with 0x prefix)
export ETH_PRIVATE_KEY="0x0000000000000000000000000000000000000000000000000000000000000001"

安全说明:

  • 不要在生产中使用带有真实资金的私钥
  • 使用测试私钥或专门为此目的创建新钱包(例如。 cast wallet new)
  • 此服务器仅模拟事务,不会广播真实事务,但始终谨慎处理私钥

3.建设项目

cargo build --release

4.运行服务器

cargo run --release

服务器通过标准输入/输出(stdio)与MCP客户端通信。

使用示例

使用支持自定义mcpServers的客户端进行测试

{
  "mcpServers": {
    "eth_mcp_server": {
      "command": "cargo",
      "args": ["run", "--manifest-path", "${workspaceFolder}/Cargo.toml"],
      "env": {
        "ETH_PRIVATE_KEY": "0x...",
        "ETH_RPC_URL": "https://..."
      }
    }
  }
}

MCP检验员测试

❤️ 推荐

安装并使用官方MCP检查器:

npx @modelcontextprotocol/inspector -e ETH_RPC_URL="https://..." -e ETH_PRIVATE_KEY="0x..." cargo run

它将打开一个演示MCP服务器工具的网页。

示例1:查询余额

请求:

{
  "method": "tools/call",
  "params": {
    "name": "get_balance",
    "arguments": {
      "wallet_address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      "token": "USDC" // or contract address.
    }
  }
}

响应:

{
  "content": [
    {
      "type": "text",
      "text": "{\"balance\":\"1234.567890\"}"
    }
  ]
}

示例2:获取代币价格

请求:

{
  "method": "tools/call",
  "params": {
    "name": "get_token_price",
    "arguments": {
      "token": "WETH", // or contract address.
      "currency": "USDC" // or contract address.
    }
  }
}

响应:

{
  "content": [
    {
      "type": "text",
      "text": "{\"price\":\"3456.789012\"}"
    }
  ]
}

示例3:模拟令牌交换

请求:

{
  "method": "tools/call",
  "params": {
    "name": "swap_tokens",
    "arguments": {
      "from_token": "USDC", // or contract address.
      "to_token": "WETH", // or contract address.
      "amount_from": "1000",
      "slippage_percent": "0.5"
    }
  }
}

响应:

{
  "content": [
    {
      "type": "text",
      "text": "{\"amount_to\":\"0.289123456789\",\"gas_estimate\":185000}"
    }
  ]
}

测试

运行单元测试:

cargo test

测试覆盖范围包括:

  • 地址解析和验证
  • 序列化/反序列化精度保证
  • 十进制转换(U256↔ 十进制)
  • 令牌注册表解析
  • 状态覆盖生成

备注:某些集成测试需要有效的网络连接。

设计决策

  1. 精度保证:用途 rust_decimal::Decimal 并将其序列化为字符串,以避免浮点精度损失。这确保了整个管道的财务计算保持准确。

  2. Uniswap V3优先级:价格查询和掉期仅使用Uniswap V3,迭代所有费用级别(0.01%、0.05%、0.3%、1%)以找到最佳价格/流动性。这种方法在保持实施重点的同时,最大限度地提高了执行质量。

  3. 状态覆盖模拟:交换模拟用途 eth_call 使用状态覆盖来模拟交易,而无需持有实际令牌。这涉及注入MockToken合约字节码(绕过限额检查)并将钱包余额设置为 U256::MAX,确保模拟不需要真正的资金。

  4. 灵活的令牌解析:支持令牌符号(例如“USDC”)和地址(例如“0x…”)作为输入。符号解析使用Uniswap令牌列表,提供方便的用户体验,同时保持使用任意合约地址的能力。

  5. 上下文错误处理:用途 anyhow::Context 为每个操作添加上下文信息,通过明确指出哪个步骤失败及其原因,使错误更易于调试和用户友好。

已知限制

  • 仅限以太坊主网:当前 CHAIN_ID 硬编码为1(可扩展到其他链)
  • 令牌列表依赖关系:依赖Uniswap的官方代币列表(tokens.uniswap.org);如果列表不可用或令牌未列出,则符号查询将失败
  • 气体估算精度:状态覆盖可能会导致天然气估算与实际链上执行不同

项目结构

eth_mcp_server_private/
├── src/
│   ├── main.rs              # Server entry point
│   ├── tools/
│   │   ├── mod.rs
│   │   ├── router.rs        # MCP tool router
│   │   ├── balance.rs       # Balance queries
│   │   ├── price.rs         # Price queries
│   │   └── swap.rs          # Swap simulation
│   └── utils/
│       ├── mod.rs
│       ├── provider.rs      # RPC provider and wallet
│       ├── contracts.rs     # Contract ABI bindings
│       ├── decimals.rs      # Precision conversion
│       └── token_registry.rs # Token symbol resolution
├── abi/                     # Uniswap contract ABIs
├── sol/                     # MockToken contract
├── Cargo.toml
└── README.md