@dizzlkheinz/ynab-mcpb 0.12.1

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 (435) hide show
  1. package/.chunkhound.json +11 -0
  2. package/.code/agents/0427d95e-edca-431f-a214-5e53264e29c4/error.txt +8 -0
  3. package/.code/agents/0d675174-d1e1-41c3-9975-4c2e275819a9/error.txt +3 -0
  4. package/.code/agents/0d8c5afd-4787-422b-abf8-2e5943fc7e67/error.txt +3 -0
  5. package/.code/agents/0ec34a70-ed5d-4b9e-bee4-bb0e4cccbc4b/error.txt +1 -0
  6. package/.code/agents/0ef51a21-1ab1-49d7-9561-0eaa43875ebc/error.txt +12 -0
  7. package/.code/agents/15db95d7-abad-4b4d-9c3b-8446089cb61d/error.txt +1 -0
  8. package/.code/agents/19ab9acb-f675-4ff0-902a-09a5476f8149/error.txt +1 -0
  9. package/.code/agents/1ef7e12d-f6ff-4897-8a9b-152d523d898e/error.txt +5 -0
  10. package/.code/agents/2465/exec-call_lroN9KKzJVWC7t5423DK1nT9.txt +1453 -0
  11. package/.code/agents/28edb6fe-95a9-41a0-ae69-aa0100d26c0c/error.txt +8 -0
  12. package/.code/agents/2ae40cf5-b4bf-42e2-92bf-7ea350a7755e/error.txt +9 -0
  13. package/.code/agents/2bfc4e1f-ac4b-45a5-b6df-bf89d4dbb54c/error.txt +1 -0
  14. package/.code/agents/2e2e1134-eff0-49be-ba25-8e2c3468a564/error.txt +5 -0
  15. package/.code/agents/3/exec-call_203OC4TNVkLxW7z2HCVEQ1cM.txt +81 -0
  16. package/.code/agents/3/exec-call_SS5T0XSiXB4LSNzUKTl75wkh.txt +610 -0
  17. package/.code/agents/3322c003-ce5e-48e3-a342-f5049c5bf9a2/error.txt +1 -0
  18. package/.code/agents/391e9b08-1ebc-468c-9bcd-6d0cc3193b37/error.txt +1 -0
  19. package/.code/agents/3ab0aa84-b7bb-4054-afa3-40b8fd7d3be0/error.txt +1 -0
  20. package/.code/agents/3bed368d-50fe-477e-aee3-a6707eaa1ab9/error.txt +3 -0
  21. package/.code/agents/3e40b925-db12-442f-8d7a-a25fc69a6672/error.txt +8 -0
  22. package/.code/agents/414d5776-cf58-41f3-9328-a6daed503a50/error.txt +5 -0
  23. package/.code/agents/42687751-4565-4610-b240-67835b17d861/error.txt +1 -0
  24. package/.code/agents/46b98876-1a39-43c9-9e2f-507ca6d47335/error.txt +9 -0
  25. package/.code/agents/4a7d9491-b26f-43dd-850d-2ecdc49b5d1b/error.txt +1 -0
  26. package/.code/agents/4e60f00a-1b3e-447f-87f3-7faf9deddec3/error.txt +13 -0
  27. package/.code/agents/5138fc1c-4d49-4b74-a7da-ccdb3a8e44e7/error.txt +14 -0
  28. package/.code/agents/521cff39-a7a3-42e5-a557-134f0f7daaa0/error.txt +5 -0
  29. package/.code/agents/53302dc5-3857-4413-9a47-9e0f64a51dc4/error.txt +5 -0
  30. package/.code/agents/567c7c2e-6a6f-4761-a08d-d36deeb2e0ac/error.txt +5 -0
  31. package/.code/agents/57b00845-80dc-47c9-953c-3028d16275d6/error.txt +3 -0
  32. package/.code/agents/593d9005-c2a5-48fd-8813-ece0d3f2de96/error.txt +1 -0
  33. package/.code/agents/5a112e66-0e1a-42f9-877c-53af56ea3551/error.txt +1 -0
  34. package/.code/agents/5b05e8ed-7788-4738-b7ee-9faa8180f992/error.txt +5 -0
  35. package/.code/agents/5f888d6f-d7ca-4ac8-be23-9ea1bf753951/error.txt +5 -0
  36. package/.code/agents/607db3ab-e4b0-435b-b497-93e9aa525549/error.txt +8 -0
  37. package/.code/agents/67dcb2a2-900f-4c78-b3fc-80b5213e0ddf/error.txt +8 -0
  38. package/.code/agents/69ad848c-4e98-49b3-b16c-0094ac2d1759/error.txt +5 -0
  39. package/.code/agents/6c9cfc5f-0d0b-445c-b121-9f60082c4f70/error.txt +1 -0
  40. package/.code/agents/6f6f8f77-4ab0-4f6e-9f30-40e8be0bd8f5/error.txt +1 -0
  41. package/.code/agents/72a7cde4-fa8a-4024-9038-27faa550539b/error.txt +1 -0
  42. package/.code/agents/7b48335c-8247-43aa-9949-5f820ba8e199/error.txt +1 -0
  43. package/.code/agents/80944249-bea9-4ac5-87de-a666c4df306e/error.txt +1 -0
  44. package/.code/agents/826099df-1b66-4186-a915-7eb59f9db19d/error.txt +5 -0
  45. package/.code/agents/8291d158-18a8-4a92-b799-4e9a4d9cce88/error.txt +1 -0
  46. package/.code/agents/82fb71a3-20fb-4341-804a-a2fc900f95bc/error.txt +1 -0
  47. package/.code/agents/855790ea-54ee-43e4-8209-a66994e37590/error.txt +1 -0
  48. package/.code/agents/88ce3a2e-04f2-42be-9062-bf97aa798da0/error.txt +3 -0
  49. package/.code/agents/9a17e398-b6ed-4218-bb55-bc64a8d38ce8/error.txt +8 -0
  50. package/.code/agents/9a4f4bfc-a2a6-4f40-a896-9335b41a7ed1/error.txt +1 -0
  51. package/.code/agents/9b633e55-ef84-47d6-94bb-fd3dd172ad97/error.txt +1 -0
  52. package/.code/agents/9b81f3ab-c72b-4a81-9a8f-28a49ddba84a/error.txt +8 -0
  53. package/.code/agents/a35daf29-b2d1-4aef-9b42-dad63a76bd47/error.txt +3 -0
  54. package/.code/agents/a81990cc-69ee-44d2-b907-17403c9bc5d7/error.txt +5 -0
  55. package/.code/agents/ab56260a-4a83-4ad4-9410-f88a23d6520a/error.txt +1 -0
  56. package/.code/agents/ad722c31-2d1d-45f7-bae2-3f02ca455b60/error.txt +1 -0
  57. package/.code/agents/b62e8690-3324-4b97-9309-731bee79416b/error.txt +5 -0
  58. package/.code/agents/baf60a3a-752b-4ad8-99d6-df32423ed2eb/error.txt +1 -0
  59. package/.code/agents/be049042-7dcb-4ac8-9beb-c8f1aea67742/error.txt +14 -0
  60. package/.code/agents/bed1dcb4-bfce-4a9f-8594-0f994962aafd/error.txt +1 -0
  61. package/.code/agents/c324a6cf-e935-4ede-9529-b3ebc18e8d6b/error.txt +5 -0
  62. package/.code/agents/c37c06ff-dfe3-43f2-9bbc-3ec73ec8f41d/error.txt +5 -0
  63. package/.code/agents/c8cd6671-433a-456b-9f88-e51cb2df6bfc/error.txt +11 -0
  64. package/.code/agents/ca2ccb67-2f24-428e-b27d-9365beadd140/error.txt +1 -0
  65. package/.code/agents/cf08c0c8-e7f0-423e-93ba-547e8e818340/error.txt +8 -0
  66. package/.code/agents/d579c74f-874b-40a4-9d56-ced1eb6a701d/error.txt +1 -0
  67. package/.code/agents/df412c98-7378-4deb-8e1e-76c416931181/error.txt +3 -0
  68. package/.code/agents/e5134eb3-2af4-45b0-8998-051cb4afdb45/error.txt +3 -0
  69. package/.code/agents/e6308471-aa45-4e9e-9496-2e9404164d97/error.txt +8 -0
  70. package/.code/agents/e7bd8bc7-23fb-4f46-98dc-b0dcf11b75a1/error.txt +1 -0
  71. package/.code/agents/e92bec35-378d-4fe1-8ac0-6e1bb3c86911/error.txt +5 -0
  72. package/.code/agents/ed918fbf-2dc4-4aa2-bfc5-04b65d9471ea/error.txt +1 -0
  73. package/.code/agents/ef1d756f-b272-48fc-8729-f05c494674f7/error.txt +1 -0
  74. package/.code/agents/ef359853-0249-4e41-a804-c0fc459fe456/error.txt +1 -0
  75. package/.code/agents/effc7b4a-4b90-40a0-8c86-a7a99d2d5fd2/error.txt +1 -0
  76. package/.code/agents/fa15f8d5-8359-4a8b-83a3-2f2056b3ff40/error.txt +3 -0
  77. package/.code/agents/fbef4193-eadf-4c8a-83ff-4878a6310f25/error.txt +8 -0
  78. package/.code/agents/fd0a4b4a-fda4-4964-a6d6-2b8a2da387c6/error.txt +1 -0
  79. package/.dxtignore +57 -0
  80. package/.env.example +44 -0
  81. package/.gemini/settings.json +8 -0
  82. package/.github/ISSUE_TEMPLATE/bug_report.md +41 -0
  83. package/.github/ISSUE_TEMPLATE/config.yml +5 -0
  84. package/.github/ISSUE_TEMPLATE/feature_request.md +24 -0
  85. package/.github/ISSUE_TEMPLATE/release_checklist.md +31 -0
  86. package/.github/pull_request_template.md +41 -0
  87. package/.github/workflows/ci-tests.yml +41 -0
  88. package/.github/workflows/claude-code-review.yml +57 -0
  89. package/.github/workflows/claude.yml +50 -0
  90. package/.github/workflows/full-integration.yml +22 -0
  91. package/.github/workflows/pr-description-check.yml +88 -0
  92. package/.github/workflows/publish.yml +33 -0
  93. package/.github/workflows/release.yml +89 -0
  94. package/.mcpbignore +58 -0
  95. package/.prettierignore +10 -0
  96. package/.prettierrc.json +10 -0
  97. package/ADOS-2-Module-1-Complete-Manual.md +757 -0
  98. package/AGENTS.md +36 -0
  99. package/CHANGELOG.md +187 -0
  100. package/CLAUDE.md +414 -0
  101. package/CODEREVIEW_RESPONSE.md +128 -0
  102. package/LICENSE +17 -0
  103. package/NUL +1 -0
  104. package/README.md +222 -0
  105. package/SCHEMA_IMPROVEMENT_SUMMARY.md +120 -0
  106. package/TESTING_NOTES.md +217 -0
  107. package/WARP.md +245 -0
  108. package/accountactivity-merged.csv +149 -0
  109. package/bin/ynab-mcp-server.cjs +4 -0
  110. package/bin/ynab-mcp-server.js +8 -0
  111. package/bundle-analysis.html +13110 -0
  112. package/dist/bundle/index.cjs +124 -0
  113. package/dist/index.d.ts +2 -0
  114. package/dist/index.js +85 -0
  115. package/dist/server/YNABMCPServer.d.ts +264 -0
  116. package/dist/server/YNABMCPServer.js +845 -0
  117. package/dist/server/budgetResolver.d.ts +15 -0
  118. package/dist/server/budgetResolver.js +99 -0
  119. package/dist/server/cacheManager.d.ts +74 -0
  120. package/dist/server/cacheManager.js +306 -0
  121. package/dist/server/config.d.ts +3 -0
  122. package/dist/server/config.js +19 -0
  123. package/dist/server/deltaCache.d.ts +61 -0
  124. package/dist/server/deltaCache.js +206 -0
  125. package/dist/server/deltaCache.merge.d.ts +9 -0
  126. package/dist/server/deltaCache.merge.js +111 -0
  127. package/dist/server/diagnostics.d.ts +90 -0
  128. package/dist/server/diagnostics.js +163 -0
  129. package/dist/server/errorHandler.d.ts +69 -0
  130. package/dist/server/errorHandler.js +524 -0
  131. package/dist/server/prompts.d.ts +31 -0
  132. package/dist/server/prompts.js +205 -0
  133. package/dist/server/rateLimiter.d.ts +27 -0
  134. package/dist/server/rateLimiter.js +82 -0
  135. package/dist/server/requestLogger.d.ts +62 -0
  136. package/dist/server/requestLogger.js +190 -0
  137. package/dist/server/resources.d.ts +39 -0
  138. package/dist/server/resources.js +85 -0
  139. package/dist/server/responseFormatter.d.ts +14 -0
  140. package/dist/server/responseFormatter.js +42 -0
  141. package/dist/server/securityMiddleware.d.ts +87 -0
  142. package/dist/server/securityMiddleware.js +117 -0
  143. package/dist/server/serverKnowledgeStore.d.ts +11 -0
  144. package/dist/server/serverKnowledgeStore.js +42 -0
  145. package/dist/server/toolRegistry.d.ts +85 -0
  146. package/dist/server/toolRegistry.js +272 -0
  147. package/dist/tools/__tests__/deltaTestUtils.d.ts +18 -0
  148. package/dist/tools/__tests__/deltaTestUtils.js +26 -0
  149. package/dist/tools/accountTools.d.ts +37 -0
  150. package/dist/tools/accountTools.js +175 -0
  151. package/dist/tools/budgetTools.d.ts +10 -0
  152. package/dist/tools/budgetTools.js +68 -0
  153. package/dist/tools/categoryTools.d.ts +27 -0
  154. package/dist/tools/categoryTools.js +232 -0
  155. package/dist/tools/compareTransactions/formatter.d.ts +71 -0
  156. package/dist/tools/compareTransactions/formatter.js +97 -0
  157. package/dist/tools/compareTransactions/index.d.ts +30 -0
  158. package/dist/tools/compareTransactions/index.js +160 -0
  159. package/dist/tools/compareTransactions/matcher.d.ts +12 -0
  160. package/dist/tools/compareTransactions/matcher.js +140 -0
  161. package/dist/tools/compareTransactions/parser.d.ts +14 -0
  162. package/dist/tools/compareTransactions/parser.js +430 -0
  163. package/dist/tools/compareTransactions/types.d.ts +27 -0
  164. package/dist/tools/compareTransactions/types.js +1 -0
  165. package/dist/tools/compareTransactions.d.ts +1 -0
  166. package/dist/tools/compareTransactions.js +1 -0
  167. package/dist/tools/deltaFetcher.d.ts +22 -0
  168. package/dist/tools/deltaFetcher.js +137 -0
  169. package/dist/tools/deltaSupport.d.ts +20 -0
  170. package/dist/tools/deltaSupport.js +176 -0
  171. package/dist/tools/exportTransactions.d.ts +17 -0
  172. package/dist/tools/exportTransactions.js +191 -0
  173. package/dist/tools/monthTools.d.ts +16 -0
  174. package/dist/tools/monthTools.js +107 -0
  175. package/dist/tools/payeeTools.d.ts +17 -0
  176. package/dist/tools/payeeTools.js +82 -0
  177. package/dist/tools/reconcileAdapter.d.ts +25 -0
  178. package/dist/tools/reconcileAdapter.js +167 -0
  179. package/dist/tools/reconciliation/analyzer.d.ts +3 -0
  180. package/dist/tools/reconciliation/analyzer.js +567 -0
  181. package/dist/tools/reconciliation/executor.d.ts +94 -0
  182. package/dist/tools/reconciliation/executor.js +611 -0
  183. package/dist/tools/reconciliation/index.d.ts +54 -0
  184. package/dist/tools/reconciliation/index.js +249 -0
  185. package/dist/tools/reconciliation/matcher.d.ts +3 -0
  186. package/dist/tools/reconciliation/matcher.js +160 -0
  187. package/dist/tools/reconciliation/payeeNormalizer.d.ts +6 -0
  188. package/dist/tools/reconciliation/payeeNormalizer.js +77 -0
  189. package/dist/tools/reconciliation/recommendationEngine.d.ts +2 -0
  190. package/dist/tools/reconciliation/recommendationEngine.js +273 -0
  191. package/dist/tools/reconciliation/reportFormatter.d.ts +13 -0
  192. package/dist/tools/reconciliation/reportFormatter.js +214 -0
  193. package/dist/tools/reconciliation/types.d.ts +172 -0
  194. package/dist/tools/reconciliation/types.js +7 -0
  195. package/dist/tools/schemas/outputs/accountOutputs.d.ts +58 -0
  196. package/dist/tools/schemas/outputs/accountOutputs.js +24 -0
  197. package/dist/tools/schemas/outputs/budgetOutputs.d.ts +48 -0
  198. package/dist/tools/schemas/outputs/budgetOutputs.js +15 -0
  199. package/dist/tools/schemas/outputs/categoryOutputs.d.ts +93 -0
  200. package/dist/tools/schemas/outputs/categoryOutputs.js +37 -0
  201. package/dist/tools/schemas/outputs/comparisonOutputs.d.ts +269 -0
  202. package/dist/tools/schemas/outputs/comparisonOutputs.js +181 -0
  203. package/dist/tools/schemas/outputs/index.d.ts +14 -0
  204. package/dist/tools/schemas/outputs/index.js +14 -0
  205. package/dist/tools/schemas/outputs/monthOutputs.d.ts +122 -0
  206. package/dist/tools/schemas/outputs/monthOutputs.js +51 -0
  207. package/dist/tools/schemas/outputs/payeeOutputs.d.ts +34 -0
  208. package/dist/tools/schemas/outputs/payeeOutputs.js +16 -0
  209. package/dist/tools/schemas/outputs/reconciliationOutputs.d.ts +1275 -0
  210. package/dist/tools/schemas/outputs/reconciliationOutputs.js +377 -0
  211. package/dist/tools/schemas/outputs/transactionMutationOutputs.d.ts +717 -0
  212. package/dist/tools/schemas/outputs/transactionMutationOutputs.js +260 -0
  213. package/dist/tools/schemas/outputs/transactionOutputs.d.ts +98 -0
  214. package/dist/tools/schemas/outputs/transactionOutputs.js +49 -0
  215. package/dist/tools/schemas/outputs/utilityOutputs.d.ts +219 -0
  216. package/dist/tools/schemas/outputs/utilityOutputs.js +120 -0
  217. package/dist/tools/schemas/shared/commonOutputs.d.ts +24 -0
  218. package/dist/tools/schemas/shared/commonOutputs.js +27 -0
  219. package/dist/tools/toolCategories.d.ts +32 -0
  220. package/dist/tools/toolCategories.js +32 -0
  221. package/dist/tools/transactionTools.d.ts +315 -0
  222. package/dist/tools/transactionTools.js +1722 -0
  223. package/dist/tools/utilityTools.d.ts +10 -0
  224. package/dist/tools/utilityTools.js +56 -0
  225. package/dist/types/index.d.ts +20 -0
  226. package/dist/types/index.js +16 -0
  227. package/dist/types/toolAnnotations.d.ts +7 -0
  228. package/dist/types/toolAnnotations.js +1 -0
  229. package/dist/utils/amountUtils.d.ts +3 -0
  230. package/dist/utils/amountUtils.js +10 -0
  231. package/dist/utils/dateUtils.d.ts +9 -0
  232. package/dist/utils/dateUtils.js +43 -0
  233. package/dist/utils/money.d.ts +21 -0
  234. package/dist/utils/money.js +51 -0
  235. package/docs/README.md +72 -0
  236. package/docs/assets/examples/reconciliation-with-recommendations.json +68 -0
  237. package/docs/assets/schemas/reconciliation-v2.json +338 -0
  238. package/docs/getting-started/CONFIGURATION.md +175 -0
  239. package/docs/getting-started/INSTALLATION.md +333 -0
  240. package/docs/getting-started/QUICKSTART.md +282 -0
  241. package/docs/guides/ARCHITECTURE.md +650 -0
  242. package/docs/guides/DEPLOYMENT.md +189 -0
  243. package/docs/guides/INTEGRATION_TESTING.md +730 -0
  244. package/docs/guides/TESTING.md +591 -0
  245. package/docs/reconciliation-flow.md +83 -0
  246. package/docs/reference/API.md +1450 -0
  247. package/docs/reference/EXAMPLES.md +946 -0
  248. package/docs/reference/TOOLS.md +348 -0
  249. package/docs/reference/TROUBLESHOOTING.md +481 -0
  250. package/esbuild.config.mjs +68 -0
  251. package/eslint.config.js +49 -0
  252. package/fix-types.sh +17 -0
  253. package/meta.json +12550 -0
  254. package/package.json +105 -0
  255. package/package.json.tmp +105 -0
  256. package/scripts/analyze-bundle.mjs +41 -0
  257. package/scripts/create-pr-description.js +203 -0
  258. package/scripts/generate-mcpb.ps1 +96 -0
  259. package/scripts/run-domain-integration-tests.js +33 -0
  260. package/scripts/run-generate-mcpb.js +29 -0
  261. package/scripts/run-throttled-integration-tests.js +116 -0
  262. package/scripts/test-delta-params.mjs +140 -0
  263. package/scripts/test-recommendations.ts +53 -0
  264. package/scripts/tmpTransaction.ts +48 -0
  265. package/scripts/validate-env.js +122 -0
  266. package/scripts/verify-build.js +105 -0
  267. package/scripts/watch-and-restart.ps1 +50 -0
  268. package/src/__tests__/comprehensive.integration.test.ts +1196 -0
  269. package/src/__tests__/delta.performance.test.ts +80 -0
  270. package/src/__tests__/performance.test.ts +725 -0
  271. package/src/__tests__/setup.ts +449 -0
  272. package/src/__tests__/testRunner.ts +444 -0
  273. package/src/__tests__/testUtils.ts +563 -0
  274. package/src/__tests__/workflows.e2e.test.ts +1675 -0
  275. package/src/index.ts +124 -0
  276. package/src/server/.gitkeep +1 -0
  277. package/src/server/YNABMCPServer.ts +1188 -0
  278. package/src/server/__tests__/YNABMCPServer.integration.test.ts +903 -0
  279. package/src/server/__tests__/YNABMCPServer.test.ts +894 -0
  280. package/src/server/__tests__/budgetResolver.test.ts +425 -0
  281. package/src/server/__tests__/cacheManager.test.ts +880 -0
  282. package/src/server/__tests__/config.test.ts +166 -0
  283. package/src/server/__tests__/deltaCache.merge.test.ts +724 -0
  284. package/src/server/__tests__/deltaCache.swr.test.ts +168 -0
  285. package/src/server/__tests__/deltaCache.test.ts +774 -0
  286. package/src/server/__tests__/diagnostics.test.ts +823 -0
  287. package/src/server/__tests__/errorHandler.integration.test.ts +466 -0
  288. package/src/server/__tests__/errorHandler.test.ts +416 -0
  289. package/src/server/__tests__/prompts.test.ts +354 -0
  290. package/src/server/__tests__/rateLimiter.test.ts +314 -0
  291. package/src/server/__tests__/requestLogger.test.ts +408 -0
  292. package/src/server/__tests__/resources.test.ts +299 -0
  293. package/src/server/__tests__/security.integration.test.ts +426 -0
  294. package/src/server/__tests__/securityMiddleware.test.ts +449 -0
  295. package/src/server/__tests__/server-startup.integration.test.ts +477 -0
  296. package/src/server/__tests__/serverKnowledgeStore.test.ts +174 -0
  297. package/src/server/__tests__/toolRegistry.test.ts +855 -0
  298. package/src/server/budgetResolver.ts +235 -0
  299. package/src/server/cacheManager.ts +503 -0
  300. package/src/server/config.ts +41 -0
  301. package/src/server/deltaCache.merge.ts +149 -0
  302. package/src/server/deltaCache.ts +341 -0
  303. package/src/server/diagnostics.ts +338 -0
  304. package/src/server/errorHandler.ts +756 -0
  305. package/src/server/prompts.ts +291 -0
  306. package/src/server/rateLimiter.ts +156 -0
  307. package/src/server/requestLogger.ts +344 -0
  308. package/src/server/resources.ts +168 -0
  309. package/src/server/responseFormatter.ts +51 -0
  310. package/src/server/securityMiddleware.ts +236 -0
  311. package/src/server/serverKnowledgeStore.ts +91 -0
  312. package/src/server/toolRegistry.ts +489 -0
  313. package/src/tools/.gitkeep +1 -0
  314. package/src/tools/__tests__/accountTools.delta.integration.test.ts +128 -0
  315. package/src/tools/__tests__/accountTools.integration.test.ts +117 -0
  316. package/src/tools/__tests__/accountTools.test.ts +653 -0
  317. package/src/tools/__tests__/budgetTools.delta.integration.test.ts +90 -0
  318. package/src/tools/__tests__/budgetTools.integration.test.ts +134 -0
  319. package/src/tools/__tests__/budgetTools.test.ts +423 -0
  320. package/src/tools/__tests__/categoryTools.delta.integration.test.ts +80 -0
  321. package/src/tools/__tests__/categoryTools.integration.test.ts +295 -0
  322. package/src/tools/__tests__/categoryTools.test.ts +622 -0
  323. package/src/tools/__tests__/compareTransactions/formatter.test.ts +486 -0
  324. package/src/tools/__tests__/compareTransactions/index.test.ts +383 -0
  325. package/src/tools/__tests__/compareTransactions/matcher.test.ts +410 -0
  326. package/src/tools/__tests__/compareTransactions/parser.test.ts +764 -0
  327. package/src/tools/__tests__/compareTransactions.test.ts +342 -0
  328. package/src/tools/__tests__/compareTransactions.window.test.ts +147 -0
  329. package/src/tools/__tests__/deltaFetcher.scheduled.integration.test.ts +76 -0
  330. package/src/tools/__tests__/deltaFetcher.test.ts +270 -0
  331. package/src/tools/__tests__/deltaSupport.test.ts +188 -0
  332. package/src/tools/__tests__/deltaTestUtils.ts +46 -0
  333. package/src/tools/__tests__/exportTransactions.test.ts +213 -0
  334. package/src/tools/__tests__/monthTools.delta.integration.test.ts +80 -0
  335. package/src/tools/__tests__/monthTools.integration.test.ts +174 -0
  336. package/src/tools/__tests__/monthTools.test.ts +523 -0
  337. package/src/tools/__tests__/payeeTools.delta.integration.test.ts +80 -0
  338. package/src/tools/__tests__/payeeTools.integration.test.ts +150 -0
  339. package/src/tools/__tests__/payeeTools.test.ts +445 -0
  340. package/src/tools/__tests__/transactionTools.integration.test.ts +762 -0
  341. package/src/tools/__tests__/transactionTools.test.ts +3521 -0
  342. package/src/tools/__tests__/utilityTools.integration.test.ts +128 -0
  343. package/src/tools/__tests__/utilityTools.test.ts +205 -0
  344. package/src/tools/accountTools.ts +283 -0
  345. package/src/tools/budgetTools.ts +112 -0
  346. package/src/tools/categoryTools.ts +366 -0
  347. package/src/tools/compareTransactions/formatter.ts +163 -0
  348. package/src/tools/compareTransactions/index.ts +228 -0
  349. package/src/tools/compareTransactions/matcher.ts +240 -0
  350. package/src/tools/compareTransactions/parser.ts +557 -0
  351. package/src/tools/compareTransactions/types.ts +60 -0
  352. package/src/tools/compareTransactions.ts +3 -0
  353. package/src/tools/deltaFetcher.ts +278 -0
  354. package/src/tools/deltaSupport.ts +293 -0
  355. package/src/tools/exportTransactions.ts +273 -0
  356. package/src/tools/monthTools.ts +164 -0
  357. package/src/tools/payeeTools.ts +140 -0
  358. package/src/tools/reconcileAdapter.ts +312 -0
  359. package/src/tools/reconciliation/__tests__/adapter.causes.test.ts +122 -0
  360. package/src/tools/reconciliation/__tests__/adapter.test.ts +234 -0
  361. package/src/tools/reconciliation/__tests__/analyzer.test.ts +406 -0
  362. package/src/tools/reconciliation/__tests__/executor.integration.test.ts +366 -0
  363. package/src/tools/reconciliation/__tests__/executor.test.ts +779 -0
  364. package/src/tools/reconciliation/__tests__/matcher.test.ts +650 -0
  365. package/src/tools/reconciliation/__tests__/payeeNormalizer.test.ts +278 -0
  366. package/src/tools/reconciliation/__tests__/recommendationEngine.integration.test.ts +658 -0
  367. package/src/tools/reconciliation/__tests__/recommendationEngine.test.ts +1000 -0
  368. package/src/tools/reconciliation/__tests__/reconciliation.delta.integration.test.ts +151 -0
  369. package/src/tools/reconciliation/__tests__/reportFormatter.test.ts +573 -0
  370. package/src/tools/reconciliation/__tests__/scenarios/adapterCurrency.scenario.test.ts +78 -0
  371. package/src/tools/reconciliation/__tests__/scenarios/extremes.scenario.test.ts +47 -0
  372. package/src/tools/reconciliation/__tests__/scenarios/repeatAmount.scenario.test.ts +61 -0
  373. package/src/tools/reconciliation/__tests__/schemaUrl.test.ts +49 -0
  374. package/src/tools/reconciliation/analyzer.ts +824 -0
  375. package/src/tools/reconciliation/executor.ts +880 -0
  376. package/src/tools/reconciliation/index.ts +400 -0
  377. package/src/tools/reconciliation/matcher.ts +269 -0
  378. package/src/tools/reconciliation/payeeNormalizer.ts +167 -0
  379. package/src/tools/reconciliation/recommendationEngine.ts +506 -0
  380. package/src/tools/reconciliation/reportFormatter.ts +363 -0
  381. package/src/tools/reconciliation/types.ts +314 -0
  382. package/src/tools/schemas/outputs/__tests__/accountOutputs.test.ts +424 -0
  383. package/src/tools/schemas/outputs/__tests__/budgetOutputs.test.ts +310 -0
  384. package/src/tools/schemas/outputs/__tests__/categoryOutputs.test.ts +448 -0
  385. package/src/tools/schemas/outputs/__tests__/comparisonOutputs.test.ts +519 -0
  386. package/src/tools/schemas/outputs/__tests__/dateValidation.test.ts +155 -0
  387. package/src/tools/schemas/outputs/__tests__/discrepancyDirection.test.ts +288 -0
  388. package/src/tools/schemas/outputs/__tests__/monthOutputs.test.ts +478 -0
  389. package/src/tools/schemas/outputs/__tests__/payeeOutputs.test.ts +370 -0
  390. package/src/tools/schemas/outputs/__tests__/reconciliationOutputs.test.ts +401 -0
  391. package/src/tools/schemas/outputs/__tests__/transactionMutationSchemas.test.ts +213 -0
  392. package/src/tools/schemas/outputs/__tests__/transactionOutputs.test.ts +474 -0
  393. package/src/tools/schemas/outputs/__tests__/utilityOutputs.test.ts +333 -0
  394. package/src/tools/schemas/outputs/accountOutputs.ts +137 -0
  395. package/src/tools/schemas/outputs/budgetOutputs.ts +86 -0
  396. package/src/tools/schemas/outputs/categoryOutputs.ts +194 -0
  397. package/src/tools/schemas/outputs/comparisonOutputs.ts +600 -0
  398. package/src/tools/schemas/outputs/index.ts +270 -0
  399. package/src/tools/schemas/outputs/monthOutputs.ts +243 -0
  400. package/src/tools/schemas/outputs/payeeOutputs.ts +105 -0
  401. package/src/tools/schemas/outputs/reconciliationOutputs.ts +796 -0
  402. package/src/tools/schemas/outputs/transactionMutationOutputs.ts +758 -0
  403. package/src/tools/schemas/outputs/transactionOutputs.ts +243 -0
  404. package/src/tools/schemas/outputs/utilityOutputs.ts +411 -0
  405. package/src/tools/schemas/shared/commonOutputs.ts +140 -0
  406. package/src/tools/toolCategories.ts +140 -0
  407. package/src/tools/transactionTools.ts +2509 -0
  408. package/src/tools/utilityTools.ts +90 -0
  409. package/src/types/.gitkeep +1 -0
  410. package/src/types/__tests__/index.test.ts +52 -0
  411. package/src/types/index.ts +67 -0
  412. package/src/types/integration-tests.d.ts +35 -0
  413. package/src/types/toolAnnotations.ts +44 -0
  414. package/src/utils/__tests__/dateUtils.test.ts +170 -0
  415. package/src/utils/__tests__/money.test.ts +189 -0
  416. package/src/utils/amountUtils.ts +32 -0
  417. package/src/utils/dateUtils.ts +108 -0
  418. package/src/utils/money.ts +123 -0
  419. package/test-csv-sample.csv +28 -0
  420. package/test-exports/sample_bank_statement.csv +7 -0
  421. package/test-exports/ynab_account_e9ddc2a6_minimal_1items_2025-11-19_09-04-53.json +23 -0
  422. package/test-exports/ynab_account_e9ddc2a6_minimal_1items_2025-11-19_10-37-42.json +23 -0
  423. package/test-exports/ynab_account_e9ddc2a6_minimal_4items_2025-11-19_09-02-09.json +44 -0
  424. package/test-exports/ynab_account_e9ddc2a6_minimal_6items_2025-11-19_10-37-52.json +58 -0
  425. package/test-exports/ynab_since_2025-11-01_account_4c18e9f0_minimal_14items_2025-11-16_10-07-10.json +115 -0
  426. package/test-reconcile-autodetect.js +40 -0
  427. package/test-reconcile-tool.js +152 -0
  428. package/test-reconcile-with-csv.cjs +89 -0
  429. package/test-statement.csv +8 -0
  430. package/test_debug.js +47 -0
  431. package/test_simple.mjs +16 -0
  432. package/tsconfig.json +31 -0
  433. package/tsconfig.prod.json +18 -0
  434. package/vitest-reporters/split-json-reporter.ts +211 -0
  435. package/vitest.config.ts +96 -0
