@dizzlkheinz/ynab-mcpb 0.17.0 → 0.18.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.
Files changed (182) hide show
  1. package/.env.example +33 -33
  2. package/.github/workflows/ci-tests.yml +45 -45
  3. package/.github/workflows/claude-code-review.yml +57 -57
  4. package/.github/workflows/claude.yml +50 -50
  5. package/.github/workflows/full-integration.yml +22 -22
  6. package/.github/workflows/publish.yml +12 -3
  7. package/.github/workflows/release.yml +2 -2
  8. package/CHANGELOG.md +10 -1
  9. package/CLAUDE.md +16 -12
  10. package/README.md +6 -1
  11. package/dist/bundle/index.cjs +49 -49
  12. package/dist/server/YNABMCPServer.d.ts +125 -54
  13. package/dist/server/YNABMCPServer.js +42 -11
  14. package/dist/server/cacheManager.js +6 -5
  15. package/dist/server/completions.d.ts +25 -0
  16. package/dist/server/completions.js +160 -0
  17. package/dist/server/config.d.ts +2 -2
  18. package/dist/server/errorHandler.js +1 -0
  19. package/dist/server/rateLimiter.js +3 -1
  20. package/dist/server/resources.d.ts +1 -0
  21. package/dist/server/resources.js +33 -16
  22. package/dist/server/securityMiddleware.d.ts +38 -8
  23. package/dist/server/securityMiddleware.js +1 -0
  24. package/dist/server/toolRegistry.d.ts +9 -0
  25. package/dist/server/toolRegistry.js +11 -0
  26. package/dist/tools/adapters.d.ts +3 -1
  27. package/dist/tools/adapters.js +1 -0
  28. package/dist/tools/reconciliation/executor.d.ts +2 -0
  29. package/dist/tools/reconciliation/executor.js +26 -1
  30. package/dist/tools/reconciliation/index.d.ts +3 -2
  31. package/dist/tools/reconciliation/index.js +4 -3
  32. package/dist/tools/schemas/outputs/index.d.ts +2 -2
  33. package/dist/tools/schemas/outputs/index.js +2 -2
  34. package/dist/tools/schemas/outputs/utilityOutputs.d.ts +0 -15
  35. package/dist/tools/schemas/outputs/utilityOutputs.js +0 -9
  36. package/dist/tools/utilityTools.d.ts +0 -7
  37. package/dist/tools/utilityTools.js +1 -50
  38. package/docs/maintainers/npm-publishing.md +27 -0
  39. package/docs/reference/API.md +83 -97
  40. package/docs/technical/reconciliation-system-architecture.md +2251 -2251
  41. package/package.json +6 -6
  42. package/scripts/analyze-bundle.mjs +41 -41
  43. package/scripts/generate-mcpb.ps1 +95 -95
  44. package/scripts/watch-and-restart.ps1 +49 -49
  45. package/src/__tests__/comprehensive.integration.test.ts +4 -32
  46. package/src/__tests__/performance.test.ts +5 -14
  47. package/src/__tests__/setup.ts +45 -14
  48. package/src/__tests__/smoke.e2e.test.ts +70 -0
  49. package/src/__tests__/testUtils.ts +2 -113
  50. package/src/server/YNABMCPServer.ts +64 -10
  51. package/src/server/__tests__/YNABMCPServer.test.ts +0 -1
  52. package/src/server/__tests__/completions.integration.test.ts +117 -0
  53. package/src/server/__tests__/completions.test.ts +319 -0
  54. package/src/server/__tests__/resources.template.test.ts +3 -3
  55. package/src/server/__tests__/resources.test.ts +3 -3
  56. package/src/server/__tests__/toolRegistration.test.ts +3 -3
  57. package/src/server/cacheManager.ts +7 -6
  58. package/src/server/completions.ts +279 -0
  59. package/src/server/errorHandler.ts +1 -0
  60. package/src/server/rateLimiter.ts +4 -1
  61. package/src/server/resources.ts +49 -13
  62. package/src/server/securityMiddleware.ts +1 -0
  63. package/src/server/toolRegistry.ts +42 -0
  64. package/src/tools/__tests__/transactionTools.integration.test.ts +63 -3
  65. package/src/tools/__tests__/utilityTools.integration.test.ts +1 -85
  66. package/src/tools/__tests__/utilityTools.test.ts +1 -123
  67. package/src/tools/adapters.ts +22 -1
  68. package/src/tools/reconciliation/__tests__/executor.progress.test.ts +462 -0
  69. package/src/tools/reconciliation/executor.ts +55 -1
  70. package/src/tools/reconciliation/index.ts +7 -3
  71. package/src/tools/schemas/outputs/index.ts +0 -3
  72. package/src/tools/schemas/outputs/utilityOutputs.ts +2 -43
  73. package/src/tools/toolCategories.ts +0 -1
  74. package/src/tools/utilityTools.ts +5 -76
  75. package/vitest.config.ts +4 -1
  76. package/.chunkhound.json +0 -11
  77. package/.code/agents/0098661e-0fa3-4990-beb9-c0cbf3f123aa/status.txt +0 -1
  78. package/.code/agents/01a13ef4-3f23-4f52-b33b-3585b73cfa60/error.txt +0 -3
  79. package/.code/agents/084fd32f-e298-4728-9103-a78d7dc39613/error.txt +0 -3
  80. package/.code/agents/0fed51e1-a943-4b97-a2a8-a6f0f27c844d/status.txt +0 -1
  81. package/.code/agents/1059b6bd-5ccd-4d83-a12c-7c9d89137399/error.txt +0 -5
  82. package/.code/agents/110/exec-call_F9BDNG7JfxKkq7Vc8ESAvdft.txt +0 -1569
  83. package/.code/agents/11ebcef3-b13f-4e44-ad80-d94a866804b7/error.txt +0 -3
  84. package/.code/agents/1324/exec-call_tIpx9uV1TpARbAMZonRQm8AO.txt +0 -757
  85. package/.code/agents/1398/exec-call_CjItcWMU1G6JoPshX62QvpaR.txt +0 -2832
  86. package/.code/agents/1398/exec-call_SUVq2ivmONQ5LMCmd7ngmOqr.txt +0 -2709
  87. package/.code/agents/1398/exec-call_SdNY4NOffdcC5pRYjVXHjPCK.txt +0 -2832
  88. package/.code/agents/1398/exec-call_qblJo9et1gsFFB63TtLOiji2.txt +0 -2832
  89. package/.code/agents/1398/exec-call_zaRrzlGz7GJcNzVfkAmML7Zg.txt +0 -2709
  90. package/.code/agents/1572/exec-call_GjVFBFOWcY7lE0idc5nWlLNh.txt +0 -781
  91. package/.code/agents/171834fd-5905-42fc-bbcc-2c755145b0fc/status.txt +0 -1
  92. package/.code/agents/1724/exec-call_HvHQe0w5CCG3T7Q3ULT6MO3g.txt +0 -5217
  93. package/.code/agents/1724/exec-call_QwUNESVzfxxk78K1frh1Vahb.txt +0 -2594
  94. package/.code/agents/1724/exec-call_aJ1Xwz71XmIpD4SBxSHERzLe.txt +0 -2594
  95. package/.code/agents/1846/exec-call_1YNAVD18RjrMN7JnfkkQhUP3.txt +0 -766
  96. package/.code/agents/1846/exec-call_lh3lDzE4WJAh1lFiomiiZ73D.txt +0 -766
  97. package/.code/agents/1d7d7ab7-7473-4b69-8b97-6e914f56056a/result.txt +0 -231
  98. package/.code/agents/2038/exec-call_DYwOukaYsL8VCONWmV2rUW5u.txt +0 -766
  99. package/.code/agents/2038/exec-call_c7fOQ7UrpVcTtvdfGBRM146V.txt +0 -652
  100. package/.code/agents/2038/exec-call_ySNyq9Mm55jWE480s54r5QcA.txt +0 -766
  101. package/.code/agents/210/exec-call_0tQCsKNJ1WTuIchb8wlcFJpW.txt +0 -2590
  102. package/.code/agents/210/exec-call_8ZlY9cUc8Ft1twi4ch8UJ6IN.txt +0 -5195
  103. package/.code/agents/2188/exec-call_5HqayBxIteJtoI8oPTiLWgvJ.txt +0 -286
  104. package/.code/agents/2188/exec-call_XRbBKBq3adZe6dcppAvQtM7G.txt +0 -218
  105. package/.code/agents/2188/exec-call_ehA0SjpYtrUi6GJXmibLjp4i.txt +0 -180
  106. package/.code/agents/21902821-ecaf-4759-bb9d-222b90921af5/error.txt +0 -3
  107. package/.code/agents/2256/exec-call_AtPcRWPmFPMcmX6qOFm1fCEY.txt +0 -766
  108. package/.code/agents/232073be-aa0e-46da-b478-5b64dbf03cf5/status.txt +0 -1
  109. package/.code/agents/234ff534-2336-4771-a8d9-aa04421a63be/result.txt +0 -747
  110. package/.code/agents/2454/exec-call_aFJpupwjfZeOBm7ixI5Vc8z2.txt +0 -766
  111. package/.code/agents/2454/exec-call_wogZ4HfXTodTEXvdgXlVUBpv.txt +0 -766
  112. package/.code/agents/253e2695-dc36-4022-b436-27655e0fc6c7/status.txt +0 -1
  113. package/.code/agents/2583/exec-call_M59I4eDjpjlBIWBiSxyS0YlJ.txt +0 -2594
  114. package/.code/agents/2583/exec-call_usLRGh7OhVHtsRBL4iUwRhjq.txt +0 -2594
  115. package/.code/agents/292aa3ff-dbab-470f-97c9-e7e8fd65e0db/result.txt +0 -144
  116. package/.code/agents/2e905864-aa07-4314-bcf9-c5b32277e4ac/result.txt +0 -36
  117. package/.code/agents/3073/exec-call_Peeagc9DxGYLgE6pNdMZhqIE.txt +0 -766
  118. package/.code/agents/3073/exec-call_d2YSE3hXF08KRSoUM3qd8Z3x.txt +0 -766
  119. package/.code/agents/3134/exec-call_IgCAMGx19lWfuo8zfYIt5FFC.txt +0 -416
  120. package/.code/agents/3134/exec-call_IxvLR2Oo7kba2QTsI1gHVko8.txt +0 -2590
  121. package/.code/agents/3134/exec-call_jYvc8hksZChSiysbzKjl2ZbB.txt +0 -2590
  122. package/.code/agents/329/exec-call_4QdP3SfSO7HGPCwVcqZIth6s.txt +0 -2590
  123. package/.code/agents/335aa031-466d-4fb7-925f-3cd864e264d0/result.txt +0 -191
  124. package/.code/agents/3364/exec-call_NbhIrsM5HhyDZDmJZG5CuCYL.txt +0 -766
  125. package/.code/agents/3364/exec-call_cKtJg0NrXiwXEFwlsE3uPZRA.txt +0 -766
  126. package/.code/agents/36d98414-5cde-4d9d-9a67-a240a18c1f07/result.txt +0 -189
  127. package/.code/agents/4604e866-b7b8-44f5-992f-2f683b0a523b/status.txt +0 -1
  128. package/.code/agents/472/exec-call_4AxzEEcWwkKhpqRB3bE8Ha4L.txt +0 -790
  129. package/.code/agents/472/exec-call_CB3LPYQA8QIZRi8I6kj4J17A.txt +0 -766
  130. package/.code/agents/472/exec-call_YeoUWvaFoktay2nqVUsa9KKX.txt +0 -790
  131. package/.code/agents/472/exec-call_jPWgKVquBBXTg0T3Lks5ZfkK.txt +0 -2594
  132. package/.code/agents/472/exec-call_qBkvunpGBDEHph2jPmTwtcsb.txt +0 -1000
  133. package/.code/agents/472/exec-call_v0ffRV1p0kTckBmJPzzHAEy0.txt +0 -3489
  134. package/.code/agents/472/exec-call_xAX5FXqWIlk02d9WubHbHWh8.txt +0 -766
  135. package/.code/agents/5346/exec-call_9q0muXUuLaucwEqI51Pt7idT.txt +0 -2594
  136. package/.code/agents/5346/exec-call_B2el3B79rVkq9LhWTI2VYlz7.txt +0 -2456
  137. package/.code/agents/5346/exec-call_BfX08f02qkZI9uJD5dvCvuoj.txt +0 -2594
  138. package/.code/agents/543328d0-61d6-4fd1-a723-bb168656e2e2/error.txt +0 -18
  139. package/.code/agents/5580c02c-1383-4d18-9cbd-cc8a06e3408d/result.txt +0 -48
  140. package/.code/agents/5f8dc01c-47b3-4163-b0b3-aa31be89fcdc/status.txt +0 -1
  141. package/.code/agents/60ce1a22-5126-44b2-b977-1d5b56142a7b/status.txt +0 -1
  142. package/.code/agents/6215d9db-7fa9-4429-aeec-3835c3212291/error.txt +0 -1
  143. package/.code/agents/6743db55-30e5-4b4e-9366-a8214fc7f714/error.txt +0 -1
  144. package/.code/agents/6bf9591b-b9c9-422c-b0a5-e968c7d8422a/status.txt +0 -1
  145. package/.code/agents/7/exec-call_HltHpkDox0Zm1vGEjdksUgpE.txt +0 -1120
  146. package/.code/agents/7/exec-call_LCATrOPPAgbxW9Q1z0XaVi2E.txt +0 -2646
  147. package/.code/agents/7/exec-call_W8DeRfNG9hvbgVFvf0clBf6R.txt +0 -2646
  148. package/.code/agents/7/exec-call_eww3GfdEiJZx61sJEQ9wNmt3.txt +0 -1271
  149. package/.code/agents/70/exec-call_owUtDMYiVgqDf8vsz1i32PFf.txt +0 -1570
  150. package/.code/agents/8/exec-call_UtrjAcLbhYLatxR4O97fZgnm.txt +0 -2590
  151. package/.code/agents/82490bc9-f34e-4b1b-8a8e-bccc2e6254f5/error.txt +0 -3
  152. package/.code/agents/841/exec-call_7nTNhSBCNjTDUIJv7py6CepO.txt +0 -3299
  153. package/.code/agents/841/exec-call_TLI0yUdUijuUAvI4o3DXEvHO.txt +0 -3299
  154. package/.code/agents/9/exec-call_XaABQT1hIlRpnKZ2uyBMWsTC.txt +0 -1882
  155. package/.code/agents/941/exec-call_GuGHRx7NNXWIDAnxUG2NEWPa.txt +0 -2594
  156. package/.code/agents/94a0ddf3-a304-4ec3-913e-3cceef509948/error.txt +0 -1
  157. package/.code/agents/95d9fbab-19a2-48af-83f9-c792566a347f/error.txt +0 -1
  158. package/.code/agents/b0098cb8-cb32-4ada-9bc4-37c587518896/result.txt +0 -170
  159. package/.code/agents/b4fe59a4-81df-42e2-a112-0153e504faca/error.txt +0 -1
  160. package/.code/agents/bf4ce152-f623-49d7-aa52-c18631625c3c/error.txt +0 -3
  161. package/.code/agents/d7d1db75-d7eb-468e-adea-4ef4d916d187/status.txt +0 -1
  162. package/.code/agents/e2baa9c8-bac3-49e3-a39d-024333e6a990/status.txt +0 -1
  163. package/.code/agents/e2c752b7-711d-423a-af57-f53c809deb84/result.txt +0 -160
  164. package/.code/agents/e350b8c3-8483-408c-b2bb-94515f492a11/error.txt +0 -3
  165. package/.code/agents/e63f9919-719f-4ad0-bccf-01b1a596e1e9/status.txt +0 -1
  166. package/.code/agents/e6601719-c31f-4a0e-8c71-d70787d0ab71/status.txt +0 -1
  167. package/.code/agents/e71695a8-3044-478d-8f12-ed13d02884c7/status.txt +0 -1
  168. package/.code/agents/f250b7ed-5bd5-4036-aa8c-ce63caee7d61/result.txt +0 -20
  169. package/.code/agents/f95b7464-3e25-4897-b153-c8dfd63fd605/error.txt +0 -5
  170. package/.code/agents/fa3c5ddf-cdf7-47a2-930a-b806c6363689/status.txt +0 -1
  171. package/AGENTS.md +0 -1
  172. package/NUL +0 -0
  173. package/package.json.tmp +0 -105
  174. package/src/__tests__/delta.performance.test.ts +0 -80
  175. package/src/__tests__/workflows.e2e.test.ts +0 -1702
  176. package/temp-recon.ts +0 -126
  177. package/test-exports/ynab_account_e9ddc2a6_minimal_1items_2025-11-19_09-04-53.json +0 -23
  178. package/test-exports/ynab_account_e9ddc2a6_minimal_1items_2025-11-19_10-37-42.json +0 -23
  179. package/test-exports/ynab_account_e9ddc2a6_minimal_4items_2025-11-19_09-02-09.json +0 -44
  180. package/test-exports/ynab_account_e9ddc2a6_minimal_6items_2025-11-19_10-37-52.json +0 -58
  181. package/test-exports/ynab_since_2025-10-16_account_53298e13_238items_2025-11-28_13-46-20.json +0 -3662
  182. package/test-exports/ynab_since_2025-11-01_account_4c18e9f0_minimal_14items_2025-11-16_10-07-10.json +0 -115
