monarch-mcp-jamiew 0.3.1__tar.gz
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.
- monarch_mcp_jamiew-0.3.1/.gitignore +78 -0
- monarch_mcp_jamiew-0.3.1/LICENSE +21 -0
- monarch_mcp_jamiew-0.3.1/PKG-INFO +197 -0
- monarch_mcp_jamiew-0.3.1/README.md +170 -0
- monarch_mcp_jamiew-0.3.1/pyproject.toml +153 -0
- monarch_mcp_jamiew-0.3.1/server.py +2120 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Environment variables
|
|
2
|
+
.env*
|
|
3
|
+
|
|
4
|
+
# Python
|
|
5
|
+
__pycache__/
|
|
6
|
+
*.py[cod]
|
|
7
|
+
*$py.class
|
|
8
|
+
*.so
|
|
9
|
+
.Python
|
|
10
|
+
build/
|
|
11
|
+
develop-eggs/
|
|
12
|
+
dist/
|
|
13
|
+
downloads/
|
|
14
|
+
eggs/
|
|
15
|
+
.eggs/
|
|
16
|
+
lib/
|
|
17
|
+
lib64/
|
|
18
|
+
parts/
|
|
19
|
+
sdist/
|
|
20
|
+
var/
|
|
21
|
+
wheels/
|
|
22
|
+
share/python-wheels/
|
|
23
|
+
*.egg-info/
|
|
24
|
+
.installed.cfg
|
|
25
|
+
*.egg
|
|
26
|
+
MANIFEST
|
|
27
|
+
.venv/
|
|
28
|
+
venv/
|
|
29
|
+
ENV/
|
|
30
|
+
env.bak/
|
|
31
|
+
venv.bak/
|
|
32
|
+
|
|
33
|
+
# Testing
|
|
34
|
+
.pytest_cache/
|
|
35
|
+
.coverage
|
|
36
|
+
htmlcov/
|
|
37
|
+
.tox/
|
|
38
|
+
.nox/
|
|
39
|
+
coverage.xml
|
|
40
|
+
*.cover
|
|
41
|
+
*.py,cover
|
|
42
|
+
.hypothesis/
|
|
43
|
+
|
|
44
|
+
# MyPy
|
|
45
|
+
.mypy_cache/
|
|
46
|
+
.dmypy.json
|
|
47
|
+
dmypy.json
|
|
48
|
+
|
|
49
|
+
# UV
|
|
50
|
+
uv.lock
|
|
51
|
+
|
|
52
|
+
# Logs
|
|
53
|
+
*.log
|
|
54
|
+
|
|
55
|
+
# Session files
|
|
56
|
+
.monarchmoney_session
|
|
57
|
+
.mm/
|
|
58
|
+
|
|
59
|
+
# IDE
|
|
60
|
+
.vscode/
|
|
61
|
+
.idea/
|
|
62
|
+
*.swp
|
|
63
|
+
*.swo
|
|
64
|
+
*~
|
|
65
|
+
|
|
66
|
+
# OS
|
|
67
|
+
.DS_Store
|
|
68
|
+
.DS_Store?
|
|
69
|
+
._*
|
|
70
|
+
Thumbs.db
|
|
71
|
+
ehthumbs.db
|
|
72
|
+
|
|
73
|
+
# Newish
|
|
74
|
+
logs.sh
|
|
75
|
+
.claude/settings.local.json
|
|
76
|
+
|
|
77
|
+
# MCP Registry
|
|
78
|
+
.mcpregistry_*
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Jamie Dubs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: monarch-mcp-jamiew
|
|
3
|
+
Version: 0.3.1
|
|
4
|
+
Summary: MCP server for Monarch Money personal finance
|
|
5
|
+
Project-URL: Homepage, https://github.com/jamiew/monarch-mcp
|
|
6
|
+
Project-URL: Repository, https://github.com/jamiew/monarch-mcp
|
|
7
|
+
Project-URL: Issues, https://github.com/jamiew/monarch-mcp/issues
|
|
8
|
+
Author-email: Jamie Dubs <jamie@jamiedubs.com>
|
|
9
|
+
License: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: budgeting,finance,mcp,model-context-protocol,monarch-money,personal-finance
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Office/Business :: Financial
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Requires-Dist: mcp[cli]<2,>=1.26.0
|
|
22
|
+
Requires-Dist: monarchmoneycommunity
|
|
23
|
+
Requires-Dist: pydantic>=2.12.5
|
|
24
|
+
Requires-Dist: python-dateutil>=2.9.0.post0
|
|
25
|
+
Requires-Dist: structlog>=25.5.0
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
|
|
28
|
+
<!-- mcp-name: io.github.jamiew/monarch-mcp -->
|
|
29
|
+
# Monarch Money MCP Server
|
|
30
|
+
|
|
31
|
+
An [MCP](https://modelcontextprotocol.io/) server for [Monarch Money](https://www.monarchmoney.com/) — gives AI assistants like Claude access to your financial accounts, transactions, budgets, and more.
|
|
32
|
+
|
|
33
|
+
Originally forked from [@colvint/monarch-money-mcp](https://github.com/colvint/monarch-money-mcp) but has diverged significantly with a full rewrite, many new features, and a modern FastMCP architecture.
|
|
34
|
+
|
|
35
|
+
Built with the [MonarchMoney](https://github.com/hammem/monarchmoney) Python library by [@hammem](https://github.com/hammem) — a fantastic unofficial API for Monarch Money with full MFA support. We currently use the [community fork](https://github.com/bradleyseanf/monarchmoneycommunity) by [@bradleyseanf](https://github.com/bradleyseanf) which tracks the latest Monarch Money API changes.
|
|
36
|
+
|
|
37
|
+
## Features
|
|
38
|
+
|
|
39
|
+
- **19 tools** covering accounts, transactions, budgets, cashflow, investments, categories, goals, net worth, recurring transactions, and more
|
|
40
|
+
- **MCP resources** for quick access to categories, accounts, and institutions
|
|
41
|
+
- **MCP prompts** for guided financial analysis workflows
|
|
42
|
+
- **Smart output formatting** — compact transaction format reduces token usage by ~80%
|
|
43
|
+
- **Natural language dates** — "last month", "30 days ago", "this year" all work
|
|
44
|
+
- **Batch operations** — parallel multi-account queries, bulk transaction updates
|
|
45
|
+
- **Spending analysis** — multi-month trend analysis with category/account breakdowns
|
|
46
|
+
- **Tool annotations** — proper read/write metadata for MCP clients
|
|
47
|
+
|
|
48
|
+
## Setup
|
|
49
|
+
|
|
50
|
+
### 1. Install dependencies
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
cd /path/to/monarch-mcp
|
|
54
|
+
uv sync
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 2. Configure your MCP client
|
|
58
|
+
|
|
59
|
+
Add to your `.mcp.json` (Claude Desktop, Claude Code, etc.):
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"mcpServers": {
|
|
64
|
+
"monarch-money": {
|
|
65
|
+
"command": "/path/to/uv",
|
|
66
|
+
"args": [
|
|
67
|
+
"--directory",
|
|
68
|
+
"/path/to/monarch-mcp",
|
|
69
|
+
"run",
|
|
70
|
+
"python",
|
|
71
|
+
"server.py"
|
|
72
|
+
],
|
|
73
|
+
"env": {
|
|
74
|
+
"MONARCH_EMAIL": "your-email@example.com",
|
|
75
|
+
"MONARCH_PASSWORD": "your-password",
|
|
76
|
+
"MONARCH_MFA_SECRET": "your-mfa-secret-key"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Use absolute paths — find yours with `which uv` and `pwd`.
|
|
84
|
+
|
|
85
|
+
### 3. Get your MFA secret
|
|
86
|
+
|
|
87
|
+
1. Go to Monarch Money settings and enable 2FA
|
|
88
|
+
2. When shown the QR code, look for "Can't scan?" or "Enter manually"
|
|
89
|
+
3. Copy the secret key (a string like `T5SPVJIBRNPNNINFSH5W7RFVF2XYADYX`)
|
|
90
|
+
4. Use this as your `MONARCH_MFA_SECRET`
|
|
91
|
+
|
|
92
|
+
## Tools
|
|
93
|
+
|
|
94
|
+
| Tool | Description |
|
|
95
|
+
|------|-------------|
|
|
96
|
+
| `get_accounts` | List accounts with balances |
|
|
97
|
+
| `get_transactions` | Transactions with date/account/category filtering |
|
|
98
|
+
| `search_transactions` | Search by merchant name or keyword |
|
|
99
|
+
| `get_transaction_categories` | Category list (compact by default) |
|
|
100
|
+
| `create_transaction` | Create a manual transaction |
|
|
101
|
+
| `update_transaction` | Update a single transaction |
|
|
102
|
+
| `update_transactions_bulk` | Update multiple transactions in parallel |
|
|
103
|
+
| `get_budgets` | Budget data and spending analysis |
|
|
104
|
+
| `get_cashflow` | Income and expense analysis |
|
|
105
|
+
| `get_account_holdings` | Investment holdings |
|
|
106
|
+
| `get_account_history` | Account balance history |
|
|
107
|
+
| `get_institutions` | Linked financial institutions |
|
|
108
|
+
| `get_recurring_transactions` | Recurring transaction detection |
|
|
109
|
+
| `set_budget_amount` | Set a budget category amount |
|
|
110
|
+
| `create_manual_account` | Create a manually-tracked account |
|
|
111
|
+
| `refresh_accounts` | Trigger account data refresh |
|
|
112
|
+
| `get_complete_financial_overview` | Combined 5-API call in parallel |
|
|
113
|
+
| `analyze_spending_patterns` | Multi-month trend analysis |
|
|
114
|
+
| `get_usage_analytics` | Tool usage stats and optimization tips |
|
|
115
|
+
|
|
116
|
+
### Transaction format
|
|
117
|
+
|
|
118
|
+
By default, transactions return a compact format with the fields that matter:
|
|
119
|
+
|
|
120
|
+
```json
|
|
121
|
+
{
|
|
122
|
+
"id": "123456789012345678",
|
|
123
|
+
"date": "2025-03-15",
|
|
124
|
+
"amount": -12.50,
|
|
125
|
+
"merchant": "Corner Deli",
|
|
126
|
+
"plaidName": "CORNER DELI NYC",
|
|
127
|
+
"category": "Restaurants & Bars",
|
|
128
|
+
"categoryId": "cat_001",
|
|
129
|
+
"account": "Main Credit Card",
|
|
130
|
+
"needsReview": true
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
`pending` and `notes` are included only when present. Set `verbose=True` on any tool for the full API response with all metadata.
|
|
135
|
+
|
|
136
|
+
## Session management
|
|
137
|
+
|
|
138
|
+
Sessions are cached in a `.mm` directory for faster subsequent logins. If you hit auth issues:
|
|
139
|
+
|
|
140
|
+
- Delete `.mm/session.pickle` to clear the cached session
|
|
141
|
+
- Set `MONARCH_FORCE_LOGIN=true` in your env config to force a fresh login
|
|
142
|
+
- Make sure your system clock is accurate (required for TOTP)
|
|
143
|
+
|
|
144
|
+
## Development
|
|
145
|
+
|
|
146
|
+
### Local setup
|
|
147
|
+
|
|
148
|
+
Create a `.env` file (git-ignored):
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
MONARCH_EMAIL="your-email@example.com"
|
|
152
|
+
MONARCH_PASSWORD="your-password"
|
|
153
|
+
MONARCH_MFA_SECRET="YOUR_TOTP_SECRET_KEY"
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Tests
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
uv run pytest tests/ -v # unit tests (no creds needed)
|
|
160
|
+
uv run pytest tests/test_integration.py -v # integration tests (needs .env)
|
|
161
|
+
uv run scripts/health_check.py # quick API connectivity check
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### CI checks
|
|
165
|
+
|
|
166
|
+
Run all checks locally (same as GitHub Actions CI):
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
uv run python scripts/ci.py
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Log analysis
|
|
173
|
+
|
|
174
|
+
Tools for measuring and optimizing token usage across MCP sessions:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
uv run scripts/analyze_logs.py # full report
|
|
178
|
+
uv run scripts/analyze_logs.py --json # JSON output
|
|
179
|
+
uv run scripts/eval_session.py snapshot # mark log position
|
|
180
|
+
# ... use tools in Claude ...
|
|
181
|
+
uv run scripts/eval_session.py analyze # analyze new entries
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Security
|
|
185
|
+
|
|
186
|
+
> **Warning**: Monarch Money does not provide an official API. This server uses unofficial API access that requires your actual account credentials. Use with appropriate caution.
|
|
187
|
+
|
|
188
|
+
- Your credentials have full account access — treat them like passwords
|
|
189
|
+
- The MFA secret (TOTP key) provides ongoing access
|
|
190
|
+
- Session files in `.mm/` contain auth tokens — keep them secure
|
|
191
|
+
- Never commit `.env` or `.mcp.json` files to version control
|
|
192
|
+
- This is an unofficial API — Monarch Money could change or restrict access at any time
|
|
193
|
+
|
|
194
|
+
## Credits
|
|
195
|
+
|
|
196
|
+
This project started as a fork of [colvint/monarch-money-mcp](https://github.com/colvint/monarch-money-mcp) by [@colvint](https://github.com/colvint). Thanks for the original implementation!
|
|
197
|
+
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
<!-- mcp-name: io.github.jamiew/monarch-mcp -->
|
|
2
|
+
# Monarch Money MCP Server
|
|
3
|
+
|
|
4
|
+
An [MCP](https://modelcontextprotocol.io/) server for [Monarch Money](https://www.monarchmoney.com/) — gives AI assistants like Claude access to your financial accounts, transactions, budgets, and more.
|
|
5
|
+
|
|
6
|
+
Originally forked from [@colvint/monarch-money-mcp](https://github.com/colvint/monarch-money-mcp) but has diverged significantly with a full rewrite, many new features, and a modern FastMCP architecture.
|
|
7
|
+
|
|
8
|
+
Built with the [MonarchMoney](https://github.com/hammem/monarchmoney) Python library by [@hammem](https://github.com/hammem) — a fantastic unofficial API for Monarch Money with full MFA support. We currently use the [community fork](https://github.com/bradleyseanf/monarchmoneycommunity) by [@bradleyseanf](https://github.com/bradleyseanf) which tracks the latest Monarch Money API changes.
|
|
9
|
+
|
|
10
|
+
## Features
|
|
11
|
+
|
|
12
|
+
- **19 tools** covering accounts, transactions, budgets, cashflow, investments, categories, goals, net worth, recurring transactions, and more
|
|
13
|
+
- **MCP resources** for quick access to categories, accounts, and institutions
|
|
14
|
+
- **MCP prompts** for guided financial analysis workflows
|
|
15
|
+
- **Smart output formatting** — compact transaction format reduces token usage by ~80%
|
|
16
|
+
- **Natural language dates** — "last month", "30 days ago", "this year" all work
|
|
17
|
+
- **Batch operations** — parallel multi-account queries, bulk transaction updates
|
|
18
|
+
- **Spending analysis** — multi-month trend analysis with category/account breakdowns
|
|
19
|
+
- **Tool annotations** — proper read/write metadata for MCP clients
|
|
20
|
+
|
|
21
|
+
## Setup
|
|
22
|
+
|
|
23
|
+
### 1. Install dependencies
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
cd /path/to/monarch-mcp
|
|
27
|
+
uv sync
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 2. Configure your MCP client
|
|
31
|
+
|
|
32
|
+
Add to your `.mcp.json` (Claude Desktop, Claude Code, etc.):
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"mcpServers": {
|
|
37
|
+
"monarch-money": {
|
|
38
|
+
"command": "/path/to/uv",
|
|
39
|
+
"args": [
|
|
40
|
+
"--directory",
|
|
41
|
+
"/path/to/monarch-mcp",
|
|
42
|
+
"run",
|
|
43
|
+
"python",
|
|
44
|
+
"server.py"
|
|
45
|
+
],
|
|
46
|
+
"env": {
|
|
47
|
+
"MONARCH_EMAIL": "your-email@example.com",
|
|
48
|
+
"MONARCH_PASSWORD": "your-password",
|
|
49
|
+
"MONARCH_MFA_SECRET": "your-mfa-secret-key"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Use absolute paths — find yours with `which uv` and `pwd`.
|
|
57
|
+
|
|
58
|
+
### 3. Get your MFA secret
|
|
59
|
+
|
|
60
|
+
1. Go to Monarch Money settings and enable 2FA
|
|
61
|
+
2. When shown the QR code, look for "Can't scan?" or "Enter manually"
|
|
62
|
+
3. Copy the secret key (a string like `T5SPVJIBRNPNNINFSH5W7RFVF2XYADYX`)
|
|
63
|
+
4. Use this as your `MONARCH_MFA_SECRET`
|
|
64
|
+
|
|
65
|
+
## Tools
|
|
66
|
+
|
|
67
|
+
| Tool | Description |
|
|
68
|
+
|------|-------------|
|
|
69
|
+
| `get_accounts` | List accounts with balances |
|
|
70
|
+
| `get_transactions` | Transactions with date/account/category filtering |
|
|
71
|
+
| `search_transactions` | Search by merchant name or keyword |
|
|
72
|
+
| `get_transaction_categories` | Category list (compact by default) |
|
|
73
|
+
| `create_transaction` | Create a manual transaction |
|
|
74
|
+
| `update_transaction` | Update a single transaction |
|
|
75
|
+
| `update_transactions_bulk` | Update multiple transactions in parallel |
|
|
76
|
+
| `get_budgets` | Budget data and spending analysis |
|
|
77
|
+
| `get_cashflow` | Income and expense analysis |
|
|
78
|
+
| `get_account_holdings` | Investment holdings |
|
|
79
|
+
| `get_account_history` | Account balance history |
|
|
80
|
+
| `get_institutions` | Linked financial institutions |
|
|
81
|
+
| `get_recurring_transactions` | Recurring transaction detection |
|
|
82
|
+
| `set_budget_amount` | Set a budget category amount |
|
|
83
|
+
| `create_manual_account` | Create a manually-tracked account |
|
|
84
|
+
| `refresh_accounts` | Trigger account data refresh |
|
|
85
|
+
| `get_complete_financial_overview` | Combined 5-API call in parallel |
|
|
86
|
+
| `analyze_spending_patterns` | Multi-month trend analysis |
|
|
87
|
+
| `get_usage_analytics` | Tool usage stats and optimization tips |
|
|
88
|
+
|
|
89
|
+
### Transaction format
|
|
90
|
+
|
|
91
|
+
By default, transactions return a compact format with the fields that matter:
|
|
92
|
+
|
|
93
|
+
```json
|
|
94
|
+
{
|
|
95
|
+
"id": "123456789012345678",
|
|
96
|
+
"date": "2025-03-15",
|
|
97
|
+
"amount": -12.50,
|
|
98
|
+
"merchant": "Corner Deli",
|
|
99
|
+
"plaidName": "CORNER DELI NYC",
|
|
100
|
+
"category": "Restaurants & Bars",
|
|
101
|
+
"categoryId": "cat_001",
|
|
102
|
+
"account": "Main Credit Card",
|
|
103
|
+
"needsReview": true
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
`pending` and `notes` are included only when present. Set `verbose=True` on any tool for the full API response with all metadata.
|
|
108
|
+
|
|
109
|
+
## Session management
|
|
110
|
+
|
|
111
|
+
Sessions are cached in a `.mm` directory for faster subsequent logins. If you hit auth issues:
|
|
112
|
+
|
|
113
|
+
- Delete `.mm/session.pickle` to clear the cached session
|
|
114
|
+
- Set `MONARCH_FORCE_LOGIN=true` in your env config to force a fresh login
|
|
115
|
+
- Make sure your system clock is accurate (required for TOTP)
|
|
116
|
+
|
|
117
|
+
## Development
|
|
118
|
+
|
|
119
|
+
### Local setup
|
|
120
|
+
|
|
121
|
+
Create a `.env` file (git-ignored):
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
MONARCH_EMAIL="your-email@example.com"
|
|
125
|
+
MONARCH_PASSWORD="your-password"
|
|
126
|
+
MONARCH_MFA_SECRET="YOUR_TOTP_SECRET_KEY"
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Tests
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
uv run pytest tests/ -v # unit tests (no creds needed)
|
|
133
|
+
uv run pytest tests/test_integration.py -v # integration tests (needs .env)
|
|
134
|
+
uv run scripts/health_check.py # quick API connectivity check
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### CI checks
|
|
138
|
+
|
|
139
|
+
Run all checks locally (same as GitHub Actions CI):
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
uv run python scripts/ci.py
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Log analysis
|
|
146
|
+
|
|
147
|
+
Tools for measuring and optimizing token usage across MCP sessions:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
uv run scripts/analyze_logs.py # full report
|
|
151
|
+
uv run scripts/analyze_logs.py --json # JSON output
|
|
152
|
+
uv run scripts/eval_session.py snapshot # mark log position
|
|
153
|
+
# ... use tools in Claude ...
|
|
154
|
+
uv run scripts/eval_session.py analyze # analyze new entries
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Security
|
|
158
|
+
|
|
159
|
+
> **Warning**: Monarch Money does not provide an official API. This server uses unofficial API access that requires your actual account credentials. Use with appropriate caution.
|
|
160
|
+
|
|
161
|
+
- Your credentials have full account access — treat them like passwords
|
|
162
|
+
- The MFA secret (TOTP key) provides ongoing access
|
|
163
|
+
- Session files in `.mm/` contain auth tokens — keep them secure
|
|
164
|
+
- Never commit `.env` or `.mcp.json` files to version control
|
|
165
|
+
- This is an unofficial API — Monarch Money could change or restrict access at any time
|
|
166
|
+
|
|
167
|
+
## Credits
|
|
168
|
+
|
|
169
|
+
This project started as a fork of [colvint/monarch-money-mcp](https://github.com/colvint/monarch-money-mcp) by [@colvint](https://github.com/colvint). Thanks for the original implementation!
|
|
170
|
+
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "monarch-mcp-jamiew"
|
|
3
|
+
version = "0.3.1"
|
|
4
|
+
description = "MCP server for Monarch Money personal finance"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.10"
|
|
7
|
+
license = { text = "MIT" }
|
|
8
|
+
authors = [
|
|
9
|
+
{ name = "Jamie Dubs", email = "jamie@jamiedubs.com" },
|
|
10
|
+
]
|
|
11
|
+
keywords = [
|
|
12
|
+
"mcp",
|
|
13
|
+
"model-context-protocol",
|
|
14
|
+
"monarch-money",
|
|
15
|
+
"finance",
|
|
16
|
+
"budgeting",
|
|
17
|
+
"personal-finance",
|
|
18
|
+
]
|
|
19
|
+
classifiers = [
|
|
20
|
+
"Development Status :: 4 - Beta",
|
|
21
|
+
"License :: OSI Approved :: MIT License",
|
|
22
|
+
"Programming Language :: Python :: 3",
|
|
23
|
+
"Programming Language :: Python :: 3.10",
|
|
24
|
+
"Programming Language :: Python :: 3.11",
|
|
25
|
+
"Programming Language :: Python :: 3.12",
|
|
26
|
+
"Programming Language :: Python :: 3.13",
|
|
27
|
+
"Topic :: Office/Business :: Financial",
|
|
28
|
+
]
|
|
29
|
+
dependencies = [
|
|
30
|
+
"mcp[cli]>=1.26.0,<2",
|
|
31
|
+
"monarchmoneycommunity",
|
|
32
|
+
"pydantic>=2.12.5",
|
|
33
|
+
"python-dateutil>=2.9.0.post0",
|
|
34
|
+
"structlog>=25.5.0",
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
[project.urls]
|
|
38
|
+
Homepage = "https://github.com/jamiew/monarch-mcp"
|
|
39
|
+
Repository = "https://github.com/jamiew/monarch-mcp"
|
|
40
|
+
Issues = "https://github.com/jamiew/monarch-mcp/issues"
|
|
41
|
+
|
|
42
|
+
[project.scripts]
|
|
43
|
+
monarch-mcp-jamiew = "server:main"
|
|
44
|
+
|
|
45
|
+
[build-system]
|
|
46
|
+
requires = ["hatchling"]
|
|
47
|
+
build-backend = "hatchling.build"
|
|
48
|
+
|
|
49
|
+
[tool.hatch.build.targets.wheel]
|
|
50
|
+
only-include = ["server.py"]
|
|
51
|
+
|
|
52
|
+
[tool.hatch.build.targets.sdist]
|
|
53
|
+
only-include = [
|
|
54
|
+
"server.py",
|
|
55
|
+
"README.md",
|
|
56
|
+
"LICENSE",
|
|
57
|
+
"pyproject.toml",
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
[dependency-groups]
|
|
61
|
+
dev = [
|
|
62
|
+
"mypy>=1.19.0",
|
|
63
|
+
"pytest>=9.0.0",
|
|
64
|
+
"pytest-asyncio>=1.3.0",
|
|
65
|
+
"pytest-cov>=7.0.0",
|
|
66
|
+
"ruff>=0.15.0",
|
|
67
|
+
"types-python-dateutil>=2.9.0.20260302",
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
[tool.mypy]
|
|
71
|
+
python_version = "3.10"
|
|
72
|
+
warn_return_any = true
|
|
73
|
+
warn_unused_configs = true
|
|
74
|
+
disallow_untyped_defs = true
|
|
75
|
+
disallow_incomplete_defs = true
|
|
76
|
+
check_untyped_defs = true
|
|
77
|
+
no_implicit_optional = true
|
|
78
|
+
strict_optional = true
|
|
79
|
+
warn_redundant_casts = true
|
|
80
|
+
warn_unused_ignores = true
|
|
81
|
+
show_error_codes = true
|
|
82
|
+
ignore_missing_imports = true
|
|
83
|
+
# Disable specific errors:
|
|
84
|
+
# - misc: Various untyped external library issues
|
|
85
|
+
# - unreachable: Defensive runtime type checks are intentional
|
|
86
|
+
# - untyped-decorator: MCP library decorators (@mcp.tool, @mcp.resource, @mcp.prompt) lack type stubs
|
|
87
|
+
disable_error_code = ["misc", "unreachable", "untyped-decorator"]
|
|
88
|
+
|
|
89
|
+
[tool.pytest.ini_options]
|
|
90
|
+
testpaths = ["tests"]
|
|
91
|
+
python_files = ["test_*.py", "*_test.py"]
|
|
92
|
+
python_classes = ["Test*"]
|
|
93
|
+
python_functions = ["test_*"]
|
|
94
|
+
addopts = ["-v", "--tb=short", "--strict-markers"]
|
|
95
|
+
asyncio_mode = "auto"
|
|
96
|
+
markers = [
|
|
97
|
+
"unit: Unit tests",
|
|
98
|
+
"integration: Integration tests",
|
|
99
|
+
"slow: Slow running tests"
|
|
100
|
+
]
|
|
101
|
+
|
|
102
|
+
[tool.ruff]
|
|
103
|
+
target-version = "py310"
|
|
104
|
+
line-length = 120
|
|
105
|
+
|
|
106
|
+
[tool.ruff.lint]
|
|
107
|
+
select = [
|
|
108
|
+
"E", # pycodestyle errors
|
|
109
|
+
"W", # pycodestyle warnings
|
|
110
|
+
"F", # pyflakes
|
|
111
|
+
"I", # isort
|
|
112
|
+
"B", # flake8-bugbear
|
|
113
|
+
"C4", # flake8-comprehensions
|
|
114
|
+
"UP", # pyupgrade
|
|
115
|
+
"SIM", # flake8-simplify
|
|
116
|
+
]
|
|
117
|
+
ignore = [
|
|
118
|
+
"E501", # line too long (handled by formatter)
|
|
119
|
+
"B008", # do not perform function calls in argument defaults
|
|
120
|
+
"SIM108", # use ternary operator instead of if-else
|
|
121
|
+
"E402", # module import not at top (needed for conditional imports)
|
|
122
|
+
]
|
|
123
|
+
|
|
124
|
+
[tool.ruff.lint.per-file-ignores]
|
|
125
|
+
"tests/*" = [
|
|
126
|
+
"F841", # unused variables (often intentional in mocks)
|
|
127
|
+
"SIM117", # multiple with statements (clearer in tests)
|
|
128
|
+
]
|
|
129
|
+
"scripts/*" = [
|
|
130
|
+
"F841", # unused variables (often for side effects)
|
|
131
|
+
]
|
|
132
|
+
|
|
133
|
+
[tool.ruff.lint.isort]
|
|
134
|
+
known-first-party = ["server"]
|
|
135
|
+
|
|
136
|
+
[tool.ruff.format]
|
|
137
|
+
quote-style = "double"
|
|
138
|
+
indent-style = "space"
|
|
139
|
+
skip-magic-trailing-comma = false
|
|
140
|
+
|
|
141
|
+
[tool.coverage.run]
|
|
142
|
+
source = ["."]
|
|
143
|
+
omit = ["tests/*", ".venv/*"]
|
|
144
|
+
|
|
145
|
+
[tool.coverage.report]
|
|
146
|
+
exclude_lines = [
|
|
147
|
+
"pragma: no cover",
|
|
148
|
+
"if __name__ == .__main__.:",
|
|
149
|
+
"raise NotImplementedError",
|
|
150
|
+
]
|
|
151
|
+
|
|
152
|
+
[tool.uv.sources]
|
|
153
|
+
monarchmoneycommunity = { git = "https://github.com/bradleyseanf/monarchmoneycommunity", rev = "main" }
|