@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
@@ -0,0 +1,591 @@
1
+ # YNAB MCP Server - Testing Guide
2
+
3
+ Comprehensive testing guide covering automated tests, manual test scenarios, and quality assurance processes.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Overview](#overview)
8
+ - [Test Structure](#test-structure)
9
+ - [Running Tests](#running-tests)
10
+ - [Environment Setup](#environment-setup)
11
+ - [Test Types](#test-types)
12
+ - [Coverage Requirements](#coverage-requirements)
13
+ - [Manual Test Scenarios](#manual-test-scenarios)
14
+ - [Test Data Management](#test-data-management)
15
+ - [Common Issues](#common-issues)
16
+
17
+ ## Overview
18
+
19
+ The YNAB MCP Server includes both automated and manual testing capabilities:
20
+
21
+ **Automated Tests**:
22
+ 1. **Unit Tests** - Test individual components in isolation
23
+ 2. **Integration Tests** - Test component interactions with mocked dependencies
24
+ 3. **End-to-End Tests** - Test complete workflows with real YNAB API (optional)
25
+ 4. **Performance Tests** - Test response times, memory usage, and load handling
26
+
27
+ **Manual Testing**:
28
+ - Comprehensive test scenarios for Claude Desktop integration
29
+ - Feature verification workflows
30
+ - Performance and reliability validation
31
+
32
+ ## Test Structure
33
+
34
+ ```
35
+ src/
36
+ ├── __tests__/ # Global test utilities and E2E tests
37
+ │ ├── setup.ts # Test environment setup
38
+ │ ├── testUtils.ts # Shared test utilities
39
+ │ ├── testRunner.ts # Comprehensive test runner
40
+ │ ├── workflows.e2e.test.ts # End-to-end workflow tests
41
+ │ ├── comprehensive.integration.test.ts # Integration tests
42
+ │ └── performance.test.ts # Performance and load tests
43
+ ├── server/__tests__/ # Server component tests
44
+ ├── tools/__tests__/ # Tool-specific tests
45
+ └── types/__tests__/ # Type definition tests
46
+ ```
47
+
48
+ ## Running Tests
49
+
50
+ ### Quick Test Commands
51
+
52
+ ```bash
53
+ # Run all tests with coverage
54
+ npm test
55
+
56
+ # Run specific test types
57
+ npm run test:unit # Unit tests only (fast, mocked)
58
+ npm run test:integration # Integration tests (mocked API)
59
+ npm run test:e2e # End-to-end tests (real API)
60
+ npm run test:performance # Performance tests
61
+
62
+ # Generate coverage report
63
+ npm run test:coverage
64
+
65
+ # Run comprehensive test suite with detailed reporting
66
+ npm run test:comprehensive
67
+
68
+ # Watch mode for test development
69
+ npm run test:watch
70
+ ```
71
+
72
+ ## Environment Setup
73
+
74
+ ### For Unit and Integration Tests (using mocks):
75
+ ```bash
76
+ # Optional - will use mock token if not provided
77
+ YNAB_ACCESS_TOKEN=your_test_token
78
+ ```
79
+
80
+ ### For End-to-End Tests (using real YNAB API):
81
+ ```bash
82
+ # Required for E2E tests
83
+ YNAB_ACCESS_TOKEN=your_real_ynab_personal_access_token
84
+
85
+ # Optional - specify test budget/account IDs
86
+ TEST_BUDGET_ID=your_test_budget_id
87
+ TEST_ACCOUNT_ID=your_test_account_id
88
+
89
+ # Optional - skip E2E tests
90
+ SKIP_E2E_TESTS=true
91
+ ```
92
+
93
+ ## Test Types
94
+
95
+ ### Unit Tests
96
+ - Test individual functions and classes in isolation
97
+ - Use mocked dependencies
98
+ - Fast execution (< 10 seconds)
99
+ - No external API calls
100
+
101
+ ### Integration Tests
102
+ - Test component interactions
103
+ - Use mocked YNAB API responses
104
+ - Validate complete tool workflows
105
+ - Medium execution time (10-30 seconds)
106
+
107
+ ### End-to-End Tests
108
+ - Test against real YNAB API
109
+ - Validate complete user workflows
110
+ - Slower execution (30-60 seconds)
111
+ - **Warning**: Creates real data in your test budget
112
+
113
+ ### Performance Tests
114
+ - Test response times and memory usage
115
+ - Validate performance under load
116
+ - Test error handling performance
117
+ - Medium execution time (15-30 seconds)
118
+
119
+ ## Coverage Requirements
120
+
121
+ The test suite enforces minimum coverage thresholds:
122
+
123
+ - **Lines**: 80%
124
+ - **Functions**: 80%
125
+ - **Branches**: 80%
126
+ - **Statements**: 80%
127
+
128
+ ---
129
+
130
+ # Manual Test Scenarios
131
+
132
+ Comprehensive test scenarios for manually validating the YNAB MCP server with Claude Desktop.
133
+
134
+ ## 1. Setup Verification Tests
135
+
136
+ ### 1.1 Server Startup and Connection
137
+
138
+ **Objective**: Verify the server starts successfully and Claude Desktop connects.
139
+
140
+ **Steps**:
141
+ 1. Build the project: `npm run build`
142
+ 2. Configure Claude Desktop with MCP server settings
143
+ 3. Restart Claude Desktop
144
+ 4. Check MCP servers list in Claude Desktop
145
+
146
+ **Expected Results**:
147
+ - Build completes without errors
148
+ - Claude Desktop shows "ynab-mcp-server" in connected servers
149
+ - No connection errors in Claude Desktop logs
150
+
151
+ **Success Criteria**: Server appears as connected in Claude Desktop interface
152
+
153
+ ### 1.2 YNAB Token Authentication
154
+
155
+ **Objective**: Verify YNAB Personal Access Token is valid and working.
156
+
157
+ **Steps**:
158
+ 1. Ask Claude: "Can you run the diagnostic_info tool?"
159
+ 2. Check the returned authentication status
160
+ 3. Verify user information is retrieved
161
+
162
+ **Expected Results**:
163
+ - Diagnostic info returns successfully
164
+ - Authentication status shows "authenticated: true"
165
+ - User information includes YNAB user details
166
+
167
+ **Success Criteria**: No authentication errors, user data present
168
+
169
+ ### 1.3 System Status Verification
170
+
171
+ **Objective**: Verify all server components are initialized properly.
172
+
173
+ **Steps**:
174
+ 1. Run diagnostic_info tool
175
+ 2. Review system configuration
176
+ 3. Check cache initialization
177
+ 4. Verify environment variables
178
+
179
+ **Expected Results**:
180
+ - All services report healthy status
181
+ - Cache is initialized with correct settings
182
+ - Environment variables loaded properly
183
+ - Tool registry shows all tools
184
+
185
+ **Success Criteria**: All system components report healthy status
186
+
187
+ ## 2. Basic Functionality Tests
188
+
189
+ ### 2.1 Budget Management
190
+
191
+ **Objective**: Test basic budget listing and selection functionality.
192
+
193
+ **Steps**:
194
+ 1. Ask Claude: "List my YNAB budgets"
195
+ 2. Note the budget names returned
196
+ 3. Ask Claude: "Set my default budget to [budget_name]"
197
+ 4. Ask Claude: "What is my current default budget?"
198
+
199
+ **Expected Results**:
200
+ - Budget list returns user's budgets with names and IDs
201
+ - Default budget is set successfully
202
+ - Cache warming is triggered automatically
203
+ - Default budget query returns the selected budget
204
+
205
+ **Success Criteria**: Budget operations work without errors, cache warming occurs
206
+
207
+ ### 2.2 Account Listing
208
+
209
+ **Objective**: Test account retrieval and caching behavior.
210
+
211
+ **Steps**:
212
+ 1. Ask Claude: "List my accounts" (first time)
213
+ 2. Note response time
214
+ 3. Ask Claude: "List my accounts" (second time)
215
+ 4. Compare response times
216
+ 5. Check diagnostic_info for cache hits
217
+
218
+ **Expected Results**:
219
+ - First request fetches from YNAB API
220
+ - Second request is faster (cache hit)
221
+ - Both requests return identical account data
222
+ - Cache metrics show hit count increase
223
+
224
+ **Success Criteria**: Caching improves response time, data consistency maintained
225
+
226
+ ### 2.3 Transaction Retrieval
227
+
228
+ **Objective**: Test transaction listing with various filters.
229
+
230
+ **Steps**:
231
+ 1. Ask Claude: "Show me recent transactions"
232
+ 2. Ask Claude: "Show me transactions from a specific account"
233
+ 3. Ask Claude: "Show me transactions from the last 30 days"
234
+ 4. Ask Claude: "Show me uncategorized transactions"
235
+
236
+ **Expected Results**:
237
+ - All transaction queries return appropriate data
238
+ - Filters work correctly (account, date range, categorization status)
239
+ - Response times are reasonable
240
+ - Data format is consistent
241
+
242
+ **Success Criteria**: All transaction filters work correctly, consistent formatting
243
+
244
+ ## 3. Enhanced Caching Tests
245
+
246
+ ### 3.1 Cache Warming Verification
247
+
248
+ **Objective**: Verify cache warming works after setting default budget.
249
+
250
+ **Steps**:
251
+ 1. Clear cache (restart server or use diagnostic tools)
252
+ 2. Set default budget
253
+ 3. Check cache metrics immediately after
254
+ 4. Verify accounts, categories, and payees are cached
255
+
256
+ **Expected Results**:
257
+ - Cache warming triggers automatically
258
+ - Accounts, categories, and payees are pre-loaded
259
+ - Subsequent requests for these data types are fast
260
+ - Cache hit rate improves dramatically
261
+
262
+ **Success Criteria**: Cache warming pre-loads commonly used data
263
+
264
+ ### 3.2 LRU Eviction Testing
265
+
266
+ **Objective**: Test cache eviction when limits are reached.
267
+
268
+ **Steps**:
269
+ 1. Set cache limit to low value (via environment variables)
270
+ 2. Request data for multiple different filters
271
+ 3. Check cache metrics for evictions
272
+ 4. Verify least recently used items are evicted first
273
+
274
+ **Expected Results**:
275
+ - Cache respects maximum entry limits
276
+ - Older entries are evicted as new ones are added
277
+ - Most frequently accessed data remains cached
278
+ - No memory leaks occur
279
+
280
+ **Success Criteria**: LRU eviction maintains cache within limits
281
+
282
+ ### 3.3 Stale-While-Revalidate Testing
283
+
284
+ **Objective**: Test stale data serving while refreshing in background.
285
+
286
+ **Steps**:
287
+ 1. Cache some data and wait for it to become stale
288
+ 2. Request the stale data
289
+ 3. Verify immediate response with stale data
290
+ 4. Confirm background refresh occurs
291
+
292
+ **Expected Results**:
293
+ - Stale data is served immediately for fast response
294
+ - Background refresh updates the cache
295
+ - User gets immediate response, cache stays fresh
296
+ - No blocking on refresh operations
297
+
298
+ **Success Criteria**: Stale-while-revalidate provides fast responses while maintaining freshness
299
+
300
+ ## 4. Tool Registry Tests
301
+
302
+ ### 4.1 All Tools Accessibility
303
+
304
+ **Objective**: Verify all tools are accessible through Claude Desktop.
305
+
306
+ **Steps**:
307
+ 1. Ask Claude to list available YNAB tools
308
+ 2. Test a selection of tools from different categories:
309
+ - Budget management (list_budgets, set_default_budget)
310
+ - Account management (list_accounts, get_account)
311
+ - Transaction management (list_transactions, create_transaction)
312
+ - Monthly data analysis (get_month, list_months)
313
+ - Utility tools (diagnostic_info, convert_amount)
314
+
315
+ **Expected Results**:
316
+ - All tools are accessible and respond correctly
317
+ - Parameter validation works consistently
318
+ - Error handling is uniform across tools
319
+ - Tool descriptions are helpful and accurate
320
+
321
+ **Success Criteria**: All tools accessible with consistent behavior
322
+
323
+ ### 4.2 Parameter Validation
324
+
325
+ **Objective**: Test parameter validation across different tools.
326
+
327
+ **Steps**:
328
+ 1. Try tools with missing required parameters
329
+ 2. Try tools with invalid parameter values
330
+ 3. Try tools with correct parameters
331
+ 4. Test optional parameter handling
332
+
333
+ **Expected Results**:
334
+ - Missing required parameters result in clear error messages
335
+ - Invalid parameters are rejected with helpful guidance
336
+ - Valid parameters are processed correctly
337
+ - Optional parameters work when provided or omitted
338
+
339
+ **Success Criteria**: Consistent parameter validation with helpful error messages
340
+
341
+ ## 5. Transaction Management Tests
342
+
343
+ ### 5.1 Transaction Creation
344
+
345
+ **Objective**: Test creating new transactions.
346
+
347
+ **Steps**:
348
+ 1. Ask Claude: "Create a test transaction for $10.00 groceries"
349
+ 2. Verify transaction appears in YNAB
350
+ 3. Check transaction details
351
+ 4. Clean up test transaction
352
+
353
+ **Expected Results**:
354
+ - Transaction is created successfully
355
+ - All details are recorded correctly
356
+ - Transaction appears in YNAB interface
357
+ - Appropriate account and category are used
358
+
359
+ **Success Criteria**: Transaction creation works with accurate data
360
+
361
+ ### 5.2 Transaction Export
362
+
363
+ **Objective**: Test transaction export functionality.
364
+
365
+ **Steps**:
366
+ 1. Ask Claude: "Export my transactions to a file"
367
+ 2. Check export directory for file
368
+ 3. Review exported data format
369
+ 4. Verify data completeness
370
+
371
+ **Expected Results**:
372
+ - Export file is created in correct directory
373
+ - File contains accurate transaction data
374
+ - Format is readable and well-structured
375
+ - All requested transactions are included
376
+
377
+ **Success Criteria**: Export creates complete, accurate files
378
+
379
+ ### 5.3 CSV Comparison
380
+
381
+ **Objective**: Test CSV comparison functionality.
382
+
383
+ **Steps**:
384
+ 1. Use a sample CSV file
385
+ 2. Ask Claude: "Compare this CSV with my YNAB transactions"
386
+ 3. Review matching results
387
+ 4. Check unmatched transaction identification
388
+
389
+ **Expected Results**:
390
+ - CSV parsing works correctly
391
+ - Transaction matching algorithms function properly
392
+ - Unmatched transactions are identified
393
+ - Clear reporting of comparison results
394
+
395
+ **Success Criteria**: CSV comparison accurately identifies matches and discrepancies
396
+
397
+ ### 5.4 Account Reconciliation
398
+
399
+ **Objective**: Test comprehensive account reconciliation.
400
+
401
+ **Steps**:
402
+ 1. Prepare CSV export from your bank
403
+ 2. Ask Claude: "Reconcile my checking account with this CSV"
404
+ 3. Review matching analysis
405
+ 4. Check balance verification
406
+ 5. Review recommendations
407
+
408
+ **Expected Results**:
409
+ - Smart duplicate matching works correctly
410
+ - Automatic date adjustment handles timezone issues
411
+ - Balance matching provides exact reconciliation
412
+ - Comprehensive reporting shows all details
413
+
414
+ **Success Criteria**: Reconciliation accurately matches transactions and balances
415
+
416
+ ## 6. Error Handling Tests
417
+
418
+ ### 6.1 Missing Budget ID Scenarios
419
+
420
+ **Objective**: Test behavior when no default budget is set.
421
+
422
+ **Steps**:
423
+ 1. Clear default budget setting
424
+ 2. Try tools that require budget context
425
+ 3. Check error messages
426
+ 4. Verify recovery guidance
427
+
428
+ **Expected Results**:
429
+ - Clear error messages about missing budget
430
+ - Helpful guidance on setting default budget
431
+ - No system crashes or unclear errors
432
+ - Easy recovery path provided
433
+
434
+ **Success Criteria**: Clear error messages with actionable recovery steps
435
+
436
+ ### 6.2 Invalid Parameter Testing
437
+
438
+ **Objective**: Test handling of invalid parameters.
439
+
440
+ **Steps**:
441
+ 1. Try tools with malformed parameters
442
+ 2. Test with out-of-range values
443
+ 3. Try with incorrect data types
444
+ 4. Test with missing required fields
445
+
446
+ **Expected Results**:
447
+ - Validation catches all invalid parameters
448
+ - Error messages clearly identify the problem
449
+ - Suggestions for correct parameter format
450
+ - No system instability from bad inputs
451
+
452
+ **Success Criteria**: Robust parameter validation with helpful error messages
453
+
454
+ ### 6.3 YNAB API Error Scenarios
455
+
456
+ **Objective**: Test handling of YNAB API errors.
457
+
458
+ **Steps**:
459
+ 1. Test with expired token (if possible)
460
+ 2. Test during YNAB API maintenance
461
+ 3. Test with network connectivity issues
462
+ 4. Test with rate limiting scenarios
463
+
464
+ **Expected Results**:
465
+ - Graceful handling of API errors
466
+ - Clear error messages about external issues
467
+ - No server crashes or hangs
468
+ - Appropriate retry mechanisms
469
+
470
+ **Success Criteria**: Robust error handling for external API issues
471
+
472
+ ## 7. Performance Tests
473
+
474
+ ### 7.1 Response Time Verification
475
+
476
+ **Objective**: Verify acceptable response times with and without caching.
477
+
478
+ **Steps**:
479
+ 1. Measure response times for fresh requests
480
+ 2. Measure response times for cached requests
481
+ 3. Compare performance improvements
482
+ 4. Test with large data sets
483
+
484
+ **Expected Results**:
485
+ - Fresh requests complete within reasonable time (< 5 seconds)
486
+ - Cached requests are significantly faster (< 1 second)
487
+ - Large data sets are handled efficiently
488
+ - No performance degradation over time
489
+
490
+ **Success Criteria**: Response times meet performance expectations
491
+
492
+ ### 7.2 Concurrent Request Handling
493
+
494
+ **Objective**: Test server behavior under concurrent load.
495
+
496
+ **Steps**:
497
+ 1. Make multiple simultaneous requests
498
+ 2. Check for race conditions
499
+ 3. Verify data consistency
500
+ 4. Monitor resource usage
501
+
502
+ **Expected Results**:
503
+ - Concurrent requests handled properly
504
+ - No race conditions in cache or data
505
+ - Consistent results across all requests
506
+ - Reasonable resource usage
507
+
508
+ **Success Criteria**: Stable performance under concurrent load
509
+
510
+ ### 7.3 Memory Usage Monitoring
511
+
512
+ **Objective**: Verify memory usage remains stable during extended use.
513
+
514
+ **Steps**:
515
+ 1. Monitor baseline memory usage
516
+ 2. Perform extended testing session
517
+ 3. Check for memory leaks
518
+ 4. Verify cache size limits are respected
519
+
520
+ **Expected Results**:
521
+ - Memory usage remains stable over time
522
+ - No significant memory leaks detected
523
+ - Cache eviction prevents unbounded growth
524
+ - Resource usage stays within acceptable limits
525
+
526
+ **Success Criteria**: Stable memory usage without leaks
527
+
528
+ ## Test Data Management
529
+
530
+ ### Mock Data
531
+ - Unit and integration tests use mock data
532
+ - Mock responses are defined in test files
533
+ - No real API calls or data modification
534
+
535
+ ### E2E Test Data
536
+ - E2E tests create real data in your YNAB budget
537
+ - Test transactions are automatically cleaned up
538
+ - Test accounts cannot be deleted via API (manual cleanup required)
539
+ - Use a dedicated test budget to avoid affecting real data
540
+
541
+ ## Common Issues and Solutions
542
+
543
+ ### E2E Tests Skipped
544
+ ```
545
+ ⏭️ E2E tests skipped (no API key or SKIP_E2E_TESTS=true)
546
+ ```
547
+ **Solution**: Set `YNAB_ACCESS_TOKEN` environment variable
548
+
549
+ ### Coverage Below Threshold
550
+ ```
551
+ ⚠️ Coverage below target (<80%)
552
+ ```
553
+ **Solution**: Add more tests or remove untestable code from coverage
554
+
555
+ ### Performance Tests Failing
556
+ ```
557
+ ❌ Performance assertion failed: 1500ms > 1000ms
558
+ ```
559
+ **Solution**: Optimize code or adjust performance thresholds
560
+
561
+ ### Connection Errors in Claude Desktop
562
+ **Solution**:
563
+ 1. Verify Node.js version (18+)
564
+ 2. Check build completed successfully
565
+ 3. Verify MCP server configuration
566
+ 4. Restart Claude Desktop completely
567
+
568
+ ## Test Execution Guidelines
569
+
570
+ 1. **Prerequisites**: Ensure .env file is configured with valid YNAB token
571
+ 2. **Environment**: Use development configuration for detailed logging
572
+ 3. **Documentation**: Record results for each test scenario
573
+ 4. **Issues**: Log any problems with steps to reproduce
574
+ 5. **Performance**: Record timing measurements for performance tests
575
+ 6. **Cleanup**: Clean up test data after testing (transactions, exports)
576
+
577
+ ## Success Criteria Summary
578
+
579
+ - ✅ All basic functionality works correctly
580
+ - ✅ Enhanced caching provides performance improvements
581
+ - ✅ Error handling is robust and helpful
582
+ - ✅ All tools are accessible and functional
583
+ - ✅ Transaction management works reliably
584
+ - ✅ Performance meets or exceeds expectations
585
+ - ✅ Integration with Claude Desktop is seamless
586
+ - ✅ Security and reliability standards are met
587
+
588
+ ---
589
+
590
+ For automated testing implementation details, see the source code in `src/__tests__/`.
591
+ For additional testing checklists, see `../development/TESTING_CHECKLIST.md`.
@@ -0,0 +1,83 @@
1
+ ---
2
+ title: 'Automated Reconciliation Flow'
3
+ status: 'active'
4
+ last_updated: '2025-11-12'
5
+ owners:
6
+ - '@ynab-mcpb/tooling'
7
+ related_docs:
8
+ - reference/API.md#reconcile_account
9
+ - reference/TOOLS.md#reconcile_account
10
+ - guides/TESTING.md#comprehensive-account-reconciliation
11
+ - reference/TROUBLESHOOTING.md#reconciliation
12
+ ---
13
+
14
+ # Automated Reconciliation Flow
15
+
16
+ Deterministic playbook for reconciling a YNAB account with a bank statement inside the MCP host. The flow runs newest → oldest, stops the moment balances align, and emits both a narrative and machine-readable payload for assistants and downstream automation.
17
+
18
+ ## Prerequisites & Environment
19
+ - Provide a valid `.env` cloned from `.env.example`, including `YNAB_ACCESS_TOKEN`, cache knobs, and any per-budget rate limits. Run `npm run validate-env` whenever secrets change.
20
+ - Install dependencies with `npm install`, keep `node` ≥ 20, and prefer `npm run dev` while editing to recompile TypeScript incrementally.
21
+ - Reconciliation tools assume access to CSV statements on disk (`csv_file_path`) or piped data (`csv_data`). Files should stay inside the workspace to avoid sandbox denials.
22
+ - Vitest snapshot directories (`test-results/`) must be writable; dry-run audits reference these to highlight regression diffs.
23
+
24
+ ## Schema & Data Contracts
25
+ - **Input contract** – `ReconcileAccountSchema` (`src/tools/reconciliation/index.ts`) enforces budget/account ids, CSV source, statement balance, and guard rails like date/amount tolerances, automation toggles, and confidence thresholds. Every entry path calls `ReconcileAccountSchema.parse(...)` before touching the YNAB API.
26
+ - **CSV normalization** – `autoDetectCSVFormat` plus `extractDateRangeFromCSV` deduce header presence, delimiter, debit/credit pairs, and generate the reconciliation window (min/max ± 5 days buffer).
27
+ - **Structured output** – `buildReconciliationPayload` + `responseFormatter` return `version: '2.0'` JSON (see `docs/schemas/reconciliation-v2.json`) alongside the human narrative. This payload captures matches, actions, balance deltas, and flags like `audit_trail_complete`.
28
+ - **Audit snapshot** – `buildBalanceReconciliation` records `precision_calculations`, `discrepancy_analysis`, and `final_verification` booleans, ensuring downstream tooling can prove reconciliation outcomes without re-querying YNAB.
29
+
30
+ ## Configuration Knobs (Schema Excerpts)
31
+ - Matching tolerances: `date_tolerance_days` (0-7, default 5) and `amount_tolerance_cents` (default 1¢) gate candidate searches; `confidence_threshold` (0.8) controls risk when auto-clearing.
32
+ - Automation toggles: `auto_create_transactions`, `auto_update_cleared_status`, `auto_adjust_dates`, `auto_unclear_missing`, `dry_run`, and `balance_verification_mode` (`ANALYSIS_ONLY`, `GUIDED_RESOLUTION`, `AUTO_RESOLVE`).
33
+ - CSV format overrides: `csv_format.{date_column, amount_column, debit_column, credit_column, date_format, has_header, delimiter}` keep unusual exports usable without retooling the parser.
34
+ - Safety rails: `require_exact_match` and `max_resolution_attempts` prevent runaway loops; `include_structured_data` controls whether assistants receive the payload blob.
35
+
36
+ ## Logging & Auditability
37
+ - Every mutation funnels through `responseFormatter` with `execution.summary` stats plus `matches_found`, `transactions_created`, and `transactions_updated` counts for dashboards.
38
+ - `buildBalanceReconciliation` emits `audit_trail_complete`, balance math, and likely-cause hints whenever a discrepancy persists.
39
+ - `executor.ts` annotates each action with reasons (e.g., "marked as cleared, date adjusted"), giving a linear log for SOC review.
40
+ - Tests under `src/tools/reconciliation/__tests__/` assert both narrative text and structured payloads; failures drop sanitized artifacts into `test-results/` for diffing.
41
+
42
+ ## Numbered Steps, Rationale, and Validation Hooks
43
+ ### Step 1 — Input validation & window detection
44
+ - **Rationale**: Prevents wasting API calls on malformed CSVs and ensures the comparison window brackets all relevant transactions.
45
+ - **What happens**: Parse CSV metadata, normalize amounts/dates, derive min/max window ±5 days, and hydrate default tolerances through `ReconcileAccountSchema.parse(...)`. Liability accounts invert statement balance sign for consistent delta math.
46
+ - **Validation**: Unit coverage in `src/tools/reconciliation/__tests__/parser.*` plus `npm run validate-env` to guarantee credentials before file I/O occurs.
47
+ - **Open questions**: Should we persist detected CSV format to `test-exports/` for reuse, or is in-memory derivation sufficient for multi-pass sessions?
48
+
49
+ ### Step 2 — Phase 1 statement pass (newest → oldest)
50
+ - **Rationale**: Mirroring experienced YNAB workflows short-circuits once balances match, avoiding needless mutation of ancient rows.
51
+ - **What happens**: Sort bank rows descending, compute `cleared_delta = ynab.cleared - statement_balance`, and for each row find best YNAB candidate within tolerances + payee similarity. If confidence ≥ `auto_match_threshold` and automation toggles allow, clear/update/auto-create transactions. Recalculate `cleared_delta` after every action; halt once |delta| ≤ tolerance.
52
+ - **Validation**: `findBestMatch` integration tests ensure deterministic candidate ordering; we also assert log completeness (`audit_trail_complete`) in executor tests.
53
+ - **Open questions**: Do we need adaptive confidence thresholds for larger ledgers (>1k rows) to limit runtime, or is the static percentage enough?
54
+
55
+ ### Step 3 — Phase 2 cleared-YNAB sanity pass
56
+ - **Rationale**: Detects stale cleared transactions that never appeared on the bank statement, a common source of lingering deltas.
57
+ - **What happens**: Iterate YNAB transactions with `cleared === 'cleared'` but `reconciled === false` inside the CSV window ±5 days. Attempt to re-match them to leftover bank rows; otherwise flip to `uncleared` when `auto_unclear_missing` is true and recompute `cleared_delta`.
58
+ - **Validation**: Executor tests (`executor.sanity-pass.test.ts`) verify we never un-clear reconciled items, and dry-run mode logs intended actions without mutating YNAB.
59
+ - **Open questions**: Should we surface a preview of would-be un-cleared transactions in dry-run mode to the structured payload for UI display?
60
+
61
+ ### Step 4 — Finalize reconciliation
62
+ - **Rationale**: Once balances align, we need a trusted checkpoint recording statement date/balance plus an auditable list of touched transactions.
63
+ - **What happens**: Prompt the assistant/user to finish reconciliation, set involved transactions to `reconciled`, and call `buildBalanceReconciliation` to persist precision math and `final_verification` booleans.
64
+ - **Validation**: Snapshot tests assert the `execution.account_balance.before/after` objects stay monotonic; manual validation by rerunning `npm test -- --runInBand` ensures no race with parallel Vitest workers.
65
+ - **Open questions**: Should we enforce that `statement_date` is required at this stage, or keep the current fallback to `statement_end_date` if missing?
66
+
67
+ ### Step 5 — Leftover escalation & operator handoff
68
+ - **Rationale**: Keeping humans in the loop for medium/low-confidence matches prevents silent drift when automation can’t safely conclude.
69
+ - **What happens**: Surface structured `recommendations` containing low-confidence suggestions, unmatched bank-only rows, and the list of transactions auto un-cleared during Step 3. The narrative outlines manual review order, while the JSON payload allows clients to build UI cards (see `reference/TROUBLESHOOTING.md#reconciliation`).
70
+ - **Validation**: Adapter tests verify `buildReconciliationPayload` includes each unresolved set with counts, and E2E scripts (`test-reconcile-autodetect.js`) confirm the CLI prints the same inventory of leftovers.
71
+ - **Open questions**: Do we need a SLA timer/escalation hook (e.g., Slack webhook) when leftovers include more than N transactions, or is assistant messaging enough?
72
+
73
+ ### Step 6 — Retriable automation & telemetry feedback
74
+ - **Rationale**: Audit logs inform future tuning (e.g., tolerance adjustments) and enable replays without re-parsing inputs.
75
+ - **What happens**: Persist log streams, emit `execution.summary` stats, and optionally rerun the flow with updated knobs (e.g., `balance_verification_mode = 'GUIDED_RESOLUTION'`) using the same CSV payload. Telemetry consumers watch `audit_trail_complete` and `discrepancy_analysis` to decide whether another automated attempt is viable.
76
+ - **Validation**: `docs/guides/TESTING.md#comprehensive-account-reconciliation` details the manual harness; CI pipelines run `npm run test:comprehensive` to ensure telemetry fields stay backwards compatible.
77
+ - **Open questions**: Should we snapshot anonymized telemetry for regression dashboards, or does that introduce privacy concerns with customer CSVs?
78
+
79
+ ## Testing Hooks & Cross-links
80
+ - Follow the **Comprehensive Account Reconciliation** playbook in `[docs/guides/TESTING.md](guides/TESTING.md#comprehensive-account-reconciliation)` to exercise CSV parsing, matching, and execution paths end-to-end.
81
+ - Tool contract reference lives in `[docs/reference/API.md#reconcile_account](reference/API.md#reconcile_account)` and `[docs/reference/TOOLS.md#reconcile_account](reference/TOOLS.md#reconcile_account)`; keep this doc updated when schemas there change.
82
+ - Troubleshooting steps for stubborn discrepancies are cataloged in `[docs/reference/TROUBLESHOOTING.md#reconciliation](reference/TROUBLESHOOTING.md#reconciliation)`; link to this when raising escalation tickets.
83
+ - Local scripts (`test-reconcile-tool.js`, `test-reconcile-autodetect.js`) double as reproducible demonstrations—capture their JSON output and attach to `.pr-description.md` when documenting reconciliation changes.