mcpField
H
headless-tracker

headless-tracker

本地服务
github.com/tamasPetki金融数据65 周前更新

关于 headless-tracker

headless-tracker 是只读 MCP 服务,可汇总交易所、钱包和预测市场中的加密资产。它将投资组合数据标准化后提供给 AI 主机,同时避免凭据进入模型上下文,并禁止交易或转移资金。

主要功能

  1. 01六种交易所、钱包和市场连接器
  2. 02标准化投资组合数据与盈亏
  3. 03只读访问及本地凭据存储
  4. 04MCP 仪表板和设置面板
  5. 05命令行投资组合查询
  6. 06多币种显示和分时段盈亏

适用场景

  1. 01查看多个交易所和钱包的持仓
  2. 02检查投资组合配置与盈亏
  3. 03同时查看预测市场和加密资产头寸
  4. 04从终端查询投资组合数据

MCP 相关

该服务向 MCP 客户端提供投资组合数据和账户管理工具,并包含仪表板与设置 MCP App 以及三个视图提示词。连接器均为只读,无法交易或转移资金。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"tamaspetki-headless-tracker": {
"command": "npx",
"args": [
"-y",
"headless-tracker"
]
}
}
}
启动命令npx -y headless-tracker

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmheadless-tracker1.0.17

工具

15

收录的工具列表 · 更新于 2 周前

参数类型必填说明
currencyenum否value/currentPrice/avgCost 的显示货币(默认值为“USD”)。非 USD 货币会按实时汇率转换;汇率及其来源显示在 meta.fx 中。仅用于显示,不会更改底层数据。USD | EUR | GBP | HUF
account_idstring否按 id 限定一个账户,例如“metamask:0xabc123...”或“bybit:UNIFIED”。省略则查询所有已配置的账户。通过 list_accounts 获取有效 id。
asset_classenum否限定一种资产类别。“prediction” = Polymarket 条件代币;“cash” = 稳定币/法币余额。省略则查询所有类别。crypto | stock | prediction | cash

详细介绍

headless-tracker

npm version

🤖 本项目由 AI 开发 Agent Hex 自主开发和维护。决策日志:decisions.md · 每日构建日志:daily-log.md · 在 Bluesky 上关注 Hex · 独立团队。开发过程中没有人类参与。

⚠️ 不构成财务建议。 HeadlessTracker 是一款投资组合数据聚合工具,仅供参考。完整内容请参阅 DISCLAIMER.md。

一个只读 MCP 服务,让你的 AI 宿主(Claude Desktop、Claude Code、Cursor、ChatGPT)查看你在交易所、链上钱包和预测市场中的全部加密货币投资组合——无需向它提供 API 密钥,也无法进行交易或转移资金。它只读取数字,无法触碰资金。

AI 宿主将 HeadlessTracker 投资组合渲染为仪表板——六个平台(Bybit、Binance、MetaMask、Solana、Hyperliquid、Polymarket)上的净资产为 116,166 美元,并显示资产类别分配、各平台持仓,以及仅供参考的 Hyperliquid 未平仓永续合约头寸。

↑ AI 宿主根据 HeadlessTracker 的数据渲染出的内容——一个问题、六个平台、一个视图。服务返回数字,宿主绘制图表。(示例数据;此视觉效果由宿主基于工具输出渲染。)

npx headless-tracker 演示——在终端中渲染的六个平台投资组合示例(Bybit、Binance、MetaMask、Solana、Hyperliquid、Polymarket),无需账户和 API 密钥

↑ 以及原始输入:npx headless-tracker demo 的实际输出——六个平台,无需账户和 API 密钥。然后向你的 AI 宿主询问相关信息。

AI 宿主将同一投资组合示例渲染为交易者视图——显示 30 天盈亏概览和迷你走势图、今日涨跌资产,以及包含 Hyperliquid 永续合约头寸(多头/空头)的杠杆持仓表,表中列出入场价、标记价格、清算价格和未实现盈亏。

↑ 相同数据,不同问题。询问“我的持仓表现如何?”,AI 就会渲染出交易者视图。没有固定的仪表板——宿主会绘制你要求的视图。(模板即将推出:欢迎贡献视图,而非连接器。)

核心观点:AI 宿主(Claude Desktop、Claude Code、Cursor、ChatGPT)可以根据结构化数据按需生成仪表板。在 2026 年再构建一款追踪器 UI 是白费功夫——没有唯一的 UI 需要构建,AI 会渲染你想要的任何视图。构建数据层,让 AI 宿主负责渲染。

状态: 已达到生产就绪状态,并已在 npm 上线(版本见上方徽章)。包含六个连接器(Bybit、Binance、MetaMask/EVM、Solana、Hyperliquid、Polymarket)、15 个 MCP 工具、交互式多标签页仪表板面板、用于终端查询的 CLI,以及包含 428 个测试的测试套件。可在原生 Node(npx headless-tracker)或 Bun 下运行,并已与 Claude Desktop 实现端到端协作。

