@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
@@ -1,191 +0,0 @@
1
- I now have comprehensive information about the tool registrations. Let me compile the report:
2
-
3
- ## MCP Tool Registration Catalogue Report
4
-
5
- ### Summary Statistics
6
- - **Total Tools:** 30
7
- - **Domain Groups:** 8 (Budget, Account, Transaction, Category, Payee, Month, Reconciliation, Utility)
8
- - **Adapter Types:** 4 (adapt, adaptWithDelta, adaptWrite, adaptNoInput/custom)
9
-
10
- ---
11
-
12
- ### Complete Tool Registry
13
-
14
- | # | Tool Name | Domain | Adapter Type | Input Schema Location | Output Schema | Migrate? |
15
- |---|-----------|--------|--------------|----------------------|---------------|----------|
16
- | 1 | `list_budgets` | Budget | delta | inline (empty) | ✅ | No |
17
- | 2 | `get_budget` | Budget | read-only | `budgetTools.ts` | ✅ | ⚠️ Yes |
18
- | 3 | `set_default_budget` | Budget | custom (server) | inline | ✅ | No |
19
- | 4 | `get_default_budget` | Budget | custom (server) | inline (empty) | ✅ | No |
20
- | 5 | `list_accounts` | Account | delta | `accountTools.ts` | ✅ | ⚠️ Yes |
21
- | 6 | `get_account` | Account | read-only | `accountTools.ts` | ✅ | ⚠️ Yes |
22
- | 7 | `create_account` | Account | write | `accountTools.ts` | Loose | ⚠️ Yes |
23
- | 8 | `list_transactions` | Transaction | delta | `transactionTools.ts` | Loose | ⚠️ Yes |
24
- | 9 | `get_transaction` | Transaction | read-only | `transactionTools.ts` | ✅ | ⚠️ Yes |
25
- | 10 | `create_transaction` | Transaction | write | `transactionTools.ts` | Loose | ⚠️ Yes |
26
- | 11 | `create_transactions` | Transaction | write | `transactionTools.ts` | Loose | ⚠️ Yes |
27
- | 12 | `update_transaction` | Transaction | write | `transactionTools.ts` | Loose | ⚠️ Yes |
28
- | 13 | `update_transactions` | Transaction | write | `transactionTools.ts` | Loose | ⚠️ Yes |
29
- | 14 | `delete_transaction` | Transaction | write | `transactionTools.ts` | Loose | ⚠️ Yes |
30
- | 15 | `create_receipt_split_transaction` | Transaction | write | `transactionTools.ts` | Loose | ⚠️ Yes |
31
- | 16 | `export_transactions` | Transaction | read-only | `exportTransactions.ts` | ✅ | ⚠️ Yes |
32
- | 17 | `compare_transactions` | Transaction | read-only | `compareTransactions/index.ts` | ✅ | ⚠️ Yes |
33
- | 18 | `reconcile_account` | Reconciliation | delta | `reconciliation/index.ts` | Loose | ⚠️ Yes |
34
- | 19 | `list_categories` | Category | delta | `categoryTools.ts` | ✅ | ⚠️ Yes |
35
- | 20 | `get_category` | Category | read-only | `categoryTools.ts` | ✅ | ⚠️ Yes |
36
- | 21 | `update_category` | Category | write | `categoryTools.ts` | Loose | ⚠️ Yes |
37
- | 22 | `list_payees` | Payee | delta | `payeeTools.ts` | ✅ | ⚠️ Yes |
38
- | 23 | `get_payee` | Payee | read-only | `payeeTools.ts` | ✅ | ⚠️ Yes |
39
- | 24 | `get_month` | Month | read-only | `monthTools.ts` | ✅ | ⚠️ Yes |
40
- | 25 | `list_months` | Month | delta | `monthTools.ts` | ✅ | ⚠️ Yes |
41
- | 26 | `get_user` | Utility | no-input | inline (empty) | ✅ | No |
42
- | 27 | `convert_amount` | Utility | custom | `utilityTools.ts` | ✅ | ⚠️ Yes |
43
- | 28 | `diagnostic_info` | Utility | custom (server) | inline | ✅ | No |
44
- | 29 | `clear_cache` | Utility | custom (server) | inline (empty) | ✅ | No |
45
- | 30 | `set_output_format` | Utility | custom (server) | inline | ✅ | No |
46
-
47
- ---
48
-
49
- ### Adapter Type Breakdown
50
-
51
- | Adapter | Tools | Description |
52
- |---------|-------|-------------|
53
- | **`adapt`** (read-only) | 8 | Standard adapter for read operations without delta support |
54
- | **`adaptWithDelta`** (delta) | 7 | Delta caching with server knowledge tracking |
55
- | **`adaptWrite`** (write) | 8 | Write operations with cache invalidation |
56
- | **`adaptNoInput`** (no-input) | 1 | Tools with empty input schema |
57
- | **custom (server)** | 6 | Server-owned tools with inline handlers |
58
-
59
- ---
60
-
61
- ### Inline Schemas in `YNABMCPServer.ts` (Server-owned - KEEP INLINE)
62
-
63
- These schemas are intentionally inline because they:
64
- 1. Are simple utility schemas used only by server-owned tools
65
- 2. Tightly coupled to server configuration logic
66
- 3. Have no need for reuse in external contexts
67
-
68
- | Schema | Tool | Rationale |
69
- |--------|------|-----------|
70
- | `emptyObjectSchema` | `list_budgets`, `get_default_budget`, `clear_cache`, `get_user` | Generic empty schema, no domain logic |
71
- | `setDefaultBudgetSchema` | `set_default_budget` | Server state management |
72
- | `diagnosticInfoSchema` | `diagnostic_info` | Server internals exposure |
73
- | `setOutputFormatSchema` | `set_output_format` | Server response configuration |
74
- | `LooseObjectSchema` | 10 mutation tools | Permissive output passthrough |
75
-
76
- ---
77
-
78
- ### Schemas Recommended for Migration
79
-
80
- **Target location:** `src/tools/schemas/inputs/` (mirroring existing `outputs/` structure)
81
-
82
- #### High Priority - Complex Schemas with Shared Patterns
83
-
84
- | Schema | Current Location | Complexity | Shared Patterns |
85
- |--------|-----------------|------------|-----------------|
86
- | `CreateTransactionSchema` | transactionTools.ts:169-211 | High (superRefine, nested subtransactions) | `date`, `cleared`, `flag_color`, `amount` |
87
- | `UpdateTransactionSchema` | transactionTools.ts:621-640 | Medium | Same as above |
88
- | `CreateTransactionsSchema` | transactionTools.ts:238-248 | High (bulk, nested) | Reuses `BulkTransactionInputSchema` |
89
- | `UpdateTransactionsSchema` | transactionTools.ts:677-687 | High (bulk) | Reuses `BulkUpdateTransactionInputSchema` |
90
- | `CreateReceiptSplitTransactionSchema` | transactionTools.ts:555-612 | Very High (nested, superRefine) | `date`, `cleared`, `flag_color` |
91
- | `ReconcileAccountSchema` | reconciliation/index.ts:71-132 | Very High (many optional params) | `csv_format`, matching config |
92
- | `CompareTransactionsSchema` | compareTransactions/index.ts:16-56 | High (nested csv_format) | `csv_format` |
93
-
94
- #### Medium Priority - Domain Entity Schemas
95
-
96
- | Schema | Current Location | Rationale |
97
- |--------|-----------------|-----------|
98
- | `GetBudgetSchema` | budgetTools.ts:12-16 | Simple but follows pattern |
99
- | `ListAccountsSchema` | accountTools.ts:17-22 | Simple with `limit` |
100
- | `GetAccountSchema` | accountTools.ts:29-34 | Standard get pattern |
101
- | `CreateAccountSchema` | accountTools.ts:41-57 | Enum types reusable |
102
- | `ListTransactionsSchema` | transactionTools.ts:139-151 | Filter params |
103
- | `GetTransactionSchema` | transactionTools.ts:157-163 | Standard get pattern |
104
- | `DeleteTransactionSchema` | transactionTools.ts:716-722 | Standard delete pattern |
105
- | `ListCategoriesSchema` | categoryTools.ts:17-21 | Simple budget_id |
106
- | `GetCategorySchema` | categoryTools.ts:28-33 | Standard get pattern |
107
- | `UpdateCategorySchema` | categoryTools.ts:40-47 | Milliunits amount |
108
- | `ListPayeesSchema` | payeeTools.ts:14-19 | Simple with `limit` |
109
- | `GetPayeeSchema` | payeeTools.ts:26-31 | Standard get pattern |
110
- | `GetMonthSchema` | monthTools.ts:15-20 | Date format regex |
111
- | `ListMonthsSchema` | monthTools.ts:27-31 | Simple budget_id |
112
- | `ExportTransactionsSchema` | exportTransactions.ts:14-27 | Filter params |
113
-
114
- #### Low Priority - Utility Schemas
115
-
116
- | Schema | Current Location | Rationale |
117
- |--------|-----------------|-----------|
118
- | `ConvertAmountSchema` | utilityTools.ts:10-15 | Simple, self-contained |
119
-
120
- ---
121
-
122
- ### Identified Reusable Schema Fragments
123
-
124
- These patterns appear in multiple schemas and could be extracted to `src/tools/schemas/shared/`:
125
-
126
- ```typescript
127
- // src/tools/schemas/shared/commonInputs.ts
128
-
129
- // Budget ID - appears in 20+ schemas
130
- export const BudgetIdSchema = z.string().min(1, 'Budget ID is required');
131
-
132
- // ISO Date - appears in 8+ schemas
133
- export const ISODateSchema = z.string()
134
- .regex(/^\d{4}-\d{2}-\d{2}$/, 'Date must be in ISO format (YYYY-MM-DD)');
135
-
136
- // Cleared Status - appears in 5+ schemas
137
- export const ClearedStatusSchema = z.enum(['cleared', 'uncleared', 'reconciled']);
138
-
139
- // Flag Color - appears in 5+ schemas
140
- export const FlagColorSchema = z.enum(['red', 'orange', 'yellow', 'green', 'blue', 'purple']);
141
-
142
- // Account Type - appears in create_account
143
- export const AccountTypeSchema = z.enum([
144
- 'checking', 'savings', 'creditCard', 'cash',
145
- 'lineOfCredit', 'otherAsset', 'otherLiability'
146
- ]);
147
-
148
- // Milliunits Amount - appears in 6+ schemas
149
- export const MilliunitsAmountSchema = z.number().int('Amount must be an integer in milliunits');
150
-
151
- // CSV Format - appears in compare_transactions, reconcile_account
152
- export const CSVFormatSchema = z.object({
153
- date_column: z.union([z.string(), z.number()]).optional(),
154
- amount_column: z.union([z.string(), z.number()]).optional(),
155
- debit_column: z.union([z.string(), z.number()]).optional(),
156
- credit_column: z.union([z.string(), z.number()]).optional(),
157
- description_column: z.union([z.string(), z.number()]).optional(),
158
- date_format: z.string().optional(),
159
- has_header: z.boolean().optional(),
160
- delimiter: z.string().optional(),
161
- }).strict();
162
- ```
163
-
164
- ---
165
-
166
- ### Recommended Migration Strategy
167
-
168
- 1. **Phase 1:** Create `src/tools/schemas/shared/commonInputs.ts` with reusable fragments
169
- 2. **Phase 2:** Create `src/tools/schemas/inputs/` directory structure:
170
- - `budgetInputs.ts`
171
- - `accountInputs.ts`
172
- - `transactionInputs.ts`
173
- - `categoryInputs.ts`
174
- - `payeeInputs.ts`
175
- - `monthInputs.ts`
176
- - `reconciliationInputs.ts`
177
- - `comparisonInputs.ts`
178
- - `utilityInputs.ts`
179
- - `index.ts` (central export)
180
- 3. **Phase 3:** Migrate high-complexity schemas first (transactions, reconciliation)
181
- 4. **Phase 4:** Update tool files to import from new schema locations
182
- 5. **Phase 5:** Keep server-owned schemas inline (5 schemas in YNABMCPServer.ts)
183
-
184
- ---
185
-
186
- ### Summary
187
-
188
- - **22 schemas** are candidates for migration to a common inputs module
189
- - **5 schemas** should remain inline in `YNABMCPServer.ts` (server-owned)
190
- - **7 reusable fragments** can be extracted to reduce duplication
191
- - The existing `src/tools/schemas/outputs/` structure provides a proven pattern to follow