Skip to content

This release includes 1 breaking change for platform teams planning a safe upgrade.

Published 22d MCP Developer Tools
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

bun copilot-money leveldb mcp personal-finance typescript

ReleasePort's take

Light signal
editorial:auto 13d

ReleasePort v2.2.0 introduces a configurable live‑reads GraphQL mode via the `--live-reads` flag and adds `get_transactions_live` with improved caching.

Why it matters: Test the new `--live-reads` feature in development environments before production deployment; no mandatory migration or security patch is required.

Summary

AI summary

Adds a configurable live‑reads GraphQL mode (--live-reads) enabling real‑time data for many tools while removing four unused cache‑mode investment functions.

Changes in this release

Feature Medium

Live-reads mode (`--live-reads` flag) introduced for GraphQL-backed reads with tiered in-memory cache.

Live-reads mode (`--live-reads` flag) introduced for GraphQL-backed reads with tiered in-memory cache.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

`get_transactions_live` added, windowed cache backed by TransactionWindowCache with cross-month leakage prevention.

`get_transactions_live` added, windowed cache backed by TransactionWindowCache with cross-month leakage prevention.

Source: llm_adapter@2026-05-21

Confidence: low

Feature Medium

Restored `get_investment_splits` modeling adjustment factors accurately (one row per security/effective_date).

Restored `get_investment_splits` modeling adjustment factors accurately (one row per security/effective_date).

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

Added `get_accounts_live` with 1‑hour snapshot cache; live_balance becomes a real boolean from the server.

Added `get_accounts_live` with 1‑hour snapshot cache; live_balance becomes a real boolean from the server.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

Added `get_categories_live` with 24‑hour cache and rollover state awareness via user setting.

Added `get_categories_live` with 24‑hour cache and rollover state awareness via user setting.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

Added `get_budgets_live` projecting over categoriesCache with per‑month overrides support.

Added `get_budgets_live` projecting over categoriesCache with per‑month overrides support.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

Added `get_recurring_live` joining category_name from categories cache and validating new state before mutation.

Added `get_recurring_live` joining category_name from categories cache and validating new state before mutation.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

Added `get_holdings_live` including cost basis via metrics while tolerating null values for CASH/401(k).

Added `get_holdings_live` including cost basis via metrics while tolerating null values for CASH/401(k).

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

Added `get_balance_history_live` as single‑account, paginated version; cache‑mode remains for cross‑account granularity.

Added `get_balance_history_live` as single‑account, paginated version; cache‑mode remains for cross‑account granularity.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

Added `get_investment_prices_live` with server‑side ownership gating to linked account securities.

Added `get_investment_prices_live` with server‑side ownership gating to linked account securities.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

Added `get_tags_live` – the only way to enumerate tags (no cache counterpart).

Added `get_tags_live` – the only way to enumerate tags (no cache counterpart).

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

Added `get_networth_live` with pagination and tighter YTD default.

Added `get_networth_live` with pagination and tighter YTD default.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

Added `get_upcoming_recurrings_live` for next‑due unpaid recurrings distinct from history.

Added `get_upcoming_recurrings_live` for next‑due unpaid recurrings distinct from history.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

Added `get_monthly_spend_live` providing daily series spending with prior‑period comparison.

Added `get_monthly_spend_live` providing daily series spending with prior‑period comparison.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

Added `refresh_cache` utility to flush live‑mode caches by scope (13 scopes listed).

Added `refresh_cache` utility to flush live‑mode caches by scope (13 scopes listed).

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

Added MCP registry publishing (`server.json`, `mcpName`) with version‑sync guard and CI publication workflow.

Added MCP registry publishing (`server.json`, `mcpName`) with version‑sync guard and CI publication workflow.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

Added `amazon-sync` skill to reconcile Amazon order history with Copilot transactions, handling multi‑category orders and refunds.

Added `amazon-sync` skill to reconcile Amazon order history with Copilot transactions, handling multi‑category orders and refunds.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Dependency Low

Bumped production dependencies (e.g., zod) and dev dependencies (e.g., @types/node, eslint).

Bumped production dependencies (e.g., zod) and dev dependencies (e.g., @types/node, eslint).

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Bugfix Medium

Fixed cache‑mode `get_transactions` tag filter now resolves name → ID before comparison, preventing empty results.

Fixed cache‑mode `get_transactions` tag filter now resolves name → ID before comparison, preventing empty results.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Bugfix Medium

