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.
@@ -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" }