package/AGENTS.md ADDED
@@ -0,0 +1,36 @@
1
+ # Repository Guidelines
2
+
3
+ ## Project Structure & Module Organization
4
+
5
+ `src/` hosts all TypeScript modules: `server/` wires the MCP host, `tools/` defines tool handlers, `utils/` shares primitives, and `index.ts` is the entry point.
6
+ Tests live in `src/__tests__` (unit, integration, e2e, performance) with sanitized fixtures in `test-exports/` and artifacts in `test-results/`.
7
+ Documentation stays in `docs/`, automation in `scripts/`, and compiled output in `dist/` plus `dist/bundle/`; never edit generated files directly.
8
+
9
+ ## Build, Test, and Development Commands
10
+
11
+ - `npm run dev` - incremental TypeScript build while coding.
12
+ - `npm run build` - clean `dist/`, compile, then esbuild-bundle.
13
+ - `npm run build:prod` / `npm run package:mcpb` - production bundle with verification and MCPB packing.
14
+ - `npm start` or `npm run start:mcp` - launch compiled server with `.env`.
15
+ - `npm run validate-env` - confirm required secrets before tool runs.
16
+
17
+ ## Coding Style & Naming Conventions
18
+
19
+ Prettier enforces 2-space indent, 100-char width, single quotes, and semicolons; verify with `npm run format:check`.
20
+ ESLint (`npm run lint`) must pass before commits; prefer `npm run lint:fix` for safe rewrites.
21
+ Name files after their capability (`budgetService.ts`, `create-account.tool.ts`) and keep MCP tool identifiers kebab-case with ES modules and explicit dependency injection.
22
+
23
+ ## Testing Guidelines
24
+
25
+ Vitest powers the suite: `npm test` runs everything then filters failures into `test-results.json`, while `test:unit`, `test:integration`, `test:e2e`, `test:performance`, and `test:coverage` target specific goals.
26
+ Use `test:comprehensive` (tsx runner) for orchestration flows, mirror test filenames to the feature, and update fixtures only with scrubbed data.
27
+
28
+ ## Commit & Pull Request Guidelines
29
+
30
+ History follows Conventional Commits (`docs:`, `fix:`, `refactor:`); keep patches focused and note verification commands in every PR.
31
+ Run `npm run pr:description` to refresh `.pr-description.md` before `gh pr create`, link issues, and attach screenshots or sample JSON for user-facing changes.
32
+
33
+ ## Environment & Security Tips
34
+
35
+ Clone `.env` from `.env.example`, set `YNAB_ACCESS_TOKEN` plus cache settings, then rerun `npm run validate-env` after edits.
36
+ Avoid logging secrets, prefer sample budgets when demonstrating behaviors, and delete stray exports from `test-exports/` before pushing.
package/CHANGELOG.md ADDED
@@ -0,0 +1,187 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Changed
11
+
12
+ - **Default Build to Production** - All builds now use minified production bundle
13
+ - `npm run build` now aliases `build:prod` (was dev build)
14
+ - `prepare` hook uses production build for consistent npm distribution
15
+ - Bundle size reduced from 2.35 MB → 1.28 MB (~45% smaller)
16
+ - Use `npm run build:dev` if you need sourcemaps for debugging
17
+ - **Integrated Linting and Formatting** - Code quality checks now run automatically
18
+ - `npm run lint` now runs both ESLint and Prettier checks
19
+ - `npm run lint:fix` now fixes both ESLint issues and formats with Prettier
20
+ - `npm run build` automatically fixes code quality and formatting issues before building
21
+ - `console.log` statements now allowed in test files for debugging
22
+ - Use `npm run build:no-lint` to skip linting during rapid iteration
23
+ - **Reconciliation Default Tolerance** - Increased `date_tolerance_days` default from 2 to 5 days
24
+ - Better handles typical credit card processing delays (3-5 days)
25
+ - Matches `compare_transactions` default for consistency
26
+ - Still configurable per-call for tighter matching when needed
27
+
28
+ ### Fixed
29
+
30
+ - **Month Output Schema** - `age_of_money` now correctly accepts `null` values
31
+ - YNAB API returns `null` when insufficient transaction history exists
32
+ - Changed from `z.number().optional()` to `z.number().nullish()`
33
+ - Affects both `MonthDetailSchema` and `MonthSummarySchema`
34
+
35
+ ## [0.12.0] - 2025-11-19
36
+
37
+ ### Added
38
+
39
+ - **Structured Output Schemas** - Zod-based output validation for all 30 tools
40
+ - Output schemas in `src/tools/schemas/outputs/` with centralized exports
41
+ - Automatic validation in ToolRegistry (toolRegistry.ts:401-483) using `z.safeParse()`
42
+ - Type-safe responses with TypeScript inference
43
+ - **Unit Tests** - Full coverage for output schemas (7 test files)
44
+ - Budget, account, transaction, category, payee, month outputs
45
+ - Comparison and export schemas with specialized validations
46
+ - **E2E Schema Validation**
47
+ - `validateOutputSchema()` helper in testUtils.ts
48
+ - Schema validation integrated into workflow tests
49
+
50
+ ### Changed
51
+
52
+ - ToolRegistry validates handler responses against output schemas
53
+ - `listTools()` includes `outputSchema` field in Tool objects
54
+ - TOOLS.md updated with structured output documentation
55
+
56
+ ## [0.11.0] - 2025-01-14
57
+
58
+ ### Added
59
+
60
+ - **Tiered Integration Testing** - Three-tier test system
61
+ - Core: Budget-agnostic fundamental operations
62
+ - Domain: Budget-specific tests by functional domain
63
+ - Throttled execution respecting API rate limits
64
+ - **Delta Request System** - Incremental data fetching via YNAB delta protocol
65
+ - `ServerKnowledgeStore`: Tracks server knowledge for delta endpoints
66
+ - `DeltaCache`: Specialized caching with conflict detection
67
+ - `DeltaFetcher`: Unified interface for delta-backed API calls
68
+ - 70-90% reduction in API response size for cached data
69
+ - **Bulk Transaction Operations** - Batch handling for up to 100 transactions
70
+ - `create_transactions`: Batch create with duplicate detection via import_id
71
+ - `update_transactions`: Batch update with automatic cache invalidation
72
+ - Dry-run mode and correlation metadata
73
+ - **Enhanced Transaction Metadata**
74
+ - Optional `original_account_id` and `original_date` for cache invalidation
75
+ - Preview functionality for updates
76
+ - Response size management for large batches
77
+
78
+ ### Changed
79
+
80
+ - Tool count: 28 → 30
81
+ - Delta-backed tools use `DeltaFetcher` for cache optimization
82
+ - Write operations support `DeltaCache` and `ServerKnowledgeStore`
83
+
84
+ ### Fixed
85
+
86
+ - Cache invalidation for cross-account transaction updates
87
+ - Response size management for bulk operations
88
+
89
+ ## [0.10.0] - 2025-11-03
90
+
91
+ ### Added
92
+
93
+ - **Reconciliation v2** - Currency plumbing and MoneyValue objects
94
+ - Analyzer/executor emit structured MoneyValue objects
95
+ - Schema `docs/schemas/reconciliation-v2.json` with `csv_format` support
96
+ - 2-3 leg combination match suggestions with insights
97
+ - Handler uses `accounts.getAccount` with fallback
98
+
99
+ ## [0.8.8] - 2025-10-13
100
+
101
+ ### Changed
102
+
103
+ - Renamed package to `@dizzlkheinz/ynab-mcp-server`
104
+
105
+ ## [0.8.7] - 2025-10-13
106
+
107
+ ### Changed
108
+
109
+ - GitHub Actions runs unit tests before publish with provenance enabled
110
+
111
+ ## [0.8.6] - 2025-10-13
112
+
113
+ ### Changed
114
+
115
+ - Npm publish workflow runs unit tests only (no YNAB credentials needed)
116
+
117
+ ## [0.8.5] - 2025-10-13
118
+
119
+ ### Fixed
120
+
121
+ - Export transaction tests parse JSON instead of relying on spacing
122
+
123
+ ## [0.8.4] - 2025-10-13
124
+
125
+ ### Changed
126
+
127
+ - MCPB generation optional via cross-platform Node wrapper (CI compatible)
128
+
129
+ ## [0.8.3] - 2025-10-13
130
+
131
+ ### Changed
132
+
133
+ - CLI launchers: `npx @dizzlkheinz/ynab-mcp-server` starts server immediately
134
+ - GitHub Actions workflow publishes to npm with provenance
135
+
136
+ ## [0.8.2] - 2025-10-13
137
+
138
+ ### Added
139
+
140
+ - `create_receipt_split_transaction` - Converts categorized receipts to YNAB splits
141
+ - Proportional tax distribution
142
+ - Optional dry-run previews
143
+
144
+ ## [0.8.1] - 2025-10-02
145
+
146
+ ### Added
147
+
148
+ - Split transaction support in `create_transaction`
149
+ - Schema validation and response formatting for subtransactions
150
+ - Detailed subtransaction data in responses
151
+
152
+ ## [0.8.0] - 2025-09-28
153
+
154
+ ### Fixed
155
+
156
+ - TypeScript build error in `compareTransactions` (inlined date comparison, non-null assertions)
157
+
158
+ ## [0.7.0] - 2025-09-23
159
+
160
+ ### Added
161
+
162
+ - Automatic amount conversion: milliunits → dollars
163
+ - Utility functions: `milliunitsToAmount`, `amountToMilliunits`, `formatAmount`
164
+
165
+ ### Changed
166
+
167
+ - **BREAKING**: All API responses return amounts in dollars (not milliunits)
168
+ - Account balances, transactions, budgets now use dollar format
169
+
170
+ ### Fixed
171
+
172
+ - Amount confusion: `-1924370` milliunits → `-$1,924.37` (not `-$1,924,370`)
173
+
174
+ ## [0.6.0] - 2025-09-16
175
+
176
+ ### Added
177
+
178
+ - `diagnostic_info` tool consolidates debug tools (80% reduction in clutter)
179
+ - Enhanced bank reconciliation
180
+ - Smart duplicate amount matching with chronological preference
181
+ - Automatic date adjustment for transaction sync
182
+ - Exact balance matching (zero tolerance)
183
+ - Improved date range reporting
184
+
185
+ ### Fixed
186
+
187
+ - Multiple identical transaction handling in reconciliation
package/CLAUDE.md ADDED
@@ -0,0 +1,414 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ This is a Model Context Protocol (MCP) server for YNAB (You Need A Budget) integration, enabling AI assistants to interact with YNAB budgets, accounts, transactions, and categories. The codebase uses TypeScript with a modular architecture introduced in v0.8.x.
8
+
9
+ ## Essential Commands
10
+
11
+ ### Build & Development
12
+
13
+ ```bash
14
+ npm run build # Clean, compile TypeScript, and bundle
15
+ npm run build:no-lint # Build without running linter
16
+ npm run build:prod # Production build with verification
17
+ npm run dev # TypeScript watch mode for development
18
+ npm run type-check # Run TypeScript type checking without emitting files
19
+ ```
20
+
21
+ See [docs/development/BUILD.md](docs/development/BUILD.md) for detailed build information.
22
+
23
+ ### Testing
24
+
25
+ ```bash
26
+ npm test # Run all unit tests + filter results
27
+ npm run test:unit # Unit tests only (fast, mocked dependencies)
28
+ npm run test:integration # Integration tests with mocked YNAB API
29
+ npm run test:e2e # End-to-end tests (requires real YNAB token)
30
+ npm run test:performance # Performance and load tests
31
+ npm run test:coverage # Generate coverage report (requires 80% coverage)
32
+ npm run test:watch # Watch mode for test development
33
+ ```
34
+
35
+ See [docs/guides/TESTING.md](docs/guides/TESTING.md) for comprehensive testing documentation.
36
+
37
+ ### Code Quality
38
+
39
+ ```bash
40
+ npm run lint # Run ESLint on TypeScript files
41
+ npm run lint:fix # Auto-fix ESLint issues
42
+ npm run format # Format code with Prettier
43
+ npm run format:check # Check formatting without modifying files
44
+ ```
45
+
46
+ ### Packaging & Distribution
47
+
48
+ ```bash
49
+ npm run package:mcpb # Build production MCPB package for Claude Desktop
50
+ npm run generate:mcpb # Generate MCPB file from built bundle
51
+ npm run bundle # Bundle with esbuild (development)
52
+ npm run bundle:prod # Bundle with minification (production)
53
+ ```
54
+
55
+ See [docs/guides/DEPLOYMENT.md](docs/guides/DEPLOYMENT.md) for deployment instructions.
56
+
57
+ ## Architecture Overview
58
+
59
+ The v0.8.x architecture is modular and service-oriented:
60
+
61
+ ### Core Server Components (`src/server/`)
62
+
63
+ - **YNABMCPServer.ts** - Main orchestration server, coordinates all services
64
+ - **toolRegistry.ts** - Centralized tool metadata, validation, and execution
65
+ - **cacheManager.ts** - Enhanced caching with LRU eviction, observability, and stale-while-revalidate
66
+ - **budgetResolver.ts** - Consistent budget ID resolution across all tools
67
+ - **errorHandler.ts** - Centralized error handling with dependency injection
68
+ - **config.ts** - Environment validation and server configuration
69
+ - **resources.ts** - MCP resource definitions and handlers
70
+ - **prompts.ts** - MCP prompt definitions and handlers
71
+ - **diagnostics.ts** - System diagnostics and health monitoring
72
+ - **securityMiddleware.ts** - Security validation and wrapper functions
73
+ - **responseFormatter.ts** - JSON response formatting (minification/pretty-print)
74
+ - **rateLimiter.ts** - Rate limiting for YNAB API compliance
75
+ - **requestLogger.ts** - Request/response logging middleware
76
+
77
+ ### Tool Implementation (`src/tools/`)
78
+
79
+ Tools are organized by domain with some using modular sub-directories:
80
+
81
+ - **budgetTools.ts** - Budget listing and retrieval
82
+ - **accountTools.ts** - Account management
83
+ - **transactionTools.ts** - Transaction CRUD operations
84
+ - **categoryTools.ts** - Category management
85
+ - **payeeTools.ts** - Payee listing and retrieval
86
+ - **monthTools.ts** - Monthly budget data
87
+ - **utilityTools.ts** - User info and amount conversion
88
+ - **exportTransactions.ts** - Transaction export to JSON files
89
+ - **reconcileAccount.ts** - Comprehensive account reconciliation
90
+
91
+ **Modular Tool Directories:**
92
+
93
+ - **compareTransactions/** - CSV comparison tools split into parser, matcher, formatter
94
+ - **financialOverview/** - Financial analysis split into schemas, handlers, insights, trends, formatter
95
+
96
+ ### Type Definitions (`src/types/`)
97
+
98
+ - **index.ts** - Shared types, error classes, server configuration
99
+
100
+ ### Utilities (`src/utils/`)
101
+
102
+ - **money.ts** - Amount conversion (dollars ↔ milliunits)
103
+ - **dateUtils.ts** - Date formatting and validation
104
+ - **amountUtils.ts** - Amount validation and utilities
105
+
106
+ ## Key Architecture Patterns
107
+
108
+ ### Tool Registry Pattern
109
+
110
+ All tools register through the centralized `ToolRegistry` for consistent validation, security, and error handling:
111
+
112
+ ```typescript
113
+ registry.register({
114
+ name: 'my_tool',
115
+ description: 'Tool description',
116
+ inputSchema: MyToolSchema, // Zod schema
117
+ handler: adapt(handleMyTool), // Handler function
118
+ defaultArgumentResolver: resolveBudgetId(), // Optional auto-resolution
119
+ });
120
+ ```
121
+
122
+ ### Enhanced Caching (v0.8.x)
123
+
124
+ Use `cacheManager.wrap()` for automatic caching with observability:
125
+
126
+ ```typescript
127
+ return cacheManager.wrap('cache_key', {
128
+ ttl: CACHE_TTLS.ACCOUNTS, // Predefined TTL constants
129
+ staleWhileRevalidate: 120000, // Optional background refresh
130
+ loader: () => expensiveOperation(),
131
+ });
132
+ ```
133
+
134
+ Cache TTL constants are defined in `cacheManager.ts`:
135
+
136
+ - `CACHE_TTLS.BUDGETS` - 1 hour (rarely changes)
137
+ - `CACHE_TTLS.ACCOUNTS` - 30 minutes
138
+ - `CACHE_TTLS.CATEGORIES` - 30 minutes
139
+ - `CACHE_TTLS.SHORT` - 5 minutes (transactions)
140
+ - `CACHE_TTLS.LONG` - 1 hour
141
+
142
+ ### Budget Resolution Pattern
143
+
144
+ Use `BudgetResolver` for consistent budget ID handling:
145
+
146
+ ```typescript
147
+ const resolved = BudgetResolver.resolveBudgetId(providedId, defaultId);
148
+ if (typeof resolved !== 'string') {
149
+ return resolved; // Returns formatted error response
150
+ }
151
+ // Use resolved budget ID
152
+ ```
153
+
154
+ ### Error Handling Pattern
155
+
156
+ Use centralized `ErrorHandler` for consistent error responses:
157
+
158
+ ```typescript
159
+ return ErrorHandler.createErrorResponse('OPERATION_FAILED', 'Detailed error message', {
160
+ operation: 'tool_name',
161
+ additionalContext,
162
+ });
163
+ ```
164
+
165
+ ### Dependency Injection
166
+
167
+ Services use explicit dependency injection for testability:
168
+
169
+ ```typescript
170
+ constructor(
171
+ private cacheManager: CacheManager,
172
+ private errorHandler: ErrorHandler,
173
+ private budgetResolver: BudgetResolver
174
+ ) {}
175
+ ```
176
+
177
+ ## Tool Annotations
178
+
179
+ All tools include MCP-compliant annotations as advisory hints for AI clients. These annotations follow the Model Context Protocol specification and help AI assistants understand tool capabilities, safety characteristics, and expected behavior. The annotation system uses type-safe presets defined in `src/tools/toolCategories.ts` via the `ToolAnnotationPresets` constant.
180
+
181
+ ### Annotation Hints
182
+
183
+ Each tool includes the following annotation fields:
184
+
185
+ - **`title`** - Human-readable tool name for UI display (e.g., "YNAB: List Budgets")
186
+ - **`readOnlyHint`** - Whether tool only reads data without modifications (boolean)
187
+ - **`destructiveHint`** - Whether tool performs irreversible operations like deletion (boolean)
188
+ - **`idempotentHint`** - Whether repeated identical calls are safe and produce same result (boolean)
189
+ - **`openWorldHint`** - Whether tool calls external APIs (YNAB API) vs local operations (boolean)
190
+
191
+ ### Tool Categories
192
+
193
+ The system defines 5 preset annotation patterns in `src/tools/toolCategories.ts`:
194
+
195
+ - **READ_ONLY_EXTERNAL** - Read-only tools querying YNAB API
196
+ - Examples: `list_budgets`, `get_account`, `list_transactions`
197
+ - Characteristics: Read-only, idempotent, external API calls
198
+
199
+ - **WRITE_EXTERNAL_CREATE** - Tools creating new resources, non-idempotent
200
+ - Examples: `create_transaction`, `create_account`
201
+ - Characteristics: Write operations, non-idempotent (repeated calls create duplicates), external API
202
+
203
+ - **WRITE_EXTERNAL_UPDATE** - Tools updating existing resources, idempotent
204
+ - Examples: `update_transaction`, `set_default_budget`, `reconcile_account`
205
+ - Characteristics: Write operations, idempotent (repeated calls produce same result), external API
206
+
207
+ - **WRITE_EXTERNAL_DELETE** - Destructive tools deleting resources
208
+ - Example: `delete_transaction` ⚠️
209
+ - Characteristics: Write operations, destructive, idempotent, external API
210
+
211
+ - **UTILITY_LOCAL** - Local utility tools without external API calls
212
+ - Examples: `convert_amount`, `clear_cache`, `diagnostic_info`
213
+ - Characteristics: Local operations, no external API dependencies
214
+
215
+ ### Complete Tool Classification
216
+
217
+ All 30 tools are classified into the following categories:
218
+
219
+ **Read-Only External (15 tools):**
220
+
221
+ - `list_budgets`, `get_budget`, `list_accounts`, `get_account`, `list_transactions`, `export_transactions`, `compare_transactions`, `get_transaction`, `list_categories`, `get_category`, `list_payees`, `get_payee`, `get_month`, `list_months`, `get_user`
222
+
223
+ **Write External - Create (4 tools):**
224
+
225
+ - `create_account`, `create_transaction`, `create_transactions`, `create_receipt_split_transaction`
226
+
227
+ **Write External - Update (5 tools):**
228
+
229
+ - `set_default_budget`, `reconcile_account`, `update_transaction`, `update_transactions`, `update_category`
230
+
231
+ **Write External - Delete (1 tool):**
232
+
233
+ - `delete_transaction` ⚠️
234
+
235
+ **Utility Local (5 tools):**
236
+
237
+ - `get_default_budget`, `convert_amount`, `diagnostic_info`, `clear_cache`, `set_output_format`
238
+
239
+ ### Expected Benefits
240
+
241
+ The tool annotation system provides several advantages:
242
+
243
+ - **Enhanced AI Client UX** - AI assistants like Claude can show warnings/confirmations for destructive tools
244
+ - **Safer Workflows** - AI understands which tools are dangerous and can prompt for confirmation before execution
245
+ - **Better Tool Discovery** - Annotations help AI clients understand tool capabilities and constraints
246
+ - **Future-Proof Integration** - As more MCP clients emerge, they'll respect these standard annotations
247
+ - **Self-Documenting API** - Metadata provides clear documentation of tool behavior without reading implementation
248
+ - **Zero Breaking Changes** - Fully backward compatible, annotations are advisory only and don't affect tool execution
249
+
250
+ ### Usage Example
251
+
252
+ Tool annotations are applied during tool registration using preset patterns:
253
+
254
+ ```typescript
255
+ import { ToolAnnotationPresets } from '../tools/toolCategories.js';
256
+
257
+ register({
258
+ name: 'delete_transaction',
259
+ description: 'Delete a transaction',
260
+ inputSchema: DeleteTransactionSchema,
261
+ handler: adaptWrite(handleDeleteTransaction),
262
+ metadata: {
263
+ annotations: {
264
+ ...ToolAnnotationPresets.WRITE_EXTERNAL_DELETE,
265
+ title: 'YNAB: Delete Transaction',
266
+ },
267
+ },
268
+ });
269
+ ```
270
+
271
+ ## Amount Handling (Critical!)
272
+
273
+ YNAB uses **milliunits** internally (1 dollar = 1000 milliunits):
274
+
275
+ ```typescript
276
+ // Converting amounts
277
+ import { milliunitsToAmount, amountToMilliunits } from './utils/money.js';
278
+
279
+ const dollars = milliunitsToAmount(25500); // 25.50
280
+ const milliunits = amountToMilliunits(25.5); // 25500
281
+
282
+ // ALL API calls require milliunits
283
+ await createTransaction({
284
+ amount: amountToMilliunits(userInputDollars), // Convert first!
285
+ // ...
286
+ });
287
+ ```
288
+
289
+ ## Testing Guidelines
290
+
291
+ ### Test File Naming
292
+
293
+ - `*.test.ts` - Unit tests
294
+ - `*.integration.test.ts` - Integration tests with mocked API
295
+ - `*.e2e.test.ts` - End-to-end tests with real API (requires YNAB token)
296
+
297
+ ### Test Organization
298
+
299
+ - Tests live in `__tests__/` directories next to source files
300
+ - Use `src/__tests__/testUtils.ts` for shared test utilities
301
+ - Use `src/__tests__/setup.ts` for global test setup
302
+
303
+ ### Coverage Requirements
304
+
305
+ Minimum 80% coverage for all metrics (branches, functions, lines, statements)
306
+
307
+ ### Running Specific Tests
308
+
309
+ ```bash
310
+ vitest run src/tools/__tests__/budgetTools.test.ts # Run single test file
311
+ vitest run --project unit # Run only unit tests
312
+ vitest run --project integration # Run only integration tests
313
+ ```
314
+
315
+ ## Environment Variables
316
+
317
+ Required:
318
+
319
+ - `YNAB_ACCESS_TOKEN` - YNAB Personal Access Token
320
+
321
+ Optional (Caching):
322
+
323
+ - `YNAB_MCP_CACHE_MAX_ENTRIES` (default: 1000)
324
+ - `YNAB_MCP_CACHE_DEFAULT_TTL_MS` (default: 1800000 / 30 min)
325
+ - `YNAB_MCP_CACHE_STALE_MS` (default: 120000 / 2 min)
326
+
327
+ Optional (Output):
328
+
329
+ - `YNAB_MCP_MINIFY_OUTPUT` (default: true) - Minify JSON responses
330
+ - `YNAB_MCP_PRETTY_SPACES` (default: 2) - Spaces for pretty-print when not minified
331
+
332
+ Optional (Export):
333
+
334
+ - `YNAB_EXPORT_PATH` - Directory for exported files (default: ~/Downloads or ~/Documents)
335
+
336
+ Optional (Testing):
337
+
338
+ - `TEST_BUDGET_ID` - Specific budget for E2E tests
339
+ - `TEST_ACCOUNT_ID` - Specific account for E2E tests
340
+ - `SKIP_E2E_TESTS` - Skip E2E tests if set
341
+
342
+ ## TypeScript Configuration
343
+
344
+ Strict mode enabled with extensive safety checks:
345
+
346
+ - `strict: true` - All strict mode flags enabled
347
+ - `noImplicitAny`, `noImplicitReturns`, `noImplicitThis` - Prevent implicit any usage
348
+ - `noUnusedLocals`, `noUnusedParameters` - Prevent unused variables
349
+ - `exactOptionalPropertyTypes` - Stricter optional property handling
350
+ - `noUncheckedIndexedAccess` - Safer array/object indexing
351
+ - `allowUnreachableCode: false` - Error on unreachable code
352
+
353
+ ## Code Style & Linting
354
+
355
+ - **ESLint**: Enforced on all TypeScript files
356
+ - **Prettier**: Auto-formatting for consistent style
357
+ - **Import Style**: Use `.js` extensions in imports (ES modules)
358
+ - **Naming**: camelCase for functions/variables, PascalCase for classes/types
359
+
360
+ ## Common Development Tasks
361
+
362
+ ### Adding a New Tool
363
+
364
+ 1. Create Zod schema in appropriate tool file (e.g., `src/tools/myTools.ts`)
365
+ 2. Implement handler function following existing patterns
366
+ 3. Register tool in `YNABMCPServer.ts` using `ToolRegistry`
367
+ 4. Add unit tests in `src/tools/__tests__/myTools.test.ts`
368
+ 5. Add integration tests in `src/tools/__tests__/myTools.integration.test.ts`
369
+ 6. Update API documentation in `docs/API.md`
370
+
371
+ ### Modifying Cache Behavior
372
+
373
+ Cache configuration is in `src/server/cacheManager.ts`. Adjust TTLs in the `CACHE_TTLS` constant or modify cache wrapper logic.
374
+
375
+ ### Adding Service Modules
376
+
377
+ Service modules (like diagnostics, resources, prompts) follow a pattern:
378
+
379
+ 1. Create module in `src/server/`
380
+ 2. Implement with dependency injection pattern
381
+ 3. Register in `YNABMCPServer` constructor
382
+ 4. Add tests in `src/server/__tests__/`
383
+
384
+ ## MCPB Packaging for Claude Desktop
385
+
386
+ The project builds a `.mcpb` file (MCP extension for Claude Desktop):
387
+
388
+ ```bash
389
+ npm run package:mcpb
390
+ ```
391
+
392
+ Output: `dist/ynab-mcp-server-<version>.mcpb`
393
+
394
+ The MCPB includes:
395
+
396
+ - Bundled Node.js code (single file, no node_modules)
397
+ - Manifest with extension metadata
398
+ - Environment variable configuration schema
399
+
400
+ ## Git & Version Control
401
+
402
+ - **Main branch**: `master`
403
+ - **Versioning**: Semantic versioning (currently 0.x.y - pre-1.0 API)
404
+ - **Commit style**: Conventional commits encouraged (feat:, fix:, chore:, etc.)
405
+
406
+ ## Important Notes
407
+
408
+ - **Backward Compatibility**: v0.8.x maintains 100% API compatibility with v0.7.x
409
+ - **Cache Invalidation**: Write operations (create, update, delete) should invalidate related caches
410
+ - **Date Format**: Always use ISO format `YYYY-MM-DD` for dates
411
+ - **Budget ID Resolution**: Most tools auto-resolve budget_id from default budget if not provided
412
+ - **Error Responses**: All errors return consistent JSON format via `ErrorHandler`
413
+ - **Security**: Input validation via Zod schemas, security middleware wraps all tool executions
414
+ - **Rate Limiting**: YNAB API has rate limits - use caching aggressively