关于 cryptoport-port
cryptoport-port 是 MCP 服务,将加密货币 YouTube 频道的公开评论整理为每日看板,供研究市场观点的用户查询。它提供币种观点、历史立场和催化因素;数据并非实时内容,也不是投资建议。
主要功能
- 01查询最新每日看板
- 02搜索公开评论
- 03查看币种及立场历史
- 04查询日期催化因素
- 05按日期获取看板快照
适用场景
- 01汇总频道对某币种的观点
- 02检索频道评论中的市场主题
- 03追踪立场变化与日期催化因素
MCP 相关
通过 MCP 向客户端提供六种看板查询工具,并支持 streamable HTTP 和 stdio。在线端点的工具均免费且无需 API 密钥。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://cryptoport-mcp.cryptoport-port.workers.dev/mcpclaude mcp add --transport http com-thecryptoport-cryptoport-port https://cryptoport-mcp.cryptoport-port.workers.dev/mcp{"mcpServers":{"com-thecryptoport-cryptoport-port":{"type":"http","url":"https://cryptoport-mcp.cryptoport-port.workers.dev/mcp"}}}在 Cursor 中打开{"servers":{"com-thecryptoport-cryptoport-port":{"type":"http","url":"https://cryptoport-mcp.cryptoport-port.workers.dev/mcp"}}}在 VS Code 中打开{"mcpServers":{"com-thecryptoport-cryptoport-port":{"type":"http","url":"https://cryptoport-mcp.cryptoport-port.workers.dev/mcp"}}}{"mcpServers":{"com-thecryptoport-cryptoport-port":{"serverUrl":"https://cryptoport-mcp.cryptoport-port.workers.dev/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
6此工具无需参数。
详细介绍
The Crypto Port — MCP 服务
作为每日看板呈现加密货币 YouTube 频道的观点——币种推荐、立场和有日期的催化因素——通过 MCP 提供。免费,无需 API 密钥。
- 在线端点(可流式传输的 HTTP):
https://cryptoport-mcp.cryptoport-port.workers.dev/mcp - 注册表名称:
com.thecryptoport/cryptoport-port(官方 MCP 注册表,registry.modelcontextprotocol.io) - 网站(面向用户的看板): https://thecryptoport.com
添加到客户端
Claude Code:
claude mcp add --transport http cryptoport https://cryptoport-mcp.cryptoport-port.workers.dev/mcp
支持可流式传输 HTTP 远程连接的任意 MCP 客户端:
{
"mcpServers": {
"cryptoport": {
"type": "streamable-http",
"url": "https://cryptoport-mcp.cryptoport-port.workers.dev/mcp"
}
}
}
上述在线端点的全部六种工具均免费——latest_board、search、coin、
stance_history、catalysts、board_snapshot。此部署没有 payTo,因此不会挂载支付中间件,也不会产生任何费用;其自身的 /healthz 和 /.well-known/mcp.json
都对此有说明。下方表格中的价格属于 付费 x402 端口(Base Sepolia
测试网),仅适用于配置了 payTo 的部署。
提供的所有内容都是对具名频道公开声明的评论;每个负载都带有
stale / stale_days / built_from_brief_date——请留意这些字段。不是财务建议,也不是
实时信息。
构建背景——第 3 级机器端口
基于 thecryptoport.com 每日看板的 MCP 服务 + 支持 x402 付费的 HTTP 端点。
网络:Base Sepolia(eip155:84532)——始终为测试网。没有主网批准,也不会假定已获批准。此服务所连接的任何网络上都不会收取真实货币。
本次构建的正式裁定为 C+(2026-08-24):现在仅在测试网上构建付费端口机制;付费层本身仍不予批准,主网开关将在第 60 天裁定。设置下方价格是为了让支付握手真实可用,并非要向任何人收费。
运行时负责人:Dex。Ward 编写资金、筛查和许可逻辑;Dex 负责启动并维护进程。详见下方的“移交给 Dex”。
功能介绍
| 工具 | 价格(测试网 USDC) | HTTP 对应端点 |
|---|---|---|
latest_board | 免费 | GET /api/v1/board |
search(q, limit) | 免费 | GET /api/v1/search?q= |
coin(ticker) | 0.005 | GET /api/v1/coin/:ticker |
stance_history(ticker) | 0.01 | GET /api/v1/stance_history/:ticker |
catalysts(window) | 0.01 | GET /api/v1/catalysts?window= |
board_snapshot(date) | 0.02 — 今日不收费 | GET /api/v1/board_snapshot/:date |
免费元数据:GET /healthz、GET /x402/routes(价格表)、GET /.well-known/mcp.json。
MCP:POST /mcp(可流式传输的 HTTP)和 npm run mcp-stdio(stdio)。
MCP 工具是同一进程内 HTTP 对应端点的轻量代理。 定价、筛查、拒绝处理和已发布字段门槛共用一条代码路径,因此两个接口不会出现不一致。
付费层实际出售的内容——定价前请先阅读
llms.txt 用网站原话写道:“没有隐藏的付费层提供相同的数据行。”
这句话是本次构建的约束,且目前仍然成立:每个付费负载都会标明相同事实所在的免费静态文件(upstream)。收费的是形式,而非独占权——例如提供解析后的日期序列,而不是 arc 字符串;提供按时间窗口查询的催化因素,而不是完整文件。如果未来某个付费工具返回了免费层没有的事实,那么必须先修改这句 llms.txt 声明,否则它就不再属实。→ 已向 Larry 标记,暂不在此决定。
运行
npm install
npm run sdn-refresh # refresh the OFAC list (vendored copy already present)
node scripts/keygen.js # writes .env.sepolia (mode 600); prints only the address
X402_PAY_TO=0x… npm start # http://localhost:8402
npm test # 91 tests
npm run demo # free call -> 402 -> (pay) -> data + receipt
数据来自第 0 级发射器:CRYPTOPORT_DATA_DIR,否则使用
<repo>/../../Documents/Claude/myPKA/infra/cryptoport-site/dist;如果 dist 中没有 feed.json,则回退到
staging。数据在启动时只读取一次并载入内存——请求路径永远不会访问文件系统,因此 src/worker.js(Cloudflare Workers)只需作为部署选项,而无需重写。
Claude Code MCP 配置(stdio)
{ "mcpServers": { "thecryptoport": {
"command": "node",
"args": ["/home/ops/projects/cryptoport-port/src/mcp-stdio.js"],
"env": { "X402_PAY_TO": "0x…" }
} } }
也可使用可流式传输的 HTTP:将客户端指向 http://localhost:8402/mcp。
选定的机制,以及否决的方案
**选定:**在付费路由前部署 x402 v2 中间件 + 使用免费的公开测试网 facilitator
- 在 Base Sepolia 上使用 USDC。**没有智能合约,也没有任何类型的字节码。**价格、收款地址和验证器就是全部机制;合约越少,本身就是一项安全属性。
| 否决的方案 | 原因 |
|---|---|
| 定制的访问/订阅合约 | 对于 x402 原生支持的逐次调用机制来说,这只会增加审计范围。 |
| 自托管 facilitator | 方向没错,规模不合适。它带来了我们不需要的去中心化,还增加了一项必须维持运行的服务。 |
| API 密钥 + Stripe | 重新引入账户、PII 和介入流程的运营方;这不适合匿名 Agent。 |
| 任何代币、订阅 NFT 或分割化工具 | 毫无收益,却要承担 CLARITY 前的证券风险。坚决不考虑。 |
@x402/paywall(@x402/hono 的对等依赖) | 会安装 716 个软件包,包括 WalletConnect,只为提供 Agent 永远不会看到的浏览器付费墙 UI。已验证:@x402/hono 无需它也能正常工作。 |
请求头名称取自 @x402/core 的 v2 代码路径(已于 2026-09-05 修正 — 8/24 的构建使用了 v1 的请求头组合):请求头为 PAYMENT-SIGNATURE(仍接受并检查 v1 的 X-PAYMENT),收据为 PAYMENT-RESPONSE(仅在回退时读取 X-PAYMENT-RESPONSE),402 响应中的条款位于 PAYMENT-REQUIRED(base64 JSON)— 同时也会在 JSON 正文中重复,以便 Agent 无需对请求头进行 base64 解码即可了解价格,并将其原样交给 MCP 调用方,放在 x402 中。test/x402.test.js 会根据 SDK 自身的函数断言这些名称。软件包的生成方式很重要:作用域为 @x402/* 的 v2 软件包在 package.json 中固定版本,并与 npm 上的 v1 x402-hono/x402-next 共存。
**这里不签署任何许可,也不引用任何许可哈希。**这一层出售的是对公开声明汇编内容的访问权限;设计中没有几何数据、没有可许可的工作成果,也没有 EIP-712 类型化数据许可。每个负载中的 license 字符串都是第 0 层自身的署名声明,原样传递。
闸门(提供任何内容前,以下三项都会运行)
- 拒绝咨询类输入 —
src/inputs.js。 任何名称类似 portfolio / holdings / position / allocation / balance / risk profile / cost basis / PnL / leverage / stop-loss / "should I buy" 的参数,都会被拒绝,并返回 400 和简单明了的原因;HTTP 和 MCP 请求均如此,且会在考虑付款之前拒绝。我们绝不检查值 — 我们拒绝这种参数形式,不读取数据。每个工具的描述都说明了这一点。 - 对付款方进行 OFAC SDN 被制裁方筛查 —
src/sdn.js。 对解码后的X-PAYMENT负载中任何位置发现的每个0x…地址进行本地检查,并与 OFAC 公布的 SDN 数字货币地址列表(991 个地址,其中 124 个为 EVM 地址,发布于 08/24/2026)比对;该列表由scripts/sdn-refresh.js从 OFAC 自有端点只读获取,并随项目提供为data/sdn-addresses.json。付款方若在列表中,将收到 403,绝不结算,也绝不提供服务。这不是 KYT:它会筛查付款地址,但不会追踪资金。没有 KYC、没有账户、没有 PII — 为一次 $0.005 的数据调用收集身份信息,造成的风险面比它能缓解的更大。 - B-2 已发布字段闸门 —
src/allowlist.js。quality、counterweight、rank和presence绝不会离开进程,无论它们以何种拼写出现;任何未声明的键也会触发错误。保留字段列表只有一个事实来源 —infra/cryptoport-site/allowlist.py— 如果两者不一致,test/allowlist-parity.test.js就会失败。上游行数据在加载时会被投影处理,因此扩展后的数据输出器无法在无提示的情况下扩大这一范围。 该闸门中记录的一项决策(2026-09-07),因为静默丢弃仍然是一种决策。projectRung0()会丢弃未声明的上游键,而不是提供它们——默认情况下这是正确的, 但它一直在悄悄丢弃每个币种文件中的catalyst_refs。这些是指向仅仅提及该币种的 声明的 D19 指针(claim_id+due+ SUBJECT 股票代码的canon,绝不是描述), 因此一条声明的文本只会存储并提供一次。丢弃这些指针会让coin工具自己承诺的句子 变成谎言:它承诺“相同的事实也可通过/coins/<TICKER>.json静态 JSON 免费获取”, 但实际提供的内容严格来说少于那个文件,而且 MCP 消费者看到的币种结构也与源数据不同。 决策:声明,而不是丢弃。 不会有任何新内容离开数据库——引用中的每个键都已公开, 而引用指向的描述也已由免费的catalysts工具完整提供。由test/tools.test.js中的两个测试锁定(“catalyst_refs survives the rung-0 projection”和 “the coin tool serves the origin's catalyst_refs, not a narrower shape”)。只有在 Worker 部署后,代码才会到达该 Worker——共有两个(免费版cryptoport-mcp、付费版cryptoport-x402),各自通过独立命令部署,每日 KV 推送只会刷新数据板,不会刷新代码。 两者的当前状态:见末尾需求计数器部分中的“部署状态”。
对提交 06e299f 留言的更正: 留言称,使用了描述符中错误的 days 参数的 Agent
调用被拒绝了。事实并非如此。两种传输方式都不会根据公布的架构验证调用,因此
days 被静默忽略——已于 2026-09-07 在线验证,{"days":7} 返回 isError:false,
包含全部 40 条催化剂(10 条已逾期),且 window_days:null;而 {"window":7} 返回 2。
这是静默的错误,并非调用方能察觉的错误。若不重写历史,就无法编辑提交留言;此处记录
这一事实。
闸门确实可以拦截的证明(这正是设置闸门的意义):
test/sdn.test.js 通过 HTTP 端到端拒绝一个确实被 OFAC 列入名单的地址,随后从名单中
移除该地址,并断言相同调用不会被拒绝——因此可以明确证明 403 来自闸门,而非其他地方。
test/b2-leak.test.js 将每个受限列注入上游 JSON,并断言每个工具要么报错,要么将其投影
移除;同时 HTTP 接口返回 500,响应正文中不含泄露值。
钱包接口
- 一个仅接收款项的地址,用作
payTo。它不签名、不持有任何授权,也不调用合约。 服务端不需要其密钥;如果环境中存在任何*PRIVATE_KEY/*RECOVERY_KEY/MNEMONIC/SEED_PHRASE变量,服务端会拒绝启动(test/network-guard.test.js)。 - 测试网一次性 EOA,遵循
~/projects/cad-on-chain/scripts/keygen.js模式,但有一处 改动:密钥会直接写入.env.sepolia(权限模式 600),绝不会打印出来。 stdout 最终会出现在终端、转录记录和会话日志中,“私钥不进入仓库、笔记或日志”这条 规则没有测试网例外。 - 不会升级。 主网
payTo必须是由 CDP 管理的 Server Wallet,否则就不存在。 - 链 ID 84532 受到硬性保护,每个主网 ID 都按名称列入拒绝名单。
- 从设计上就是非托管模式:不接收买家资金、不持有买家密钥、不接触买家文件、不退款 (结算先于交付),并且绝不托管文件。
主网准入清单(逐字摘自 Lane C 规范 §C7 — 以下各项必须全部满足,不得推断)
- Master 对每次部署明确签署主网上线批准,并在交付物中逐字引用。
- 重新审议并批准付费层级裁定。
- Pax/Master 对 §C5 (a)–(d) 的答复,尤其是投资顾问相关问题。
payTo是由 CDP 管理的账户;磁盘上的任何位置都不得存有密钥材料;弃用一次性 EOA 模式。- 证明 SDN 禁止方准入关卡会拒绝已列出的地址。
- B-2 泄漏测试在 CI 中通过,并证明引入一个保留列时测试会失败。
- Facilitator 从
x402.org(仅限测试网)切换到 CDP,凭证保存在仓库之外。 - 在非 Master 所属的域名上解决所有权/收据问题。
- 不得有新字节码 — 如果这一点发生变化,则必须在 CI 中运行 Slither + Foundry 模糊测试/不变量测试,并且在主网上线前进行一次有具名审计方的外部审计。
截至目前,该清单的状态:**第 5 项和第 6 项已完成并经证明。第 1、2、3、4、7 和 8 项尚未着手。**第 9 项仍然成立 — 此构建不包含字节码,因此无需通过 Slither/Foundry 测试,也无需外部审计;如果这一情况有任何变化,则第 9 项将完全适用。
交接给 Dex(运行时要求,而非运行时决策)
- 正常运行时间。 必须能在无人值守且无需操作员持续点击的情况下,经受重启。在这台机器上,这意味着一个 systemd 单元 — 实时配置须经 Master 批准。Ward 没有创建此单元。
- 密钥。 该进程只需要一个变量:
X402_PAY_TO。不需要任何密钥。将其保存在所有仓库之外。.env.sepolia/.env.buyer的权限模式为 600,且已被 git 忽略,服务器也不会读取这些文件。 - 冷启动。 启动时会读取整块数据板一次(约 60 个 JSON 文件,耗时几十毫秒)。在 Workers 上,相同的数据结构来自 KV,通过
src/worker.js(env.BOARD的键:feed、coins、catalysts、sdn),由 07:50 的 cron 推送。两个 Workers(免费和付费)均已在 davitlabs Cloudflare 账户上运行 — 参见文末的两个章节。 - 每次付费调用都会通过出站 HTTPS 访问
https://x402.org/facilitator(1–2 个子请求)。这台机器的数据中心出站问题是 YouTube 的入站信誉,而不是出站 HTTPS。 - 数据。 将
CRYPTOPORT_DATA_DIR指向 07:50 的任务输出数据的位置。服务端口只会在启动时重新读取数据;请在任务输出后重启它,或添加重新加载功能。 - SDN 刷新与同一个 cron 一起运行:
npm run sdn-refresh(从 OFAC 只读获取数据,约 30 秒)。 - 免费层的速率限制属于边缘问题 → Dex。付费层会自行限制。
- 锚定工作仍由 Dex 负责第 1 阶段。 端口会使用锚点并原样传递,不会重新锚定、重新哈希或分叉护照记录。注意: 当前
dist构建中的anchor.root = null,而staging中有实际的 Merkle 根 — 已部署的构建未锚定。服务器启动时会打印警告,并忠实地提供空锚点。应由 Dex 修复,而非 Ward。 - 注册表提交 — 已完成。 已通过 HTTP 域名验证,以
com.thecryptoport/cryptoport-port的名称列在 registry.modelcontextprotocol.io 上(根目录server.json、scripts/registry-publish.sh)。
成本
预计约为 $0。 免费测试网 facilitator、免费注册表列表、测试网 USDC、现有托管服务,无合约,无供应商。唯一可能出现的经常性成本,是主网上线后每月结算量超过 1,000 笔时,CDP 每笔收取 $0.001;对于这块数据板的任何现实使用量而言,成本都为零。收入预期也约为 $0:按生态系统中位数计算,每月 1,000 次付费调用约为 $28;按这些价格计算,则是 $5–10。这条路径是对这套技术栈的演示,也是对一条支付通道的期权。
已知限制和信心标记
- Bazaar 发现功能在测试网上不可用 — 已于 2026-08-24 确认。 免费的
x402.org协调器的/supported会公布['builder-code','eip2612GasSponsoring','erc20ApprovalGasSponsoring'],不包含bazaar;而GET /facilitator/discovery/resources会返回 404。我们的 402 响应带有有效的bazaar声明(registry/bazaar-mcp.json,且test/x402.test.js对此有断言),但没有任何东西为其编制索引。真正的 Bazaar 上架需要 CDP 协调器,而这需要账户。这与 Lane C 规范 §C3 中“Bazaar 上线首日即可用”的说法矛盾,也是主网发布的门槛事项。 演示止步于 402— 已于 2026-08-27 在本地解决,并于 2026-09-05 在托管 Worker 上解决(在 Base Sepolia 上完成三笔 0.01 USDC 结算,涵盖 HTTP 和 MCP 调用;见下文付费 Worker 部分)。买方持有 0.255 测试 USDC,供后续运行使用。- MCP 注册表清单是根目录下的
server.json;它通过实时注册表架构的验证,也是scripts/registry-publish.sh发布的文件。(此前未使用的草稿registry/server.json已于 2026-08-30 移除。) board_snapshot是一个存根,因此在它仍是存根期间,我们特意不收取费用:目前还没有锚定的历史板块序列。- 结算元数据通过
PAYMENT-RESPONSE标头传回,而非响应正文,因为 SDK 在处理程序已写入正文后才完成结算。MCP 层会将其合并到有效负载中的settlement字段;HTTP 调用方则读取标头。此行为已记录,而非通过变通方案处理。 stance_history根据已发布的arc字符串生成。 如果第 0 层今后不再发布arc,此工具就没有可解析的内容。- Ward 不编写面向客户端的文案。每个有效负载中的
disclaimer句子都是工程说明,解释锚点能证明和不能证明的内容——措辞需由 Rhea/Pax 审定。
Pax / Master 的待决问题(已标记,尚未决定)
与 Lane C 规范 §C5 中的问题相同:(a) 对指定频道的通话记录摘要订阅收费,是否会改变归属标注/衍生作品方面的立场;(b) 付费加密货币通话记录订阅是否会被视为投资顾问业务,而免费板块不会;(c) 接收 USDC 以换取数据是否会被认定为资金转移;(d) 七个频道名称能否出现在付费产品中。这些问题均未有定论,本次构建不会向任何人收费。
文件
src/config.js env + the chain-id guard + the no-keys-in-env rule
src/allowlist.js B-2 gate (mirrors infra/cryptoport-site/allowlist.py)
src/data.js snapshot, freshness, arc parsing, search — pure, Workers-safe
src/inputs.js advisory-input refusal
src/sdn.js OFAC SDN screening
src/tools.js the one tool table: prices, schemas, descriptions, handlers
(its advertised half is mirrored in the origin's mcp-tools.json —
test/descriptor-parity.test.js fails if the two ever drift)
src/x402-routes.js route config, 402 body, Bazaar declarations, price table
src/app.js Hono app: gates, paywall, HTTP twins, free meta
src/mcp.js MCP server + streamable-HTTP mount (proxies the HTTP twins)
src/mcp-stdio.js stdio transport entry
src/node-server.js Node entry: disk -> memory at boot
src/worker.js Cloudflare Workers entry (KV-backed; no account created)
src/stats.js demand counter: counts per tool/transport/day in KV (/stats + /healthz.demand only if STATS_PUBLIC=1)
src/evm-keys.js keygen/address, same pattern as cad-on-chain
scripts/ keygen, sdn-refresh, balance, demo, gen-manifests, kv-push,
stats-read (the operator's read-only view of the private counts)
registry/ server.json (MCP registry), bazaar-mcp.json
data/ sdn-addresses.json (vendored OFAC export)
test/ 91 tests
Cloudflare Workers 上的免费 MCP 服务(于 2026-08-27 部署)
在线地址: https://cryptoport-mcp.cryptoport-port.workers.dev/mcp — 基于 HTTP 的 MCP,
提供六个工具,免费,无需密钥和账户。
Master 于 2026-08-27 裁定,免费 MCP 服务应先于付费 x402 端口托管:它是策略备忘录中所说的“面向人类预算的免费入口”,也是唯一能产生第 30 天检查点所需访客数量的事物;而网站在 /.well-known/mcp.json 发布的描述文件此前列出的工具并没有对应的服务。
从设计上免费,而非靠政策约束。 wrangler.jsonc 未设置 X402_PAY_TO,因此 createApp 不会挂载 x402 中间件,isCharging() 在每个响应中都会报告 price_usdc: "0" 和 paid: false,并且没有任何工具描述会标注费用。因此,Master 的裁定 4a——在第 60 天检查点之前暂不启用付费层——是通过移除变量来落实的,而不是依赖某人记得这项规定。
⛔ 请勿将 X402_PAY_TO 添加到此 Worker。 付费端口是一个独立部署,其托管已延期;在此处开启付款会仅通过编辑配置文件,就改变已被否决的层级。
数据路径。 scripts/kv-push.mjs 读取构建后的 dist/,并将 feed、coins、catalysts 和 sdn 写入 BOARD KV 命名空间。Worker 读取 KV;它不会接触文件系统,也不会回连 Bluehost——这也意味着被 Bluehost 的 mod_security 拒绝的机器客户端(python-requests 在那里会收到 406)可以在此访问看板。
无区域,无 DNS。 它通过账户自己的 *.workers.dev 子域名响应。没有创建或更改 thecryptoport.com 或任何其他投资组合域名上的记录,因此不会触及这些区域中“切勿操作邮件”的指令。
每日刷新 — 已于 2026-08-27 经 Master 批准安装
KV 保存最近一次推送的内容,因此推送安排在现有 07:50 链路的末尾——只有在构建、允许列表检查和部署均成功时才会运行。
更改此行之前,务必先在 cron 环境下进行试运行。 wrangler 的 shebang 是 #!/usr/bin/env node,而 cron 的精简 PATH 中没有 node:第一次尝试以退出码 127 失败,正是导致 2026-08-15 的 channel_intel 流水线失败的同一个陷阱。kv-push.mjs 现在会将自身 process.execPath 所在目录添加到 PATH 中。用于捕获此问题的检查:
env -i HOME=/home/ops PATH=/usr/bin:/bin SHELL=/bin/sh \
/home/ops/.nvm/versions/node/v24.15.0/bin/node scripts/kv-push.mjs
运维说明(主机、部署链路)保存在此仓库之外。
随时可以手动运行:node scripts/kv-push.mjs。
Cloudflare Workers 上的付费 x402 端口 — 测试网(部署于 2026-09-05)
线上地址: https://cryptoport-x402.cryptoport-port.workers.dev — 与免费 Worker 使用相同代码,通过 wrangler.x402.jsonc 部署,并设置了 X402_PAY_TO,因此四个收费工具会以 x402 v2 条款返回 402,使用 Base Sepolia(eip155:84532,测试 USDC),并通过免费的 x402.org facilitator 完成结算。latest_board 和 search 仍然免费;board_snapshot 目前只是存根,因此不收费。同一个 Worker 在 POST /mcp 上提供 MCP 服务,收费工具会标明 COSTS n USDC on Base Sepolia。不会收取真实资金;裁决 4a 仍然有效。包含已录制演示、链上收据和 Bazaar staging 的记录:
myPKA/Deliverables/2026-08-24-thecryptoport-strategy/12-ward-x402-port-hosted-testnet-2026-09-05.md。
npx wrangler deploy --config wrangler.x402.jsonc # deploy the PAID worker
npx wrangler deploy # deploys the FREE worker (wrangler.jsonc) — separate
PORT_URL=https://cryptoport-x402.cryptoport-port.workers.dev npm run demo # free -> 402 -> pay -> receipt, then the MCP leg
为什么使用第二个 Worker,而不是 env 块: wrangler.jsonc 中没有 X402_PAY_TO,正是这一点确保付费层级被拒绝。在该文件中添加付费环境,会让被拒绝的层级只隔着一行配置。两个文件、两个 Worker,不共享开关。
X402_PAY_TO 是普通 var——每个 402 响应中都会包含它,因此不是秘密;两个 Worker 上都没有 wrangler secret。
线上主机揭示了测试套件无法发现的三个问题(均已修复并测试):
- 自行等待 facilitator 握手完成。
@x402/hono会在构造时启动httpServer.initialize(),但只会在第一个付费请求中等待它完成。Workers 会取消响应发出时仍在进行的 I/O,因此,如果某个 isolate 的第一个请求是免费请求,之后所有付费请求都会永远挂起(wrangler tail:outcome: canceled,CPU 约 0 ms,耗时 25 s)。现在src/worker.js会传入syncFacilitatorOnStart:false,并在build()中等待app.__x402.initialize();只有成功后才缓存 isolate。 - 托管的 SDN 列表为空。
kv-push.mjs读取了data/sdn.json——一个从未存在过的文件——并推送了{"addresses":[]}。现在改为读取正确的文件;若地址少于 100 个则拒绝推送;在worker.js中捆绑了备用列表;在app.js中添加了默认拒绝保护(已设置 payTo 但筛查器为空时,拒绝构建);并添加了/healthz.sdn,以便查看已加载的门控状态。 - v2 请求头名称。 客户端发送
PAYMENT-SIGNATURE;门控只读取X-PAYMENT,因此从未筛查真实买家,缺少payer,而PAYMENT-RESPONSE收据读出的值为 null。现在每个门控都读取中间件读取的请求头;test/paid-path.test.js使用临时内存密钥为真实 v2 载荷签名,并通过 stub facilitator 完成结算。
仅属外观问题,已记录: 每次构建 isolate 都会记录 x402: Route "…" has an invalid bazaar extension: … Code generation from strings disallowed——Bazaar 扩展使用 Ajv(new Function)验证 schema,而 Workers 禁止这种方式。该问题仅发生在声明阶段;402 响应仍包含完整的 bazaar 块,结算不受影响。
Bazaar + registry——已暂存,尚未提交。 x402.org 没有 Bazaar(再次验证:/supported 中没有 bazaar,发现端点返回 404)。CDP 的 facilitator 在未经身份验证时会返回 401,因此要发布条目,需要 CDP 账户和作为 Worker secrets 的 API 密钥——需通过 Master's gate。开放后:设置 X402_FACILITATOR_URL=https://api.cdp.coinbase.com/platform/v2/x402,运行 wrangler secret put CDP_API_KEY_ID / CDP_API_KEY_SECRET,并在 app.js 中使用 new HTTPFacilitatorClient({ url: cfg.facilitatorUrl, createAuthHeaders }),其中 createAuthHeaders 为 CDP 的 JWT 请求头生成器——随后一次付费调用便会返回该扩展,四个路由也会出现在
GET …/x402/discovery/resources?payTo=0xcceb… 中。registry/server.x402-staged.json 是 0.2.0 registry 版本更新,其中将此 Worker 添加为第二个远程服务;已发布的 0.1.1 未作改动。
需求计数器 — 已构建于 2026-09-23,尚未部署 — 默认以 PRIVATE 方式计数
原因。 在这次构建之前,还没有人按工具统计过任一 Worker 上的 tools/call,而有记录的 x402 结算全部由我们自己的买家钱包支付。所有“Agent 会找到它”的移植理由,都建立在一个并不存在的数字上。src/stats.js 记录的就是这个数字——仅计数。
存储内容,仅此而已。 在现有的 BOARD 命名空间中,每个(Worker、UTC 日期、隔离实例)存储一个 KV 值——不新增绑定,不更改 wrangler 配置:
stats:<cryptoport-mcp|cryptoport-x402>:<YYYY-MM-DD>:<shard>
{ v, date, deployment,
tools: { <tool>: { mcp|http: { calls, errors, http_402, settled, known_bot } } },
tools_list: { mcp: { calls, known_bot } },
excluded: n }
stats:<deployment>:since the first UTC day this build counted anything
不存储 IP、付款方地址、用户代理、参数,也不存储任何精度高于日期的数据。 在边缘端只读取一次调用方信息(classifyOrigin),并转换为两个布尔值——是否来自操作者自己的出口,以及用户代理所属类别是否看起来像爬虫/监控程序(known_bot,使用粗略正则表达式;node、curl、python-httpx 和 claude-code 等 Agent 运行时特意不匹配)。IP 和 UA 不会被进一步传递。record() 仅根据枚举字段构建存储文档,因此额外字段无处写入。test/stats.test.js 通过哨兵 IP / UA / 付款方 / 查询值验证了这一点,还包含一个负向对照:对确实会泄露数据的存储执行同样的检查,必须失败。
统计内容。 calls = 到达工具的每次调用(MCP tools/call 或对应的 HTTP 调用,每次只计一次——MCP 层的进程内调用会被标记,因此绝不会同时计入 http);http_402 = 已发出付款条款;errors = 已拒绝或失败(400 提示性拒绝、403 SDN、404、500);settled = 已付款并完成结算;served(计算得出)= 其余情况。tools_list 统计 MCP 发现请求。非工具路径不计入。
排除操作者,但绝不写入源码。 本仓库是公开的,因此绝不会在其中提交任何 IP 地址——无论是 src/stats.js,还是(同样会提交的)wrangler.jsonc / wrangler.x402.jsonc。DEFAULT_EXCLUDED_IPS 按设计为空数组;排除列表仅在部署时从 STATS_EXCLUDE_IPS 环境变量读取(逗号分隔列表,可填写精确 IP 或 IPv4 CIDR,例如 203.0.113.7 或 203.0.113.0/24)。未设置该变量时,不排除任何地址,每次调用都会计入。被排除的调用只计入 excluded,绝不会计入任何工具分类。
Master 为每个 Worker 单独设置该值——首选设为机密(绝不会出现在 wrangler.jsonc、本仓库或 wrangler deployments list 中):
npx wrangler secret put STATS_EXCLUDE_IPS # free Worker (cryptoport-mcp)
npx wrangler secret put STATS_EXCLUDE_IPS --config wrangler.x402.jsonc # paid Worker (cryptoport-x402)
也可以在部署时通过普通的 --var 设置(会显示在部署元数据中,但仍绝不会提交到文件):npx wrangler deploy --var STATS_EXCLUDE_IPS:203.0.113.7(使用 wrangler.x402.jsonc 配置时也同样设置)。
设备的出口会在不同的数据中心 ASN 之间变动;当前地址及其历史记录保存在 myPKA 中的 infra/cryptoport-site/own-egress-ips.txt(不在远程端——绝不放在本仓库中)。出口变动时,请重新读取该文件并重置此变量。
KV 预算——此账户使用 Workers 免费套餐。 KV 每天允许 1,000 次写入和 1,000 次列表操作,按账户共享;还要供 07:50 的 kv-push(4 次写入)和 CAD on Chain Worker 使用。每次调用都写入一次,会在约 1,000 次调用时耗尽预算,导致看板无法刷新。因此,每个隔离实例每天拥有一个键(单写入者——无需读改写,也不会因 KV 跨 colo 约 60 秒的延迟而丢失增量),并通过 waitUntil 刷新累计总数:事件发生后约 10 秒进行首次刷新,之后最多每 10 秒刷新一次;写入 50 次后,最多每 15 分钟刷新一次;每个隔离实例每天最多写入 150 次;写入失败后,当天剩余时间停止计数。公开读取(/stats、/healthz,仅在 STATS_PUBLIC=1 时)由每个隔离实例共享一份聚合数据,缓存 15 分钟,并使用各自的列表预算;私有 Worker 完全不会因读取而消耗 KV 列表操作。结果是一个下限,而非精确计数,每个负载都会说明这一点。每天持续达到数千次调用,就是该功能应迁移到 Durable Object 或 Workers 付费套餐的信号——由 Master 决定,而且这是个好问题。
默认情况下,计数为 PRIVATE(Master 的裁定 S3.1 = B,2026-09-23)。 两个 Worker 都会按上述说明将计数写入 KV,但如果未设置 STATS_PUBLIC,就不会挂载 GET /stats——它会像任何未知路径一样返回 404 {"error":"not_found",…},因此不会暴露自身——而且 /healthz 不会包含 demand 区块(甚至不会包含 enabled:false)。计数不受此开关影响:仅 STATS_ENABLED 可将其开启或关闭。
读取(运维人员在主机上只读):
cd ~/projects/cryptoport-port && node scripts/stats-read.mjs # both Workers, last 14 UTC days
cd ~/projects/cryptoport-port && node scripts/stats-read.mjs --days 30 --only x402 --json
它通过本仓库自带的 wrangler,始终使用 --remote,在主机现有的 wrangler login 登录状态下,从 wrangler.jsonc 和 wrangler.x402.jsonc 中指定的 BOARD 命名空间列出并读取 stats:* 键(目前两者绑定的是同一个命名空间)。它会打印公开 /stats 将返回的聚合数据(按工具、传输方式和日期统计;--json 可输出完整载荷),这些数据由 src/stats.js 中相同的 mergeShard + summarize 构建。它绝不会写入数据:只有带 --remote 的 kv key list / kv key get 才能调用 wrangler,其他任何操作都会在进程启动前被拒绝(test/stats-read.test.js)。每次运行会为每个不同的命名空间执行一次 KV 列表查询,并为每个分片执行一次读取。无法解析的分片会让视图标记为 partial,而不是直接丢弃。
在部署时由 Master 为每个 Worker 单独切换开关,以公开计数:
npx wrangler deploy --var STATS_PUBLIC:1(wrangler.x402.jsonc 配置也执行相同操作)。只有值恰好为 1 时才会公开。--var 只在下次普通部署之前生效;普通部署会再次将计数设为私有。开启后,目前的公开行为会返回:
curl -s https://cryptoport-mcp.cryptoport-port.workers.dev/stats?days=14(1..31,默认 14),而 /healthz 会包含 .demand(最近 7 天)。与其他所有响应一样,公开载荷受 B-2 门控。
counting_since 之前的日期从未被测量:这些日期会被省略,而不是记为零。数组中只包含 {name, …},绝不会使用以工具为键的映射,因此 B-2 键遍历门控只会看到已声明的键;格式错误或来自其他来源的 KV 值不会产生任何数据(已测试)。
无需更改代码即可使用紧急停用开关: npx wrangler deploy --var STATS_ENABLED:0(付费配置也相同)。Node 服务(npm start)没有 KV,也不会计数;如果设置了 STATS_PUBLIC=1,其 /stats 会说明这一点。
Cloudflare 侧的数字(2026-09-23 核查,只读)。 主机上的 wrangler OAuth 授权没有 analytics 权限范围(wrangler whoami 中没有 analytics 或 observability read),而且 wrangler 没有 analytics-read 命令,因此要从 Cloudflare 的 GraphQL Analytics API 获取请求数,需要有权限范围的 API token,且具备 Account Analytics: Read 权限——这需要 Master 批准;尚未尝试。该 API 可以提供按状态码划分的每个 Worker 请求数,但无法提供 MCP 工具名称(它位于 POST 请求体中),这正是需要此计数器的原因。
部署状态(2026-09-23)——两个 Worker 都需要部署才能启用计数器
| Worker | 当前构建 | 需要执行 |
|---|---|---|
cryptoport-mcp(免费) | 2026-09-08 03:00 UTC | npx wrangler deploy——启用计数器 |
cryptoport-x402(付费,测试网) | 2026-09-07 03:14 UTC | bash ~/x402.sh go——应用 9/07 修复并启用计数器 |
先提交更改过的源代码:scripts/deploy-x402.sh 会拒绝存在未提交更改的 src/、wrangler*.jsonc 或 package*.json。部署前后,两个 /stats URL 都会返回 404(默认私有),因此无法通过 curl 区分构建版本。请改用 node scripts/stats-read.mjs 验证:在首次外部调用到达运行计数器构建版本的 Worker 之前,它会一直读取到 counting_since=never。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。