使用说明
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-rsserde/serde_jsontracing(日志记录)- 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测试网上使用真实钱包;仅模拟/测试事务
- 可以在本地部署或嵌入外部客户端
- 模块化设计:平衡/价格/交换模块可以轻松扩展
