NFT Data MCP
NFT Data MCP 是一个已发布的 MCP 服务器(npm 包名 nftdata-mcp),为 AI 代理提供一个工具 get_collection_data。给定一个 OpenSea 合集 slug,它会从 NFT Data API 返回该合集市场数据的结构化快照。每次成功的非缓存调用都会自动在 Base 主网上用 USDC 支付。
官方资源:
- 仓库:https://github.com/Nomad07/nftdata-mcp
- npm:https://www.npmjs.com/package/nftdata-mcp
- API 文档:https://www.nftdata.app/docs
- MCP 服务器文档:https://www.nftdata.app/docs/mcp
何时使用此技能
当用户想了解一个或多个在 OpenSea 上列出的特定 NFT 合集的当前市场统计数据时使用,例如:
- 合集的地板价
- 过去 24 小时、7 天、30 天或整个历史时期的销售数量和交易量
- 合集的合约地址和链
- 总供应量、唯一持有者数量或创建日期
- 多个合集的并排比较
请勿将其用于下文“限制”中列出的范围之外的任何用途。
先决条件:MCP 服务器必须已设置完毕
此技能不安装或配置任何东西。nftdata-mcp 服务器必须已在用户的 MCP 客户端中运行,并且 get_collection_data 工具必须可用。
如果该工具不可用:
- 告知用户 NFT Data MCP 服务器未连接。
- 引导他们查看设置指南 https://www.nftdata.app/docs/mcp 或 README https://github.com/Nomad07/nftdata-mcp。
- 停止。不要尝试绕过它,也不要要求用户将私钥粘贴到对话中(参见“钱包安全”)。
作为参考,该服务器由用户在自己的机器上配置,使用类似这样的 stdio MCP 配置(密钥保留在用户的本地配置中,绝不会与代理共享):
{
"mcpServers": {
"nftdata": {
"command": "npx",
"args": ["-y", "[email protected]"],
"env": {
"EVM_PRIVATE_KEY": "<由用户在本地设置>"
}
}
}
}
要求:Node.js 20 或更高版本,支持 stdio 服务器的 MCP 客户端,以及一个在 Base 主网上持有少量 USDC 的专用 EVM 钱包。
工具:get_collection_data
该服务器只暴露一个工具。
输入
{ "collection": "azuki" }
collection(字符串,必需):OpenSea 合集 slug。它是合集 OpenSea URL 的最后部分:opensea.io/collection/<slug>。- 服务器会修剪并将 slug 转换为小写。它必须由字母或数字开头,并且仅包含小写字母、数字、
-和_(最多 100 个字符)。任何其他内容都会在发起请求或支付之前被拒绝。 - 只接受 slug。合集显示名称、合约地址、代币 ID、钱包地址和完整 URL 都不是有效输入。如果用户提供 URL,请从中提取 slug。如果用户只提供名称,请询问 slug 或 OpenSea URL;不要猜测。
输出
一个 JSON 对象(以文本形式返回),包含以下字段。对于新付费调用,服务器会在 JSON 后附加两行:Payment: 0x...(交易哈希)和 Verify: https://basescan.org/tx/0x...。缓存的结果不包括这些行。阅读 JSON 部分以获取数据,并将这两行视为支付收据。
| 字段 | 含义 |
|---|---|
name | 合集显示名称 |
slug | OpenSea 合集 slug |
contracts | { "address", "chain" } 对象数组 |
floor_price | 当前地板价(数字) |
floor_price_currency | 地板价的货币(例如 ETH、USDC、HYPE) |
one_day_sales、seven_day_sales、thirty_day_sales | 过去 24 小时、7 天、30 天的销售数量 |
one_day_volume、seven_day_volume、thirty_day_volume | 这些时间段的交易量 |
one_day_volume_currency、seven_day_volume_currency、thirty_day_volume_currency | 每个交易量的货币 |
total_sales、total_volume | 整个历史时期的销售数量和交易量 |
total_volume_currency | 整个历史时期交易量的货币 |
num_owners | 唯一持有者数量 |
total_supply | 合集代币总数量 |
created_date | 合集创建日期(ISO 8601 日期,例如 2022-01-12) |
数据来自 OpenSea API 并按原样返回。这是一个时间点快照,而非时间序列。
示例响应(历史数据,非实时数据)
{
"name": "Azuki",
"slug": "azuki",
"contracts": [{ "address": "0xed5af388653567af2f388e6224dc7c4b3241c544", "chain": "ethereum" }],
"floor_price": 0.49328599,
"floor_price_currency": "ETH",
"one_day_sales": 21,
"one_day_volume": 10.150091000000002,
"seven_day_sales": 163,
"seven_day_volume": 96.67526161112121,
"thirty_day_sales": 471,
"thirty_day_volume": 325.72023569476767,
"total_sales": 93156,
"total_volume": 831992.6461159982,
"num_owners": 4394,
"total_supply": 10000,
"created_date": "2022-01-12",
"one_day_volume_currency": "ETH",
"seven_day_volume_currency": "ETH",
"thirty_day_volume_currency": "ETH",
"total_volume_currency": "ETH"
}
解释和比较结果
遵循以下规则,确保答案忠实于数据:
- 只报告返回的内容。 如果某个字段缺失或为
null(例如total_supply、created_date或交易量货币),请说明该字段不可用。切勿凭空捏造值,也不要在未经说明的情况下从记忆或其他来源填补空缺。 - 缺失值不等于零。
null或缺失的字段意味着“未知”。返回的0意味着零。不要将两者等同对待,也不要在求和或平均值中将未知值当作零处理。 - 始终将数值与其货币配对。 读取
floor_price_currency和每个*_volume_currency字段。不同合集的货币可能不同(ETH、USDC、HYPE等)。除非响应中明确指出,否则切勿将价格标为 ETH 或 USD。 - 不要在算术或排名中混合使用不同货币。 该工具不提供汇率。比较合集时,只有在其货币字段匹配的情况下才直接比较数值。如果货币不同,请用各自货币显示每个值,并说明直接比较需要数据中未包含的换算。
- 标记衍生数字。 你计算出的数字,例如平均销售价格(交易量除以销售数量,仅在销售数量大于 0 且交易量货币已知时计算)或过去 30 天交易量占整个历史时期交易量的份额,都是你自己的计算结果。请说明它们是衍生值,并显示计算输入。
- 保留链的上下文。
contracts[].chain显示了合集所在的区块链。一个合集可能列出多个合约。不要假设只有一个链或一个合约。 - 不要过度解读。 数据是一次查询的快照。不要描述趋势、势头、“好”或“坏”的价格,或提供投资建议。你可以指出不同时间段之间的明显差异(例如 7 天交易量大于 24 小时交易量),而无需做出任何预测。
- 说明数据获取的时间。 市场数据不断变化。如果在对话中重复使用了某个结果,请提醒用户这是一个快照。
- 注意舍入。 原始值有多个小数位。为便于阅读,你可以进行舍入,但不要更改源数字,也不要在数据未提供的精度上暗示更多精确性。
当被要求更改呈现方式(摘要、表格、报告、比较)时,重新格式化相同的值,但不做任何修改。
成本感知使用
- 每次非缓存调用花费 $0.002 USDC。结果按 slug 缓存 5 分钟;在此窗口内再次请求相同的 slug 是免费的,并返回缓存的数据,不附带新的支付收据。
- 相同的并发调用共享一个请求,因此重复查找不会重复支付。
- 服务器限制每个会话的付费调用次数(
NFTDATA_MAX_REQUESTS,默认 100,最多 1000)。不要在循环中或为推测性查询而调用该工具。对于比较,请求每个合集一次。 - 在大量请求(例如超过几个合集)之前,告知用户需要多少次调用以及总成本,并获得用户的同意。
- 不要自动重试失败的调用。服务器本身从不重试,并且超时后可能已经签署了支付。报告失败,让用户决定。
处理错误
| 情况 | 处理方式 |
|---|---|
| 无效 slug 消息 | 对照 OpenSea URL 检查 slug;要求用户确认。未产生支付。 |
| “未找到合集” | slug 与 OpenSea 上的任何合集都不匹配。要求用户提供正确的 slug 或 URL。 |
| 速率限制消息(带有延迟秒数) | 等待指定的时间后再试,并告知用户。 |
| “安全策略拒绝支付” | 服务器在签署前拒绝了支付条款。报告该情况;不要试图绕过它。 |
| “支付未被接受” | API 未接受支付。报告该情况;不要自行重试。 |
| “已达到付费请求限制...” | 达到了会话消费上限。用户必须重启客户端或提高 NFTDATA_MAX_REQUESTS。 |
| 超时 | 可能已经授权了支付但未重试。告知用户;仅在用户同意的情况下提供重试选项。 |
| 通用“请求失败。” | 将其报告为故障。不要猜测原因。 |
示例提示
- “使用 NFT Data MCP 服务器。
azuki合集的地板价是多少?” - “获取
basedpunks的市场统计数据:地板价、24 小时、7 天和 30 天的销售与交易量、供应量和持有者。” - “
milady在 OpenSea 上使用的是哪个合约地址和链?” - “比较
azuki和basedpunks的地板价和 30 天交易量。仅比较使用相同货币的数值。” - “这是 OpenSea 链接:https://opensea.io/collection/azuki。将该合集总结为一份简短报告。”
- “显示
azuki的原始 JSON 响应并解释每个字段。” - “
azuki的持有者数量与其总供应量相比如何?”(是一个衍生比例,因此要标记为衍生值)
支付详情
- 价格: 每次成功的非缓存调用 $0.002 USDC。
- 网络: 仅限 Base 主网(
eip155:8453),使用 USDC(0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913)支付。无论查询的合集在哪个区块链上,支付网络都是 Base 主网。查询其他链(包括在 OpenSea 上列出的 Solana 合集)的合集,仍然在 Base 主网上支付。 - 默认协议:x402 v2。 服务器在 Base 主网上支付一个
exact金额的 USDC 挑战。 - 可选协议:MPP
evm/charge。 仅在服务器启动时设置了NFTDATA_PAYMENT_PROTOCOL=mpp才会被选择。支付相同价格,在 Base 主网上使用 USDC。 - 每次服务器运行一个协议,无回退。 协议在服务器启动时选择一次。服务器绝不会从一个协议切换到另一个协议,绝不会为单次调用尝试两个协议,也绝不会使用另一个协议重试。如果 API 在所选协议下未提供可接受的支付方式,则不会签署任何内容,调用失败。无效的
NFTDATA_PAYMENT_PROTOCOL值(非空、x402或mpp的任何值)会在启动时停止服务器。 - 签署前检查: 服务器在签署任何内容之前会验证网络、代币、方案或方法、精确金额(2000 个原子单位,即 $0.002)以及官方收款地址。不匹配的挑战将被拒绝。
- 每次工具调用最多一次支付尝试。
- 缓存命中免费。 它们不会触发支付,也不包含交易哈希。
- 收据: 每次新付费的成功调用都包含一个交易哈希和一个 BaseScan 链接,用户可以打开该链接来验证支付。
- 不要将服务器与主 API 混淆。 NFT Data API 本身接受 Base 主网和 Solana 主网上的 x402 v2,以及 Base 主网上的 MPP
evm/charge。此 MCP 服务器范围更窄:它仅在 Base 主网上支付,使用 x402 v2 或 MPPevm/charge,一次只使用一个。MCP 服务器不支持 Solana 支付。
钱包安全
- 切勿要求用户在对话中分享、粘贴、输入或发送私钥、助记词或钱包文件,也切勿要求用户提供私钥来“设置”或“修复”服务器。密钥只能由用户在本地 MCP 服务器的环境变量(
EVM_PRIVATE_KEY)中设置。 - 不要读取、打印、复制或总结可能包含密钥的配置文件或环境变量。
- 如果用户无论如何都将私钥粘贴到了聊天中,不要重复它或使用它。告知用户停止使用该钱包,将所有资金转移到新钱包,并更换密钥。
- 建议使用专用钱包,该钱包仅在 Base 主网上持有少量 USDC 余额,切勿使用主钱包或持有大量资金的钱包。
- 鼓励用户使用收据中的交易哈希在 BaseScan 上验证支付。
- 切勿建议将资金发送到你未从用户自己的钱包或官方文档中获得的地址。
限制
此技能和服务器是只读的合集数据查询工具。它们不是:
- 通用的 NFT 搜索或发现工具:不支持按名称、特征、稀有度、价格范围或排名搜索,也不提供“顶级”或“趋势”合集列表
- 代币级别的工具:不支持单个 NFT、代币 ID、元数据、稀有度或持有者查询
- 钱包工具:不支持钱包余额、持仓、投资组合或交易历史
- 交易或转账工具:不能购买、出售、挂单、竞价、铸造、转移、桥接或交换任何东西,并且除了每次调用的小额支付外,绝不转移资金
- 历史或实时数据流:每次调用返回一个快照,没有价格历史或流式更新
- 价格预言机或顾问:不支持货币换算、估值、预测或投资建议
其他限制:
- 只能查询存在于 OpenSea 上的合集,输入必须是 OpenSea slug。
- 某些合集的部分字段可能缺失或为
null。 - 数据来自 OpenSea 并按其返回方式报告。它反映了查询时该合集的平台范围统计信息。
- 不支持按名称、代币 ID、钱包地址或特征进行搜索。
- 如果 slug 无效、合集未被索引或支付失败,可能会出错。
- 如果用户在基于文本的界面中工作,Markdown 表格和格式可能会被截断;优先使用简洁的摘要格式。
有关 API 本身(包括速率限制和可用性)的问题,请参阅官方 NFT Data API 文档:https://www.nftdata.app/docs