Filtered out soft‑deleted transactions (`user_deleted=true`) from cache reads.

Filtered out soft‑deleted transactions (`user_deleted=true`) from cache reads.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Bugfix Medium

Improved leveldb-reader cache invalidation to handle source changes and compaction TOCTOU scenarios.

Improved leveldb-reader cache invalidation to handle source changes and compaction TOCTOU scenarios.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Bugfix Low

Corrected `get_budgets` top‑level aggregation to sum only top‑level category budgets, avoiding double‑counting.

Corrected `get_budgets` top‑level aggregation to sum only top‑level category budgets, avoiding double‑counting.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Bugfix Low

Normalized account‑type bucketing by uppercase server enum, fixing case‑sensitive mismatches for liabilities.

Normalized account‑type bucketing by uppercase server enum, fixing case‑sensitive mismatches for liabilities.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Bugfix Low

Mapped `limit:0` on charge cards to null (no preset limit) instead of zero.

Mapped `limit:0` on charge cards to null (no preset limit) instead of zero.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Bugfix Low

Ensured `createCategory` explicitly sets parentId=null, preserving the field through flatten operations.

Ensured `createCategory` explicitly sets parentId=null, preserving the field through flatten operations.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Bugfix Low

Adjusted `total_return_percent` rounding in holdings to match Copilot UI convention.

Adjusted `total_return_percent` rounding in holdings to match Copilot UI convention.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Refactor Low

Implemented LiveCopilotDatabase, SnapshotCache, TransactionWindowCache, InFlightRegistry and structured logging for read calls.

Implemented LiveCopilotDatabase, SnapshotCache, TransactionWindowCache, InFlightRegistry and structured logging for read calls.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Refactor Low

Rewrote README with compact 3‑mode comparison and moved per‑tool inventory to `docs/tools-by-mode.md`.

Rewrote README with compact 3‑mode comparison and moved per‑tool inventory to `docs/tools-by-mode.md`.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Refactor Low

Updated tool descriptions, added read‑only hints, and revised documentation for live‑reads preflight and PII guardrails.

Updated tool descriptions, added read‑only hints, and revised documentation for live‑reads preflight and PII guardrails.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Refactor Low

Extracted shared helpers (`paginate`, `computeTotalReturnPercent`, `parseAmount`), centralized constants, and dropped dead excluded filter logic and stale audit comments.

Extracted shared helpers (`paginate`, `computeTotalReturnPercent`, `parseAmount`), centralized constants, and dropped dead excluded filter logic and stale audit comments.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Other Low

affected_surface

affected_surface

Source: llm_adapter@2026-05-21

Confidence: low

Full changelog

This release closes Phases 1–3 of the --live-reads migration (GraphQL-backed reads layered over the local LevelDB cache, gated by --live-reads and a browser session). The live surface now covers transactions, accounts, categories, budgets, recurring charges, holdings, balances, investment prices, tags, net worth, monthly spend, and upcoming recurrings — 13 live read/utility tools that swap in for 6 cache-mode equivalents and add 7 new ones. Default mode (no flags) stays fully local and offline.