完整功能列表 - **6 个连接器:** Bybit、Binance Spot+Futures、MetaMask 多链 + 多钱包、Solana 多钱包、Hyperliquid(永续合约 + 现货,仅需地址)、Polymarket - **15 个 MCP 工具:**6 个数据工具 + 7 个账户/代币管理工具 + 2 个 MCP App 面板 - **3 个 MCP 提示词(视图):**`portfolio-dashboard`、`weekly-review`、`risk-check`——参见 [TEMPLATES.md](TEMPLATES.md),以及[贡献视图](TEMPLATES.md#contribute-a-view--not-a-connector) - **交互式仪表板 MCP App:**3 个标签页(Portfolio / Weekly / Risk),包含环形图和柱状图、货币切换器、刷新按钮 - **实时设置 MCP App**,用于配置和管理 - **CLI 投资组合查询:**`show holdings / pnl / transactions`(无需 Claude) - **自定义 ERC-20 代币列表**;基于交易历史计算 FIFO + 平均成本 - **多币种显示**(USD/EUR/GBP/HUF);通过 CoinGecko + Jupiter 获取现货价和历史价格 - **按时间范围统计盈亏**(`--timeframe=24h|7d|30d|ytd`) - **包含 428 项测试的测试套件**;可在原生 Node 或 Bun 下运行 - **只读且本地优先:**不支持下单/提现/转账;6 个连接器中有 4 个只需公开地址;密钥保存在操作系统密钥链中,绝不会进入模型的上下文——参见 [SECURITY.md](SECURITY.md)

有关已完成事项、后续计划及有意排除的范围,请参见 ROADMAP.md。

功能介绍

以只读方式连接你的账户,将所有数据统一为单一架构,并将其作为 MCP 工具提供。然后你可以向 Claude(或任何 MCP 宿主)提问:

  • “我有哪些资产?”
  • “我的投资组合在加密货币和预测市场之间如何分配?”
  • “按事件分组显示我的 Polymarket 仓位。”
  • “刷新 Bybit,并告诉我 BTC 的盈亏。”

AI 宿主会生成图表、表格和明细。你无需构建 UI。

60 秒快速试用(无需 API 密钥)

**零配置版本——只需一条命令,无需账户、密钥,甚至无需地址。**查看完整的示例投资组合(五个平台;加密货币 + 现金 + 预测市场),其呈现方式与你的 AI 宿主收到的内容完全一致:

npx headless-tracker demo
account                 symbol               class       qty       value    price
──────────────────────  ───────────────────  ──────────  ────────  ───────  ───────
bybit:UNIFIED           BTC                  crypto      0.420000  $25704   $61200
binance:spot            SOL                  crypto      95.0000   $14440   $152.00
metamask:0xd8d2…f1a3    WBTC                 crypto      0.150000  $9150    $61000
solana:7vfC…Wd9k        JUP                  crypto      1800.00   $1656    $0.9200
polymarket:0x9c1a…7b20  RATE-CUT-2026 (YES)  prediction  1500.00   $930.00  $0.6200
…
Total: $104126  (15 positions across 5 venues)

Allocation by asset class:
  crypto         $88024   84.5%  ████████████████████
  cash           $14900   14.3%  ███
  prediction      $1202    1.2%  █

它还会打印出你可能会向 Claude 提出的通俗问题(“我所有平台上都有哪些资产?”、“如何分配?”),并列出回答每个问题的 MCP 工具。准备好查看自己的数据时,流程相同,只需使用真实地址或只读密钥:

你不应该仅仅为了了解一个新工具是否好用,就必须把交易所密钥交给它。Solana、Hyperliquid 和 Polymarket 可读取公开的链上地址,因此你可以将 HeadlessTracker 指向任何你能查看的钱包(包括自己的),无需任何凭据。(Hyperliquid 完全无需密钥——永续合约仓位、账户净值和现货余额都只需读取你用于交易的地址。)

# install (or prefix any command with `npx`)
npm install -g headless-tracker

# add a public Solana wallet: no API key, just the address
headless-tracker setup solana
#   Solana address (base58): <paste any public address>
#   (press ENTER through the optional RPC + dust prompts)

# print the holdings right in your terminal, no Claude required
headless-tracker show holdings
account            symbol  class   qty       value    price
─────────────────  ──────  ──────  ────────  ───────  ────────
solana:7Xk2…q9Fa   SOL     crypto  12.4081   $2604    $209.88
solana:7Xk2…q9Fa   USDC    crypto  540.0000  $540.00  $1.00
solana:7Xk2…q9Fa   JUP     crypto  1200.00   $612.00  $0.5100

Total: $3756  (3 positions across 1 accounts)

(输出示例;为适应宽度,此处缩短了账户 ID。你的数据来自实时链上信息。)

整个流程就是这样:安装、输入公开地址,即可查看标准化后的持仓。需要连接自己的私有账户(Bybit、Binance)时,也对它们运行 setup。每个连接器都使用只读凭据,这些凭据保存在操作系统密钥链中,不写入磁盘,也不会发送到交易所自有 API 之外的任何地方。然后将其接入 Claude,并询问*“我有哪些资产?”*,即可获得与聊天原生仪表板相同的数据。

非交互式设置(脚本、Docker、CI)

setup 也可以在无提示的情况下运行——传入标志,并将任何密钥放在环境变量中(切勿放在命令行上,以免记录在 shell 历史中):

# public-address connectors: everything via flags, zero secrets
headless-tracker setup solana --address=<base58> --dust=0.5
headless-tracker setup hyperliquid --address=0x...   # perp + spot, no key
headless-tracker setup polymarket --proxy-wallet=0x... 

# connectors with a secret: non-secret config via flags, secret via env
HT_SETUP_ETHERSCAN_KEY=… headless-tracker setup metamask --address=0x... --chains=1,137
HT_SETUP_API_KEY=… HT_SETUP_API_SECRET=… headless-tracker setup bybit --account-type=UNIFIED --also=FUND

无头模式/无操作系统密钥链(Docker、WSL、许多 Linux 服务器、CI):由于没有可供写入的 Secret Service,setup 会注册账户,并打印需要设置的确切 HEADLESS_TRACKER_<CONNECTOR>_<ACCOUNT> 环境变量,其值为 JSON 凭据对象,例如 HEADLESS_TRACKER_SOLANA_<ADDR>='{"address":"…","dustThresholdUsd":0.5}'。在 MCP 服务的环境中设置该变量,数据工具便会从中读取凭据。任何内容都不会写入磁盘。

交互式仪表板(实时 UI 面板)

对于支持 MCP Apps 的宿主 — Claude Desktop、ChatGPT、Goose、VS Code — 可以说:

显示我的仪表板

宿主会在聊天面板中渲染一个沙盒化 iframe,其中包含三个实时标签页:

  • Portfolio(投资组合) — 总价值 KPI、主要持仓表、按币种分配的环形图(前 7 项 + “其他”尾项)、警告和故障
  • Weekly(每周) — 7 天窗口变化 KPI、近期交易表、跳过的币种说明(含原因)
  • Risk(风险) — 集中度审查(单一持仓、交易场所、稳定币储备、预测市场超配),评级为 PASS / WARN / ALERT,并提供按交易场所划分的环形图

此外还有货币切换器(USD / EUR / GBP / HUF)和刷新按钮。用户点击标签页时,iframe 会自行发起后续工具调用 — 打开后无需额外提示。可选参数:

以 HUF 打开仪表板,并切换到每周标签页

实现位置:src/mcp/apps/dashboard/(浏览器端 TS,通过 bun run build:apps 打包为单个 dist/mcp-apps/dashboard.html,并随软件包一同发布)。打包后的文件包含在 npm 软件包中,因此用户运行 npx headless-tracker 无需执行构建步骤。

如果你的宿主尚未渲染 MCP Apps,render_dashboard 工具仍会返回文本确认。可使用下方的 提示词指南 作为替代方案 — 工作流和数据相同,只是没有实时 UI 面板。

设置面板(用于设置和管理的实时 UI)

如果不想通过终端进行设置,可以这样请求:

打开设置

Settings MCP App 会打开,包含四个标签页:

  • Accounts(账户) — 显示已配置账户的列表,并提供 Remove 按钮(单向确认对话框;会从 OS 钥匙串和注册表中删除)。
  • Add Account(添加账户) — 提供 Bybit / Binance / MetaMask / Solana / Hyperliquid / Polymarket 表单。每个表单都会先通过上游 API 验证凭据,再保存凭据。表单顶部会明确说明安全事项:通过表单提交的凭据在送往钥匙串的过程中会经过 Claude Desktop 进程。这六个连接器均按设计使用只读凭据(Bybit 仅启用“Read”,不启用 Withdraw;Binance 仅启用“Enable Reading”,不启用 Trade 或 Withdraw;Etherscan 是用于限制请求频率的公共数据令牌;Polymarket 代理钱包本身已公开;Solana 和 Hyperliquid 地址是公开的链上标识符 — Hyperliquid 完全不需要密钥或签名)。最坏情况下发生泄露,也只能读取投资组合,无法转移资金。若要实现零信任,仍可使用 CLI 流程(bun run setup <connector>)。
  • Wallets(钱包) — 为现有 MetaMask 或 Solana 账户添加其他钱包地址(在单个 MCP 账户下管理多个钱包,共用同一个 Etherscan 密钥 / 链选择或 RPC URL)。
  • Custom Tokens(自定义代币) — 按链列出、添加或移除 ERC-20 代币。代币数据是公开的链上数据;不涉及钥匙串。

无论选择哪种方式(CLI 或 Settings UI),都会写入同一个 ~/.headless-tracker/cache.db 和 OS 钥匙串,因此通过任一方式创建的账户都会立即显示在仪表板和 CLI 中。

快速开始

1. 安装

无需克隆、无需构建步骤,也无需 Bun。软件包可在普通 Node(≥ 22.5)或 Bun 环境下运行。全局安装:

npm install -g headless-tracker

也可以在不安装的情况下,通过在命令前加上 npx 来运行,例如 npx headless-tracker setup solana。(开发时从源代码构建需使用 Bun — 参见开发。)

2. 配置账户(交互式)

对每个要使用的集成运行 setup。每项设置都会提示输入凭据、验证凭据,并将其存储在 OS 钥匙串中(macOS Keychain、Linux Secret Service、Windows Credential Vault)。如果是在没有钥匙串的无头设备上,请参见下方的无头环境 / 没有 OS 钥匙串。

headless-tracker setup bybit
headless-tracker setup binance
headless-tracker setup metamask
headless-tracker setup solana
headless-tracker setup polymarket

验证已配置的内容:

headless-tracker list-accounts
无头环境/无 OS 密钥链(Docker、WSL、服务器、CI)

OS 密钥链需要运行中的密钥服务(Linux 上的 Secret Service/D-Bus、macOS 上的 Keychain、Windows 上的 Credential Vault)。许多实际环境都没有这类服务:Docker 容器、WSL、精简版 Linux 服务器、CI 任务。在这些环境中,写入密钥链会失败。

此时,setup 不会中止。它仍会注册账户,然后打印需要设置的确切环境变量,例如:

⚠  OS keychain unavailable, so credentials were NOT stored (...). The account is
   registered. ... set the HEADLESS_TRACKER_SOLANA_<ADDR> environment variable to a
   JSON object in your MCP server's env, then restart.

将此变量设为 MCP 服务的 env 块(或 Shell)中的连接器凭据 JSON,然后重启。环境变量始终优先于密钥链,因此也可用作显式覆盖。各连接器的 JSON 格式如下(请使用只读 API 密钥——参见 Settings 面板部分的安全说明):

连接器环境变量(由 setup 打印)JSON 值
BybitHEADLESS_TRACKER_BYBIT_<ACCOUNTTYPE>{"apiKey":"...","apiSecret":"...","accountType":"UNIFIED"}
BinanceHEADLESS_TRACKER_BINANCE_KEY_<FIRST6>{"apiKey":"...","apiSecret":"...","includeFutures":false}
MetaMaskHEADLESS_TRACKER_METAMASK_0X<ADDR>{"address":"0x...","etherscanApiKey":"...","chainIds":[1],"trackCommonTokens":true,"hasEtherscanPro":false}
SolanaHEADLESS_TRACKER_SOLANA_<ADDR>{"address":"<base58>"}(可选 "rpcUrl"、"dustThresholdUsd")
HyperliquidHEADLESS_TRACKER_HYPERLIQUID_0X<ADDR>{"address":"0x..."}(可选 "dustThresholdUsd")
PolymarketHEADLESS_TRACKER_POLYMARKET_0X<ADDR>{"proxyWallet":"0x...","sizeThreshold":0.01}

变量名根据账户标识符生成(setup 会打印确切字符串,因此无需手动构造)。Claude Desktop/MCP 配置 env 块示例:

"env": {
  "HEADLESS_TRACKER_SOLANA_<ADDR>": "{\"address\":\"<base58 address>\"}"
}
可选:请求超时

每个账户的数据获取都受截止时间限制(默认 30s),因此上游服务卡住时绝不会阻塞工具调用——该账户会返回 network_timeout 错误,其余账户则正常返回。可通过 HEADLESS_TRACKER_REQUEST_TIMEOUT_MS 覆盖此设置(例如,若你在单个 MetaMask 账户上跟踪许多 EVM 链并遇到偶发超时,可调高此值)。

3. 配置 Claude Desktop

编辑 claude_desktop_config.json(macOS:~/Library/Application Support/Claude/,Windows:%APPDATA%\Claude\):

{
  "mcpServers": {
    "headless-tracker": {
      "command": "npx",
      "args": ["-y", "headless-tracker"]
    }
  }
}

这就是全部配置:无需绝对路径、克隆位置或 Bun。不带子命令运行 npx -y headless-tracker,即可通过 stdio 启动 MCP 服务(npx 会在首次运行后缓存)。如果你通过 npm i -g headless-tracker 全局安装,也可以仅使用 "command": "headless-tracker",不设置 args。

重启 Claude Desktop(按 Cmd+Q,然后重新打开——应用内的“新建对话”不会重新加载配置)。

4. 试用

在 Claude Desktop 中开启新对话:

我的投资组合里有什么?

我的投资组合中,加密货币和预测市场的占比如何?

显示我的 Polymarket 持仓,并按当前价值排序。

如果 Claude 看不到这些工具,请检查 ~/Library/Logs/Claude/mcp-server-headless-tracker.log。

5. 使用交互式仪表板(MCP App)

设置完成后,询问:

显示我的仪表板

实时 UI 面板会在聊天中弹出。有关各个标签页的内容以及如何传递参数,请参阅上文的交互式仪表板(实时 UI 面板)部分。

6. 使用预设提示词(一键式仪表盘)

MCP 服务附带三个提示词模板。它们会显示在 Claude Desktop 的提示词选择器中(/ 菜单或附件菜单,具体取决于版本),也会在 Claude Code 中显示为斜杠命令。每个提示词都会引导 Claude 完成特定的多工具工作流:

提示词功能
portfolio-dashboard并行调用 get_holdings + get_allocations + get_pnl + get_polymarket_positions,并生成完整的多分区仪表盘(支持时生成 HTML 工件)。
weekly-review7 天窗口变化 + 变动最大的项目 + 最近交易 + 一条观察。坦诚说明近似计算的注意事项(按历史价格计算当前持仓篮子,而非窗口内的交易)。
risk-check集中度 / 交易平台 / 稳定币储备 / 预测市场超配 / 链集中度。每个维度根据实际百分比评为 PASS / WARN / ALERT。

你也可以直接粘贴以下任一提示词——它们都是纯文本。请参阅下方的实用提示词集。

实用提示词集

将这些提示词复制粘贴到任何支持 MCP 的客户端中。每个提示词都要求已配置 headless-tracker MCP 服务。无需在服务端编写新代码。

快速了解“我的持仓情况”

为我生成一份完整的投资组合仪表盘。并行调用 get_holdings、get_allocations(按 asset_class 和 symbol)、get_pnl 和 get_polymarket_positions,并综合生成一个仪表盘工件。显示前 10 大持仓、资产类别明细和总盈亏。对于 NULL 字段请如实说明,不要捏造。

快速了解“这一周表现如何”

为我生成一份 7 天回顾。调用 get_pnl(timeframe=7d)、get_holdings 和 get_transactions(since=7d)。展示 windowDelta,并说明近似计算的注意事项(“按历史价格计算当前持仓篮子,而非窗口内的交易”),按交易平台列出交易,最后用一句简短的话说明变化的驱动因素。

快速了解“我需要担心吗”

对我的投资组合进行风险检查。调用 get_holdings 和 get_allocations(按 symbol、asset_class、connector)。分别评估:单项持仓集中度(> 40% 为 ALERT)、交易平台集中度(> 70% 为 ALERT)、稳定币储备(< 5% 为 WARN,= 0% 为 ALERT)、预测市场超配(> 15% 为 WARN)。以 Markdown 表格输出。

报税季

我需要报税。调用 get_transactions 获取过去一年的交易(since=365d)。然后调用 get_pnl(include_history=true,method=fifo)。按 symbol 和月份汇总已实现盈亏。标记所有成本基础未知的卖出交易(没有价格的存入 / 转账)——这些信息缺失之处需要我另行调查,请如实指出。

HUF 视图(或 EUR / GBP)

以匈牙利福林显示我的投资组合。调用 get_holdings(currency=HUF)。按价值降序排序。计算 HUF 总额,并告知汇率来源是实时 API 还是静态回退值。

Polymarket 投注回顾

带我了解 Polymarket 持仓。调用 get_polymarket_positions(group_by_event=true)。然后调用 get_pnl(include_history=true),通过 /trades 按 FIFO 获取已实现盈亏。对于每个事件,显示:标题、我的结果持仓、当前价值、截至目前的已实现盈亏和结束日期。标记我可以申领的可兑付持仓。

从 CLI 快速查询投资组合(无需 Claude)

无需打开 Claude Desktop,即可在 3 秒内回答“我的投资组合里有什么?”:

headless-tracker show holdings
headless-tracker show pnl
headless-tracker show transactions --since=7d

每条命令都会打印一个文本表格。筛选条件也可用:show holdings --account-id=bybit:UNIFIED、show holdings --asset-class=crypto、show transactions --since=24h --account-id=metamask:0xabc。

多币种显示

show holdings 默认使用 USD。传入 --currency= 可查看按实时汇率换算的数值:

headless-tracker show holdings --currency=HUF
headless-tracker show holdings --currency=EUR

汇率来自免费公共 API(exchangerate-api.com),并以 frankfurter.dev 作为备用;如果两者都失败,则使用静态回退值(此时会显示警告,提醒你显示的数值可能有几个百分点的过时误差)。支持的币种:USD、EUR、GBP、HUF。

成本基础计算方法(FIFO 与平均成本)

根据你的交易历史计算真实已实现盈亏(而非连接器元数据;预测市场的元数据可能混合已实现与未实现盈亏):

headless-tracker show pnl --include-history=true
headless-tracker show pnl --include-history=true --method=average

--method=fifo(默认):每次卖出时优先消耗最早的批次。 --method=average:汇总所有有定价的买入;卖出时按滚动加权平均成本计算。

两种方法都遵循“诚实地标记未知”规则:通过钱包转入收到的代币(无价格)会导致任何涉及这些代币的卖出产生 realizedPnl: null——不会捏造数字。已实现盈亏仅统计所有被消耗批次的成本基础均已知的卖出。

按时间窗口计算盈亏
headless-tracker show pnl --timeframe=7d
headless-tracker show pnl --timeframe=24h
headless-tracker show pnl --timeframe=ytd

按历史 CoinGecko 价格对你的当前资产组合估值,并报告与当前相比的差额。**近似计算:**不会考虑时间窗口内的交易——它回答的是“如果我 N 天前持有完全相同的资产组合,收益会是多少?”Polymarket 仓位以及没有 CoinGecko 映射的加密货币会被跳过(计入 skippedSymbols)。CoinGecko 免费套餐的历史数据精度为每日,因此 --timeframe=24h 表示“昨日收盘价与当前价格相比”。

自定义 ERC-20 代币

捆绑的 MetaMask 代币列表涵盖 USDC, USDT, WETH, WBTC, LINK, DAI。如需追踪特定项目的代币:

headless-tracker token add metamask:0xabc 1 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 USDC 6
headless-tracker token list
headless-tracker token remove metamask:0xabc 1 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48

自定义代币按账户存储在 SQLite 账户存储中(而非钥匙串——它们是公开的链上标识符,不是机密信息)。

支持的集成

连接器身份验证状态备注
Bybit V5API key + secret✓ 完整UNIFIED / SPOT / CONTRACT / FUND 账户。只读密钥。
BinanceAPI key + secret✓ 资产持仓现货账户(/api/v3/account)+ 可选的期货钱包/持仓(/fapi/v2/account)。只读密钥(仅启用“Enable Reading”)。稳定币按 $1 计价;非稳定资产通过批量接口 /api/v3/ticker/24hr?type=MINI 计价。未平仓期货仓位会作为单独的资产持仓显示,并在元数据中包含方向、杠杆、盈亏和强平信息。v0.13 中交易历史为 ok([]),暂缓实现。仅支持 binance.com(binance.us 暂缓实现)。
MetaMask / EVM 钱包Etherscan V2 API key✓ 完整一个密钥即可覆盖 Ethereum、Polygon、BSC、Base、Arbitrum、Optimism。余额支持原生代币和内置的常见 ERC-20 代币(USDC、USDT、WETH、WBTC、LINK、DAI);交易支持原生代币和 ERC-20 转账。可通过 headless-tracker token add ... 添加自定义代币列表。每个账户可添加多个钱包(一个 Etherscan key,多个地址)。免费套餐需要 Etherscan Pro 才能使用 BSC/Base(否则会自动跳过并发出警告)。
Polymarket代理钱包地址(无需 API key)✓ 完整使用公开的 data-api。通过 /trades?user=PROXY 获取持仓和买入/卖出交易历史(最多约 1000 条最新记录)。已结算亏损的持仓(已结算市场中价值为 $0、但 data-api 仍会返回的持仓)会通过基于价值的尘埃阈值(dustThresholdUsd,默认值为 $0.01)过滤。
Solana 钱包Base58 地址(无需 API key)✓ 资产持仓使用公开的 Solana RPC + Jupiter Price API v2。支持原生 SOL + SPL 代币(Token program v1;暂不支持 Token-2022)。每个账户可添加多个钱包;对于追踪 3 个以上钱包的用户,可选用高级 RPC URL(Helius/QuickNode/Triton)。为主要铸币地址提供固定元数据(USDC/USDT/mSOL/JUP/JTO/PYTH/BONK/RNDR/WIF/JLP)。v0.12 中交易历史为 ok([]);将在 v0.14 中支持,并可选择启用高级 RPC。
HyperliquidEVM 地址(无需 API key 或签名)✓ 完整使用公开的 info 端点。永续合约账户的 权益 报告为账户的净美元价值(抵押品 + 未实现盈亏);未平仓永续合约仓位会作为单独的资产持仓显示,并在元数据中包含带符号的数量、名义价值、未实现盈亏、入场/强平价格和杠杆——其名义价值会被刻意排除在净资产总额之外(否则会高估杠杆账户)。现货余额通过 spotMetaAndAssetCtxs 中的 USDC 交易对计价;USDC = $1,无法计价的代币会按尘埃过滤。交易历史通过近期成交记录获取(userFills,最多 2000 条)。每个账户可添加多个地址。

要添加新的连接器,请实现 src/connectors/types.ts 中的 Connector,并将其添加到 src/mcp/orchestrator.ts 中的 CONNECTOR_FACTORIES。根据现有六个连接器的实现,每个连接器约需 150-400 行代码(具体取决于上游 API 使用 REST/SDK/RPC,以及响应结构的丰富程度)。

MCP 工具一览

工具用途常见提示词
get_holdings所有账户的当前持仓“我持有什么”“显示我的投资组合”“当前持仓”
get_pnl汇总盈亏“我表现如何”“我的盈亏是多少”“我是赚了还是亏了”
get_polymarket_positions专为 Polymarket 设计,按事件分组“显示我的 Polymarket 投注”“选举投注”
get_transactions带有 since 筛选条件的交易历史“显示我最近的交易”“本周的交易”
get_allocations按资产类别/连接器/链/代币符号分组的明细“我的投资组合如何分配”“最大持仓”
refresh_data强制使缓存失效“刷新”“获取最新数据”“现在获取”

数据工具接受可选的 account_id 筛选条件(例如 metamask:0xabc...、bybit:UNIFIED)。不指定筛选条件时,会查询所有数据。

账户和设置管理(所有凭据写入操作均使用只读 API 密钥,并将其存储在 OS 钥匙串中):

工具用途
setup_connector将只读凭据写入 OS 钥匙串,以配置连接器
list_accounts列出已配置的账户,不暴露凭据
add_wallet_address为现有 MetaMask 或 Solana 账户添加另一个钱包地址
remove_account从钥匙串中删除账户及其凭据
add_custom_token在 MetaMask 账户中追踪项目专属 ERC-20 代币
remove_custom_token停止追踪自定义 ERC-20 代币(公开的链上数据,无需钥匙串)
list_custom_tokens列出各 MetaMask 账户正在追踪的自定义 ERC-20 代币

MCP App 面板(在聊天中呈现的交互式界面):

工具用途
render_dashboard交互式仪表板面板:持仓、盈亏、资产分配、预测市场
render_settings设置面板:CLI 设置流程的图形界面替代方案

为什么采用本地优先设计

  • API 密钥绝不会离开你的设备。 通过 @napi-rs/keyring 将其存储在 OS 钥匙串中。
  • 缓存使用本地 SQLite(运行时内置驱动:Node 下为 node:sqlite,Bun 下为 bun:sqlite)。没有服务端、没有 SaaS,也不会发送分析数据。
  • 默认不收集遥测数据。 错误报告完全由用户选择启用:只有在你设置了 SENTRY_DSN 时才会执行任何操作;即便如此,也绝不会发送投资组合数据——不包括金额、余额、钱包地址、API 密钥或账户标签,只会发送错误类别、经过清理的消息/堆栈信息,以及发生故障的连接器。详情请参阅 decisions.md(2026-06-06)。
  • 从设计上就是只读的。 不会签署交易。该工具所能做的一切都不会导致你损失资金。
  • 按连接器设置缓存 TTL(加密钱包为 60s,交易所为 120s,Polymarket 为 30s),既能保持快速响应,又不会对上游 API 造成过多请求。

架构

              ┌────────────────────────────┐
              │     headless-tracker       │
              │      (Node or Bun)         │
              │  ────────────────────────  │
              │  src/connectors/           │
              │    bybit.ts                │
              │    metamask.ts             │
              │    polymarket.ts           │
              │  src/types.ts (schema)     │
              │  src/cache.ts (SQLite)     │
              │  src/vault.ts (keyring)    │
              │  src/accounts.ts (registry)│
              │  src/mcp/orchestrator.ts   │  ← parallel fan-out + in-flight Promise dedup
              │  src/mcp/server.ts         │  ← McpServer + 15 tools
              │       ▲                    │
              │       │ stdio MCP          │
              └───────┼────────────────────┘
                      │
       ┌──────────────┼──────────────┐
       │              │              │
┌──────▼──────┐ ┌─────▼─────┐ ┌──────▼──────┐
│Claude Desktop│ │Claude Code│ │ Cursor/Codex│
│  ChatGPT     │ │           │ │  ZED, etc.  │
└──────────────┘ └───────────┘ └─────────────┘

示例提示词和响应

headless-tracker 的核心是,你无需编写 SQL 或学习命令行,只需向 Claude 提问即可。以下是一些对话示例:

“我持有哪些资产?”

Claude 调用 get_holdings({}),并返回格式化的明细:“你目前在 Bybit 持有 0.5 BTC(约 $30,000)、2 ETH(约 $5,000),MetaMask 钱包中还持有 1 ETH,以及一笔价值 $60 的 2024 年选举 Polymarket 仓位。投资组合总价值:约 $35,060。”

“按事件分组显示我的 Polymarket 投注。”

Claude 调用 get_polymarket_positions({ group_by_event: true }),并生成一张按事件分组的表格,其中包含标题、你持有的 Yes/No 结果仓位、事件总价值,以及每个事件的合计现金盈亏。

“我的资产在加密货币和预测市场之间如何分配?”

Claude 调用 get_allocations({ by: "asset_class" }),并返回百分比分布:“97.5% 为加密货币($35,000),2.5% 为预测市场($1,000)。”

“刷新我的数据并显示最新持仓。”

Claude 调用 refresh_data({}),然后调用 get_holdings({})——缓存会失效,系统会并行从所有上游 API 获取最新数据,然后由 Claude 呈现更新后的状态。

“给我一份完整的投资组合仪表盘。”

Claude 并行调用多个工具(get_holdings、get_allocations、get_pnl、get_polymarket_positions),并综合生成一个包含多个板块的仪表盘。即使扇出范围很广,编排器的进行中 Promise 去重机制也能确保每个连接器最多只会被调用一次。

开发

从源代码构建需要使用 Bun 1.3+。最终用户无需安装它——请参阅快速开始。

git clone https://github.com/tamasPetki/HeadlessTracker.git
cd headless-tracker
bun install
bun test                              # 377 tests, ~5s
bun run typecheck                     # bun --bun tsc --noEmit
bun run build:apps                    # bundle the dashboard MCP App into dist/mcp-apps/
bun run build                         # build the Node-runnable dist/ (what npm ships)
bun run start                         # start MCP server on stdio (debug only)
bun run setup bybit                   # interactive credential setup

要添加连接器,请遵循 src/connectors/ 中的现有模式。Connector 接口会强制所有集成都统一使用 Result<T> 错误处理——对于预期失败(身份验证、速率限制、网络),不会通过抛出异常的方式处理。

常见问题

我的 API 密钥会被发送到其他地方吗? 不会。它们存储在操作系统的密钥链中,只会发送到对应的上游 API(Bybit 密钥发送到 Bybit 的 API,Etherscan 密钥发送到 Etherscan 的 API)。MCP 服务完全在你的计算机上运行。

Polymarket 显示了我的持仓,但 Claude 看不到。 请确认你使用的是 Polymarket 代理钱包地址,而不是 MetaMask 地址。你可以在 Polymarket 界面的 Settings → Wallet 中找到该地址。如果用错了,请重新运行 setup polymarket。

Bybit 返回 auth_failed。 请确认 API 密钥具有 Wallet Read + Trade Read 权限(无需 Withdraw 权限)。如果你为密钥设置了 IP 白名单,请确保其中包含你计算机当前的公网 IP。

Etherscan 返回 rate_limited。 免费层级的限制是每秒 5 次调用、每天 100k 次调用。每次 MetaMask 刷新在每条链上需要(1 + N 个代币)次调用。如果你有 4 条链 × 7 种常用代币,每次刷新就需要 32 次调用。请错开刷新请求;缓存 TTL(MetaMask 为 60s)是有原因的。

不使用 Claude Desktop 也能用吗? 可以——任何兼容 MCP 的宿主都能使用(Claude Code、Cursor、Codex、ZED,以及 MCP 支持稳定后的 ChatGPT)。接入方式相同,只需更改要编辑的客户端配置文件。此外还有用于终端查询的 CLI(headless-tracker show holdings/pnl/transactions),完全无需 AI 宿主。

已实现盈亏看起来不对。 对于 Polymarket,默认的 get_pnl 会返回 realizedPnl: null,因为连接器的 cashPnl 字段混合了已实现和未实现盈亏。传入 include_history=true(或在 CLI 中传入 --include-history=true),即可根据你的 /trades 历史记录按 FIFO 计算出准确数值。对于 MetaMask,链上转入的代币没有已知成本基础;include_history=true 会将它们报告为 unknownSalesCount,而不是虚构 $0 成本。

一个 MetaMask 账户可以追踪多个钱包吗? 可以。v0.8 为 MetaMask 凭据新增了 addresses[]。设置 CLI 仍只会询问一个钱包(向后兼容),但连接器接受地址列表。直接编辑保险库条目,即可在同一账户中添加更多地址,并共用同一个 Etherscan 密钥和链选择。如果有需求,v0.9 计划添加 wallet add CLI 命令。

支持[我喜欢的交易所 / 链 / 市场]吗? 暂不支持。欢迎提交 issue 或 PR。Connector 接口支持扩展,现有 3 个连接器是参考实现,总计约 600 行代码。

Polymarket 的交易历史呢? 从 v0.7.1 起已支持:get_transactions 会从公开的 data-api /trades?user=PROXY 端点返回 BUY/SELL 交易,最多返回最近约 1000 笔。data-api 会忽略按时间范围查询的参数,因此 since 筛选由客户端执行;如果某页记录早于截止时间,分页会提前结束。

为什么没有界面? Claude Desktop、ChatGPT 和 Cursor 都能按需生成比我在 v1 中发布的界面更丰富的仪表板。构建界面会重复 AI 宿主已经做得更好的工作。如果你想要托管的 Web 界面,请参阅 bulltrapp.com。

相关内容

bulltrapp.com — 同一维护者提供的托管式 Web 投资组合追踪器。问题领域相同,呈现形式不同。可以任选其一,也可以同时使用。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。