以太坊交易MCP服务器
Rust中的模型上下文协议(MCP)服务器实现,使AI代理能够查询以太坊上的余额并模拟代币交换。
AI代理的快速入门
该服务器允许像Claude这样的AI代理通过自然对话与以太坊进行交互:
- 构建:
cargo build --release - 配置Claude桌面(请参阅 使用AI代理进行配置)
- 与克劳德聊天: *“vitalik.ETH的ETH余额是多少?”*
就是这样! 人工智能将自动调用区块链工具。
特性
- 余额查询:查询任何地址的ETH和ERC20代币余额
- 价格信息:从CoinGecko和Chainlink神谕获取实时代币价格
- 交换模拟:使用气体估算模拟Uniswap V2交换(无链上执行)
- MCP协议:遵循MCP规范的完整JSON-RPC 2.0实现
- 生产准备就绪:使用ethers进行以太坊交互,使用rust_decimal进行财务精确
先决条件
- 锈蚀1.70或更高
- 以太坊RPC端点(公共或来自Infura/Alchemy)
安装
- 克隆存储库:
git clone
cd eth-trading-mcp-server- 复制示例环境文件:
cp .env.example .env- 编辑
.env并配置您的以太坊RPC URL:
ETH_RPC_URL=https://eth.llamarpc.com
# Or use your own Infura/Alchemy endpoint:
# ETH_RPC_URL=https://mainnet.infura.io/v3/YOUR_API_KEY- 构建项目:
cargo build --release运行服务器
MCP服务器通过stdio(标准输入/输出)进行通信:
cargo run --release服务器将:
- 连接到以太坊RPC端点
- 通过获取链ID来验证连接
- 在stdin上监听JSON-RPC请求
- 在stdout上发送响应
使用AI代理进行配置
此MCP服务器旨在供Claude Desktop等AI代理使用,它们可以通过自然对话调用以太坊工具。
选项1:克劳德桌面(推荐)
- 构建发布二进制文件:
cargo build --release- 找到二进制文件:
# The binary will be at:
# /Users/hikari/src/eth-trading-mcp-server/target/release/eth-trading-mcp-server- 配置Claude桌面:
编辑您的Claude Desktop配置文件:
- macOS: ~/Library/Application Support/Claude/claude_desktop_config.json - 窗户: %APPDATA%\Claude\claude_desktop_config.json - Linux: ~/.config/Claude/claude_desktop_config.json
添加此MCP服务器配置:
{
"mcpServers": {
"ethereum-trading": {
"command": "/Users/hikari/src/eth-trading-mcp-server/target/release/eth-trading-mcp-server",
"env": {
"ETH_RPC_URL": "https://eth.llamarpc.com"
}
}
}
}注: 将路径替换为实际的项目路径。使用 pwd 在项目目录中获取完整路径。
- 重新启动克劳德桌面
- 验证安装:
打开克劳德桌面,寻找🔌 指示MCP服务器已连接的图标。
选项2:其他MCP客户端
对于其他MCP兼容客户端,请将其配置为运行:
/path/to/eth-trading-mcp-server/target/release/eth-trading-mcp-server环境变量:
ETH_RPC_URL=https://eth.llamarpc.com自然语言测试
一旦配置了Claude Desktop,您就可以通过自然聊天来测试这些工具:
余额查询:
- “0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045的ETH余额是多少?”
- “检查vitalik.eth的USDC余额”
- “0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb有多少ETH?”
价格查询:
- “USDC的当前价格是多少?”(然后提供地址:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)
- “给我ETH价格”(使用0x000000000000000000000000000000000)
- “令牌0x6B175474E89094C44Da98b954EedeAC495271d0F的价格是多少?”(DAI)
交换模拟:
- “模拟将0.1 ETH兑换为USDC,换取0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045钱包”
- “1个ETH能得到多少USDC?”
- “显示将0.5 ETH兑换为DAI的天然气成本”
通用令牌地址:
- ETH:
0x0000000000000000000000000000000000000000 - USDC:
0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 - USDT:
0xdAC17F958D2ee523a2206206994597C13D831ec7 - 戴:
0x6B175474E89094C44Da98b954EedeAC495271d0F - WETH:
0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
人工智能代理(Claude)将:
- 了解您的自然语言要求
- 调用相应的MCP工具(get_balance、get_token_price或swap_tokes)
- 以人性化的格式呈现结果
可用工具
1.平衡
查询ETH或ERC20代币余额以获取钱包地址。
参数:
wallet_address(字符串,必填):要查询的钱包地址(0x…)token_address(字符串,可选):ERC20代币合约地址。如果没有提供,则返回ETH余额。
请求示例:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_balance",
"arguments": {
"wallet_address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"
}
}
}示例响应:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "Balance: 1.234567890123456789 ETH\nDecimals: 18\nWallet: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb\nRaw balance: 1234567890123456789"
}
]
}
}2.获取价格
从价格神谕获取美元和以太坊的当前代币价格。
参数:
token_address(字符串,必填):令牌合约地址。使用0x0000000000000000000000000000000000000000ETH。
请求示例:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_token_price",
"arguments": {
"token_address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
}
}
}示例响应:
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"content": [
{
"type": "text",
"text": "Token: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\nPrice (USD): 1.00\nPrice (ETH): 0.0005\nSource: CoinGecko"
}
]
}
}3.swap_tomates
在Uniswap V2上模拟令牌交换,而不执行交易。
参数:
from_token(字符串,必填):源令牌地址。使用0x0000000000000000000000000000000000000000ETH。to_token(字符串,必填):目标令牌地址amount(字符串,必填):以代币单位交换的金额(例如“1.5”)slippage_bps(数字,可选):基点滑动公差(默认值:50=0.5%)wallet_address(字符串,必填):用于模拟的钱包地址
请求示例:
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "swap_tokens",
"arguments": {
"from_token": "0x0000000000000000000000000000000000000000",
"to_token": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"amount": "1.0",
"slippage_bps": 50,
"wallet_address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"
}
}
}示例响应:
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [
{
"type": "text",
"text": "Swap Simulation:\nFrom: 0x0000000000000000000000000000000000000000\nTo: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\nAmount In: 1.0\nEstimated Output: 2000.5\nMinimum Output (with slippage): 1990.4975\nEstimated Gas: 150000\nSlippage Tolerance: 50 bps (0.5%)\nRoute: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 -> 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
}
]
}
}MCP协议流
- 初始化:客户端发送
initialize请求 - 列出工具:客户要求提供可用的工具
tools/list - 呼叫工具:客户端调用工具
tools/call
初始化示例:
{
"jsonrpc": "2.0",
"id": 0,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": {
"name": "example-client",
"version": "1.0.0"
}
}
}设计决策
建筑
- 模块化设计:为了可维护性和可测试性,将关注点分为不同的模块(ethereum/、tools/、types.rs、mcp.rs)。
- 异步优先:基于Tokio构建,用于高效处理并发RPC调用和未来的可扩展性。
- 仅模拟:The
swap_tokens工具用途eth_estimateGas和getAmountsOut在不执行交易的情况下模拟掉期,确保人工智能代理的安全。
- 金融精准度:用途
rust_decimal以避免财务计算中的浮点错误。
- Oracle定价策略:实现回退链(CoinGecko→ 链环→ Uniswap池),以最大限度地提高价格数据的可用性。
实现细节
- Uniswap集成:由于其简单性和广泛采用,使用Uniswap V2路由器进行交换模拟
- ABI生成:利用醚类
abigen!类型安全合约交互的宏 - 错误处理:对内部错误和客户端响应的JSON-RPC错误代码进行全面的错误处理
- 日志记录:带跟踪的结构化日志记录,输出到stderr以避免干扰stdio协议
已知限制
- 仅限主网:当前配置为以太坊主网。需要对L2或测试网进行修改。
- 价格信息:CoinGecko API有利率限制。对于生产,实现缓存或使用付费的API层。
- 交换路由:使用简单的直接路径(标记A→ 令牌B)或通过WETH单跳。生产系统应实施多跳路由,以获得更好的价格。
- 天然气估算:对于复杂的场景可能不准确。这
eth_estimateGas如果钱包余额不足,通话可能会失败。
- 无交易执行:此服务器仅模拟交换。要执行真实交易,您需要:
- 添加适当的钱包管理和安全的密钥存储 - 执行交易签名和广播 - 添加确认跟踪 - 处理随机数管理
- 仅限Uniswap V2:不支持Uniswap V3或其他DEX。V3的集中流动性将提供更好的定价,但需要更复杂的整合。
测试
推荐:使用AI Agent进行测试
测试此服务器的最佳方法是通过像Claude Desktop这样的AI代理(请参阅 使用AI代理进行配置 上文)。只需使用自然语言与Claude聊天,例如:
- “vitalik.ETH的ETH余额是多少?”
- “获取USDC的价格”
- “模拟将1 ETH兑换为USDC”
替代方案:手动测试
如果你想在没有人工智能代理的情况下直接测试服务器:
Python测试客户端
Python测试客户端(client_example.py)用于对所有MCP服务器功能进行简单的端到端测试:
# Make the script executable
chmod +x client_example.py
# Initialize the server
python3 client_example.py init
# List available tools
python3 client_example.py list
# Test balance query (example: Vitalik's address)
python3 client_example.py balance 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
# Test token price (example: USDC)
python3 client_example.py price 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
# Test swap simulation (ETH -> USDC)
python3 client_example.py swap 0x0000000000000000000000000000000000000000 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 0.1 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045可用命令:
init-初始化MCP服务器连接list-列出所有可用工具balance-查询钱包余额price-获取代币价格(使用0x0000000000000000000000000000000000000000ETH)swap-模拟代币交换
Bash测试脚本
一个简单的bash脚本(test_mcp.sh)还提供了快速测试:
chmod +x test_mcp.sh
./test_mcp.sh此脚本显示可以发送到服务器的JSON-RPC请求示例。
锈蚀试验
运行测试套件:
cargo test使用日志记录运行:
RUST_LOG=debug cargo test -- --nocapture发展
启用调试日志记录:
RUST_LOG=debug cargo run格式代码:
cargo fmt运行门楣:
cargo clippy安全考虑
- 永不承诺
.env包含私钥的文件 - 此服务器仅模拟事务,基本操作不需要私钥
- 对于生产使用,实施适当的秘密管理(例如HashiCorp Vault、AWS Secrets Manager)
- 始终验证和净化输入,特别是地址和金额
许可证
麻省理工学院
贡献
欢迎投稿!请随时提交拉取请求。
