面向 AI 智能体的加密 MCP 服务器
AI 智能体连接后会发现十一个工具,阅读它们的描述来了解有哪些数据,然后自行组合请求。无需构造 URL,也无需解析 REST 模式。
服务器通过 HTTP 传输使用 MCP 协议。它用你的密钥把每次调用转发给 API,沿用 API 的名称、单位和约定,并以面向AI 智能体的方式呈现结果:紧凑的行、每个序列的摘要、有上限的响应大小。
#将你的 AI 连接到加密货币 MCP 服务器
一个 URL 和一个请求头。服务器默认关闭:没有有效的 X-API-KEY 时,不会公布任何工具,所有请求都以 401 拒绝(缺少请求头时为 X-Deny-Reason: missing_api_key,密钥未知或已吊销时为 invalid_api_key)。
{
"mcpServers": {
"bytnode": {
"type": "http",
"url": "https://api.bytnode.com/mcp",
"headers": { "X-API-KEY": "your_key" }
}
}
}配置文件的具体格式取决于 AI 智能体,上面的通用代码块并不适用于所有客户端:Claude Desktop、ChatGPT 和 Gemini CLI 的读取方式不同。MCP 服务器页面为每个客户端提供可直接粘贴的配置:Claude Desktop、Claude Code、ChatGPT、Cursor、Codex、VS Code、LangChain、n8n 等。
传输为无会话的 Streamable HTTP:每个请求自成一体。serverInfo.version 为 MCP 接口的版本(1.0.0)——包括其工具、说明和响应形式——,与 API 契约的版本(1.0.2)不同;每个响应都会在 mcp_version 中重复它。有些客户端会保留连接时收到的工具定义:当 mcp_version 变化时(新的主版本表示需要适配的变更),请重新连接连接器以加载新的定义。能力声明只包含实际存在的内容——工具和资源,没有 listChanged 通知——未知资源返回 JSON-RPC 错误 -32002。/mcp 开放 CORS:在浏览器中运行的 MCP 客户端可以连接。通过 OAuth 登录的连接器(claude.ai、ChatGPT、Claude Code)无需密钥:不带密钥的请求会收到 401 以及 WWW-Authenticate: Bearer resource_metadata=…,它指向授权服务器 bytnode.com,您在那里批准连接。否则,密钥放在 X-API-KEY 请求头中,或作为 Authorization: Bearer 发送。 无需密钥,服务器卡片 https://api.bytnode.com/.well-known/mcp/server-card.json 描述了完整的接口(工具、资源、版本、认证方式),/mcp/server.json 是其在官方 MCP 注册表中的条目。
#十一个加密市场数据工具
十一个工具均为只读、无副作用且幂等:AI 智能体可以放心重放。五个数据工具各有一个目标——交易对、资产、全市场、宏观、链上——用法相同:fields(要返回的字段名)、limit、since_ms / until_ms、last、columns、detail 和 max_tokens(详见 get_pair_data)在每个工具中含义一致,每个响应都带有 server_time 和 response_tokens;它们的通用约定——模式、窗口、摘要、单位、大小预算——写在服务器的说明(instructions)中,连接时发送一次,而不是在每个描述中重复。rank_pairs 按一个指标为所有交易对排名,read_export 读取因预算被截断的响应的其余部分。
get_system_info
你的方案,以及按需提供的已服务交易对、数据新鲜度和AI 智能体定位字段所需的目录。它总是返回服务健康状况和 plan:你的密钥所属的方案——市场数据族、各周期的历史深度、速率限制和剩余配额——且不计入配额。include 可补充实时交易对列表和/或新鲜度摘要,freshness_fields 补充指定字段的新鲜度,catalogs 补充 get_macro_data 所需的序列或某个交易对的能力。每请求一部分计一个请求。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
include | string[] | — | 可选 symbols(实时的已服务交易对列表)和 freshness(数据新鲜度摘要:state、stale_fields、stale_feeds),可同时选择。 |
freshness_fields | string[] | — | 需要了解新鲜度的字段名(任一数据工具的字段):每个字段给出 age_s 和 is_stale。隐含 freshness。 |
catalogs | string[] | — | 可选 macro_series 和 macro_intraday_series(get_macro_data 的序列,后者附带其周期)、symbol_capabilities,可同时多个。 |
symbol | string | — | symbol_capabilities 必需:在请求之前了解哪些数据流在运行、哪些指标可用或受阻。 |
category | string | — | 过滤 macro_series 目录。 |
get_pair_brief
一次调用获取交易对的状态,形式始终相同,无需选择字段:price_change(价格及其滚动涨跌幅)、funding_next、最新的 basis、最近一个已收盘 1h 时间桶的 oi(含 oi_usd)和 cvd、以单个对象给出的最近 24 小时清算(liquidations_24h:from 和 to 为第一个和最后一个 1h 时间桶的起点,以及 long_usd、short_usd、total_usd、bucket_count)以及恐惧与贪婪指数(fear_greed)。每个值都是扁平对象:无需读取序列,也无需在 summary 中查找合计。每个交易对约消耗一个配额请求,另加一个。其他需求——其他字段、历史、其他步长——请用 get_pair_data。它读取的是当前值:Free 方案没有 snapshot 市场数据族,因此会被拒绝,可改用带 last: "1h" 的 get_pair_data 获取最新的数据点。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
symbol | string[] | — | 必填:一个交易对,例如 BTCUSDT,或最多 10 个交易对的列表以便比较;多个交易对时,每个键前加上其交易对(BTCUSDT/funding_next),全市场的 fear_greed 只返回一次。 |
get_pair_data
单个交易对的市场数据,也可在一次调用中比较最多十个交易对:价格与 K 线、成交、订单簿与订单流、衍生品(未平仓量、资金费率、基差、清算)以及代币经济。一次调用、多个字段,当前值或带日期的历史。由 REST 快照提供的字段每个交易对共用一个请求;其他字段(例如大额成交)走各自的路由,并行执行。fields 列出要返回的字段,limit 指定每个序列返回最近多少个点。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
symbol | string[] | — | 必填:交易对,例如 BTCUSDT,或最多 10 个交易对的列表以便比较:请求按交易对计数,每个键变为 交易对/字段(ETHUSDT/funding_next),某个交易对被拒绝不影响其他交易对(errors、partial)。实时列表由 get_system_info 提供。 |
fields | string[] | — | 必填:要返回的字段,每次调用可多个,取自本工具的 24 个名称(见下文)。属于其他工具的字段会被拒绝,并指出其所属工具。 |
limit | integer | — | 每个序列最近的 N 个点;默认为最新一个(指定周期时为最近 N 个时间桶)。只有当前值的字段(如 price_change)返回一个点;超过字段自身上限(序列为 1000,逐笔成交为 10000)的 limit 会被截到上限,并在 warnings 中说明。带窗口时,它是每个序列的点数上限。describe_fields 说明 N 的含义。 |
timeframe | string | 1h | 标有 timeframe 的字段的周期。省略时:当前值为 1h;历史模式下,选择约 200 个点的步长。1w 仅限 klines。 |
live | boolean | false | 仅限当前值:追加正在形成的 K 线,标记为 is_closed: false。 |
since_ms / until_ms | string | — | 日期窗口的边界:Unix 毫秒、ISO 8601 日期(2026-10-20T00:00:00Z;不带时区即为 UTC)或距今的时长('48h'、'30d';单位 m、h、d、w)。一旦提供,每个请求的字段都返回其历史。 |
last | string | — | 以完整的已收盘时间桶返回给定时长('48h'、'30d')内的历史:since_ms 会回退到其时间桶的起点,因此在 1h 下 last: '7d' 返回 168 根 K 线,而 since_ms: '7d' 返回 167 根。它取代 since_ms(两者同时提供会被拒绝);until_ms 可指定其结束时间。 |
min_usd | number | — | trades_large(默认 100,000,最低 1,000)和 liquidations_events 的美元阈值。 |
market | string | all | cvd、buy_sell_ratio、trades_avg_size 和 orderbook 的市场:all(现货 + 永续合约)、spot 或 futures。工具会将其转换为该市场对应的路由。 |
columns | string | — | 每行要保留的列,以列表给出(如 ["close", "volume"];也接受 CSV 字符串),嵌套字段用点号表示——相当于 REST API 的 ?fields=(在这里,fields 指定的是数据字段)。按字段应用:至少存在于一个所请求字段中的列,会在其存在的字段上应用,并在 warnings 中说明在哪里被忽略;所有字段都不认识的列会被拒绝,并附带建议。优先于 detail。 |
detail | string | compact | compact:重型行只保留主要列,所有行都已收盘时去掉 is_closed,并去掉成交 ID;omitted_columns 说明省略了哪些列。full:返回全部列。 |
max_tokens | integer | 6000 | 响应预算,以估算的 token 计,范围 1,500 到 16,000(默认 6,000)。每个数据工具、get_market_indicators、rank_pairs 和 read_export 都有同样的参数。 |
get_options_data
单个资产的期权和现货 ETF:期权摘要、未平仓量、成交量、看跌/看涨比率、隐含波动率、最大痛点、希腊值、按行权价的未平仓量,以及 etf_fundamentals(按发行方的现货 ETF 向 SEC 提交的季度申报数据;不含每日资金流)。expiries: true 会补充各有效到期日,并按到期日给出看涨和看跌未平仓量、看跌/看涨比率、最大痛点、主要行权价和平值隐含波动率;options_summary 和 options_put_call_ratio 是所有到期日的合计。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
asset | string | — | 必填:只填资产,例如 BTC,绝不是交易对。 |
fields | string[] | — | 要返回的字段,取自本工具的 11 个名称(见下文)。这是唯一可以省略它的数据工具:expiries: true 可以单独使用。 |
limit | integer | — | 每个序列最近的 N 个点;默认为最新一个(指定周期时为最近 N 个时间桶)。只有当前值的字段(如 price_change)返回一个点;超过字段自身上限(序列为 1000,逐笔成交为 10000)的 limit 会被截到上限,并在 warnings 中说明。带窗口时,它是每个序列的点数上限。describe_fields 说明 N 的含义。 |
expiries | boolean | false | 补充 data.expiries:各有效到期日及其各自的数据,只需一个请求。其日期即其他字段的 expiry。可单独使用,无需任何字段。 |
timeframe | string | — | 期权历史的周期(标有 timeframe 的字段)。省略时,选择约 200 个点的步长。 |
expiry | string | — | 到期日,格式 YYYY-MM-DD:用于 options_oi_distribution,以及历史模式下的 options_max_pain(此时必需)。 |
ticker | string | — | ETF 发行方,例如 IBIT:etf_fundamentals 历史的可选筛选条件。 |
get_market_overview
整个加密市场,无需目标:总市值、成交量和 BTC/ETH 占比(global_market)、两个恐惧与贪婪指数(fear_greed 和 CMC 的 fear_greed_cmc)、altcoin_season,以及 cmc20 和 cmc100 指数。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
fields | string[] | — | 必填:要返回的字段,每次调用可多个,取自本工具的 6 个名称(见下文)。属于其他工具的字段会被拒绝,并指出其所属工具。 |
limit | integer | — | 每个序列最近的 N 个点;默认为最新一个(指定周期时为最近 N 个时间桶)。只有当前值的字段(如 price_change)返回一个点;超过字段自身上限(序列为 1000,逐笔成交为 10000)的 limit 会被截到上限,并在 warnings 中说明。带窗口时,它是每个序列的点数上限。describe_fields 说明 N 的含义。 |
timeframe | string | — | 仅用于 global_market 的周期(1h、4h、1d);各指数为日频。 |
get_macro_data
美国及全球宏观。macro 读取一个 FRED 序列(DGS10、DCOILWTICO…)——不带 series 时返回每个序列的最新值;macro_intraday 读取其目录中的一个日内品种(例如 PAXGUSDT),series 必填。四个计算字段无需目标:净流动性、加密与宏观的相关性、动量和风险评分。序列列表来自 get_system_info 的目录。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
fields | string[] | — | 必填:要返回的字段,每次调用可多个,取自本工具的 6 个名称(见下文)。属于其他工具的字段会被拒绝,并指出其所属工具。 |
limit | integer | — | 每个序列最近的 N 个点;默认为最新一个(指定周期时为最近 N 个时间桶)。只有当前值的字段(如 price_change)返回一个点;超过字段自身上限(序列为 1000,逐笔成交为 10000)的 limit 会被截到上限,并在 warnings 中说明。带窗口时,它是每个序列的点数上限。describe_fields 说明 N 的含义。 |
series | string | — | 序列标识:macro 使用 FRED 序列(例如 DGS10;获取当前值时可选),macro_intraday 使用品种(例如 PAXGUSDT;必填)。 |
timeframe | string | — | 仅用于 macro_intraday 的周期(其目录给出每个品种可用的周期)。 |
get_onchain_data
比特币和以太坊链上数据,无需目标:八个 btc_* 字段(网络、内存池、手续费、挖矿、MVRV、NVT、活跃地址、每单位难度收入)和八个 eth_* 字段(供应、Gas、质押、通缩、DeFi、Gas 动量、供应紧缩、以 BTC 计的 ETH 价格)。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
fields | string[] | — | 必填:要返回的字段,每次调用可多个,取自本工具的 16 个名称(见下文)。属于其他工具的字段会被拒绝,并指出其所属工具。 |
limit | integer | — | 每个序列最近的 N 个点;默认为最新一个(指定周期时为最近 N 个时间桶)。只有当前值的字段(如 price_change)返回一个点;超过字段自身上限(序列为 1000,逐笔成交为 10000)的 limit 会被截到上限,并在 warnings 中说明。带窗口时,它是每个序列的点数上限。describe_fields 说明 N 的含义。 |
timeframe | string | — | 仅用于 btc_fees 的周期(1h、4h、1d);其他序列保持其数据源的频率。 |
dataset | string | — | concentration(默认)、rewards、difficulty 或 fee_rates,用于 btc_mining 的历史。 |
get_market_indicators
十九种技术指标,按需计算,可用于一到十个交易对。symbol(与其他工具一样为列表)、timeframe 和 indicators 为必填;只有 limit 有默认值 1。每种类型的参数、默认值和取值范围都在工具的 JSON 模式和描述中。
await c.call_tool("get_market_indicators", {
"symbol": "BTCUSDT",
"timeframe": "1h",
"limit": 60,
"indicators": [
{"id": "rsi_7", "type": "rsi", "period": 7},
{"id": "rsi_21", "type": "rsi", "period": 21},
{"id": "macd", "type": "macd", "fast": 12, "slow": 26, "signal": 9},
{"id": "adx_14", "type": "adx", "period": 14},
],
})规则与 REST 相同:每个指标使用你自己选择的 id(在同一次调用中唯一),并且 limit + warm-up ≤ 1000。响应与数据工具的形式相同:data 为每个 id@timeframe 给出一个序列(多个交易对时为 交易对/id@timeframe),indicators 给出每个指标的类型和参数;指标不适用的交易对(稳定币)其键为 null,并在 unavailable 中注明 not_applicable,被拒绝的交易对列在 errors 中。每个交易对计一个配额请求。
describe_fields
五个数据工具中字段的完整定义:每个字段返回什么(列、约定、行的时间如何标注)、每一列的单位(units)、每个标签的阈值(labels)、所属工具和目标、周期、最大点数、历史、附加参数以及是否支持 live。它也描述不属于字段的输出键:liquidations_24h、oi_usd、cumulative_net_volume 和 ranking。不调用 API,不计配额:每个工具的描述为每个字段写一行,使用与索引相同的标签,其余由该工具给出。同样的定义也以 MCP 资源提供:bytnode://fields(索引,附每个字段所属的工具)和 bytnode://fields/{name}。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
fields | string[] | — | 要描述的名称,至少一个:任一数据工具的字段,或输出键 liquidations_24h、oi_usd、cumulative_net_volume 和 ranking。未知名称会被拒绝并附带建议。 |
rank_pairs
按一个指标为所有提供的交易对排名,返回前 limit 个,无论交易对多少,只计一个配额请求:oi_usd(以美元计的未平仓量)、volume_usd_24h(最近 24 个已收盘小时的现货 + 期货成交量,即每小时成交量 × 收盘价之和)、funding_next(下一次预估资金费率:estimated_rate_pct,8 小时等值,%,以及 apr_pct)、price_change_pct(在 window 上的滚动涨跌幅)和 rsi(timeframe 最近一根已收盘 K 线上的 RSI 14)。data.ranking 给出每个交易对的 rank、symbol、数值和价格。数值最多 60 秒前(computed_at);没有该指标的交易对——oi_usd、funding_next 和 rsi 下的纯现货交易对、缺失的数据流——列在 excluded 中。配额请求使用你的密钥,发往该指标所属市场数据族的路由,因此你的方案同样适用:oi_usd 和 funding_next 需要衍生品,price_change_pct 和 volume_usd_24h 需要价格与成交量,rsi 需要指标。要获取单个交易对的完整数据,请用 get_pair_data。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
metric | string | — | 必填:oi_usd、volume_usd_24h、funding_next、price_change_pct 或 rsi。 |
order | string | desc | desc(从大到小,默认)或 asc——例如资金费率最负的交易对。 |
limit | integer | 10 | 返回的交易对数量,1 到 100。 |
window | string | 1d | 仅用于 price_change_pct:1h、4h、1d(默认)或 1w。 |
timeframe | string | 4h | 仅用于 rsi:计算 RSI 的 K 线,1h、4h(默认)或 1d。 |
max_tokens | integer | 6000 | 响应预算,以估算的 token 计,范围 1,500 到 16,000(默认 6,000)。每个数据工具、get_market_indicators、rank_pairs 和 read_export 都有同样的参数。 |
read_export
分页读取因大小预算被截断的响应的其余部分,格式相同,不发起 API 请求,不计配额。被截断的响应带有 export.export_id,其 ranges 中的 missing(多个交易对时为顶层 missing)给出要发起的调用:read_export(export_id=…, key='klines@1h', offset=N)。每一页给出 row_count、total_row_count 和 next_offset(结束时为 null),keys 列出导出中的每个序列及其行数。导出保留一小时,须用生成它的 API 密钥读取。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
export_id | string | — | 必填:被截断响应的 export.export_id(也接受其 bytnode:// URI)。 |
key | string | — | 要读取的序列,使用响应 data 中的键名(例如 klines@1h);默认为第一个。keys 会列出它们。 |
offset | integer | 0 | 要返回的第一行,0 为最新一行;被截断响应 ranges 中的 row_count 会给出它。 |
max_tokens | integer | 6000 | 响应预算,以估算的 token 计,范围 1,500 到 16,000(默认 6,000)。每个数据工具、get_market_indicators、rank_pairs 和 read_export 都有同样的参数。 |
#加密市场数据的当前值或历史
模式只取决于一件事:是否提供日期窗口。没有 since_ms、until_ms 和 last 时,数据工具返回当前值;提供其中之一时,每个请求的字段都返回该窗口内的历史——一次调用即可获取多个带日期的指标。
| 请求 | 每个字段返回什么 |
|---|---|
| fields: [...] | 每个字段的最新一个点;按时间桶的序列为最近一个已收盘的时间桶。 |
| limit: N | 每个序列最近的 N 个点;对于标有 timeframe 的字段,为该周期最近的 N 个时间桶(默认 1h):basis、oi_change 等分钟级序列会按时间桶聚合。只有当前值的字段返回一个点。 |
| since_ms / until_ms,或 last | 该时段内的完整序列,绝不会被悄悄截断。某行的时间(其时间桶的起点)≥ since_ms 且 ≤ until_ms 时才返回该行;未完成的时间桶永不返回。last 会把 since_ms 回退到其时间桶的起点:在 1h 下 last: '24h' 返回全部 24 个已收盘时间桶,since_ms: '24h' 最多返回 23 个。不指定周期时,服务器会选择一个让整次调用约有 200 个点的步长,并在 ranges.note 中说明;指定的周期若无法满足,会在调用前被拒绝,并说明确切原因(超出方案,或单次调用点数过多)以及可行的周期。 |
| live: true | 下列字段会追加正在形成的 K 线(临时值)。与日期窗口同时使用,或没有任何请求字段支持时,会被拒绝。 |
支持正在形成的 K 线的字段
klinescvdspread_interexchangetrades_klinetrades_kline_spottrades_kline_futures
#定位加密货币交易对与市场
每个数据工具都有自己的目标:get_pair_data 为交易对(symbol,必填),get_options_data 为资产(asset,必填),get_macro_data 为目录中的序列(series),get_market_overview 和 get_onchain_data 无需目标。每个字段只属于一个工具。不符合的请求会在首次网络调用之前被拒绝,绝不会被默默吞掉,并且所有问题都在同一条消息中列出。
| 情况 | 响应 |
|---|---|
| 缺少目标 | 错误会指出缺少的参数,并附示例:symbol 和 asset 在各自工具的模式中为必填,series 对 macro_intraday 和 macro 的历史为必填。 |
| 向错误的工具请求字段 | 错误:'fear_greed' is a field of get_market_overview: call that tool. 错误消息会指出该字段所属的工具,而不是推荐一个相近的字段。 |
| 提供了没有任何请求字段需要的 series | 错误:只有 macro 和 macro_intraday 读取 series;计算得出的宏观字段没有目标。 |
| asset 填写了交易对 | 错误:asset 只接受资产本身。不存在任何自动推导。 |
| 所选路由不接受的参数 | 错误:例如在 options_max_pain 的当前值上使用 expiry,只有其历史接受该参数。 |
| 没有任何字段使用的 timeframe | 错误:timeframe 不适用于任何请求的字段(每个工具会说明哪些字段接受它:交易对的 klines、cvd、trades_kline…,以及 global_market、macro_intraday、btc_fees)。 |
| 对不支持日期窗口的字段指定窗口 | 错误:该字段没有带日期的历史;请不带窗口请求其当前值,或请求承载其历史的字段,错误消息会给出该字段(price_change → klines,funding_next → funding_rate)。 |
| last 与 since_ms 同时提供 | 错误:last 取代 since_ms,只能提供其一。既不是 Unix 毫秒、也不是 ISO 8601 日期或时长的边界会被拒绝,并列出可接受的形式。 |
| symbol 中超过 10 个交易对 | 错误:每次调用最多 10 个交易对,并给出收到的数量。 |
#64 个加密市场字段
名称与 API 一致,当前值和历史使用同一名称,差异如下:整体市场在这里叫 global_market,在 REST 快照中叫 global(global 是 Python 的保留字,服务器用 Python 编写);市场在这里是参数(market: "spot"),在 REST 中是路径后缀(/v1/cvd/spot);每个期权到期日的数据通过 get_options_data 的 expiries: true 获取(REST:/v1/options/expiry),交易对的能力通过 symbol_capabilities 目录获取(REST:/v1/capabilities?symbol=…);历史数据在 timeframe_applied 中说明工具采用的步长,因为工具可能自行选择。每个字段的详情——所属工具、包含什么、单位、N 的含义、上限、历史——由 describe_fields 给出;每个工具的描述为每个字段写一行,附带其标签(周期、仅当前值、live、limit 上限)。另见数据目录。
get_pair_data:二十五个按交易对的字段(symbol)
klinesprice_changetrades_spottrades_futurestrades_largetrades_kline_futures_secondsoifunding_nextfunding_ratefunding_cumulativebasisoi_changeliquidations_eventsliquidations_cumulativeliquidations_big_small_ratioorderbookcvdspread_interexchangebuy_sell_ratiotrades_avg_sizetrades_klinetrades_kline_spottrades_kline_futurestokenomics
get_options_data:十一个按资产的字段(asset)
options_summaryoptions_oioptions_oi_changeoptions_oi_distributionoptions_volumeoptions_put_call_ratiooptions_ivoptions_iv_klinesoptions_max_painoptions_greeksetf_fundamentals
期权字段和 etf_fundamentals。有效到期日及其各自的数据通过 expiries: true 获取。options_max_pain 列出所有有效到期日(由近到远),不带窗口时 limit: N 保留最近的 N 个到期日;带窗口则返回单个 expiry 的历史,此时该参数必填。
get_market_overview:六个全市场字段(无目标)
global_marketfear_greedfear_greed_cmcaltcoin_seasoncmc20cmc100
get_macro_data:六个宏观字段
macromacro_intradaymacro_net_liquiditymacro_correlationsmacro_momentummacro_risk
不带 series 的 macro 返回每个 FRED 序列的最新值;带上它时只返回该序列,且其历史必须提供它。macro_intraday 始终需要它,且不接受 30m。两者包含的品种不同:不要相互替代。四个计算字段(macro_net_liquidity、macro_correlations、macro_momentum、macro_risk)不接受 series。
get_onchain_data:十六个链上字段(无目标)
btc_networkbtc_mempoolbtc_feesbtc_miningbtc_mvrvbtc_nvtbtc_active_addressesbtc_revenue_per_difficultyeth_supplyeth_gaseth_stakingeth_deflationeth_defieth_gas_momentumeth_squeezeeth_price_btc
只有 btc_fees 接受 timeframe;btc_mining 的历史接受 dataset;估值类字段(btc_mvrv、btc_nvt…)为日频。
仅当前值
price_changetrades_spottrades_futurestrades_largetrades_kline_futures_secondsfunding_nextliquidations_eventsmacro_correlationsmacro_momentummacro_riskoptions_summaryoptions_oi_distributionoptions_greeks
这些字段没有带日期的历史:它们返回当前值(一个点,或在字段按行计数时用 limit 取最近 N 个——成交、强平事件)。对它们传入 since_ms 或 until_ms 窗口会被拒绝而不是忽略——否则AI 智能体会以为自己筛选了某个时段,实际收到的却是最近的数据点。
#响应:AI 智能体可读的加密市场数据
数据沿用 API 的名称、单位和约定,每个字段一个键,但会以面向AI 智能体的方式呈现,而不是原样返回。带周期的字段键名为 字段@tf;多个交易对时,每个键前加上其交易对(ETHUSDT/funding_next、BTCUSDT/cvd@1h)。响应总是包含 mode、data、api_requests、server_time(服务器时间,ISO 8601 UTC)、mcp_version(MCP 接口版本)和 response_tokens(响应自身的大小,以估算的 token 计),适用时还包含 scopes、summary、ranges、freshness、warnings、errors、partial、unavailable、omitted_columns、missing、truncation、export、timeframe_applied 和 window;get_market_indicators 和 rank_pairs 使用相同的外层结构。空的或不适用的序列为 null,unavailable 说明原因。unavailable 和 out_of_plan_fields 与快照中的相同。所有工具都不声明 outputSchema:各个键在本页说明,structuredContent 携带与文本相同的 JSON。
{
"mode": "latest",
"data": {
"klines@1h": {
"first_time": "2026-10-21T13:00:00.000Z",
"step_s": -3600,
"columns": ["open", "high", "low", "close", "volume"],
"rows": [[…], …]
},
"oi@1h": { "first_time": …, "step_s": -3600, "columns": ["oi", "oi_usd", … ], "rows": [ … ] },
"funding_next": { … },
"price_change": { … }
},
"scopes": {
"symbol:BTCUSDT": ["klines@1h", "oi@1h", "funding_next", "price_change"]
},
"summary": {
"klines@1h": { "column": "close", "latest": …, "min": …, "max": …, "mean": …,
"change_pct": …, "high_max": …, "low_min": …, … }
},
"freshness": { "age_s": { "klines@1h": 4, "funding_next": 2, … }, "stale": [] },
"omitted_columns": { "klines@1h": ["is_closed"] },
"timeframe_applied": "1h",
"unavailable": { … },
"api_requests": 1,
"server_time": "2026-10-21T14:02:31.512Z",
"response_tokens": 1840
}data:行列表以{columns, rows}形式给出,行从新到旧排列;单个点以对象给出;空的或不适用的序列为null。步长规则的序列没有time列,而是给出first_time和step_s,无论行数多少,一行也是如此:第 i 行的时间为first_time + i × step_s,step_s为负数,从最新一行往前推;只要有任何缺口,就保留time列。事件(逐笔成交、逐笔清算)和表格保留其time,所有行共有的部分只在块上说明一次:date(此时每个time为当天的 UTC 时间,如12:54:30.494Z)或单个time(所有行同一时刻,如到期日表);没有任何行带毫秒时去掉.000。浮点数保留 6 位有效数字,供应量和累计值除外,它们保留完整的整数单位。使用detail: "compact"(默认)时,重型行只保留主要列,所有行都已收盘时去掉is_closed,并去掉成交 ID;omitted_columns说明省略了哪些列,detail: "full"会返回它们。scopes:每个键的真实范围——symbol:X、asset:X、series:X,无目标的字段为market。不带series请求的macro标记为market,绝不会标记为某个序列。多个交易对时,键的前缀已标明其交易对:只保留其他目标的范围(market…)。mode:latest或history;历史模式下,window会重复时间边界,ranges按序列说明实际覆盖的范围:timeframe、row_count、from和to(第一个和最后一个时间桶的起点,与每行的time相同)、note和truncated;序列被截断时,missing说明如何获取其余部分——更小的limit、以next_until_ms结束的更早窗口,或从其给出的 offset 开始调用read_export。summary:按序列在其主列上给出最新值和最早值、最小值和最大值及其时间、平均值;流量类(清算、净成交量…)给出总和,并在sums中给出各组成部分之和(long_usd与short_usd、buy_volume与sell_volume),状态类给出变化量(有意义时还有change_pct);K 线另给出high_max和low_min及其时间。逐笔成交和逐笔清算另给出by_side(每一方的笔数、数量和美元金额)。freshness(当前值):来自数据流监控,age_s给出每个键的源数据流距上次送达已过去多少秒(一行数据的日期是其time),stale列出数据流滞后的键;warnings列出每个滞后的字段(其值并非当前值),以及被某个字段忽略的每个投影列。- 大小:每个响应默认上限为估算的 6,000 个 token;数据工具、
get_market_indicators、rank_pairs和read_export的max_tokens参数可将其设为 1,500 到 16,000,response_tokens给出每个响应的大小。超出预算时,最重的序列保留最新的行,截断情况只说明一次,写在每个序列的ranges中(total_row_count行中返回了row_count行;missing说明如何获取其余部分,通常给出足以容纳完整响应的max_tokens;多个交易对的同一字段被截断时,只在顶层missing中给出一条说明;truncation仅用于没有ranges的内容),多个交易对相同的元数据(ranges、omitted_columns、freshness)按字段只写一次,键名为字段名,export将完整数据保留一小时,供同一密钥读取:read_export凭export.export_id分页读取,格式与响应相同,不发起 API 请求,不计配额。它也是 MCP 资源bytnode://exports/{id},供能读取资源的客户端一次性读取,保留 8 位有效数字和每一行的time。 timeframe_applied:只要有字段使用了周期,就给出实际应用的周期;live:请求了正在形成的 K 线时出现。errors和partial:某个字段出错不会影响其他字段,某个交易对被拒绝也不会影响其他交易对。它会列在errors下(交易对以其名称列出),响应带有partial: true。api_requests:本次调用计入配额的请求数——每个交易对的快照字段当前值合计一个,其他每个字段、每个历史和expiries各一个。oi_usd:oi的每一行都带有以美元计的未平仓量,即oi× 同一时间桶参考现货 K 线的收盘价(没有该 K 线时为null),当前值同样提供,不增加请求;get_pair_brief也带有它。同样,cvd的每一行都带有cumulative_net_volume,即从所返回序列最早一行开始的net_volume累计值:该时段的 CVD 曲线。liquidations_cumulative的当前值是其最近一个已收盘时间桶(默认 1h),与所有行一样以起点标注时间。
#加密市场数据调用的错误
所有错误都以 Error (HTTP NNN): message 开头。当 API 已作出响应时,末尾会附上 [code: …],即 API 稳定的 error.code。失败的工具调用会被标记为 MCP 错误(isError),绝不会作为数据返回,同一错误还会以字段形式放在 structuredContent.error 中:{status, code, message, param?, hint?, retry_after_s?}。API 给出 code 时,code 即为该值(invalid_symbol、plan_family、history_depth、rate_limited、quota_exceeded…);否则按状态码取值(422 为 invalid_request,401 为 unauthorized…);向错误的工具请求字段时为 wrong_tool,hint 给出正确的工具(call get_market_overview);未知字段或列为 unknown_field,未知参数为 unknown_parameter,hint 中为 did you mean …;消息给出等待时间时,retry_after_s 即为该时长。
| 情况 | 行为 |
|---|---|
| 请求没有有效密钥 | 401,X-Deny-Reason: missing_api_key(或 invalid_api_key),在公布任何工具之前。 |
| 请求无效 | Error (HTTP 422),列出每个问题,在任何网络调用之前。 |
| 方案外的市场数据族 | Error (HTTP 403): The 'options' data family is not included in your plan. GET /v1/limits lists the families of your key; https://bytnode.com/pricing lists the plans that open it. [code: plan_family] —— 数据存在,只是不在你的方案中。 |
| 方案不含快照(Free) | 当前值(快照字段、get_pair_brief)收到明确的 Error (HTTP 403),并指出开放它们的方案;其他字段照常提供,短历史(last: '1h')可给出最新的数据点。 |
| 超出方案深度的时段 | 在调用前即被拒绝,并给出方案在该步长下的深度以及能覆盖该时段的步长;处于边界时,返回 API 的 Error (HTTP 403) [code: history_depth]。 |
| 速率或配额 | Error (HTTP 429),附带 API 的 detail:每分钟速率或每月配额。 |
| 单个字段出错 | 列在 errors 下,其他字段照常提供,partial: true;多个字段的相同错误只写一次(same error as '…')。只有所有字段都失败时调用才会失败。 |
| 多个交易对中有一个被拒绝 | 以其名称列在 errors 下(例如无效的 symbol),其他交易对照常返回,partial: true。只有所有交易对都失败时调用才会失败。 |
| 无效的 symbol | API 返回的 Error (HTTP 422),末尾为 [code: invalid_symbol],并列出可接受的值;实时列表由 get_system_info 提供。 |
| 已过期或未知的导出 | read_export 返回 Error (HTTP 404),以 [code: not_found] 结尾:导出保留一小时,须用生成它的密钥读取;请重新调用该工具。 |
| 上游无响应 | 遇到 502、503、504 或网络故障时重试一次。500 不会重放:每个请求都计入你的配额。 |
| 超时 | 三十秒无响应后返回 Error (HTTP 504)。 |
| 服务器内部错误 | Error (HTTP 500),仅包含错误类型;详情保留在服务器日志中。 |