Skip to content

Releases: tamasPetki/HeadlessTracker

v1.0.12 -- self-describing tool parameters

07 Jun 12:09

Choose a tag to compare

Makes every tool parameter self-describing to the AI agents that call them.

Changed

  • Every tool input parameter now carries a machine-readable description in its JSON Schema. All 38 parameters across the 15 tools (and setup_connector's credential sub-fields) previously had bare types -- the per-argument semantics lived only in the prose tool description, which an MCP host parses far less reliably than the schema's own description fields. Each parameter now has a concise .describe(): what it scopes, defaults, accepted shorthands, and caveats. This is exactly what Claude reads to call the tools correctly, so it reduces malformed calls and wrong-parameter guesses, and it lifts the Glama Tool Definition Quality score. A long-standing comment claimed .describe() tripped a TypeScript TS2589 error in the MCP SDK's tool() generic; re-tested and it no longer does, so the workaround that suppressed all parameter docs is gone. No runtime behavior change.

349 tests green.

Not financial advice -- data aggregation tool only.

v1.0.11 -- retry once on transient network errors

07 Jun 07:05

Choose a tag to compare

Recovers automatically from a transient network blip instead of failing the account.

Fixed

  • A transient network error is now retried once before failing. A connector that hit a momentary network failure (a dropped connection, a DNS hiccup, a connection refused) failed that account immediately, surfacing an error for what a single retry would have cleared. The orchestrator now retries once (after a short, abortable backoff) on a network_error -- the one error kind returned uniformly and only when fetch itself throws at the network layer. It deliberately does not retry upstream_error (mixes transient 5xx with non-transient 4xx and upstream logical errors), rate_limited (429s already back off in the price layer), auth_failed, or schema_mismatch. The retry is bounded by the v1.0.10 request deadline, so it can never push a call past the timeout, and it still falls back to stale cache if both attempts fail.

349 tests green.

Not financial advice -- data aggregation tool only.

v1.0.10 -- connector fetch timeout (no more indefinite hangs)

06 Jun 17:08

Choose a tag to compare

Stops a hung upstream from stalling a tool call indefinitely.

Fixed

  • A connector request can no longer hang the whole tool call forever. Every connector honors an AbortSignal (and prices.ts / fx.ts already timed out their own fetches), but nothing ever set a deadline on the connector path -- the tool handlers called the orchestrator with no signal, so if an upstream accepted the TCP connection and then never responded, the call would spin forever and the MCP host would hang with it. The orchestrator now races each per-account fetch against a deadline (default 30s, override with HEADLESS_TRACKER_REQUEST_TIMEOUT_MS): a hang degrades to a single network_timeout failure for that one account while the healthy accounts return normally -- the same graceful-degradation contract a thrown connector error got in v1.0.9. The race is an airtight backstop even for a connector that does not fully thread the signal into its fetch (the Bybit connector checked the abort flag only after its request returned, so its fetch is now passed the signal too and a stuck Bybit call is actually cancelled).

346 tests green.

Not financial advice -- data aggregation tool only.

v1.0.9 -- opt-in error reporting + fan-out reliability fix

06 Jun 12:13

Choose a tag to compare

Adds opt-in error reporting and hardens the holdings fan-out so one broken connector can no longer take down a whole request.

Added

  • Opt-in Sentry error reporting, zero new dependencies. Set SENTRY_DSN and the server reports unexpected connector exceptions and upstream schema mismatches; leave it unset (the default) and every capture is a silent no-op. No @sentry/node (it pulls ~20 packages / the OpenTelemetry stack for one HTTP POST) -- instead a ~150-line client posts a Sentry envelope via Node fetch, self-authenticating with the DSN. Privacy hard rule: never sends portfolio data (no amounts, balances, addresses, API keys, or labels), only the error class, a scrubbed message/stack, and the connector id / operation. All strings pass a scrubber that redacts EVM/base58 address shapes and OS usernames.

Fixed

  • A connector that throws no longer wipes out every account. The per-account Promise.all fan-out had no error boundary, so any unexpected exception rejected the whole aggregated request and every other account returned nothing. Each fetch is now wrapped: a throw is caught, reported (if Sentry is on), and degraded to a single unknown failure for that one account while healthy accounts return normally. Pinned by a regression test.

343 tests green (up from 332).

Not financial advice -- data aggregation tool only.

v1.0.8

05 Jun 17:10

Choose a tag to compare

Fixed: Polymarket holdings now filter out settled-loss dust -- resolved positions worth $0 that the data-api still returns. On real wallets these were 57-98% of the rows. fetchHoldings now drops positions below a value-based dustThresholdUsd (default $0.01), matching the Solana dust filter; winnings and open positions stay. Verified live: a wallet went from 42 rows to 18 real holdings.

Data aggregation only, not financial advice.

v1.0.7

05 Jun 12:13

Choose a tag to compare

Fixed: `headless-tracker help` now prints the canonical `npx` Claude Desktop config (was `bunx`, which needed Bun). The old-Node SQLite error leads with "upgrade to Node 22.5+" instead of suggesting bunx.

Changed: split the 631-line `metamask.ts` into focused modules (`metamask-chains.ts`, `metamask-etherscan.ts`, and the connector class) with no behavior change. 332 tests green.

Data aggregation only, not financial advice.

v1.0.6

05 Jun 07:16

Choose a tag to compare

Drops the bybit-api SDK for a tiny in-house signed-fetch client. A fresh npx headless-tracker install goes from ~258 packages to ~97, and the deprecated-abab warning is gone.

Changed

  • The Bybit connector no longer depends on bybit-api. That SDK shipped its whole webpack build toolchain as optionalDependencies (installed by default), pulling ~160 transitive packages into every install for a connector that makes two read-only GET requests. Replaced with a small client on Node's built-in fetch + crypto: same V5 HMAC signing, same two endpoints, zero added dependencies. Verified against the live Bybit API and with new unit tests.

Fixed

  • Gateway-level Bybit auth/rate errors now map correctly: 401/403 -> auth_failed, 429 -> rate_limited.

Install: npx headless-tracker . Data aggregation only, not financial advice.

v1.0.5

04 Jun 09:02

Choose a tag to compare

Makes the docs match the capability shipped in v1.0.1. The package has run under plain Node (npx headless-tracker) since v1.0.1, but the README's Quick Start still told everyone to git clone + install Bun, and the Claude Desktop config still pointed at a local Bun clone with absolute paths. Lots of repo clones, almost no one using the zero-friction path that already existed.

Changed

  • README leads with npx / global install, not a Bun clone. Quick Start is now npm i -g headless-tracker (or prefix npx), and the Claude Desktop config is just {"command": "npx", "args": ["-y", "headless-tracker"]} -- no absolute paths, no clone, no Bun. The git clone + Bun path moved to the Development section.
  • Landing page no longer claims "Requires Bun 1.3+" for end users (it runs under Node 22.5+).

Added

  • headless-tracker version (--version / -v). Previously only help printed the version.

Install: npx headless-tracker ( https://www.npmjs.com/package/headless-tracker ). Data aggregation only, not financial advice.