@@ -8,6 +8,7 @@ This document provides comprehensive documentation for all tools available in th
8
8
  - [Authentication](#authentication)
9
9
  - [Data Formats](#data-formats)
10
10
  - [MCP Resources](#mcp-resources)
11
+ - [MCP Client Features](#mcp-client-features)
11
12
  - [Budget Management Tools](#budget-management-tools)
12
13
  - [Account Management Tools](#account-management-tools)
13
14
  - [Transaction Management Tools](#transaction-management-tools)
@@ -20,7 +21,7 @@ This document provides comprehensive documentation for all tools available in th
20
21
 
21
22
  ## Overview
22
23
 
23
- The YNAB MCP Server provides 30 tools that enable AI assistants to interact with YNAB data. All tools follow consistent patterns for parameters, responses, and error handling.
24
+ The YNAB MCP Server provides 29 tools that enable AI assistants to interact with YNAB data. All tools follow consistent patterns for parameters, responses, and error handling.
24
25
 
25
26
  ### Tool Naming Convention
26
27
 
@@ -49,10 +50,14 @@ The server automatically converts YNAB's internal milliunits to dollars in all r
49
50
  - Budget amounts: `150.00` (instead of `150000` milliunits)
50
51
 
51
52
  **Input formats**:
52
- - When creating transactions, amounts should be provided in milliunits (as per YNAB API requirements)
53
- - Use the `convert_amount` tool to convert between dollars and milliunits if needed
53
+ - When creating transactions, amounts should be provided in dollars (e.g., `50.25`)
54
+ - The server automatically converts to YNAB's internal milliunit format
54
55
 
55
- **Legacy behavior**: YNAB's internal representation uses milliunits (1/1000th of currency unit), but this is now transparent to users
56
+ **Note**: YNAB's internal representation uses milliunits (1/1000th of currency unit), but this is now transparent to users - all inputs and outputs use standard dollar amounts
57
+
58
+ ### Output Formatting Overrides
59
+
60
+ All tool calls accept optional boolean hints `minify`, `_minify`, or `__minify` in their arguments to override JSON formatting for that call. These keys are removed before validation and do not affect tool behavior.
56
61
 
57
62
  ### Dates
58
63
 
@@ -186,9 +191,9 @@ URI: ynab://budgets/12345678-1234-1234-1234-123456789012/accounts/87654321-4321-
186
191
  ### Caching
187
192
 
188
193
  All MCP resources are cached for optimal performance:
189
- - **Budgets**: 1 hour TTL (rarely change)
190
- - **Accounts**: 30 minutes TTL (balances update periodically)
191
- - **User info**: 1 hour TTL (static data)
194
+ - **Budgets**: 10 minutes TTL (rarely change)
195
+ - **Accounts**: 5 minutes TTL (balances update periodically)
196
+ - **User info**: 30 minutes TTL (static data)
192
197
 
193
198
  ### Resource vs Tool: When to Use What
194
199
 
@@ -209,6 +214,27 @@ All MCP resources are cached for optimal performance:
209
214
  - Get transactions for an account: Use `list_transactions` tool ✅
210
215
  - Create a new transaction: Use `create_transaction` tool ✅
211
216
 
217
+ ## MCP Client Features
218
+
219
+ These features depend on MCP client support. If your client doesn't surface them, tool calls still work normally.
220
+
221
+ ### Completions (Autocomplete)
222
+
223
+ The server provides MCP completions for common arguments:
224
+ - `budget_id`
225
+ - `account_id`
226
+ - `account_name`
227
+ - `category`
228
+ - `category_id`
229
+ - `payee`
230
+ - `payee_id`
231
+
232
+ Clients can use these completions to suggest IDs or names while composing tool calls.
233
+
234
+ ### Progress Notifications
235
+
236
+ When a client provides a `progressToken` in tool requests, the server emits `notifications/progress` events. Progress updates are most useful for long-running operations such as `reconcile_account`, which can create, update, or unclear large batches of transactions.
237
+
212
238
  ## Budget Management Tools
213
239
 
214
240
  ### list_budgets
@@ -291,7 +317,7 @@ Lists all accounts for a specific budget.
291
317
  "content": [
292
318
  {
293
319
  "type": "text",
294
- "text": "{\n \"accounts\": [\n {\n \"id\": \"87654321-4321-4321-4321-210987654321\",\n \"name\": \"Checking Account\",\n \"type\": \"checking\",\n \"on_budget\": true,\n \"closed\": false,\n \"note\": null,\n \"balance\": 150000,\n \"cleared_balance\": 145000,\n \"uncleared_balance\": 5000,\n \"transfer_payee_id\": \"transfer-payee-id\",\n \"direct_import_linked\": false,\n \"direct_import_in_error\": false,\n \"last_reconciled_at\": null,\n \"debt_original_balance\": null,\n \"debt_interest_rates\": {},\n \"debt_minimum_payments\": {},\n \"debt_escrow_amounts\": {}\n }\n ]\n}"
320
+ "text": "{\n \"accounts\": [\n {\n \"id\": \"87654321-4321-4321-4321-210987654321\",\n \"name\": \"Checking Account\",\n \"type\": \"checking\",\n \"on_budget\": true,\n \"closed\": false,\n \"note\": null,\n \"balance\": 150.0,\n \"cleared_balance\": 145.0,\n \"uncleared_balance\": 5.0,\n \"transfer_payee_id\": \"transfer-payee-id\",\n \"direct_import_linked\": false,\n \"direct_import_in_error\": false,\n \"last_reconciled_at\": null,\n \"debt_original_balance\": null,\n \"debt_interest_rates\": {},\n \"debt_minimum_payments\": {},\n \"debt_escrow_amounts\": {}\n }\n ]\n}"
295
321
  }
296
322
  ]
297
323
  }
@@ -331,7 +357,7 @@ Creates a new account in the specified budget.
331
357
  - `lineOfCredit` - Line of credit
332
358
  - `otherAsset` - Other asset account
333
359
  - `otherLiability` - Other liability account
334
- - `balance` (number, optional): Initial balance in milliunits
360
+ - `balance` (number, optional): Initial balance in dollars
335
361
  - `dry_run` (boolean, optional): Validate and return simulated result; no API call
336
362
 
337
363
  **Example Request:**
@@ -342,7 +368,7 @@ Creates a new account in the specified budget.
342
368
  "budget_id": "12345678-1234-1234-1234-123456789012",
343
369
  "name": "New Savings Account",
344
370
  "type": "savings",
345
- "balance": 100000
371
+ "balance": 100.0
346
372
  }
347
373
  }
348
374
  ```
@@ -353,7 +379,7 @@ Creates a new account in the specified budget.
353
379
  "content": [
354
380
  {
355
381
  "type": "text",
356
- "text": "{\n \"account\": {\n \"id\": \"new-account-id\",\n \"name\": \"New Savings Account\",\n \"type\": \"savings\",\n \"on_budget\": true,\n \"closed\": false,\n \"balance\": 100000,\n \"cleared_balance\": 100000,\n \"uncleared_balance\": 0\n }\n}"
382
+ "text": "{\n \"account\": {\n \"id\": \"new-account-id\",\n \"name\": \"New Savings Account\",\n \"type\": \"savings\",\n \"on_budget\": true,\n \"closed\": false,\n \"balance\": 100.0,\n \"cleared_balance\": 100.0,\n \"uncleared_balance\": 0\n }\n}"
357
383
  }
358
384
  ]
359
385
  }
@@ -390,7 +416,7 @@ Lists transactions for a budget with optional filtering.
390
416
  "content": [
391
417
  {
392
418
  "type": "text",
393
- "text": "{\n \"transactions\": [\n {\n \"id\": \"transaction-id\",\n \"date\": \"2024-01-15\",\n \"amount\": -5000,\n \"memo\": \"Coffee shop\",\n \"cleared\": \"cleared\",\n \"approved\": true,\n \"flag_color\": null,\n \"account_id\": \"87654321-4321-4321-4321-210987654321\",\n \"payee_id\": \"payee-id\",\n \"category_id\": \"category-id\",\n \"transfer_account_id\": null,\n \"transfer_transaction_id\": null,\n \"matched_transaction_id\": null,\n \"import_id\": null,\n \"import_payee_name\": null,\n \"import_payee_name_original\": null,\n \"debt_transaction_type\": null,\n \"deleted\": false\n }\n ]\n}"
419
+ "text": "{\n \"transactions\": [\n {\n \"id\": \"transaction-id\",\n \"date\": \"2024-01-15\",\n \"amount\": -5.0,\n \"memo\": \"Coffee shop\",\n \"cleared\": \"cleared\",\n \"approved\": true,\n \"flag_color\": null,\n \"account_id\": \"87654321-4321-4321-4321-210987654321\",\n \"payee_id\": \"payee-id\",\n \"category_id\": \"category-id\",\n \"transfer_account_id\": null,\n \"transfer_transaction_id\": null,\n \"matched_transaction_id\": null,\n \"import_id\": null,\n \"import_payee_name\": null,\n \"import_payee_name_original\": null,\n \"debt_transaction_type\": null,\n \"deleted\": false\n }\n ]\n}"
394
420
  }
395
421
  ]
396
422
  }
@@ -426,7 +452,7 @@ Exports all transactions to a JSON file with descriptive filename and platform-s
426
452
  "content": [
427
453
  {
428
454
  "type": "text",
429
- "text": "{\n \"message\": \"Successfully exported 1247 transactions\",\n \"filename\": \"ynab_since_2024-01-01_1247items_2024-09-10_14-30-15.json\",\n \"full_path\": \"C:\\\\Users\\\\YourName\\\\Downloads\\\\ynab_since_2024-01-01_1247items_2024-09-10_14-30-15.json\",\n \"export_directory\": \"C:\\\\Users\\\\YourName\\\\Downloads\",\n \"filename_explanation\": \"Filename format: ynab_{filters}_{count}items_{timestamp}.json - identifies what data was exported, when, and how many transactions\",\n \"preview_count\": 10,\n \"total_count\": 1247,\n \"preview_transactions\": [\n {\n \"id\": \"transaction-id\",\n \"date\": \"2024-01-15\",\n \"amount\": -5000,\n \"memo\": \"Coffee shop\",\n \"payee_name\": \"Starbucks\",\n \"category_name\": \"Dining Out\"\n }\n ]\n}"
455
+ "text": "{\n \"message\": \"Successfully exported 1247 transactions\",\n \"filename\": \"ynab_since_2024-01-01_1247items_2024-09-10_14-30-15.json\",\n \"full_path\": \"C:\\\\Users\\\\YourName\\\\Downloads\\\\ynab_since_2024-01-01_1247items_2024-09-10_14-30-15.json\",\n \"export_directory\": \"C:\\\\Users\\\\YourName\\\\Downloads\",\n \"filename_explanation\": \"Filename format: ynab_{filters}_{count}items_{timestamp}.json - identifies what data was exported, when, and how many transactions\",\n \"preview_count\": 10,\n \"total_count\": 1247,\n \"preview_transactions\": [\n {\n \"id\": \"transaction-id\",\n \"date\": \"2024-01-15\",\n \"amount\": -5.0,\n \"memo\": \"Coffee shop\",\n \"payee_name\": \"Starbucks\",\n \"category_name\": \"Dining Out\"\n }\n ]\n}"
430
456
  }
431
457
  ]
432
458
  }
@@ -678,16 +704,17 @@ The `reconcile_account_v2` tool now includes an optional `recommendations` array
678
704
 
679
705
  Recommendations include complete parameters for YNAB MCP tool calls:
680
706
 
681
- **CRITICAL**: Recommendation `parameters.amount` values are in **milliunits** (YNAB's internal format where 1 dollar = 1000 milliunits). These values are ready to pass directly to `create_transaction` without conversion. However, `estimated_impact.value` remains in decimal dollars for human readability.
707
+ **CRITICAL**: Recommendation `parameters.amount` values are in **milliunits** (YNAB's internal format where 1 dollar = 1000 milliunits). These values are intended for reconciliation execution; convert to dollars before calling `create_transaction`. `estimated_impact.value` remains in decimal dollars for human readability.
682
708
 
683
709
  ```typescript
684
710
  // For create_transaction recommendations:
685
- // Note: Recommendation amounts are already in milliunits, ready to use directly
711
+ // Note: Recommendation amounts are already in milliunits; convert to dollars before tool calls
686
712
  const rec = recommendations.find(r => r.action_type === 'create_transaction');
687
713
  if (rec) {
688
714
  await create_transaction({
689
715
  budget_id: 'your-budget-id',
690
- ...rec.parameters // Parameters already contain amounts in milliunits
716
+ ...rec.parameters,
717
+ amount: rec.parameters.amount / 1000 // Convert milliunits to dollars
691
718
  });
692
719
  }
693
720
 
@@ -880,7 +907,7 @@ Creates a new transaction in the specified budget and account.
880
907
  **Parameters:**
881
908
  - `budget_id` (string, required): The ID of the budget
882
909
  - `account_id` (string, required): The ID of the account
883
- - `amount` (number, required): Transaction amount in milliunits (negative for outflows)
910
+ - `amount` (number, required): Transaction amount in dollars (negative for outflows)
884
911
  - `date` (string, required): Transaction date in ISO format (YYYY-MM-DD)
885
912
  - `payee_name` (string, optional): The payee name
886
913
  - `payee_id` (string, optional): The payee ID
@@ -890,7 +917,7 @@ Creates a new transaction in the specified budget and account.
890
917
  - `approved` (boolean, optional): Whether the transaction is approved
891
918
  - `flag_color` (string, optional): Transaction flag color (`red`, `orange`, `yellow`, `green`, `blue`, `purple`)
892
919
  - `dry_run` (boolean, optional): Validate and return simulated result; no API call
893
- - `subtransactions` (array, optional): Split line items; each entry accepts `amount` (milliunits), plus optional `memo`, `category_id`, `payee_id`, and `payee_name`
920
+ - `subtransactions` (array, optional): Split line items; each entry accepts `amount` (dollars), plus optional `memo`, `category_id`, `payee_id`, and `payee_name`
894
921
 
895
922
  When `subtransactions` are supplied, their `amount` values must sum to the parent `amount`, matching YNAB API requirements.
896
923
 
@@ -901,7 +928,7 @@ When `subtransactions` are supplied, their `amount` values must sum to the paren
901
928
  "arguments": {
902
929
  "budget_id": "12345678-1234-1234-1234-123456789012",
903
930
  "account_id": "87654321-4321-4321-4321-210987654321",
904
- "amount": -5000,
931
+ "amount": -5.0,
905
932
  "date": "2024-01-15",
906
933
  "payee_name": "Coffee Shop",
907
934
  "category_id": "category-id",
@@ -919,12 +946,12 @@ When `subtransactions` are supplied, their `amount` values must sum to the paren
919
946
  "arguments": {
920
947
  "budget_id": "12345678-1234-1234-1234-123456789012",
921
948
  "account_id": "87654321-4321-4321-4321-210987654321",
922
- "amount": -125000,
949
+ "amount": -125.0,
923
950
  "date": "2024-02-01",
924
951
  "memo": "Rent and utilities",
925
952
  "subtransactions": [
926
- { "amount": -100000, "category_id": "rent-category", "memo": "Rent" },
927
- { "amount": -25000, "category_id": "utilities-category", "memo": "Utilities" }
953
+ { "amount": -100.0, "category_id": "rent-category", "memo": "Rent" },
954
+ { "amount": -25.0, "category_id": "utilities-category", "memo": "Utilities" }
928
955
  ]
929
956
  }
930
957
  }
@@ -1038,7 +1065,7 @@ Updates an existing transaction.
1038
1065
  - `budget_id` (string, required): The ID of the budget
1039
1066
  - `transaction_id` (string, required): The ID of the transaction to update
1040
1067
  - `account_id` (string, optional): Update the account ID
1041
- - `amount` (number, optional): Update the amount in milliunits
1068
+ - `amount` (number, optional): Update the amount in dollars
1042
1069
  - `date` (string, optional): Update the date (YYYY-MM-DD)
1043
1070
  - `payee_name` (string, optional): Update the payee name
1044
1071
  - `payee_id` (string, optional): Update the payee ID
@@ -1056,7 +1083,7 @@ Updates an existing transaction.
1056
1083
  "arguments": {
1057
1084
  "budget_id": "12345678-1234-1234-1234-123456789012",
1058
1085
  "transaction_id": "transaction-id",
1059
- "amount": -6000,
1086
+ "amount": -6.0,
1060
1087
  "memo": "Updated memo",
1061
1088
  "flag_color": "red"
1062
1089
  }
@@ -1108,7 +1135,7 @@ Lists all categories for a specific budget.
1108
1135
  "content": [
1109
1136
  {
1110
1137
  "type": "text",
1111
- "text": "{\n \"category_groups\": [\n {\n \"id\": \"group-id\",\n \"name\": \"Monthly Bills\",\n \"hidden\": false,\n \"deleted\": false,\n \"categories\": [\n {\n \"id\": \"category-id\",\n \"category_group_id\": \"group-id\",\n \"name\": \"Rent/Mortgage\",\n \"hidden\": false,\n \"original_category_group_id\": null,\n \"note\": null,\n \"budgeted\": 150000,\n \"activity\": -150000,\n \"balance\": 0,\n \"goal_type\": null,\n \"goal_creation_month\": null,\n \"goal_target\": null,\n \"goal_target_month\": null,\n \"goal_percentage_complete\": null,\n \"goal_months_to_budget\": null,\n \"goal_under_funded\": null,\n \"goal_overall_funded\": null,\n \"goal_overall_left\": null,\n \"deleted\": false\n }\n ]\n }\n ]\n}"
1138
+ "text": "{\n \"category_groups\": [\n {\n \"id\": \"group-id\",\n \"name\": \"Monthly Bills\",\n \"hidden\": false,\n \"deleted\": false,\n \"categories\": [\n {\n \"id\": \"category-id\",\n \"category_group_id\": \"group-id\",\n \"name\": \"Rent/Mortgage\",\n \"hidden\": false,\n \"original_category_group_id\": null,\n \"note\": null,\n \"budgeted\": 150.0,\n \"activity\": -150.0,\n \"balance\": 0,\n \"goal_type\": null,\n \"goal_creation_month\": null,\n \"goal_target\": null,\n \"goal_target_month\": null,\n \"goal_percentage_complete\": null,\n \"goal_months_to_budget\": null,\n \"goal_under_funded\": null,\n \"goal_overall_funded\": null,\n \"goal_overall_left\": null,\n \"deleted\": false\n }\n ]\n }\n ]\n}"
1112
1139
  }
1113
1140
  ]
1114
1141
  }
@@ -1129,7 +1156,7 @@ Updates the budgeted amount for a category in the current month.
1129
1156
  **Parameters:**
1130
1157
  - `budget_id` (string, required): The ID of the budget
1131
1158
  - `category_id` (string, required): The ID of the category
1132
- - `budgeted` (number, required): The budgeted amount in milliunits
1159
+ - `budgeted` (number, required): The budgeted amount in dollars
1133
1160
  - `dry_run` (boolean, optional): Validate and return simulated result; no API call
1134
1161
 
1135
1162
  **Example Request:**
@@ -1139,7 +1166,7 @@ Updates the budgeted amount for a category in the current month.
1139
1166
  "arguments": {
1140
1167
  "budget_id": "12345678-1234-1234-1234-123456789012",
1141
1168
  "category_id": "category-id",
1142
- "budgeted": 50000
1169
+ "budgeted": 50.0
1143
1170
  }
1144
1171
  }
1145
1172
  ```
@@ -1227,60 +1254,6 @@ Gets information about the authenticated user.
1227
1254
  }
1228
1255
  ```
1229
1256
 
1230
- ### convert_amount
1231
-
1232
- Converts between dollars and milliunits with integer arithmetic for precision.
1233
-
1234
- **Parameters:**
1235
- - `amount` (number, required): The amount to convert
1236
- - `to_milliunits` (boolean, required): If true, convert from dollars to milliunits. If false, convert from milliunits to dollars
1237
-
1238
- **Example Request (dollars to milliunits):**
1239
- ```json
1240
- {
1241
- "name": "convert_amount",
1242
- "arguments": {
1243
- "amount": 50.25,
1244
- "to_milliunits": true
1245
- }
1246
- }
1247
- ```
1248
-
1249
- **Example Response:**
1250
- ```json
1251
- {
1252
- "content": [
1253
- {
1254
- "type": "text",
1255
- "text": "{\n \"original_amount\": 50.25,\n \"converted_amount\": 50250,\n \"conversion_type\": \"dollars_to_milliunits\"\n}"
1256
- }
1257
- ]
1258
- }
1259
- ```
1260
-
1261
- **Example Request (milliunits to dollars):**
1262
- ```json
1263
- {
1264
- "name": "convert_amount",
1265
- "arguments": {
1266
- "amount": 50250,
1267
- "to_milliunits": false
1268
- }
1269
- }
1270
- ```
1271
-
1272
- **Example Response:**
1273
- ```json
1274
- {
1275
- "content": [
1276
- {
1277
- "type": "text",
1278
- "text": "{\n \"original_amount\": 50250,\n \"converted_amount\": 50.25,\n \"conversion_type\": \"milliunits_to_dollars\"\n}"
1279
- }
1280
- ]
1281
- }
1282
- ```
1283
-
1284
1257
  ## Diagnostic Tools
1285
1258
 
1286
1259
  These tools help inspect the server, environment, and performance. They do not modify YNAB data.
@@ -1525,9 +1498,9 @@ if (!dateRegex.test(date)) {
1525
1498
  throw new Error('Date must be in YYYY-MM-DD format');
1526
1499
  }
1527
1500
 
1528
- // Validate amount is in milliunits
1529
- if (!Number.isInteger(amount)) {
1530
- throw new Error('Amount must be an integer in milliunits');
1501
+ // Validate amount is in dollars
1502
+ if (!Number.isFinite(amount)) {
1503
+ throw new Error('Amount must be a number in dollars');
1531
1504
  }
1532
1505
  ```
1533
1506
 
@@ -1549,24 +1522,23 @@ const recentTransactions = await mcpClient.callTool('list_transactions', {
1549
1522
  });
1550
1523
  ```
1551
1524
 
1552
- ### 4. Amount Conversions
1525
+ ### 4. Amount Handling
1553
1526
 
1554
- Use the conversion utility for user-friendly displays:
1527
+ All amounts are automatically handled in dollars:
1555
1528
 
1556
1529
  ```javascript
1557
- // Convert milliunits to dollars for display
1558
- const dollarsResult = await mcpClient.callTool('convert_amount', {
1559
- amount: 50250,
1560
- to_milliunits: false
1561
- });
1562
- console.log(`Amount: $${dollarsResult.converted_amount}`); // Amount: $50.25
1530
+ // All returned amounts are in dollars - no conversion needed
1531
+ const accounts = await mcpClient.callTool('list_accounts', { budget_id: budgetId });
1532
+ console.log(`Balance: $${accounts.accounts[0].balance}`); // Balance: $1234.56
1563
1533
 
1564
- // Convert user input to milliunits for API calls
1565
- const milliUnitsResult = await mcpClient.callTool('convert_amount', {
1566
- amount: 50.25,
1567
- to_milliunits: true
1534
+ // When creating transactions, provide amounts in dollars
1535
+ await mcpClient.callTool('create_transaction', {
1536
+ budget_id: budgetId,
1537
+ account_id: accountId,
1538
+ amount: -50.25, // Negative for outflows
1539
+ date: '2024-01-15',
1540
+ payee_name: 'Coffee Shop'
1568
1541
  });
1569
- // Use milliUnitsResult.converted_amount in transaction creation
1570
1542
  ```
1571
1543
 
1572
1544
  ### 5. Caching Strategies
@@ -1592,3 +1564,17 @@ const transactions = await mcpClient.callTool('list_transactions', {
1592
1564
  ```
1593
1565
 
1594
1566
  This API reference provides comprehensive documentation for all available tools. For additional information, see the [Developer Guide](DEVELOPER.md) for best practices and common usage patterns.
1567
+
1568
+
1569
+
1570
+
1571
+
1572
+
1573
+
1574
+
1575
+
1576
+
1577
+
1578
+
1579
+
1580
+