以太坊交易MCP服务器

一个基于Rust编写的Model Context Protocol (MCP)服务器,支持查询ETH和ERC20代币余额、获取代币价格以及模拟Uniswap V3交易,适用于AI代理或CLI客户端。

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

使用说明

以太坊交易MCP服务器

A. 模型上下文协议(MCP) 服务器写入 锈,使AI代理或CLI客户端能够:

  • 查询 ETH和ERC20余额
  • 获取 代币价格 (ETH或美元)
  • 模拟 Uniswap V3交换 (通过QuoterV2只读)

服务器通过以下方式进行通信 JSON-RPC 2.0(标准输入/标准输出) 并且可以连接到任何以太坊RPC端点,例如 英富拉, 炼金术,或a 局部砧叉.


安装说明

1.依赖关系

您需要:

  • 防锈工具链 ≥ 1.73 (rustup 推荐)
  • 货物 构建系统(与Rust一起安装)
  • 访问a 以太坊RPC节点 (Infura、炼金术或当地叉子)

2.环境变量(.env)

基于.env.example文件在项目根目录中创建.env文件

如果你没有公共RPC密钥,你可以使用本地分叉:

砧叉urlhttps://eth.llamarpc.com--链id 1--端口8545

3.运行MCP服务器

货物运输--安静

服务器从stdin读取JSON-RPC请求,并将响应写入stdout。

要手动测试,请使用jq:

jq-nc'{“jsonrpc”:“2.0”,“id”:1,“method”:“tools/list”,“params”:{}}'|货物运行--安静

MCP工具调用示例

1.️⃣ 列出可用工具

请求

{“jsonrpc”:“2.0”,“id”:1,“方法”:“工具/列表”,“参数”:{}}

响应

{ “jsonrpc”:“2.0”, “id”:1, “结果”:{ “工具”:[ {“name”:“get_balance”,“description”:“查询ETH或ERC20余额”}, {“name”:“get_token_price”,“description”:“以ETH或USD获取代币价格”}, {“name”:“swap_togens”,“description”:“模拟Uniswap V3单跳交换”} ] } }

2.️⃣ 查询特定地址的ETH余额

请求

{ “jsonrpc”:“2.0”, “id”:2, “方法”:“工具/调用”, “参数”:{ “name”:“get_balance”, “参数”:{“地址”:“0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266”} } }

响应

{ “jsonrpc”:“2.0”, “id”:2, “结果”:{ “好”:{ “符号”:“ETH”, “小数”:18, “金额”:“9999.9999999999” } } }

3.️⃣ 获取代币价格(ETH/USDC)

请求

{ “jsonrpc”:“2.0”, “id”:3, “方法”:“工具/调用”, “参数”:{ “name”:“get_token_price”, “论点”:{ “令牌”:“0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48”, “vs”:“ETH”, “费用”:3000 } } }

响应

{ “jsonrpc”:“2.0”, “id”:3, “结果”:{ “好”:{ “令牌”:“0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48”, “vs”:“ETH”, “价格”:“0.00029” } } }

4.️⃣ 模拟Uniswap V3交换(ETH→ USDC)

请求

{ “jsonrpc”:“2.0”, “id”:4, “方法”:“工具/调用”, “参数”:{ “name”:“swap_tomates”, “论点”:{ “从令牌”:“0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2”, “to_token”:“0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48”, “金额”:“10000000000000000”, “slippage_bps”:50, “use_v3”:真, “v3_fee”:3000 } } }

响应

{ “jsonrpc”:“2.0”, “id”:4, “结果”:{ “好”:{ “路由器”:“UniswapV3/KquoterV2”, “方法”:“quoteExactInput(字节)”, “估计输出”:“34021798”, “气体估计值”:0, “gas_price_wei”:“18000000000”, “路由提示”:“0xc02a…->(3000)->0xa0b8…” } } }

设计决策

MCP stdio架构: 服务器遵循模型上下文协议 spec,通过stdin/stdout上的tools/list和tools/call公开工具。 这种设计避免了网络绑定,并易于集成到AI代理运行时。

以太坊RPC抽象: 所有链上读取都使用带有异步I/O的ethers。服务器支持公共RPC端点(Infura/Alchemy)和通过铁砧的本地分叉。

可组合模块:

eth.rs--核心平衡实用程序

price.rs——Uniswap V3+链式定价

uniswap.rs——通过QuoterV2进行交换模拟

mcp.rs——统一JSON-RPC工具调度器

types.rs——共享请求/响应模式

精密处理: 在内部使用rust_decimal和BigDecimal,以便在具有不同小数的令牌对之间进行安全的金融数学计算。

已知限制和假设

仅模拟:交换永远不会在链上广播。

ETH/USD定价假设位于0x5f4e地址的Chainlink主网聚合器。..b8419。

对于非标准erc20,decimals()处理可能会失败,除非您使用提供的safe_erc20_decimals。

RPC端点必须允许eth_call、eth_getCode和eth_gasPrice。

服务器不维护状态或钱包密钥;它是只读的。

快速测试

测试功能概述

测试脚本 test_mcp_client.py 验证MCP(市场连接平台)服务的核心功能,包括:

  • 查询可用工具列表
  • 获取以太坊地址的ETH余额
  • 获取以太坊地址的代币余额(例如USDC)
  • 检索与ETH相关的代币价格信息
  • 模拟代币交换操作(从WETH到USDC)

先决条件

在运行测试之前,请确保:

  1. 您已经创建并配置了 .env 文件
  2. 您在本地有一个可用的以太坊RPC节点(如砧节点)
  3. Python 3环境已安装

运行测试

基本测试(使用默认配置)

cd test
python3 test_mcp_client.py

这将使用默认的cargo命令启动服务,并连接到默认的RPC节点(http://127.0.0.1:8545).

自定义测试参数

您可以通过命令行参数自定义测试配置:

# Specify a different RPC node
python3 test_mcp_client.py --rpc https://eth.llamarpc.com

# Specify the wallet address to test
python3 test_mcp_client.py --addr 0xYourWalletAddress

# Specify different WETH and USDC contract addresses
python3 test_mcp_client.py --weth 0xYourWETHAddress --usdc 0xYourUSDCAddress

# Specify a custom server start command
python3 test_mcp_client.py --server-cmd "cargo" "run" "--release"

环境变量

测试脚本会自动从环境变量中读取配置,特别是:

  • ETH_RPC_URL:以太坊RPC节点URL(如果未通过命令行参数指定)

测试结果

当测试成功通过时,您将看到类似于以下内容的输出:

✓ tools/list OK
✓ get_balance(ETH) OK
✓ get_balance(USDC) OK
✓ get_token_price(vs=ETH) OK
✓ swap_tokens (simulate) OK

ALL TESTS PASSED ✅

如果测试失败,将显示详细的错误信息和服务器日志以进行调试。

注意:令牌交换功能目前仅执行模拟操作,不会执行实际的链上交易。