copilot-money-mcp 2.0.1 → 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 +95 -32
- package/dist/cli.js +5632 -1333
- package/dist/decode-worker.js +1612 -663
- package/dist/server.js +5616 -1324
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
[](https://www.typescriptlang.org/)
|
|
8
8
|
[](https://github.com/ignaciohermosillacornejo/copilot-money-mcp/actions/workflows/test.yml)
|
|
9
9
|
[](https://codecov.io/gh/ignaciohermosillacornejo/copilot-money-mcp)
|
|
10
|
+
[](https://glama.ai/mcp/servers/ignaciohermosillacornejo/copilot-money-mcp)
|
|
10
11
|
|
|
11
12
|
## Disclaimer
|
|
12
13
|
|
|
@@ -16,7 +17,7 @@
|
|
|
16
17
|
|
|
17
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.**
|
|
18
19
|
|
|
19
|
-
**
|
|
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.
|
|
20
21
|
|
|
21
22
|
## Privacy First
|
|
22
23
|
|
|
@@ -31,6 +32,22 @@ We never collect, store, or transmit your data to any server operated by this pr
|
|
|
31
32
|
>
|
|
32
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.
|
|
33
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
|
+
|
|
34
51
|
## Quick Start
|
|
35
52
|
|
|
36
53
|
### Prerequisites
|
|
@@ -94,7 +111,7 @@ Then add to your Claude Desktop configuration (`~/Library/Application Support/Cl
|
|
|
94
111
|
|
|
95
112
|
> "What are my top 5 spending categories this year?"
|
|
96
113
|
|
|
97
|
-
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.
|
|
98
115
|
|
|
99
116
|
### Account Overview
|
|
100
117
|
|
|
@@ -104,17 +121,17 @@ Uses `get_transactions`, `get_categories` with date ranges, text search, and cat
|
|
|
104
121
|
|
|
105
122
|
> "Which bank connections need attention?"
|
|
106
123
|
|
|
107
|
-
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.
|
|
108
125
|
|
|
109
126
|
### Investment Portfolio
|
|
110
127
|
|
|
111
128
|
> "What are my current holdings and total returns?"
|
|
112
129
|
|
|
113
|
-
> "Show me
|
|
130
|
+
> "Show me the price history for my largest equity holding over the past year"
|
|
114
131
|
|
|
115
|
-
> "What's my
|
|
132
|
+
> "What's my current cost basis on META?"
|
|
116
133
|
|
|
117
|
-
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).
|
|
118
135
|
|
|
119
136
|
### Budgets & Goals
|
|
120
137
|
|
|
@@ -124,7 +141,7 @@ Uses `get_holdings`, `get_investment_prices`, `get_securities`, `get_investment_
|
|
|
124
141
|
|
|
125
142
|
> "Show me my goal history over the past 6 months"
|
|
126
143
|
|
|
127
|
-
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).
|
|
128
145
|
|
|
129
146
|
### Subscriptions & Recurring
|
|
130
147
|
|
|
@@ -132,31 +149,7 @@ Uses `get_budgets`, `get_goals`, `get_goal_history`.
|
|
|
132
149
|
|
|
133
150
|
> "How much do I spend on recurring charges per month?"
|
|
134
151
|
|
|
135
|
-
Uses `get_recurring_transactions
|
|
136
|
-
|
|
137
|
-
## Available Tools
|
|
138
|
-
|
|
139
|
-
### Read Tools (17)
|
|
140
|
-
|
|
141
|
-
| Tool | Description |
|
|
142
|
-
|------|-------------|
|
|
143
|
-
| `get_transactions` | Query transactions with filters — date range, category, merchant, amount, account, location, text search, and special types (foreign, refunds, duplicates, HSA-eligible). |
|
|
144
|
-
| `get_accounts` | List all accounts with balances, filter by type (checking, savings, credit, investment). Includes net worth calculation. |
|
|
145
|
-
| `get_categories` | List categories with transaction counts and spending totals. Supports list, tree, and search views. |
|
|
146
|
-
| `get_recurring_transactions` | Identify subscriptions and recurring charges with frequency, cost, and next expected date. |
|
|
147
|
-
| `get_budgets` | Get budgets with spending vs. limit comparisons. |
|
|
148
|
-
| `get_goals` | Get financial goals with target amounts, progress, and monthly contributions. |
|
|
149
|
-
| `get_goal_history` | Monthly progress snapshots for goals with daily data and contribution records. |
|
|
150
|
-
| `get_balance_history` | Daily balance snapshots for accounts over time. Supports daily, weekly, or monthly granularity. |
|
|
151
|
-
| `get_holdings` | Current investment holdings with ticker, quantity, price, cost basis, and total return. |
|
|
152
|
-
| `get_investment_prices` | Historical price data (daily + high-frequency) for stocks, ETFs, mutual funds, and crypto. |
|
|
153
|
-
| `get_investment_splits` | Stock split history with ratios, dates, and multipliers. |
|
|
154
|
-
| `get_investment_performance` | Per-security investment performance data. |
|
|
155
|
-
| `get_twr_returns` | Time-weighted return (TWR) monthly data for investment holdings. |
|
|
156
|
-
| `get_securities` | Security master data — ticker, name, type, price, and identifiers (ISIN/CUSIP). |
|
|
157
|
-
| `get_connection_status` | Bank sync health for linked institutions, including last sync timestamps and errors. |
|
|
158
|
-
| `get_cache_info` | Local cache metadata — date range, transaction count, cache age. |
|
|
159
|
-
| `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.
|
|
160
153
|
|
|
161
154
|
## Configuration
|
|
162
155
|
|
|
@@ -209,6 +202,58 @@ The `period` parameter supports these shortcuts:
|
|
|
209
202
|
|
|
210
203
|
`this_month` `last_month` `last_7_days` `last_30_days` `last_90_days` `ytd` `this_year` `last_year`
|
|
211
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
|
+
|
|
212
257
|
## Known Limitations
|
|
213
258
|
|
|
214
259
|
### Local Cache Dependency
|
|
@@ -217,6 +262,24 @@ This server reads from Copilot Money's **local Firestore cache**, not the cloud.
|
|
|
217
262
|
|
|
218
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.
|
|
219
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
|
+
|
|
220
283
|
## Troubleshooting
|
|
221
284
|
|
|
222
285
|
### Database Not Found
|