This release includes 1 breaking change for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
ReleasePort's take
Light signalReleasePort 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 summaryAdds 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
| Type | Severity | Summary | CVE |
|---|---|---|---|
| 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-readsflag) — opt-in GraphQL-backed reads served through a tiered in-memory cache. Mirrors Copilot's web app traffic againstapp.copilot.money/api/graphqland falls back gracefully when auth is missing. Off by default. Seedocs/graphql-live-reads.md. get_transactions_live(#334) — windowed cache backed byTransactionWindowCache(tiered TTLs by month-age, LRU eviction). Trims cross-month leakage and shares a bounded-concurrencypLimitprimitive across callers.get_accounts_live(#352) — 1h snapshot cache;live_balancebecomes a real boolean from the server.get_categories_live(#360) — 24h cache; readsuser.budgetingConfig.rolloversConfig.isEnabledso categories reflect rollover state per the user setting. Default-stripsbudget.histories(audit C1); opt back in viainclude_history.get_budgets_live(#363) — projection overcategoriesCache;set_budgetwrite-throughs targetpatchLiveCategoryBudget. Per-month overrides supported.get_recurring_live(#347) — joinscategory_namefrom the categories cache (audit R1);set_recurring_statevalidates new state before mutating.get_holdings_live(#373) — includes cost basis viametrics; toleratesmetrics: nullfor CASH and 401(k) mutual funds.get_balance_history_live(#376) — single-account, paginated; cache-modeget_balance_historyremains 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_cacheutility (#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 infrastructure —
LiveCopilotDatabase,SnapshotCache/TransactionWindowCache,InFlightRegistrysingle-flight primitive, structuredlogReadCallwithttl_tier+cache_hit, optimistic write-through patches at 16 call sites intools.ts. get_investment_splitsrestored (#387) — now models adjustment factors accurately (one row per(security_id, effective_date)with multiplier); cache-only.- MCP registry publishing (#374) —
server.json+mcpNameshipped;scripts/check-version-sync.tsguardspackage.json/server.json/manifest.jsonfrom drifting, wired into the Quality Checks CI job. CI workflow publishes to the MCP registry after npm publish. amazon-syncskill (#329) — reconcile Amazon order history with Copilot transactions, split multi-category orders, match card refunds.
Fixed
- Cache-mode
get_transactionstag 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=truerows so deleted transactions stop showing up in cache reads. get_budgetstop-level aggregation (#365) — sumstotal_budgetedfrom 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:0on charge cards now maps tonull(no preset limit), not zero. - Category
parentIdpreservation (#357) — write-throughcreateCategorysetsparentId=nullexplicitly;flattenno longer drops the field. leveldb-readercache invalidation (#349, #352) — temp-copy cache now invalidates when source changes and tolerates compaction TOCTOU during copy + fingerprint.- Holdings percent rounding (#378) —
total_return_percentnow 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.
- Documentation —
docs/graphql-live-reads.mdcovers cache architecture and freshness envelope;tools-by-mode.mdis now the canonical per-tool inventory;CLAUDE.mddocuments--live-readspreflight + PII-scrub guardrails. - Refactor — extracted shared
paginatehelper for time-series tools,computeTotalReturnPercent/parseAmountutils, cache-key tuple helper, duration constants; centralizedALL_TIME_FRAMESin_shared; aligned holdings rounding with Copilot UI; dropped deadexcludedfilter logic and staleset_recurring_stateaudit 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 placeholderget_investment_splitsare gone. Plaid never populates the backing collections, or the data is internal-only / unused by the Copilot web app.get_investment_splitsreturns 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
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.
Related context
Beta — feedback welcome: [email protected]