以太坊工具服务器

一个基于Rust的MCP服务器,为AI代理提供以太坊相关的工具,包括余额查询、代币价格查询和Uniswap交换模拟。

  • by jordanlixu
  • Rust
  • 本地部署
  • 更新于
在 GitHub 查看 jordanlixu/eth-mcp-server

使用说明

MCP以太坊工具服务器(Rust)

该项目实现了 模型上下文协议(MCP)服务器 Rust为AI代理提供了与以太坊相关的工具。 它通过一个简单的MCP接口公开余额查询、代币价格查找和Uniswap掉期模拟。

目的是展示 实用的Rust工程、模块化设计和正确使用以太坊RPC.


1.概述

服务器充当MCP兼容后端。 当AI代理调用工具时,服务器通过以太坊RPC执行链上查询。

MCP Client → MCP Server → Ethereum RPC → Uniswap Contracts

架构图

       ┌──────────────────────┐
       │      AI Agent        │
       │  (decision making)   │
       └─────────┬────────────┘
                 │  MCP Request
                 ▼
       ┌──────────────────────-┐
       │      MCP Server       │
       │   (ServerHandler)     │
       │──────────────────────-│
       │ - call_tool()         │
       │ - list_tools()        │
       └─────────┬────────────-┘
                 │
       ┌─────────┼────────────------------─┐
       ▼         ▼                         ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ BalanceModule │ │  PriceModule  │ │  SwapModule   │
│  get_balance  │ │   get_price   │ │ simulate_swap │
└───────────────┘ └───────────────┘ └───────────────┘
                 │
                 ▼
        ┌─────────────────┐
        │ Ethereum Node   │
        │  (ethers.rs)    │
        └─────────────────┘

注: 服务器会 不 执行真实交易。 交换功能使用 eth_call 以安全地模拟执行。


2.提供的工具

get_balance

查询:

  • ETH余额
  • ERC20余额(使用ABI+小数)

get_token_price

  • 使用链上Uniswap池数据获取代币价格
  • 注: 不包括外部价格来源

swap_tokens

  • 构造一个Uniswap V2或V3交换调用,并使用 eth_call
  • 返回预期产量和天然气估算值
  • 没有交易被广播

3.要求

依赖项

  • Rust(tokio异步运行时)
  • ethers-rs
  • serde / serde_json
  • tracing (日志记录)
  • MCP Rust SDK(rmcp)

环境

创建一个 .env 文件:

INFURA_URL=
WALLET_ADDRESS=
USDC=

密钥仅用于构建模拟事务, 未播出.


4.跑步

构建

cargo build

启动MCP服务器

cargo run
  • 启动MCP服务器(main.rs)
  • 使用真实钱包在Sepolia测试网上运行
  • ChatGPT或其他客户端可以直接发送请求

运行测试客户端(本地模拟)

cargo run --bin test_client
  • 在本地模拟MCP主机/客户端
  • 向正在运行的MCP服务器发送请求以测试端点和响应
  • 无需部署服务器,即可用于开发或自动化测试
  • 所有交易都发生在Sepolia测试网上——安全,不需要生产基础设施

5.MCP工具调用示例

请求:get_balance

{
  "method": "call_tool",
  "params": {
    "name": "get_balance",
    "arguments": {
      "address": "0xYourWalletAddress",
      "token": "0xUSDCContractAddress"
    }
  }
}

响应:get_balance

{
  "result": {
    "eth_balance": "0.52",
    "tokens": [
      {
        "symbol": "USDC",
        "balance": "123.45"
      }
    ]
  }
}

请求:获取价格(ETH/USD)

{
  "method": "call_tool",
  "params": {
    "name": "get_price",
    "arguments": {
      "token": null
    }
  }
}

响应:获取价格(ETH/USD)

{
  "result": {
    "price": "1850.23"
  }
}

请求:swap_tomates

{
  "method": "call_tool",
  "params": {
    "name": "swap_tokens",
    "arguments": {
      "from_token": "ETH",
      "to_token": "USDC",
      "amount_in": "0.001",
      "slippage": 0.5
    }
  }
}

响应:swap_tomates

{
  "result": {
    "amount_out": "1.82",
    "estimated_gas": 21000
  }
}

6.设计说明

  • 使用单个共享以太坊提供商来减少冗余连接
  • 在Sepolia测试网上使用真实钱包;仅模拟/测试事务
  • 可以在本地部署或嵌入外部客户端
  • 模块化设计:平衡/价格/交换模块可以轻松扩展