copilot-money-mcp 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -32
- package/dist/cli.js +4743 -1287
- package/dist/decode-worker.js +1199 -600
- package/dist/server.js +4727 -1278
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
An [MCP](https://modelcontextprotocol.io/) server that gives AI assistants access to your Copilot Money personal finance data. It reads from the locally cached Firestore database (LevelDB + Protocol Buffers) on your Mac. **Reads are 100% local with zero network requests.**
|
|
19
19
|
|
|
20
|
-
**
|
|
20
|
+
**14 cache-mode read tools (or 21 in `--live-reads` mode: 8 surviving cache + 13 live), plus up to 17 write tools** — query and modify transactions, accounts, holdings, balances, categories, recurring charges, budgets, goals, and investment performance. See [Tools by Mode](#tools-by-mode) below.
|
|
21
21
|
|
|
22
22
|
## Privacy First
|
|
23
23
|
|
|
@@ -32,6 +32,22 @@ We never collect, store, or transmit your data to any server operated by this pr
|
|
|
32
32
|
>
|
|
33
33
|
> **By using this MCP server with a hosted AI model, you are knowingly sharing your financial data with that AI provider.** Only use this tool if you are comfortable with that trade-off. If you are not, consider waiting for an official Copilot Money integration or using a fully local model.
|
|
34
34
|
|
|
35
|
+
## Tools by Mode
|
|
36
|
+
|
|
37
|
+
This server exposes different tools depending on which CLI flags you enable.
|
|
38
|
+
|
|
39
|
+
| Mode | Flag | What it does | Auth | Network | Tools available |
|
|
40
|
+
|---|---|---|---|---|---|
|
|
41
|
+
| 🟢 Default | _(none)_ | Reads from your local LevelDB cache | ❌ None | 🔌 Zero (offline) | 14 cache-mode read + utility tools |
|
|
42
|
+
| 🌐 Live reads | `--live-reads` | Real-time reads via Copilot's GraphQL API; swaps out 6 cache tools and adds 7 live-only ones | 🔒 Browser session | 🌐 HTTPS per request | 21 read tools (8 cache + 13 live) |
|
|
43
|
+
| ✍️ Writes | `--write` | Adds mutation tools (transactions, tags, categories, budgets, recurrings, splits) | 🔒 Browser session | 🌐 HTTPS per request | +17 write tools (additive to either read mode) |
|
|
44
|
+
|
|
45
|
+
`--live-reads` and `--write` can be combined.
|
|
46
|
+
|
|
47
|
+
📖 **See [docs/tools-by-mode.md](docs/tools-by-mode.md)** for the full per-tool inventory with status, caveats, and known limitations (goals, stock splits, response-size caps).
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
35
51
|
## Quick Start
|
|
36
52
|
|
|
37
53
|
### Prerequisites
|
|
@@ -95,7 +111,7 @@ Then add to your Claude Desktop configuration (`~/Library/Application Support/Cl
|
|
|
95
111
|
|
|
96
112
|
> "What are my top 5 spending categories this year?"
|
|
97
113
|
|
|
98
|
-
Uses `get_transactions
|
|
114
|
+
Uses `get_transactions` (or `get_transactions_live` for fresh data via `--live-reads`) and `get_categories` (or `get_categories_live`), with date ranges, text search, and category filters.
|
|
99
115
|
|
|
100
116
|
### Account Overview
|
|
101
117
|
|
|
@@ -105,17 +121,17 @@ Uses `get_transactions`, `get_categories` with date ranges, text search, and cat
|
|
|
105
121
|
|
|
106
122
|
> "Which bank connections need attention?"
|
|
107
123
|
|
|
108
|
-
Uses `get_accounts
|
|
124
|
+
Uses `get_accounts` (or `get_accounts_live` for fresh balances via `--live-reads`), `get_balance_history` (with optional `get_balance_history_live` per-account live variant), `get_connection_status`, and `get_networth_live` for net-worth-over-time charts.
|
|
109
125
|
|
|
110
126
|
### Investment Portfolio
|
|
111
127
|
|
|
112
128
|
> "What are my current holdings and total returns?"
|
|
113
129
|
|
|
114
|
-
> "Show me
|
|
130
|
+
> "Show me the price history for my largest equity holding over the past year"
|
|
115
131
|
|
|
116
|
-
> "What's my
|
|
132
|
+
> "What's my current cost basis on META?"
|
|
117
133
|
|
|
118
|
-
Uses `get_holdings
|
|
134
|
+
Uses `get_holdings` (or `get_holdings_live` for live cost basis), `get_investment_prices` (or `get_investment_prices_live` for live per-security price history).
|
|
119
135
|
|
|
120
136
|
### Budgets & Goals
|
|
121
137
|
|
|
@@ -125,7 +141,7 @@ Uses `get_holdings`, `get_investment_prices`, `get_securities`, `get_investment_
|
|
|
125
141
|
|
|
126
142
|
> "Show me my goal history over the past 6 months"
|
|
127
143
|
|
|
128
|
-
Uses `get_budgets
|
|
144
|
+
Uses `get_budgets` (or `get_budgets_live` via `--live-reads`), and `get_goals` / `get_goal_history` (cache-only — Copilot's GraphQL endpoint doesn't expose goal data).
|
|
129
145
|
|
|
130
146
|
### Subscriptions & Recurring
|
|
131
147
|
|
|
@@ -133,31 +149,7 @@ Uses `get_budgets`, `get_goals`, `get_goal_history`.
|
|
|
133
149
|
|
|
134
150
|
> "How much do I spend on recurring charges per month?"
|
|
135
151
|
|
|
136
|
-
Uses `get_recurring_transactions
|
|
137
|
-
|
|
138
|
-
## Available Tools
|
|
139
|
-
|
|
140
|
-
### Read Tools (17)
|
|
141
|
-
|
|
142
|
-
| Tool | Description |
|
|
143
|
-
|------|-------------|
|
|
144
|
-
| `get_transactions` | Query transactions with filters — date range, category, merchant, amount, account, location, text search, and special types (foreign, refunds, duplicates, HSA-eligible). |
|
|
145
|
-
| `get_accounts` | List all accounts with balances, filter by type (checking, savings, credit, investment). Includes net worth calculation. |
|
|
146
|
-
| `get_categories` | List categories with transaction counts and spending totals. Supports list, tree, and search views. |
|
|
147
|
-
| `get_recurring_transactions` | Identify subscriptions and recurring charges with frequency, cost, and next expected date. |
|
|
148
|
-
| `get_budgets` | Get budgets with spending vs. limit comparisons. |
|
|
149
|
-
| `get_goals` | Get financial goals with target amounts, progress, and monthly contributions. |
|
|
150
|
-
| `get_goal_history` | Monthly progress snapshots for goals with daily data and contribution records. |
|
|
151
|
-
| `get_balance_history` | Daily balance snapshots for accounts over time. Supports daily, weekly, or monthly granularity. |
|
|
152
|
-
| `get_holdings` | Current investment holdings with ticker, quantity, price, cost basis, and total return. |
|
|
153
|
-
| `get_investment_prices` | Historical price data (daily + high-frequency) for stocks, ETFs, mutual funds, and crypto. |
|
|
154
|
-
| `get_investment_splits` | Stock split history with ratios, dates, and multipliers. |
|
|
155
|
-
| `get_investment_performance` | Per-security investment performance data. |
|
|
156
|
-
| `get_twr_returns` | Time-weighted return (TWR) monthly data for investment holdings. |
|
|
157
|
-
| `get_securities` | Security master data — ticker, name, type, price, and identifiers (ISIN/CUSIP). |
|
|
158
|
-
| `get_connection_status` | Bank sync health for linked institutions, including last sync timestamps and errors. |
|
|
159
|
-
| `get_cache_info` | Local cache metadata — date range, transaction count, cache age. |
|
|
160
|
-
| `refresh_database` | Reload data from disk. Cache auto-refreshes every 5 minutes. |
|
|
152
|
+
Uses `get_recurring_transactions` (or `get_recurring_live` via `--live-reads`) and `get_upcoming_recurrings_live` for next-due unpaid items.
|
|
161
153
|
|
|
162
154
|
## Configuration
|
|
163
155
|
|
|
@@ -210,6 +202,58 @@ The `period` parameter supports these shortcuts:
|
|
|
210
202
|
|
|
211
203
|
`this_month` `last_month` `last_7_days` `last_30_days` `last_90_days` `ytd` `this_year` `last_year`
|
|
212
204
|
|
|
205
|
+
## Authentication & Optional Modes
|
|
206
|
+
|
|
207
|
+
Both `--live-reads` and `--write` make authenticated calls to Copilot Money's GraphQL API at `app.copilot.money/api/graphql`. They require a **logged-in browser session** against `app.copilot.money` — the server reads the same Firebase refresh token the web app stores in your browser (Chrome, Arc, Safari, or Firefox).
|
|
208
|
+
|
|
209
|
+
Default mode requires no authentication and makes zero network requests — reads come from the local LevelDB cache.
|
|
210
|
+
|
|
211
|
+
### `--live-reads`: real-time reads via GraphQL
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
copilot-money-mcp --live-reads
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Replaces 6 cache-mode read tools (`get_transactions`, `get_accounts`, `get_categories`, `get_budgets`, `get_recurring_transactions`, `get_holdings`) with live GraphQL-backed equivalents, and adds 7 net-new ones (`get_tags_live`, `get_networth_live`, `get_upcoming_recurrings_live`, `get_monthly_spend_live`, `get_balance_history_live`, `get_investment_prices_live`, `refresh_cache`).
|
|
218
|
+
|
|
219
|
+
Use this when:
|
|
220
|
+
- You need transactions the macOS app hasn't pre-fetched yet (the auto-fetch window is typically ~30 days; past that, open the app and scroll back to force the cache to populate, or use `--live-reads` to query the server directly).
|
|
221
|
+
- You want fresh per-security cost basis or balance-over-time data.
|
|
222
|
+
- The macOS app hasn't synced recently.
|
|
223
|
+
|
|
224
|
+
### `--write`: mutations via GraphQL
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
copilot-money-mcp --write
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Adds 17 mutation tools for transactions, tags, categories, recurrings, budgets, and split-transactions. Off by default — the server is read-only unless you opt in.
|
|
231
|
+
|
|
232
|
+
### Combining both
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
copilot-money-mcp --live-reads --write
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Live reads + write tools together — the most common power-user setup.
|
|
239
|
+
|
|
240
|
+
### Configuring via Claude Desktop / Cursor
|
|
241
|
+
|
|
242
|
+
Add the flags to the `args` array in your MCP config:
|
|
243
|
+
|
|
244
|
+
```json
|
|
245
|
+
{
|
|
246
|
+
"mcpServers": {
|
|
247
|
+
"copilot-money": {
|
|
248
|
+
"command": "copilot-money-mcp",
|
|
249
|
+
"args": ["--live-reads", "--write"]
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Restart Claude Desktop / Cursor after editing.
|
|
256
|
+
|
|
213
257
|
## Known Limitations
|
|
214
258
|
|
|
215
259
|
### Local Cache Dependency
|
|
@@ -218,6 +262,24 @@ This server reads from Copilot Money's **local Firestore cache**, not the cloud.
|
|
|
218
262
|
|
|
219
263
|
**To maximize cached data:** Open the Copilot Money app and browse through your data (transaction history, accounts, budgets) to ensure it has been fetched and cached locally.
|
|
220
264
|
|
|
265
|
+
### Goals are read-only
|
|
266
|
+
|
|
267
|
+
`get_goals` and `get_goal_history` work (cache-only), but there are no goal write tools — Copilot's GraphQL endpoint doesn't expose goal mutations. Goal creation, editing, and contributions are mobile-only in Copilot itself, and live in a path our project can't reach without iOS / desktop traffic capture.
|
|
268
|
+
|
|
269
|
+
### Investment splits are limited to currently-held securities
|
|
270
|
+
|
|
271
|
+
`get_investment_splits` returns split events (date + adjustment multiplier) for securities you currently hold. Securities you no longer hold eventually fall out of the cache. There's no GraphQL endpoint for splits, so this is the only path.
|
|
272
|
+
|
|
273
|
+
Also: `get_investment_prices` and `get_investment_prices_live` already return split- and dividend-adjusted prices (Copilot applies Plaid's adjustment factors server-side). You generally don't need raw split events to back-correct prices.
|
|
274
|
+
|
|
275
|
+
### Live investment prices are ownership-gated
|
|
276
|
+
|
|
277
|
+
`get_investment_prices_live` only works for securities currently in your linked accounts. Asking for a price series on a ticker you don't own returns an explicit "not in your linked accounts" error.
|
|
278
|
+
|
|
279
|
+
### Long time-series responses are capped
|
|
280
|
+
|
|
281
|
+
Time-series live tools (`get_balance_history_live`, `get_networth_live`, `get_investment_prices_live`) cap responses at 500 rows by default to fit the MCP single-tool-result token limit. Pass `max_rows` / `offset` to paginate, or narrow `time_frame` for fewer rows.
|
|
282
|
+
|
|
221
283
|
## Troubleshooting
|
|
222
284
|
|
|
223
285
|
### Database Not Found
|