以太坊MCP服务器

一个基于Rust构建的MCP服务器,使AI代理能够与以太坊交互,提供查询余额、获取代币价格和模拟Uniswap V3代币交换的功能。

  • by cowboy0015
  • Rust
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 cowboy0015/ethereum-mcp-server

使用说明

以太坊MCP服务器

Rust内置的MCP(模型上下文协议)服务器,使AI代理能够与以太坊交互。服务器提供用于查询余额、获取代币价格和在Uniswap V3上模拟代币交换的工具。

特性

  • 余额查询:获取任何以太坊地址的ETH和ERC-20代币余额
  • 代币价格:从CoinGecko API获取当前代币价格(美元/ETH)
  • 交换模拟:构建和模拟Uniswap V3代币交换,而无需在链上执行
  • MCP协议:完全符合JSON-RPC 2.0标准的MCP服务器实现

先决条件

  • 锈1.75+和货物
  • 以太坊RPC端点(公共或私有)
  • 交易签名私钥(仅模拟)
  • CoinGecko API密钥(可选,包括演示密钥)

快速开始

  1. 克隆和构建
git clone https://github.com/cowboy0015/ethereum-mcp-server.git
cd ethereum-mcp-server
cargo build --release
  1. 配置环境 复制示例环境文件并对其进行修改:
cp .env.example .env

编辑 .env 根据您的配置:

# Required: Your Ethereum private key (for simulation)
PRIVATE_KEY=0x45ff7f5de016d7aa75787576efe1e58c972d22169277e587d4fa46dfa995a79b
# Optional: Override defaults
ETHEREUM_RPC_URL=https://eth.llamarpc.com  # Any Ethereum RPC endpoint. Check https://chainlist.org/ if you want to use public rpc endpoint
UNISWAP_V3_ROUTER=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45
UNISWAP_V3_FACTORY=0x1F98431c8aD98523631AE4a59f267346ea31F984
  1. 运行服务器
cargo run --release

服务器将使用MCP协议通过stdin/stdout启动和通信。

MCP工具示例

取得平衡

  • 请求:
{
  "method": "tools/call",
  "params": {
    "name": "get_balance",
    "arguments": {
      "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      "tokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
    }
  }
}
  • 答复:
{
    "content": [
        {
            "type": "text",
            "text": "ERC20 balance: Token balance: 38826263261"
        }
    ],
    "isError": false
}

获取代币价格

  • 请求:
{
  "method": "tools/call",
  "params": {
    "name": "get_token_price",
    "arguments": {
      "currency": "usd",
      "token": "eth"
    }
  }
}
  • 答复:
{
    "content": [
        {
            "type": "text",
            "text": "ETH: 3063.63 USD"
        }
    ],
    "isError": false
}

交换代币(模拟)

  • 请求:
{
  "method": "tools/call",
  "params": {
    "name": "swap_tokens",
    "arguments": {
      "amountIn": "100",
      "fromToken": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
      "slippageTolerance": 0.5,
      "toToken": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
    }
  }
}

  • 答复:
{
  "jsonrpc": "2.0",
  "result": {
    "content": [{
      "type": "text",
      "text": "Swap Simulation:\nFrom: 100 USDC\nTo: 0.0321 WETH\nMin Out (0.5% slippage): 0.0319 WETH\nEstimated Gas: 150000 wei\nSimulation successful - transaction would succeed"
    }]
  }
}

设计决策

  1. 模块化架构:代码被组织成集中的模块(swap.rs, pool.rs, balance.rs, price.rs)为了清晰地分离关注点和更容易的测试。

  2. 模拟首次交换: 我们不执行事务,而是构建真实的Uniswap V3事务,并使用 eth_call,提供准确的气体估算和成功/失败反馈,而无需实际支出 ETH.

  3. 十进制精度:用途 rust_decimal 对于所有财务计算,避免浮点精度问题,确保准确的掉期计算和余额查询。

  4. 提供者抽象:杠杆 Alloy的以太坊交互提供者系统,使在不同的RPC提供者或网络之间切换变得容易。

  5. 差错恢复:使用回退机制进行全面的错误处理(例如,如果池价格计算失败,则回退到基于报价的估计)。

已知限制和假设

  1. 仅限Uniswap V3: 目前仅支持Uniswap V3交换。V2池不受支持,但可以通过最小的更改添加。

  2. 固定费用等级: 仅使用0.05%的费用等级(500个基点)。在生产中,您希望检查多个费用级别或让用户指定。

  3. 价格来源: 代币价格来自CoinGecko的公开API,有利率限制。对于生产使用,您需要自己的API密钥和潜在的多个价格来源。

  4. 单滑套型号: 使用简单的基于百分比的滑动计算。大型掉期交易需要更复杂的模型(TWAP、动态滑动)。

  5. 静态配置: 私钥和RPC URL在启动时从环境变量加载。对于生产系统,您需要动态钱包管理。

  6. 仅模拟: 服务器仅模拟交换。实际的交易签名和广播需要与钱包提供商进行额外的集成。

测试

运行测试套件:

cargo test

测试包括:

  • 余额查询验证
  • 交换参数验证
  • 价格获取
  • 实用功能单元测试

日志记录

日志被写入 logs/ethereum.log 每天轮换。日志记录级别设置为 INFO 默认情况下。日志包括:

  • 工具调用详细信息
  • 以太坊RPC调用
  • 仿真结果
  • 错误条件

安全考虑

重要提示: 此服务器使用私钥进行事务模拟,但从不广播事务。然而:

  1. 切勿在开发中使用带有真实资金的私钥
  2. 私钥应仅用于测试目的
  3. 所有RPC调用都是只读的(eth_call, eth_getBalance)
  4. 未进行交易签名或广播

依赖项

关键依赖关系:

  • alloy:以太坊RPC客户端和ABI处理
  • rmcp:MCP协议实施
  • rust_decimal:精确的十进制算术
  • tracing:结构化日志记录
  • reqwest:价格为API的HTTP客户端
  • dotenv:环境变量管理