使用说明
Zerion MCP服务器
生产准备就绪 模型上下文协议 (MCP)服务器,为人工智能助手提供访问Zerion API的权限,用于加密货币投资组合管理、DeFi头寸、NFT和市场数据。
特性
- 🔌 自动生成的工具:通过OpenAPI规范将Zerion API端点自动公开为MCP工具
- ⚙️ 灵活配置:具有环境变量覆盖的YAML配置文件
- 📝 结构化日志记录:JSON和文本格式,具有敏感数据编辑功能
- 🛡️ 稳健的错误处理:带有详细上下文和故障排除提示的自定义异常
- 🔁 自动重试逻辑:利率限制(429)和钱包索引(202)的指数回退
- 📄 分页支持:对大型结果集(5000多个项目)进行手动和自动分页
- 🚦 费率限制管理:具有可配置退避策略的透明重试处理
- 🔍 高级过滤:链过滤、DeFi位置、垃圾邮件过滤、交易类型等
- 🧪 测试网支持:通过X-Env标头在测试网(Sepolia、Monad等)上测试应用程序
- 💱 多币种:以美元、以太坊、欧元或比特币计价的投资组合价值
- ✅ 综合测试:使用pytest进行单元和集成测试
- 🚀 异步HTTP:使用httpx的非阻塞API调用
作战能力
Zerion API提供了三种强大的操作功能,使其从传统的区块链数据提供商中脱颖而出:
1.多链聚合
一个API调用中包含100多个区块链 -Zerion自动聚合所有支持的区块链网络中的数据,而无需多次API请求。
它是如何工作的:
- 无需特殊参数-多链聚合是自动的
- 单次呼叫
getWalletPortfolio返回以太坊、Base、Polygon、Arbitrum、Optimism、Solana和100多个其他链的余额 - 消除了对API供应商(Alchemy、Infura、Moralis)的需求
支持的链包括:
- EVM链:以太坊、多边形、Arbitrum、乐观主义、基础、BNB链、雪崩、Fantom、Gnosis、zkSync、StarkNet
- L2s:乐观主义、仲裁、基础、zkSync时代、多边形zkEVM、线性、滚动
- 非 EVM:索拉纳
- 100+条链 (参见
listChains完整列表)
示例:
Get wallet portfolio across all chains:
Use getWalletPortfolio with:
- address: "0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990"
- currency: "usd"
结果:在一个响应中聚合了所有100多个受支持链的投资组合数据。
Get positions across all chains:
Use listWalletPositions with:
- address: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
- filter[positions]: "only_complex"
- currency: "usd"
结果:在一次调用中,来自以太坊、Base、Arbitrum和所有其他链的DeFi头寸。
与每链API相比的优势:
- 泽里翁:1 API对跨链投资组合的呼吁
- 每链API:需要10个以上单独的API调用(每个链一个)
- 配额节省:API请求减少90%
- 简化逻辑:不需要手动链聚合
使用案例:
- 跨链投资组合仪表板
- DeFi聚合器(跟踪所有链上的位置)
- 多链钱包分析
- 跨链交易历史
2.DeFi协议覆盖范围
跟踪了8000多个DeFi协议 -Zerion为借贷、质押、LP和产量农业头寸提供了全面的协议元数据。
可用协议元数据:
relationships.dapp.data.id-协议标识符(例如,“uniswap-v3”、“aave-v3”)attributes.position_type-头寸类别(质押、存款、贷款、奖励等)- 遵循JSON的DApp数据:API关系格式
涵盖的协议类别:
- 去中心化交易所:Uniswap、曲线、平衡器、SushiSwap、PancakeSwap
- 借贷:Aave、复合、MakerDAO、Euler
- 标桩:丽都、火箭池、锦标
- 收益聚合器:Yearn、Beefy、凸形
示例:
Get all DeFi positions with protocol data:
Use listWalletPositions with:
- address: "0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990"
- filter[positions]: "only_complex"
- filter[trash]: "only_non_trash"
- currency: "usd"
结果:返回以下位置 relationships.dapp 包含协议元数据(Uniswap、Aave、Curve等)。
Filter positions by specific protocol:
Use listWalletPositions with:
- address: "0x..."
- filter[dapp_ids]: "aave-v3,compound-v2"
- filter[positions]: "only_complex"
结果:只有维生素V3和化合物V2的位置。
使用案例:
- DeFi协议分析仪表板
- 按协议进行位置聚合
- 协议收益跟踪
- 风险管理(按协议跟踪风险敞口)
3.NFT元数据完整性
全面的NFT元数据 -Zerion为ERC-721和ERC-1155代币提供了丰富的元数据,实现了功能齐全的NFT显示。
可用元数据字段:
metadata.name-NFT名称metadata.description-NFT描述metadata.content.preview-缩略图/预览图像URLmetadata.content.detail-高分辨率图像URLmarket_data.prices.floor-集合底价(如有)metadata.attributes-NFT特征和属性relationships.nft_collection-收集关系数据
图像URL:
- 预览缩略图/图库视图的URL
- 全尺寸显示器的详细URL
- URL可能是IPFS网关
底价可用性:
- 适用于大多数已建立的收藏
- 新/小型收藏可能缺乏楼层数据
- 以请求的货币(美元、以太坊、欧元、比特币)计量
示例:
Get NFT with full metadata:
Use getNFTById with:
- nft_id: "ethereum:0x74ee68a33f6c9f113e22b3b77418b75f85d07d22:10"
- currency: "usd"
结果:完成NFT元数据,包括名称、描述、图像、底价、特征和收集数据。
Get wallet NFT positions:
Use listWalletNFTPositions with:
- address: "0x..."
- filter[trash]: "only_non_trash"
结果:NFT位置具有丰富NFT库显示的元数据。
使用案例:
- NFT图库应用程序
- NFT市场展示
- 收款分析(底价跟踪)
- 基于特征的过滤和稀有性分析
可用功能
钱包和投资组合
- getWallet投资组合:返回web3钱包的投资组合概览。
- listWallet职位:返回钱包头寸列表(支持
filter[positions]=only_complex对于DeFi)。 - 获取钱包图表:返回钱包的投资组合余额图。
- Getwalletpnl:返回web3钱包的损益(PnL)详细信息。
- listWallet交易:返回与钱包关联的交易列表(支持高级过滤器)。
非同质化代币
- getWalletNft投资组合:返回web3钱包的NFT投资组合概述。
- listWalletNFT收藏:返回特定钱包持有的NFT收藏列表。
- listWalletNFT位置:返回特定钱包持有的NFT头寸列表。
- 获取NFTById:通过其唯一标识符返回单个NFT。
- 列表NFT:使用不同的参数返回NFT列表。
Webhooks和实时通知(新增!)
- createTx订阅:创建用于实时交易通知的webhook订阅。
- listTx订阅:列出所有活动事务订阅。
- getTx订阅:按ID获取订阅详细信息。
- 更新订阅:更新订阅地址、回调URL或链筛选器。
- deleteTx订阅:删除交易订阅。
市场数据
- getFungibleById:通过其唯一标识符返回可替换资产。
- getFungibleChart:返回所选期间可替代资产的图表。
- 列表真菌:返回Zerion支持的可替换资产的分页列表。
- 列表天然气价格:提供所有支持的区块链网络中当前天然气价格的实时信息。
- listChains:返回Zerion支持的所有链的列表。
- Getchainbyid:通过其唯一的链标识符返回链。
互换和桥接
- swap真菌:提供可用于桥接交换的替代品列表。
- swap优惠:提供相关交易和过桥交易所的全面概述。
需求
Docker(推荐)
- Docker 20.10或更高版本
- Docker Compose V2
- Zerion API密钥(在这里买一个)
用于原生Python安装
- Python 3.11或更高版本
- Zerion API密钥(在这里买一个)
安装
使用Docker(推荐)
# Clone the repository
git clone https://github.com/SAK1337/myzerionmcp.git
cd myzerionmcp
# Create .env file with your API key
cp .env.example .env
# Edit .env and set ZERION_API_KEY
# Start with Docker Compose
docker-compose up -d
# View logs
docker-compose logs -f
看 医生.md 了解详细的Docker部署指南。
源自源头
# Clone the repository
git clone https://github.com/SAK1337/myzerionmcp.git
cd myzerionmcp
# Install the package
pip install -e .
# For development (includes testing dependencies)
pip install -e ".[dev]"
来自PyPI(发布时)
pip install zerion-mcp-server
快速开始
1.设置API密钥
export ZERION_API_KEY="Bearer your-api-key-here"
2.运行服务器
zerion-mcp-server
3.连接MCP客户端
服务器将启动并监听MCP协议连接。您可以将其连接到Claude Desktop等AI助手。
Claude桌面配置
添加到您的 claude_desktop_config.json:
{
"mcpServers": {
"zerion": {
"command": "zerion-mcp-server",
"env": {
"ZERION_API_KEY": "Bearer your-api-key-here"
}
}
}
}
配置
配置文件
创建一个 config.yaml 工作目录中的文件:
# Server configuration
name: "Zerion API"
base_url: "https://api.zerion.io"
oas_url: "https://raw.githubusercontent.com/smart-mcp-proxy/zerion-mcp-server/main/zerion_mcp_server/openapi_zerion.yaml"
# API authentication
api_key: "${ZERION_API_KEY}" # Environment variable substitution
# Logging configuration
logging:
level: "INFO" # DEBUG, INFO, WARN, ERROR
format: "text" # text or json
看 config.example.yaml 举一个完整的例子。
环境变量
环境变量覆盖配置文件值:
| 变量 | 描述 | 默认值 |
|---|---|---|
ZERION_API_KEY |
Zerion API密钥(必需) | - |
ZERION_BASE_URL |
Zerion API基础URL | https://api.zerion.io |
ZERION_OAS_URL |
OpenAPI规范URL | GitHub原始URL |
CONFIG_PATH |
config.yaml的路径 | ./config.yaml |
LOG_LEVEL |
日志记录级别 | INFO |
LOG_FORMAT |
日志记录格式(text/json) | text |
用法示例
一旦连接到MCP客户端(如Claude),您就可以查询Zerion数据:
投资组合平衡
Get the portfolio balance for wallet 0x1234...
服务器公开了以下工具 getWalletChart, getWalletPositions等等。
DeFi位置
Show me the DeFi positions for address 0xabcd...
NFT集合
List NFTs owned by 0x5678...
所有Zerion API端点都可以自动作为MCP工具使用。请参阅 Zerion API文档 对于可用的操作。
Webhooks-实时交易通知
Zerion MCP服务器现在支持 事务订阅webhooks 用于实时钱包活动监控。这对生产应用程序至关重要,因为webhook消除了低效的轮询,节省了API配额,并启用了亚秒的通知延迟。
为什么要使用Webhooks?
- 速率限制保护:轮询浪费了API配额(免费层每天约5千个请求)。Webhooks仅在事务发生时推送更新。
- 实时:受监控钱包交易时的亚秒级通知
- 可扩展性:监控数百个钱包,无配额浪费
- 成本效益:在付费层(149美元/月Builder)上,webhooks消除了冗余的轮询请求
架构概述
┌──────────────┐
│ AI Client │ (Claude Desktop)
└──────┬───────┘
│ stdio (MCP protocol)
▼
┌──────────────┐
│ MCP Server │ - Manages subscriptions via API calls
└──────┬───────┘
│ HTTPS
▼
┌──────────────┐
│ Zerion API │
└──────┬───────┘
│ Webhooks (HTTP POST)
▼
┌──────────────┐
│ Your HTTP │ - Receives webhook payloads (separate service)
│ Receiver │
└──────────────┘
重要:MCP服务器管理webhook订阅,但不接收webhook有效负载。您必须部署一个单独的HTTP服务来接收来自Zerion的webhook POST请求。
可用工具
createTxSubscription-创建新的webhook订阅listTxSubscriptions-列出所有活动订阅getTxSubscription-按ID获取订阅详细信息updateTxSubscription-更新地址、回调URL或链过滤器deleteTxSubscription-删除订阅
示例:为以太坊地址创建订阅
Use the createTxSubscription tool with:
- addresses: ["0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990"]
- callback_url: "https://webhook.site/your-unique-url"
- chain_ids: ["ethereum", "base"]
这将创建一个订阅,每当指定的地址在以太坊或Base上有交易时,该订阅会向您的回调URL发送webhook通知。
示例:为Solana地址创建订阅
Use the createTxSubscription tool with:
- addresses: ["8BH9pjtgyZDC4iAQH5ZiYDZ1MDWC98xki2V8NzqqKW3K"]
- callback_url: "https://your-server.com/webhooks/zerion"
- chain_ids: ["solana"]
Webhook有效载荷结构
当一个被监控的地址有一个新的事务时,Zerion会向您的回调URL发送一个POST请求,其结构如下:
{
"data": {
"type": "callback",
"id": "bf300927-3f57-4d00-a01a-f7b75bd9b8de",
"attributes": {
"address": "0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990",
"callback_url": "https://webhook.site/test",
"timestamp": "2025-10-16T10:56:50Z"
},
"relationships": {
"subscription": {
"id": "61f13641-443e-4068-932b-c28edeaefd85",
"type": "tx-subscriptions"
}
}
},
"included": [
{
"type": "transactions",
"id": "13de850a-bfa4-54c7-a7bb-fd6371d98894",
"attributes": {
"operation_type": "trade",
"hash": "0x...",
"mined_at": "2025-10-16T10:56:48Z",
"status": "confirmed",
"fee": { ... },
"transfers": [ ... ]
},
"relationships": {
"chain": { "id": "ethereum", "type": "chains" },
"dapp": { "id": "uniswap", "type": "dapps" }
}
}
]
}
这 included 数组包含使用与相同架构的完整事务详细信息 listWalletTransactions 终点。
设置Webhook接收器
选项1:使用webhook.site进行测试(建议用于开发)
- 访问https://webhook.site
- 复制您的唯一URL(例如。,
https://webhook.site/abc-123-def) - 将该URL用作
callback_url创建订阅时 - 在webhook.site页面上实时查看传入的webhooks
选项2:Python Flask接收器(生产)
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/webhooks/zerion', methods=['POST'])
def handle_zerion_webhook():
payload = request.json
# Extract transaction data
callback_data = payload['data']
transactions = payload.get('included', [])
for tx in transactions:
if tx['type'] == 'transactions':
print(f"New transaction: {tx['attributes']['hash']}")
print(f"Operation: {tx['attributes']['operation_type']}")
print(f"Chain: {tx['relationships']['chain']['id']}")
return jsonify({"status": "received"}), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
将其部署到公共服务器(Heroku、Vercel、AWS Lambda等),并使用公共HTTPS URL作为回调。
选项3:Node.js快速接收器
const express = require('express');
const app = express();
app.use(express.json());
app.post('/webhooks/zerion', (req, res) => {
const { data, included } = req.body;
const transactions = included.filter(item => item.type === 'transactions');
transactions.forEach(tx => {
console.log(`New ${tx.attributes.operation_type}: ${tx.attributes.hash}`);
});
res.status(200).json({ status: 'received' });
});
app.listen(8080, () => console.log('Webhook receiver running on port 8080'));
Webhook最佳实践
- 快速响应:Zerion预计响应时间<5秒。异步执行繁重的处理。
- 幂等性:Webhooks可能会多次交付。检查是否存在重复的交易ID。
- 重试策略:Zerion在失败时最多重试3次交付。
- 需要HTTPS:回调URL必须使用HTTPS(不是HTTP)。
- 无保证订单:不要假设webhook交付订单与区块链订单匹配。
安全注意事项
- 签名验证:未来的增强功能-webhook负载签名(查看Zerion文档)
- IP白名单:考虑将webhook接收器限制在Zerion的IP范围内
- 仅限HTTPS:切勿在生产环境中使用HTTP回调URL
Webhooks故障排除
Webhooks未送达
- 检查回调URL是否可公开访问:测试
curl -X POST https://your-url.com - 验证订阅是否处于活动状态:使用
listTxSubscriptions确认订阅存在 - 检查Zerion仪表板:验证API密钥是否具有webhook权限
- 先用webhook.site测试:确认Zerion可以访问您的基础设施
订阅管理的费率限制
- 开发者密钥:有限订阅(1-5)
- 联系api@zerion.io用于企业webhook配额
高级筛选-查询优化
Zerion API支持强大的过滤器参数,这些参数在MCP服务器中已经可用,但通常未得到充分利用。使用过滤器 减少API配额使用, 缩短响应时间,并启用 精确数据查询.
滤波器适用性矩阵
| 筛选器 | 端点 | 用例 |
|---|---|---|
filter[positions] |
getWalletPortfolio, listWalletPositions |
将DeFi头寸与简单余额隔离开来 |
filter[chain_ids] |
listWalletPositions, listWalletTransactions, getWalletChart, listWalletNFTPositions |
仅查询特定区块链 |
filter[trash] |
listWalletPositions, listWalletTransactions, listWalletNFTPositions |
隐藏垃圾邮件/灰尘 |
filter[operation_types] |
listWalletTransactions |
按交易类型筛选(交易、转账、执行) |
filter[position_types] |
listWalletPositions |
按DeFi类别筛选(质押、存款、贷款、奖励) |
filter[fungible_ids] |
listWalletPositions, listWalletTransactions |
仅跟踪特定令牌 |
DeFi位置过滤(only_complex)
问题:默认情况下, listWalletPositions 返回简单的令牌余额。DeFi协议(质押、LP、借贷)被排除在外。
解决方案:使用 filter[positions]=only_complex 得到 仅限DeFi位置.
示例:仅获取DeFi位置
Use listWalletPositions with:
- address: "0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990"
- filter[positions]: "only_complex"
- filter[trash]: "only_non_trash"
- currency: "usd"
结果:返回质押头寸(例如,质押ETH)、流动性池代币(Uniswap、Curve)、借贷头寸(Aave、Compound)和收益农业头寸。不包括简单的ERC-20余额。
用例:
- DeFi分析仪表板
- 机构风险管理(单独跟踪复杂头寸)
- 产量农业跟踪器
- 税务报告的投资组合分类
筛选选项
only_simple(默认):仅钱包类型的头寸(基本代币余额)only_complex:仅支持DeFi协议头寸(质押、LP、借贷)no_filter:简单和复杂的职位
链式过滤(filter[chain_ids])
问题:在所有50多个链中获取位置会浪费配额并返回不相关的数据。
解决方案:使用 filter[chain_ids] 查询特定的区块链。
示例:仅限以太坊+基础
Use listWalletTransactions with:
- address: "0x..."
- filter[chain_ids]: "ethereum,base"
- filter[trash]: "only_non_trash"
结果:仅限于以太坊和Base上的交易。忽略多边形、仲裁、乐观等活动。
示例:单链(乐观主义)
Use listWalletPositions with:
- address: "0x..."
- filter[chain_ids]: "optimism"
用例:
- L2重点分析(基础、乐观、仲裁)
- 跨链比较(以太坊与L2)
- 仅限主网查询
有效的链ID: ethereum, base, optimism, arbitrum, polygon, solana, binance-smart-chain, avalanche, fantom, gnosis等等。使用 listChains 查看所有支持的链。
垃圾邮件过滤(filter[trash])
问题:钱包交易历史被垃圾代币、灰尘和空投骗局污染。
解决方案:使用 filter[trash]=only_non_trash 隐藏垃圾邮件。
示例:清理交易历史记录
Use listWalletTransactions with:
- address: "0x..."
- filter[trash]: "only_non_trash"
- page[size]: 100
结果:干净的交易历史记录,没有垃圾代币或灰尘转移。
筛选选项
only_non_trash:隐藏垃圾邮件/灰尘(建议用于面向用户的应用程序)only_trash:仅显示垃圾邮件/灰尘(用于安全监控)no_filter(默认):显示所有交易
用例:
- 面向用户的钱包(简洁的用户界面)
- 投资组合分析(不包括噪声)
- 税务申报(忽略垃圾邮件空投)
交易类型筛选(filter[operation_types])
问题:需要分析特定的交易类型(例如,仅掉期、仅转账)。
解决方案:使用 filter[operation_types] 以隔离交易类别。
示例:仅交易
Use listWalletTransactions with:
- address: "0x..."
- filter[operation_types]: "trade"
- filter[chain_ids]: "ethereum,base"
结果:只有DEX掉期和交易。不包括转让、批准、合同执行。
可用操作类型
trade:代币交换(Uniswap、1英寸等)transfer:简单的代币转移execute:智能合约交互approve:代币批准deposit:协议存款withdraw:协议撤销
用例:
- 交易分析(交易量、频率)
- 转账跟踪(工资、付款)
- 智能合约交互审计
职位类型筛选(filter[position_types])
问题:DeFi头寸涵盖许多类别(质押、借贷、奖励)。需要隔离特定类型。
解决方案:使用 filter[position_types] 用于粒度DeFi分类。
示例:仅限质押+奖励
Use listWalletPositions with:
- address: "0x..."
- filter[positions]: "only_complex"
- filter[position_types]: "staked,reward"
结果:只有质押资产和可索赔的奖励。不包括LP头寸、贷款和存款。
可用职位类型
wallet:简单平衡deposit:贷款协议存款(Aave、Compound)loan:借入资产staked:质押代币(ETH质押、治理质押)reward:可申请的奖励locked:已授予/锁定的代币margin:保证金交易头寸airdrop:空投资格
用例:
- 质押仪表板
- 收益优化
- 贷款/抵押跟踪
- 奖励收获
查询优化最佳实践
1.使用过滤器减少配额使用
坏 (获取所有数据,在客户端过滤):
- Get all positions for address
- Filter out spam in your app
- Filter to Ethereum-only in your app
成本:返回约1000个职位,响应量大
好 (API级别的过滤器):
Use listWalletPositions with:
- filter[chain_ids]: "ethereum"
- filter[trash]: "only_non_trash"
成本:返回约50个位置,响应减少20倍
2.组合过滤器以提高精度
示例:仅支持DeFi、以太坊、无垃圾邮件
Use listWalletPositions with:
- filter[positions]: "only_complex"
- filter[chain_ids]: "ethereum"
- filter[trash]: "only_non_trash"
- currency: "usd"
- sort: "value"
结果:仅限高价值以太坊DeFi头寸。非常适合风险仪表板。
3.页面大小控制
Use listWalletTransactions with:
- page[size]: 50
- filter[trash]: "only_non_trash"
更小的页面=更快的响应,每个请求的配额更少。
常见过滤器组合
| 用例 | 筛选器 |
|---|---|
| 干净的交易馈送 | filter[trash]=only_non_trash, filter[operation_types]=trade,transfer |
| DeFi风险仪表板 | filter[positions]=only_complex, filter[chain_ids]=ethereum, sort=value |
| L2交易分析 | filter[chain_ids]=base,optimism,arbitrum, filter[operation_types]=trade |
| 质押跟踪器 | filter[positions]=only_complex, filter[position_types]=staked,reward |
| NFT组合(无垃圾邮件) | filter[trash]=only_non_trash 上 listWalletNFTPositions |
分页-获取大结果集
Zerionneneneba API对返回列表(事务、位置、NFT)的端点使用基于游标的分页。MCP服务器提供手动和自动分页支持。
为什么分页很重要
活动钱包可以有 数千笔交易。不分页:
- API配额很快用完(开发人员层:每天约5千个请求)
- 数据不完整(默认页面大小:100个项目)
- 响应速度慢(有效载荷大)
手动分页
所有列表端点支持 page[size] 和 page[after] 参数:
Use listWalletTransactions with:
- address: "0x..."
- page[size]: 100
- filter[trash]: "only_non_trash"
该回复包括 links.next 获取下一页的URL:
{
"data": [...],
"links": {
"next": "https://api.zerion.io/v1/wallets/.../transactions?page[after]=cursor123"
}
}
获取下一页,从以下位置提取光标 links.next 并将其用作 page[after]:
Use listWalletTransactions with:
- address: "0x..."
- page[size]: 100
- page[after]: "cursor123"
继续直到 links.next 不存在(到达最后一页)。
自动分页(Python SDK)
对于程序化访问,使用自动分页帮助程序自动获取所有页面:
from zerion_mcp_server.pagination import fetch_all_pages
from zerion_mcp_server import RetryAsyncClient
# Create client
client = RetryAsyncClient(
base_url="https://api.zerion.io",
headers={"Authorization": "Bearer your-key"}
)
# Define your API call
async def get_transactions(address, **kwargs):
response = await client.get(
f"/v1/wallets/{address}/transactions",
params=kwargs
)
return response.json()
# Fetch all transactions (up to max_pages)
all_transactions = await fetch_all_pages(
api_call=lambda **kw: get_transactions("0x123...", **kw),
max_pages=50, # Safety limit
page_size=100
)
print(f"Total transactions: {len(all_transactions)}")
分页配置
控制分页行为 config.yaml:
pagination:
# Default page size (max: 100)
default_page_size: 100
# Safety limit for auto-pagination
max_auto_pages: 50
计算示例:
- 50页×100个项目=5000个结果(覆盖99%的钱包)
- 消耗了50个API请求(注意您的配额!)
分页最佳实践
1.使用过滤器减少结果
坏 (获取所有内容):
listWalletTransactions:
- address: "0x..."
- page[size]: 100
结果:2000笔交易(20页)
好 (先过滤):
listWalletTransactions:
- address: "0x..."
- filter[chain_ids]: "ethereum"
- filter[trash]: "only_non_trash"
- page[size]: 100
结果:300笔交易(3页)-节省85%的配额!
2.选择合适的页面大小
- 小页面(25-50页):单个请求更快,总请求更多
- **大页面(100)**请求减少,有效载荷增大(推荐)
- 默认:每页100个项目
3.监控自动分页限制
自动分页帮助程序在关键阈值处记录警告:
INFO: Fetched 10 pages - quota impact may be significant
WARNING: Fetched 25 pages - high quota usage
WARNING: Reached max page limit (50) - results may be incomplete
如果你看到“结果可能不完整”,请增加 max_auto_pages 或使用手动分页。
配额影响示例
场景:获取活动钱包的所有交易(5000笔交易)
| 方法 | 请求 | 配额影响(开发人员级别) |
|---|---|---|
| 手册(1页) | 1 | ~0.02%每日配额 |
| 自动分页(50页) | 50 | ~1%的每日配额 |
| 无过滤器(200页) | 200 | ~4%的每日配额 |
外卖:使用过滤器+合理 max_pages 限制以避免配额耗尽。
速率限制-带回退的自动重试
Zerion API根据您的订阅等级强制执行费率限制:
| 级别 | 费率限制 | 每日请求 | 价格 |
|---|---|---|---|
| 开发者 (免费) | 2 RPS | ~5000/天 | 0美元 |
| 建造者 | 50 RPS | 约500000美元/天 | 149美元/月 |
| 专业版 | 150 RPS | 约150万/天 | 599美元/月 |
| 企业 | 定制 | 定制 | 联系销售 |
当您超过配额时,API将返回 429 Too Many Requests 带着一个 Retry-After 头球
自动重试行为
MCP服务器 自动重试 使用具有抖动的指数退避的速率限制请求:
Request → 429 (rate limit)
↓ Wait 1 second
Retry 1 → 429
↓ Wait 2 seconds (exponential backoff)
Retry 2 → 429
↓ Wait 4 seconds
Retry 3 → 200 OK (success!)
您不需要手动处理重试 -服务器透明地处理它们。
重试配置
在中自定义重试行为 config.yaml:
retry_policy:
# Maximum retry attempts before raising error
max_attempts: 5
# Base delay for exponential backoff (seconds)
base_delay: 1
# Maximum delay between retries (seconds)
max_delay: 60
# Exponential backoff multiplier
exponential_base: 2
延迟序列 (指数基=2):
- 重试1:1秒
- 重试2:2秒
- 重试3:4秒
- 重试4:8秒
- 重试5:16秒
总最大等待时间:~31秒(如果需要所有重试)。
速率限制错误消息
如果重试次数用尽,您将看到一个可操作的错误:
RateLimitError: Rate limit exceeded after 5 retry attempts.
Retry after 60 seconds. Consider upgrading tier or reducing
request frequency. See: https://zerion.io/pricing
下一步行动:
- 等待
retry_after持续时间(来自错误消息) - 降低应用程序中的请求频率
- 如果需要,升级到更高的级别
限速最佳实践
1.使用Webhooks而不是轮询
坏 (投票):
# Check for new transactions every 10 seconds
while True:
transactions = get_transactions(address)
time.sleep(10)
成本:8640个请求/天(超过开发人员层配额!)
好 (webhooks):
# Webhook delivers new transactions as they happen
# 0 polling requests, only create subscription once
create_webhook_subscription(addresses=[address])
成本:共1个请求🎯
2.实现客户端缓存
from functools import lru_cache
import time
@lru_cache(maxsize=100)
def get_portfolio(address, ttl_hash):
return fetch_wallet_portfolio(address)
# Cache for 5 minutes
def get_ttl_hash(seconds=300):
return round(time.time() / seconds)
# Usage
portfolio = get_portfolio(address, get_ttl_hash())
3.使用过滤器减少数据量
更小的响应=更快的处理=更少的超时重试:
Use listWalletTransactions with:
- filter[chain_ids]: "ethereum"
- filter[trash]: "only_non_trash"
- page[size]: 50
监控速率限制状态
服务器记录速率限制事件:
WARNING: Rate limit exceeded (url=/v1/wallets/.../transactions, retry_after=30s)
INFO: Retrying request after rate limit (attempt=2)
INFO: Request succeeded after 2 retry attempts
启用 调试 登录以查看详细的重试信息:
logging:
level: "DEBUG"
禁用自动重试
要禁用自动重试(例如,用于测试):
retry_policy:
max_attempts: 0 # Disable retries
现在 429 反应将立即提高 RateLimitError.
错误处理-202已接受(钱包索引)
当您查询 新创建的钱包 (第一次请求该地址),Zerion可能会返回 202 Accepted 而不是 200 OK这意味着:
“钱包正在被索引。数据将在2-10秒内准备就绪。”
自动202重试
MCP服务器 自动重试 202 具有固定延迟的响应:
Request → 202 Accepted (indexing...)
↓ Wait 3 seconds
Retry 1 → 202 Accepted (still indexing...)
↓ Wait 3 seconds
Retry 2 → 200 OK (indexing complete!)
你看不见 202 回应 -服务器透明地处理它们。
202什么时候发生?
- 首次请求新的钱包地址:Zerion尚未将其编入索引
- 最近创建的链上钱包:区块链已确认,Zerion索引正在进行中
- 罕见边缘案例:Zerion的索引服务负载过重
典型索引时间2-10秒(通常为3-5秒)。
202配置
在中自定义重试行为 config.yaml:
wallet_indexing:
# Delay between retries (seconds)
retry_delay: 3
# Maximum retry attempts
max_retries: 3
# Automatically retry (recommended: true)
auto_retry: true
总等待时间: retry_delay × max_retries (例如3s×3=9秒)。
202错误消息
如果索引在最大重试次数后超时:
WalletIndexingError: Wallet is still being indexed by Zerion.
Tried 3 times over 9 seconds. Please retry in 30-60 seconds.
下一步行动:
- 等待30-60秒,让Zerion完成索引
- 重试您的请求
- 如果问题仍然存在,请联系api@zerion.io
禁用202自动重试
要禁用自动重试(例如,用于即时反馈):
wallet_indexing:
auto_retry: false
现在 202 回复将立即提出:
WalletIndexingError: Wallet indexing in progress. This is a
new wallet address for Zerion. Enable auto_retry in
configuration or wait and retry manually.
202日志记录
服务器记录索引事件:
INFO: Wallet indexing in progress, will retry (retry_delay=3s, max_retries=3)
INFO: Retrying wallet indexing request (attempt=1/3)
INFO: Wallet indexing completed successfully (attempts=2, total_wait=6s)
或者,如果超时:
WARNING: Wallet indexing timeout (attempts=3, total_wait=9s)
排除202个错误
“重试3次后索引超时”
原因:钱包索引时间比预期的要长(>9秒)。
解决方案:
-
增加
max_retries或retry_delay:wallet_indexing: retry_delay: 5 max_retries: 5新的总等待时间:5s×5=25秒
-
等待1-2分钟,然后手动重试
“这是一个新的钱包地址”
原因:首次向钱包发出请求的正常行为。
解决方案:如果出现以下情况,则无需采取任何行动 auto_retry: true (默认)。服务器将自动重试。
测试网支持
某些Zerion API端点通过 X-Env 标头参数。这允许开发人员在部署到主网之前在测试网上测试应用程序。
支持的测试网端点
以下端点接受 X-Env 头球
listWalletPositions-在测试网上获取钱包位置getWalletPortfolio-获取测试网钱包的投资组合数据listWalletTransactions-获取测试网交易历史记录listWalletNFTPositions-获取测试网上的NFT位置listWalletNFTCollections-在测试网上列出NFT集合getWalletNftPortfolio-获取测试网的NFT产品组合listFungibles-在测试网上列出可替代资产getFungibleById-在测试网上获取特定的替代品listChains-列表链(包括测试网)
使用测试网数据
要查询测试网数据,请包括 X-Env: testnet 调用支持的终结点时:
Use listWalletPositions with:
- address: "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"
- X-Env: "testnet"
- currency: "usd"
这将返回测试网链上指定地址的位置(例如以太坊Sepolia、Monad testnet)。
测试网API访问
重要:测试网访问可能需要特殊的API证书或特定的层访问。检查您的API关键功能:
- 联系api@zerion.io用于测试网API访问
- 验证您的层是否包括测试网支持
- 某些测试网络的数据可用性可能有限
测试网开发工作流程
测试网优先开发的推荐工作流程:
- 在测试网上创建测试钱包 (例如,波兰)
- 使用测试网代币进行投资 (使用水龙头)
- 测试MCP工具 随着
X-Env: testnet - 验证数据准确性 在测试网上
- 部署到主网 验证后
示例-测试投资组合提取:
# Test on Sepolia first
Use getWalletPortfolio with:
- address: "0x..."
- X-Env: "testnet"
- currency: "usd"
# Then move to mainnet
Use getWalletPortfolio with:
- address: "0x..."
- currency: "usd"
支持的测试网链
使用 listChains 随着 X-Env: testnet 查看所有可用的测试网链。常见的测试网络包括:
- 以太坊sepolia (
sepolia) - Monad测试网 (
monad-testnet) - 基础Sepolia (
base-sepolia) - 乐观Sepolia (
optimism-sepolia) - 杨梅 (
arbitrum-sepolia)
备注:测试网链的可用性可能会有所不同。使用 listChains endpoint获取当前列表。
测试网限制
- 数据新鲜度:测试网索引可能比主网慢
- 历史数据:一些测试网的历史数据有限
- 协议覆盖范围:并非所有DeFi协议都部署在测试网上
- 价格数据:测试网代币通常没有市场价格
多币种支持
Zerion API支持多种货币的价格面额。您可以请求美元、ETH、欧元或BTC的投资组合价值、头寸价格和图表。
支持的货币
| 货币 | 代码 | 用例 |
|---|---|---|
| 美元 | usd |
默认值,最常见于普通用户 |
| 以太坊 | eth |
DeFi分析,ETH原生社区 |
| 欧元 | eur |
欧洲用户,欧盟合规要求 |
| 比特币 | btc |
比特币至上主义观点 |
货币兼容端点
这 currency 这些端点支持参数:
getWalletPortfolio-指定货币的投资组合总价值listWalletPositions-以指定货币表示的头寸值getWalletChart-指定货币的历史余额表getWalletPNL-以指定货币计算损益getFungibleChart-指定货币的资产价格图表
使用不同的货币
美元(默认):
Use getWalletPortfolio with:
- address: "0x..."
- currency: "usd"
ETH面额:
Use getWalletPortfolio with:
- address: "0x..."
- currency: "eth"
这将以ETH返回投资组合价值。例如,如果一个钱包价值10000美元,ETH为2000美元,则价值将显示为5个ETH。
欧元面额:
Use listWalletPositions with:
- address: "0x..."
- currency: "eur"
- filter[chain_ids]: "ethereum"
所有头寸价值将以欧元而非美元显示。
BTC面额:
Use getWalletChart with:
- address: "0x..."
- currency: "btc"
- period: "month"
历史投资组合价值将以BTC等值显示。
货币参数行为
默认行为:如果 currency 参数被省略,默认使用美元。
受影响的价格字段:货币参数影响:
attributes.value-总价值attributes.price-单项资产价格attributes.changes-价值随时间变化attributes.floor_price-NFT底价(如适用)
汇率:Zerion使用实时汇率进行货币转换。费率会不断更新。
多币种示例
示例1:ETH中的DeFi投资组合
Use listWalletPositions with:
- address: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
- filter[positions]: "only_complex"
- currency: "eth"
结果:所有DeFi头寸值均以ETH面额显示。
示例2:欧洲用户组合
Use getWalletPortfolio with:
- address: "0x..."
- currency: "eur"
结果:投资组合价值和所有资产价格(欧元)。
示例3:BTC的历史表现
Use getWalletChart with:
- address: "0x..."
- currency: "btc"
- period: "year"
结果:以BTC计价的全年投资组合绩效图。
货币最佳实践
- 在一般应用中使用美元 -大多数用户期望美元定价
- 将ETH用于DeFi仪表板 -DeFi用户经常用ETH来思考
- 使用欧元进行欧盟合规 -某些欧洲监管报告需要
- 将BTC用于比特币社区 -与以比特币为中心的世界观相一致
发展
设置开发环境
# Clone and install with dev dependencies
git clone https://github.com/SAK1337/myzerionmcp.git
cd myzerionmcp
pip install -e ".[dev]"
# Set up API key
export ZERION_API_KEY="Bearer your-test-key"
运行测试
# Run all tests
pytest
# Run with coverage
pytest --cov=zerion_mcp_server --cov-report=html
# Run specific test file
pytest tests/test_config.py
# Run with verbose output
pytest -v
代码质量
# Type checking (if mypy is installed)
mypy zerion_mcp_server
# Linting (if ruff is installed)
ruff check zerion_mcp_server
故障排除
常见问题
“配置错误:缺少必需的配置:api_key”
解决方案:设置 ZERION_API_KEY 环境变量:
export ZERION_API_KEY="Bearer your-api-key-here"
“加载OpenAPI规范超时”
解决方案:检查您的互联网连接。服务器需要从GitHub下载OpenAPI规范。
“未经授权:API密钥无效或丢失”
解决方案:验证您的API密钥是否正确,并包含“Bearer”前缀:
export ZERION_API_KEY="Bearer your-actual-key"
“超出费率限制”
解决方案:等待速率限制窗口重置。检查以下错误消息 retry_after_sec 价值。
调试模式
启用调试日志记录以获取详细信息:
export LOG_LEVEL="DEBUG"
zerion-mcp-server
或在 config.yaml:
logging:
level: "DEBUG"
format: "json" # Structured logs for analysis
测井解释
- 信息:正常运行(启动、请求)
- 警告:潜在问题(运行缓慢)
- 错误:故障(API错误、网络问题)
- 调试:详细跟踪(请求/响应机构)
建筑
┌─────────────────┐
│ MCP Client │ (e.g., Claude Desktop)
│ (AI Assistant) │
└────────┬────────┘
│ MCP Protocol
│
┌────────▼────────┐
│ FastMCP Server │
│ │
│ ┌───────────┐ │
│ │ Config │ │ (YAML + Env)
│ │ Manager │ │
│ └───────────┘ │
│ │
│ ┌───────────┐ │
│ │ Logger │ │ (Structured)
│ └───────────┘ │
│ │
│ ┌───────────┐ │
│ │ Error │ │ (Custom Exceptions)
│ │ Handler │ │
│ └───────────┘ │
│ │
│ ┌───────────┐ │
│ │ HTTP │ │ (httpx AsyncClient)
│ │ Client │ │
│ └─────┬─────┘ │
└────────┼────────┘
│
│ HTTPS
│
┌────────▼────────┐
│ Zerion API │
│ │
│ - Portfolios │
│ - DeFi │
│ - NFTs │
│ - Transactions │
└─────────────────┘
技术栈
- Python 3.11+:核心语言
- FastMCP:具有OpenAPI集成的MCP服务器框架
- httpx:异步HTTP客户端
- Yaml:配置解析
- 测试:测试框架
贡献
欢迎投稿!请遵循以下指南:
- 分叉存储库
- 创建要素分支:
git checkout -b feature/your-feature - 编写测试 对于您的更改
- 确保测试通过:
pytest - 提交拉取请求
开发工作流程
- 遵循PEP 8风格指南
- 向函数签名添加类型提示
- 为模块和函数编写文档字符串
- 更新任何代码更改的测试
- 保持提交的重点和原子性
许可证
MIT许可证-请参阅 许可证 详细信息文件
支持
- 问题: GitHub问题
- Zerion API文档: developers.serion.io
- MCP规范: 模型上下文协议.io
更新日志
看 更改日志.md 查看版本历史记录和更改