Added

  • Live-reads mode (--live-reads flag) — opt-in GraphQL-backed reads served through a tiered in-memory cache. Mirrors Copilot's web app traffic against app.copilot.money/api/graphql and falls back gracefully when auth is missing. Off by default. See docs/graphql-live-reads.md.
  • get_transactions_live (#334) — windowed cache backed by TransactionWindowCache (tiered TTLs by month-age, LRU eviction). Trims cross-month leakage and shares a bounded-concurrency pLimit primitive across callers.
  • get_accounts_live (#352) — 1h snapshot cache; live_balance becomes a real boolean from the server.
  • get_categories_live (#360) — 24h cache; reads user.budgetingConfig.rolloversConfig.isEnabled so categories reflect rollover state per the user setting. Default-strips budget.histories (audit C1); opt back in via include_history.
  • get_budgets_live (#363) — projection over categoriesCache; set_budget write-throughs target patchLiveCategoryBudget. Per-month overrides supported.
  • get_recurring_live (#347) — joins category_name from the categories cache (audit R1); set_recurring_state validates new state before mutating.
  • get_holdings_live (#373) — includes cost basis via metrics; tolerates metrics: null for CASH and 401(k) mutual funds.
  • get_balance_history_live (#376) — single-account, paginated; cache-mode get_balance_history remains the path for cross-account / weekly / monthly granularity.
  • get_investment_prices_live (#382) — server-side ownership-gated to securities in linked accounts.
  • get_tags_live (#341) — no cache-mode counterpart; the only way to enumerate tags.
  • get_networth_live (#368) — net worth over time, retrofitted with pagination + tighter YTD default.
  • get_upcoming_recurrings_live (#369) — next-due unpaid recurrings, distinct from the recurring rule history.
  • get_monthly_spend_live (#370) — daily-series spending for the current month with prior-period comparison.
  • refresh_cache utility (#334) — flush live-mode caches by scope (transactions, accounts, categories, budgets, recurrings, tags, holdings, balance_history, investment_prices, networth, monthly_spend, upcoming_recurrings, user).
  • Live-reads infrastructureLiveCopilotDatabase, SnapshotCache / TransactionWindowCache, InFlightRegistry single-flight primitive, structured logReadCall with ttl_tier + cache_hit, optimistic write-through patches at 16 call sites in tools.ts.
  • get_investment_splits restored (#387) — now models adjustment factors accurately (one row per (security_id, effective_date) with multiplier); cache-only.
  • MCP registry publishing (#374) — server.json + mcpName shipped; scripts/check-version-sync.ts guards package.json / server.json / manifest.json from drifting, wired into the Quality Checks CI job. CI workflow publishes to the MCP registry after npm publish.
  • amazon-sync skill (#329) — reconcile Amazon order history with Copilot transactions, split multi-category orders, match card refunds.

Fixed

  • Cache-mode get_transactions tag filter (#394) — previously compared the input tag name against opaque tag IDs and returned an empty result; now resolves name → id first.
  • Soft-deleted transactions (#344) — decoder now filters user_deleted=true rows so deleted transactions stop showing up in cache reads.
  • get_budgets top-level aggregation (#365) — sums total_budgeted from top-level categories only; child categories no longer double-count.
  • Account-type bucketing (#354) — liabilities now bucketed by uppercase server enum; previously case-sensitive comparison missed some accounts.
  • Charge-card limit handling (#355) — limit:0 on charge cards now maps to null (no preset limit), not zero.
  • Category parentId preservation (#357) — write-through createCategory sets parentId=null explicitly; flatten no longer drops the field.
  • leveldb-reader cache invalidation (#349, #352) — temp-copy cache now invalidates when source changes and tolerates compaction TOCTOU during copy + fingerprint.
  • Holdings percent rounding (#378) — total_return_percent now matches the Copilot UI's rounding convention.

Changed

  • README rewrite (#386, #395) — compact 3-mode comparison; per-tool inventory moved to docs/tools-by-mode.md. Documents --write / --live-reads, expands known limitations, clarifies live-mode tool counts (21 read tools: 8 cache + 13 live).
  • Tool descriptions (#390) — review-pass over read-tool descriptions + read-only hints.
  • Documentationdocs/graphql-live-reads.md covers cache architecture and freshness envelope; tools-by-mode.md is now the canonical per-tool inventory; CLAUDE.md documents --live-reads preflight + PII-scrub guardrails.
  • Refactor — extracted shared paginate helper for time-series tools, computeTotalReturnPercent / parseAmount utils, cache-key tuple helper, duration constants; centralized ALL_TIME_FRAMES in _shared; aligned holdings rounding with Copilot UI; dropped dead excluded filter logic and stale set_recurring_state audit comments.
  • Dependencies — production-group bumps (zod, others); dev-group bumps (@types/node, @types/bun, eslint); ESLint 8.59 unnecessary-type-assertion cleanup.

Removed

  • Four dead cache-mode investment tools (#383) — get_investment_performance, get_twr_returns, get_securities, and the original placeholder get_investment_splits are gone. Plaid never populates the backing collections, or the data is internal-only / unused by the Copilot web app. get_investment_splits returns immediately with the new adjustment-factor model in #387.

Breaking Changes

  • Removed cache‑mode investment tools: `get_investment_performance`, `get_twr_returns`, `get_securities`, and original placeholder `get_investment_splits`.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track ignaciohermosillacornejo/copilot-money-mcp

Get notified when new releases ship.

Sign up free

About ignaciohermosillacornejo/copilot-money-mcp

Read and manage Copilot Money personal finance data — 30 tools for transactions, budgets, accounts, recurring charges, investments, and goals. Reads are 100% local from the Firestore cache; opt-in writes (`--write`) go directly to Copilot's GraphQL API.

All releases →

Beta — feedback welcome: [email protected]