使用说明
以太坊交易MCP服务器
Rust实现 模型上下文协议(MCP) 它使AI代理能够查询以太坊余额、获取代币价格并模拟Uniswap V3掉期。
根据 任务.
特性
此MCP服务器提供三个核心工具:
-
get_balance-查询ETH和ERC20代币余额- 输入:钱包地址、可选令牌符号或地址
- 输出:带正确小数的格式化余额
-
get_token_price-获取当前代币价格- 输入:代币符号/地址、货币符号/地址
- 输出:代币价格(查询所有Uniswap V3费用级别并返回最佳价格)
-
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↔ 十进制)
- 令牌注册表解析
- 状态覆盖生成
备注:某些集成测试需要有效的网络连接。
设计决策
-
精度保证:用途
rust_decimal::Decimal并将其序列化为字符串,以避免浮点精度损失。这确保了整个管道的财务计算保持准确。 -
Uniswap V3优先级:价格查询和掉期仅使用Uniswap V3,迭代所有费用级别(0.01%、0.05%、0.3%、1%)以找到最佳价格/流动性。这种方法在保持实施重点的同时,最大限度地提高了执行质量。
-
状态覆盖模拟:交换模拟用途
eth_call使用状态覆盖来模拟交易,而无需持有实际令牌。这涉及注入MockToken合约字节码(绕过限额检查)并将钱包余额设置为U256::MAX,确保模拟不需要真正的资金。 -
灵活的令牌解析:支持令牌符号(例如“USDC”)和地址(例如“0x…”)作为输入。符号解析使用Uniswap令牌列表,提供方便的用户体验,同时保持使用任意合约地址的能力。
-
上下文错误处理:用途
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