@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,1450 @@
1
+ # YNAB MCP Server API Reference
2
+
3
+ This document provides comprehensive documentation for all tools available in the YNAB MCP Server, including parameters, examples, and error handling.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Overview](#overview)
8
+ - [Authentication](#authentication)
9
+ - [Data Formats](#data-formats)
10
+ - [Budget Management Tools](#budget-management-tools)
11
+ - [Account Management Tools](#account-management-tools)
12
+ - [Transaction Management Tools](#transaction-management-tools)
13
+ - [Category Management Tools](#category-management-tools)
14
+ - [Payee Management Tools](#payee-management-tools)
15
+ - [Monthly Data Tools](#monthly-data-tools)
16
+ - [Utility Tools](#utility-tools)
17
+ - [Diagnostic Tools](#diagnostic-tools)
18
+ - [Error Handling](#error-handling)
19
+
20
+ ## Overview
21
+
22
+ The YNAB MCP Server provides 30 tools that enable AI assistants to interact with YNAB data. All tools follow consistent patterns for parameters, responses, and error handling.
23
+
24
+ ### Tool Naming Convention
25
+
26
+ All tools follow a simple naming pattern with an action and resource:
27
+ - `list_budgets` - List operation on budgets
28
+ - `get_budget` - Get operation on a specific budget
29
+ - `create_transaction` - Create operation for transactions
30
+
31
+ ## Authentication
32
+
33
+ All tools require authentication via a YNAB Personal Access Token set in the `YNAB_ACCESS_TOKEN` environment variable.
34
+
35
+ ```bash
36
+ YNAB_ACCESS_TOKEN=your_personal_access_token_here
37
+ ```
38
+
39
+ ## Data Formats
40
+
41
+ ### Monetary Amounts
42
+
43
+ **📢 New in v0.7.0**: All monetary amounts are automatically converted to standard dollar format for human readability.
44
+
45
+ The server automatically converts YNAB's internal milliunits to dollars in all responses:
46
+ - Account balances: `-1924.37` (instead of `-1924370` milliunits)
47
+ - Transaction amounts: `50.25` (instead of `50250` milliunits)
48
+ - Budget amounts: `150.00` (instead of `150000` milliunits)
49
+
50
+ **Input formats**:
51
+ - When creating transactions, amounts should be provided in milliunits (as per YNAB API requirements)
52
+ - Use the `convert_amount` tool to convert between dollars and milliunits if needed
53
+
54
+ **Legacy behavior**: YNAB's internal representation uses milliunits (1/1000th of currency unit), but this is now transparent to users
55
+
56
+ ### Dates
57
+
58
+ All dates use ISO 8601 format: `YYYY-MM-DD`
59
+ - Example: `2024-01-15`
60
+ - Time zones are handled by YNAB based on your account settings
61
+
62
+ ### IDs
63
+
64
+ All YNAB IDs are UUID strings:
65
+ - Budget ID: `12345678-1234-1234-1234-123456789012`
66
+ - Account ID: `87654321-4321-4321-4321-210987654321`
67
+
68
+ ## Budget Management Tools
69
+
70
+ ### list_budgets
71
+
72
+ Lists all budgets associated with the user's account.
73
+
74
+ **Parameters:** None
75
+
76
+ **Example Request:**
77
+ ```json
78
+ {
79
+ "name": "list_budgets",
80
+ "arguments": {}
81
+ }
82
+ ```
83
+
84
+ **Example Response:**
85
+ ```json
86
+ {
87
+ "content": [
88
+ {
89
+ "type": "text",
90
+ "text": "{\n \"budgets\": [\n {\n \"id\": \"12345678-1234-1234-1234-123456789012\",\n \"name\": \"My Budget\",\n \"last_modified_on\": \"2024-01-15T10:30:00.000Z\",\n \"first_month\": \"2024-01-01\",\n \"last_month\": \"2024-12-01\",\n \"date_format\": {\n \"format\": \"MM/DD/YYYY\"\n },\n \"currency_format\": {\n \"iso_code\": \"USD\",\n \"example_format\": \"123,456.78\",\n \"decimal_digits\": 2,\n \"decimal_separator\": \".\",\n \"symbol_first\": true,\n \"group_separator\": \",\",\n \"currency_symbol\": \"$\",\n \"display_symbol\": true\n }\n }\n ]\n}"
91
+ }
92
+ ]
93
+ }
94
+ ```
95
+
96
+ ### get_budget
97
+
98
+ Gets detailed information for a specific budget.
99
+
100
+ **Parameters:**
101
+ - `budget_id` (string, required): The ID of the budget to retrieve
102
+
103
+ **Example Request:**
104
+ ```json
105
+ {
106
+ "name": "get_budget",
107
+ "arguments": {
108
+ "budget_id": "12345678-1234-1234-1234-123456789012"
109
+ }
110
+ }
111
+ ```
112
+
113
+ **Example Response:**
114
+ ```json
115
+ {
116
+ "content": [
117
+ {
118
+ "type": "text",
119
+ "text": "{\n \"budget\": {\n \"id\": \"12345678-1234-1234-1234-123456789012\",\n \"name\": \"My Budget\",\n \"last_modified_on\": \"2024-01-15T10:30:00.000Z\",\n \"first_month\": \"2024-01-01\",\n \"last_month\": \"2024-12-01\",\n \"accounts\": [...],\n \"payees\": [...],\n \"payee_locations\": [...],\n \"category_groups\": [...],\n \"categories\": [...],\n \"months\": [...],\n \"transactions\": [...],\n \"subtransactions\": [...],\n \"scheduled_transactions\": [...],\n \"scheduled_subtransactions\": [...]\n }\n}"
120
+ }
121
+ ]
122
+ }
123
+ ```
124
+
125
+ ## Account Management Tools
126
+
127
+ ### list_accounts
128
+
129
+ Lists all accounts for a specific budget.
130
+
131
+ **Parameters:**
132
+ - `budget_id` (string, required): The ID of the budget
133
+
134
+ **Example Request:**
135
+ ```json
136
+ {
137
+ "name": "list_accounts",
138
+ "arguments": {
139
+ "budget_id": "12345678-1234-1234-1234-123456789012"
140
+ }
141
+ }
142
+ ```
143
+
144
+ **Example Response:**
145
+ ```json
146
+ {
147
+ "content": [
148
+ {
149
+ "type": "text",
150
+ "text": "{\n \"accounts\": [\n {\n \"id\": \"87654321-4321-4321-4321-210987654321\",\n \"name\": \"Checking Account\",\n \"type\": \"checking\",\n \"on_budget\": true,\n \"closed\": false,\n \"note\": null,\n \"balance\": 150000,\n \"cleared_balance\": 145000,\n \"uncleared_balance\": 5000,\n \"transfer_payee_id\": \"transfer-payee-id\",\n \"direct_import_linked\": false,\n \"direct_import_in_error\": false,\n \"last_reconciled_at\": null,\n \"debt_original_balance\": null,\n \"debt_interest_rates\": {},\n \"debt_minimum_payments\": {},\n \"debt_escrow_amounts\": {}\n }\n ]\n}"
151
+ }
152
+ ]
153
+ }
154
+ ```
155
+
156
+ ### get_account
157
+
158
+ Gets detailed information for a specific account.
159
+
160
+ **Parameters:**
161
+ - `budget_id` (string, required): The ID of the budget
162
+ - `account_id` (string, required): The ID of the account
163
+
164
+ **Example Request:**
165
+ ```json
166
+ {
167
+ "name": "get_account",
168
+ "arguments": {
169
+ "budget_id": "12345678-1234-1234-1234-123456789012",
170
+ "account_id": "87654321-4321-4321-4321-210987654321"
171
+ }
172
+ }
173
+ ```
174
+
175
+ ### create_account
176
+
177
+ Creates a new account in the specified budget.
178
+
179
+ **Parameters:**
180
+ - `budget_id` (string, required): The ID of the budget
181
+ - `name` (string, required): The name of the new account
182
+ - `type` (string, required): The account type. Valid values:
183
+ - `checking` - Checking account
184
+ - `savings` - Savings account
185
+ - `creditCard` - Credit card account
186
+ - `cash` - Cash account
187
+ - `lineOfCredit` - Line of credit
188
+ - `otherAsset` - Other asset account
189
+ - `otherLiability` - Other liability account
190
+ - `balance` (number, optional): Initial balance in milliunits
191
+ - `dry_run` (boolean, optional): Validate and return simulated result; no API call
192
+
193
+ **Example Request:**
194
+ ```json
195
+ {
196
+ "name": "create_account",
197
+ "arguments": {
198
+ "budget_id": "12345678-1234-1234-1234-123456789012",
199
+ "name": "New Savings Account",
200
+ "type": "savings",
201
+ "balance": 100000
202
+ }
203
+ }
204
+ ```
205
+
206
+ **Example Response:**
207
+ ```json
208
+ {
209
+ "content": [
210
+ {
211
+ "type": "text",
212
+ "text": "{\n \"account\": {\n \"id\": \"new-account-id\",\n \"name\": \"New Savings Account\",\n \"type\": \"savings\",\n \"on_budget\": true,\n \"closed\": false,\n \"balance\": 100000,\n \"cleared_balance\": 100000,\n \"uncleared_balance\": 0\n }\n}"
213
+ }
214
+ ]
215
+ }
216
+ ```
217
+
218
+ ## Transaction Management Tools
219
+
220
+ ### list_transactions
221
+
222
+ Lists transactions for a budget with optional filtering.
223
+
224
+ **Parameters:**
225
+ - `budget_id` (string, required): The ID of the budget
226
+ - `account_id` (string, optional): Filter by account ID
227
+ - `category_id` (string, optional): Filter by category ID
228
+ - `since_date` (string, optional): Only return transactions on or after this date (YYYY-MM-DD)
229
+ - `type` (string, optional): Filter by transaction type (`uncategorized` or `unapproved`)
230
+
231
+ **Example Request:**
232
+ ```json
233
+ {
234
+ "name": "list_transactions",
235
+ "arguments": {
236
+ "budget_id": "12345678-1234-1234-1234-123456789012",
237
+ "account_id": "87654321-4321-4321-4321-210987654321",
238
+ "since_date": "2024-01-01"
239
+ }
240
+ }
241
+ ```
242
+
243
+ **Example Response:**
244
+ ```json
245
+ {
246
+ "content": [
247
+ {
248
+ "type": "text",
249
+ "text": "{\n \"transactions\": [\n {\n \"id\": \"transaction-id\",\n \"date\": \"2024-01-15\",\n \"amount\": -5000,\n \"memo\": \"Coffee shop\",\n \"cleared\": \"cleared\",\n \"approved\": true,\n \"flag_color\": null,\n \"account_id\": \"87654321-4321-4321-4321-210987654321\",\n \"payee_id\": \"payee-id\",\n \"category_id\": \"category-id\",\n \"transfer_account_id\": null,\n \"transfer_transaction_id\": null,\n \"matched_transaction_id\": null,\n \"import_id\": null,\n \"import_payee_name\": null,\n \"import_payee_name_original\": null,\n \"debt_transaction_type\": null,\n \"deleted\": false\n }\n ]\n}"
250
+ }
251
+ ]
252
+ }
253
+ ```
254
+
255
+ ### export_transactions
256
+
257
+ Exports all transactions to a JSON file with descriptive filename and platform-specific default paths. This tool bypasses MCP response size limits by saving data to a file instead of returning it in the response.
258
+
259
+ **Parameters:**
260
+ - `budget_id` (string, required): The ID of the budget
261
+ - `account_id` (string, optional): Filter by account ID
262
+ - `category_id` (string, optional): Filter by category ID
263
+ - `since_date` (string, optional): Only export transactions on or after this date (YYYY-MM-DD)
264
+ - `type` (string, optional): Filter by transaction type (`uncategorized` or `unapproved`)
265
+ - `filename` (string, optional): Custom filename (auto-generated if not provided)
266
+ - `minimal` (boolean, optional): Export only essential fields for smaller files (default: true)
267
+
268
+ **Example Request:**
269
+ ```json
270
+ {
271
+ "name": "export_transactions",
272
+ "arguments": {
273
+ "budget_id": "12345678-1234-1234-1234-123456789012",
274
+ "since_date": "2024-01-01"
275
+ }
276
+ }
277
+ ```
278
+
279
+ **Example Response:**
280
+ ```json
281
+ {
282
+ "content": [
283
+ {
284
+ "type": "text",
285
+ "text": "{\n \"message\": \"Successfully exported 1247 transactions\",\n \"filename\": \"ynab_since_2024-01-01_1247items_2024-09-10_14-30-15.json\",\n \"full_path\": \"C:\\\\Users\\\\YourName\\\\Downloads\\\\ynab_since_2024-01-01_1247items_2024-09-10_14-30-15.json\",\n \"export_directory\": \"C:\\\\Users\\\\YourName\\\\Downloads\",\n \"filename_explanation\": \"Filename format: ynab_{filters}_{count}items_{timestamp}.json - identifies what data was exported, when, and how many transactions\",\n \"preview_count\": 10,\n \"total_count\": 1247,\n \"preview_transactions\": [\n {\n \"id\": \"transaction-id\",\n \"date\": \"2024-01-15\",\n \"amount\": -5000,\n \"memo\": \"Coffee shop\",\n \"payee_name\": \"Starbucks\",\n \"category_name\": \"Dining Out\"\n }\n ]\n}"
286
+ }
287
+ ]
288
+ }
289
+ ```
290
+
291
+ **Export File Structure:**
292
+ The exported JSON file contains:
293
+ - `export_info`: Metadata about the export (timestamp, filters, count, minimal flag)
294
+ - `transactions`: Array of transaction objects
295
+ - **Minimal mode (default)**: `id`, `date`, `amount`, `payee_name`, `cleared`
296
+ - **Full mode**: All available transaction fields
297
+
298
+ **Platform-Specific Default Paths:**
299
+ - Windows/Mac: `~/Downloads`
300
+ - Linux/Unix: `~/Documents` (or `$XDG_DOCUMENTS_DIR`)
301
+ - Configurable via `YNAB_EXPORT_PATH` environment variable
302
+
303
+ ### compare_transactions
304
+
305
+ Compares bank transactions from CSV files with YNAB transactions to identify missing entries in either direction. This tool helps with bank statement reconciliation by finding transactions that exist in your bank statement but not in YNAB (need to import) or vice versa (double-check for duplicates).
306
+
307
+ **Parameters:**
308
+ - `budget_id` (string, required): The ID of the budget to compare against
309
+ - `account_id` (string, required): The ID of the account to compare transactions for
310
+ - `csv_file_path` (string, optional): Path to CSV file containing bank transactions
311
+ - `csv_data` (string, optional): CSV data as string (alternative to csv_file_path)
312
+ - `amount_tolerance` (number, optional): Amount difference tolerance as decimal (0.01 = 1%, default: 0.01)
313
+ - `date_tolerance_days` (number, optional): Date difference tolerance in days (default: 5)
314
+ - `csv_format` (object, optional): CSV format configuration
315
+ - `date_column` (string): Column name for transaction date when `has_header: true`, or column index as string when `has_header: false` (default: "Date")
316
+ - `amount_column` (string): Column name for transaction amount when `has_header: true`, or column index as string when `has_header: false` (default: "Amount")
317
+ - `description_column` (string): Column name for transaction description when `has_header: true`, or column index as string when `has_header: false` (default: "Description")
318
+ - `date_format` (string): Date format pattern (default: "MM/DD/YYYY")
319
+ - `has_header` (boolean): Whether CSV has header row (default: true)
320
+ - `delimiter` (string): CSV delimiter character (default: ",")
321
+
322
+ **Example Request (CSV data):**
323
+ ```json
324
+ {
325
+ "name": "compare_transactions",
326
+ "arguments": {
327
+ "budget_id": "12345678-1234-1234-1234-123456789012",
328
+ "account_id": "87654321-4321-4321-4321-210987654321",
329
+ "csv_data": "Date,Amount,Description\n2024-01-01,100.00,Coffee Shop\n2024-01-02,-50.25,Gas Station\n2024-01-03,25.00,ATM Withdrawal"
330
+ }
331
+ }
332
+ ```
333
+
334
+ **Example Request (CSV file with custom format):**
335
+ ```json
336
+ {
337
+ "name": "compare_transactions",
338
+ "arguments": {
339
+ "budget_id": "12345678-1234-1234-1234-123456789012",
340
+ "account_id": "87654321-4321-4321-4321-210987654321",
341
+ "csv_file_path": "/path/to/bank-statement.csv",
342
+ "csv_format": {
343
+ "date_column": "Transaction Date",
344
+ "amount_column": "Dollar Amount",
345
+ "description_column": "Description",
346
+ "date_format": "DD/MM/YYYY",
347
+ "delimiter": ";",
348
+ "has_header": true
349
+ },
350
+ "amount_tolerance": 0.02,
351
+ "date_tolerance_days": 3
352
+ }
353
+ }
354
+ ```
355
+
356
+ **Example Request (CSV without headers using column indices):**
357
+ ```json
358
+ {
359
+ "name": "compare_transactions",
360
+ "arguments": {
361
+ "budget_id": "12345678-1234-1234-1234-123456789012",
362
+ "account_id": "87654321-4321-4321-4321-210987654321",
363
+ "csv_data": "2024-01-01,100.00,Coffee Shop\n2024-01-02,-15.50,ATM Fee\n2024-01-03,250.00,Paycheck",
364
+ "csv_format": {
365
+ "date_column": "0",
366
+ "amount_column": "1",
367
+ "description_column": "2",
368
+ "date_format": "YYYY-MM-DD",
369
+ "has_header": false,
370
+ "delimiter": ","
371
+ }
372
+ }
373
+ }
374
+ ```
375
+
376
+ **Example Response:**
377
+ ```json
378
+ {
379
+ "content": [
380
+ {
381
+ "type": "text",
382
+ "text": "{\n \"summary\": {\n \"bank_transactions_count\": 15,\n \"ynab_transactions_count\": 12,\n \"matches_found\": 10,\n \"missing_in_ynab\": 5,\n \"missing_in_bank\": 2,\n \"date_range\": {\n \"start\": \"2024-01-01\",\n \"end\": \"2024-01-15\"\n },\n \"parameters\": {\n \"amount_tolerance\": 0.01,\n \"date_tolerance_days\": 5\n }\n },\n \"matches\": [\n {\n \"bank_date\": \"2024-01-01\",\n \"bank_amount\": \"100.00\",\n \"bank_description\": \"Coffee Shop\",\n \"ynab_date\": \"2024-01-01\",\n \"ynab_amount\": \"100.00\",\n \"ynab_payee\": \"Starbucks\",\n \"match_score\": 90,\n \"match_reasons\": [\"Exact date match\", \"Exact amount match\"]\n }\n ],\n \"missing_in_ynab\": [\n {\n \"date\": \"2024-01-03\",\n \"amount\": \"25.00\",\n \"description\": \"ATM Withdrawal\",\n \"row_number\": 4\n }\n ],\n \"missing_in_bank\": [\n {\n \"id\": \"transaction-xyz\",\n \"date\": \"2024-01-02\",\n \"amount\": \"-15.50\",\n \"payee_name\": \"Coffee Bean\",\n \"memo\": \"Morning coffee\",\n \"cleared\": \"cleared\"\n }\n ]\n}"
383
+ }
384
+ ]
385
+ }
386
+ ```
387
+
388
+ **Matching Algorithm:**
389
+ - **Date matching** (40 points max): Exact dates get full points, nearby dates get partial points
390
+ - **Amount matching** (50 points max): Exact amounts get full points, close amounts within tolerance get partial points
391
+ - **Description matching** (10 points max): Similarity between bank description and YNAB payee/memo
392
+ - **Smart Duplicate Handling**: Multiple transactions with identical amounts are matched using chronological order with chronology bonus (+15 points for same day, +10 for within 3 days)
393
+ - **Minimum match score**: 30 points required for a valid match
394
+
395
+ **Supported Date Formats:**
396
+ - `MM/DD/YYYY` or `M/D/YYYY` (default)
397
+ - `DD/MM/YYYY` or `D/M/YYYY`
398
+ - `YYYY-MM-DD` (ISO format)
399
+ - `MM-DD-YYYY`
400
+
401
+ **Use Cases:**
402
+ - **Bank reconciliation**: Find transactions missing from YNAB that need to be imported
403
+ - **Duplicate detection**: Identify YNAB transactions that don't appear in bank statements
404
+ - **Import verification**: Verify that imported transactions match your bank statement exactly
405
+ - **Data cleanup**: Find and resolve discrepancies between bank and YNAB data
406
+
407
+ ### reconcile_account
408
+
409
+ Performs comprehensive account reconciliation with bank statement data. The tool returns **two content entries**: a human-readable narrative for assistants and a structured JSON payload (`version: "2.0"`) that encodes MoneyValue objects, insights, and optional execution results.
410
+
411
+ **Parameters (selected):**
412
+ - `budget_id` / `account_id` (string, required)
413
+ - `csv_file_path` or `csv_data` (one required)
414
+ - `statement_balance` (number, required) – ending cleared balance from the statement in dollars
415
+ - `statement_start_date`, `statement_end_date`, `statement_date` (string, optional)
416
+ - Matching controls: `date_tolerance_days` (default 2), `amount_tolerance_cents` (default 1), `auto_match_threshold` (default 90), `suggestion_threshold` (default 60)
417
+ - Execution controls (optional):
418
+ - `auto_create_transactions` (default `false`)
419
+ - `auto_update_cleared_status` (default `false`)
420
+ - `auto_unclear_missing` (default `true`)
421
+ - `auto_adjust_dates` (default `false`)
422
+ - `dry_run` (default `true`)
423
+ - `amount_tolerance` (deprecated decimal fallback – automatically inferred from `amount_tolerance_cents`)
424
+ - Other legacy options remain accepted for compatibility (`expected_bank_balance`, `balance_verification_mode`, `require_exact_match`, etc.).
425
+
426
+ **Example Request:**
427
+ ```json
428
+ {
429
+ "name": "reconcile_account",
430
+ "arguments": {
431
+ "budget_id": "12345678-1234-1234-1234-123456789012",
432
+ "account_id": "87654321-4321-4321-4321-210987654321",
433
+ "csv_data": "Date,Description,Amount\n2025-10-20,Amazon,-23.47\n2025-10-22,Coffee Shop,-4.50\n2025-10-23,Grocery Store,-67.89",
434
+ "statement_balance": -560.38,
435
+ "statement_start_date": "2025-10-01",
436
+ "statement_end_date": "2025-10-31",
437
+ "auto_create_transactions": true,
438
+ "dry_run": true
439
+ }
440
+ }
441
+ ```
442
+
443
+ **Example Response (truncated):**
444
+ ```json
445
+ {
446
+ "content": [
447
+ {
448
+ "type": "text",
449
+ "text": "📊 Checking Account Reconciliation Report\nStatement Range: 2025-10-01 to 2025-10-31\n\n• YNAB Cleared Balance: -$899.02\n• Statement Balance: -$921.24\n❌ Discrepancy: $22.22 (Statement shows more owed than YNAB)\n\nMatches: 5 auto, 1 suggested, 1 unmatched bank, 0 unmatched YNAB\n\nInsights:\n• [WARNING] 1 unmatched transaction at $22.22\n\nNext Steps:\n• Review 5 auto-matched transactions for approval\n• Add missing bank transaction\n\nDry run only — no YNAB changes were applied."
450
+ },
451
+ {
452
+ "type": "text",
453
+ "text": "{\n \"version\": \"2.0\",\n \"schema_url\": \"https://raw.githubusercontent.com/dizzlkheinz/ynab-mcp-mcpb/master/docs/schemas/reconciliation-v2.json\",\n \"summary\": {\n \"bank_transactions_count\": 7,\n \"auto_matched\": 5,\n \"current_cleared_balance\": {\n \"value_milliunits\": -899020,\n \"value_display\": \"-$899.02\",\n \"currency\": \"USD\",\n \"direction\": \"debit\"\n },\n \"discrepancy\": {\n \"value_display\": \"$22.22\"\n }\n },\n \"balance\": {\n \"discrepancy_direction\": \"bank_higher\"\n },\n \"csv_format\": {\n \"delimiter\": \",\",\n \"decimal_separator\": \".\",\n \"thousands_separator\": null,\n \"date_format\": \"MM/DD/YYYY\",\n \"header_row\": true,\n \"date_column\": \"Date\",\n \"amount_column\": \"Amount\",\n \"payee_column\": \"Description\"\n },\n \"insights\": [ { \"id\": \"repeat-22.22\", \"type\": \"repeat_amount\" } ],\n \"matches\": { ... },\n \"unmatched\": { ... },\n \"execution\": {\n \"summary\": {\n \"matches_found\": 6,\n \"transactions_created\": 1,\n \"transactions_updated\": 2,\n \"dry_run\": false\n },\n \"account_balance\": {\n \"before\": { \"cleared_balance\": { \"value_display\": \"-$899.02\" }, ... },\n \"after\": { \"cleared_balance\": { \"value_display\": \"-$921.24\" }, ... }\n },\n \"recommendations\": [\"Review EvoCarShare discrepancy\"]\n }\n}"
454
+ }
455
+ ]
456
+ }
457
+ ```
458
+
459
+ When execution flags are enabled and `dry_run` is `false`, the structured payload includes an `execution` block with created/updated transactions, recommendations, and MoneyValue snapshots. The human narrative also summarizes applied actions.
460
+
461
+ **Key Output Sections:**
462
+ - `summary` – counts and MoneyValue balances for the statement window
463
+ - `balance` – MoneyValue snapshots plus discrepancy direction (`bank_higher`, `ynab_higher`, or `balanced`)
464
+ - `insights` – repeat-amount, near-match, and anomaly callouts with evidence
465
+ - `next_steps` – ordered suggestions for assistants to surface
466
+ - `matches`, `unmatched` – detailed transaction lists with MoneyValue fields for amounts
467
+ - `execution` (optional) – action totals, recommendations, and balance reconciliation metrics (MoneyValue)
468
+ - `recommendations` (optional) – actionable suggestions with complete parameters for executing YNAB tool calls
469
+
470
+ ### Recommendations Field
471
+
472
+ The `reconcile_account_v2` tool now includes an optional `recommendations` array with actionable suggestions for resolving discrepancies.
473
+
474
+ #### Recommendation Types
475
+
476
+ **Create Transaction**
477
+ ```json
478
+ {
479
+ "id": "rec-123",
480
+ "action_type": "create_transaction",
481
+ "priority": "high",
482
+ "confidence": 0.95,
483
+ "message": "Create transaction for EvoCarShare",
484
+ "reason": "This transaction exactly matches your $22.22 discrepancy",
485
+ "estimated_impact": {
486
+ "value": 22.22,
487
+ "value_display": "$22.22",
488
+ "currency": "USD"
489
+ },
490
+ "account_id": "abc123",
491
+ "parameters": {
492
+ "account_id": "abc123",
493
+ "date": "2024-01-15",
494
+ "amount": 22.22,
495
+ "payee_name": "EvoCarShare",
496
+ "memo": "Car rental",
497
+ "cleared": "cleared",
498
+ "approved": true
499
+ }
500
+ }
501
+ ```
502
+
503
+ **Update Cleared Status**
504
+ ```json
505
+ {
506
+ "id": "rec-456",
507
+ "action_type": "update_cleared",
508
+ "priority": "low",
509
+ "confidence": 0.6,
510
+ "message": "Mark transaction as cleared",
511
+ "parameters": {
512
+ "transaction_id": "ynab-txn-789",
513
+ "cleared": "cleared"
514
+ }
515
+ }
516
+ ```
517
+
518
+ **Review Duplicate**
519
+ ```json
520
+ {
521
+ "id": "rec-789",
522
+ "action_type": "review_duplicate",
523
+ "priority": "medium",
524
+ "confidence": 0.7,
525
+ "message": "Review possible duplicate",
526
+ "parameters": {
527
+ "candidate_ids": ["ynab-1", "ynab-2"],
528
+ "suggested_match_id": "ynab-1"
529
+ }
530
+ }
531
+ ```
532
+
533
+ #### Executing Recommendations
534
+
535
+ Recommendations include complete parameters for YNAB MCP tool calls:
536
+
537
+ **CRITICAL**: Recommendation `parameters.amount` values are in **milliunits** (YNAB's internal format where 1 dollar = 1000 milliunits). These values are ready to pass directly to `create_transaction` without conversion. However, `estimated_impact.value` remains in decimal dollars for human readability.
538
+
539
+ ```typescript
540
+ // For create_transaction recommendations:
541
+ // Note: Recommendation amounts are already in milliunits, ready to use directly
542
+ const rec = recommendations.find(r => r.action_type === 'create_transaction');
543
+ if (rec) {
544
+ await create_transaction({
545
+ budget_id: 'your-budget-id',
546
+ ...rec.parameters // Parameters already contain amounts in milliunits
547
+ });
548
+ }
549
+
550
+ // For update_cleared recommendations:
551
+ const updateRec = recommendations.find(r => r.action_type === 'update_cleared');
552
+ if (updateRec) {
553
+ await update_transaction({
554
+ budget_id: 'your-budget-id',
555
+ transaction_id: updateRec.parameters.transaction_id,
556
+ transaction: {
557
+ cleared: updateRec.parameters.cleared
558
+ }
559
+ });
560
+ }
561
+ ```
562
+
563
+ #### Recommendation Priority
564
+
565
+ - **High**: Exact matches with 90%+ confidence, resolve immediately
566
+ - **Medium**: Likely matches with 60-89% confidence, review before executing
567
+ - **Low**: Suggestions requiring manual review, investigate further
568
+
569
+ #### Best Practices for Executing Recommendations
570
+
571
+ **Execution Order**
572
+
573
+ Process recommendations in the order they're returned (already sorted by priority and confidence):
574
+
575
+ ```typescript
576
+ for (const rec of recommendations) {
577
+ // High confidence (>0.9) can often be auto-executed
578
+ if (rec.confidence > 0.9 && rec.action_type === 'create_transaction') {
579
+ await executeRecommendation(rec);
580
+ } else {
581
+ // Lower confidence should be reviewed
582
+ await reviewAndExecute(rec);
583
+ }
584
+ }
585
+ ```
586
+
587
+ **Batch Execution**
588
+
589
+ For multiple recommendations, execute in batches with review checkpoints:
590
+
591
+ ```typescript
592
+ // Group by action type
593
+ const groups = {
594
+ create: recommendations.filter(r => r.action_type === 'create_transaction'),
595
+ update: recommendations.filter(r => r.action_type === 'update_cleared'),
596
+ review: recommendations.filter(r => r.action_type === 'manual_review'),
597
+ };
598
+
599
+ // Execute high-confidence creates first
600
+ for (const rec of groups.create.filter(r => r.confidence > 0.9)) {
601
+ await create_transaction({
602
+ budget_id: budgetId,
603
+ ...rec.parameters
604
+ });
605
+ }
606
+
607
+ // Review checkpoint: verify balance improvement
608
+ const updatedAnalysis = await reconcile_account_v2({ ... });
609
+ console.log('Balance after creates:', updatedAnalysis.balance_info.discrepancy);
610
+ ```
611
+
612
+ **Error Handling and Rollback**
613
+
614
+ Track executed recommendations for potential rollback:
615
+
616
+ ```typescript
617
+ const executionLog = [];
618
+
619
+ try {
620
+ for (const rec of recommendations) {
621
+ if (rec.action_type === 'create_transaction') {
622
+ const result = await create_transaction({
623
+ budget_id: budgetId,
624
+ ...rec.parameters
625
+ });
626
+
627
+ executionLog.push({
628
+ recommendation_id: rec.id,
629
+ transaction_id: result.transaction.id,
630
+ action: 'create_transaction'
631
+ });
632
+ }
633
+ }
634
+ } catch (error) {
635
+ // Rollback: delete created transactions
636
+ for (const log of executionLog.reverse()) {
637
+ if (log.action === 'create_transaction') {
638
+ await delete_transaction({
639
+ budget_id: budgetId,
640
+ transaction_id: log.transaction_id
641
+ });
642
+ }
643
+ }
644
+ throw error;
645
+ }
646
+ ```
647
+
648
+ **Verification After Execution**
649
+
650
+ Always re-run reconciliation after executing recommendations to verify balance improvement:
651
+
652
+ ```typescript
653
+ // Execute recommendations
654
+ await executeRecommendations(recommendations);
655
+
656
+ // Verify discrepancy resolved
657
+ const verifyAnalysis = await reconcile_account_v2({
658
+ budget_id: budgetId,
659
+ account_id: accountId,
660
+ csv_data: csvData,
661
+ statement_balance: statementBalance,
662
+ statement_date: statementDate
663
+ });
664
+
665
+ const beforeDiscrepancy = originalAnalysis.balance_info.discrepancy.value;
666
+ const afterDiscrepancy = verifyAnalysis.balance_info.discrepancy.value;
667
+
668
+ if (Math.abs(afterDiscrepancy) >= Math.abs(beforeDiscrepancy)) {
669
+ console.warn('Discrepancy not improved - review executed recommendations');
670
+ }
671
+ ```
672
+
673
+ **Handling Manual Review Recommendations**
674
+
675
+ Manual review recommendations require investigation before action:
676
+
677
+ ```typescript
678
+ for (const rec of recommendations.filter(r => r.action_type === 'manual_review')) {
679
+ console.log(`\n=== ${rec.message} ===`);
680
+ console.log(`Reason: ${rec.reason}`);
681
+ console.log(`Issue type: ${rec.parameters.issue_type}`);
682
+
683
+ if (rec.parameters.related_transactions) {
684
+ console.log('\nRelated transactions:');
685
+ for (const txn of rec.parameters.related_transactions) {
686
+ console.log(` - [${txn.source}] ${txn.description} (ID: ${txn.id})`);
687
+ }
688
+ }
689
+
690
+ // Fetch full details for investigation
691
+ for (const txn of rec.parameters.related_transactions || []) {
692
+ if (txn.source === 'ynab') {
693
+ const details = await get_transaction({
694
+ budget_id: budgetId,
695
+ transaction_id: txn.id
696
+ });
697
+ console.log(` Details:`, JSON.stringify(details, null, 2));
698
+ }
699
+ }
700
+ }
701
+ ```
702
+
703
+ **Progressive Execution Strategy**
704
+
705
+ For large discrepancies with many recommendations:
706
+
707
+ 1. **Execute high-confidence creates** (confidence > 0.9, action_type = create_transaction)
708
+ 2. **Re-run reconciliation** to verify progress
709
+ 3. **Review remaining discrepancy** and adjust strategy
710
+ 4. **Process medium-confidence items** with manual review
711
+ 5. **Final verification** before marking account as reconciled
712
+
713
+ ### get_transaction
714
+
715
+ Gets detailed information for a specific transaction.
716
+
717
+ **Parameters:**
718
+ - `budget_id` (string, required): The ID of the budget
719
+ - `transaction_id` (string, required): The ID of the transaction
720
+
721
+ **Example Request:**
722
+ ```json
723
+ {
724
+ "name": "get_transaction",
725
+ "arguments": {
726
+ "budget_id": "12345678-1234-1234-1234-123456789012",
727
+ "transaction_id": "transaction-id"
728
+ }
729
+ }
730
+ ```
731
+
732
+ ### create_transaction
733
+
734
+ Creates a new transaction in the specified budget and account.
735
+
736
+ **Parameters:**
737
+ - `budget_id` (string, required): The ID of the budget
738
+ - `account_id` (string, required): The ID of the account
739
+ - `amount` (number, required): Transaction amount in milliunits (negative for outflows)
740
+ - `date` (string, required): Transaction date in ISO format (YYYY-MM-DD)
741
+ - `payee_name` (string, optional): The payee name
742
+ - `payee_id` (string, optional): The payee ID
743
+ - `category_id` (string, optional): The category ID
744
+ - `memo` (string, optional): Transaction memo
745
+ - `cleared` (string, optional): Transaction cleared status (`cleared`, `uncleared`, `reconciled`)
746
+ - `approved` (boolean, optional): Whether the transaction is approved
747
+ - `flag_color` (string, optional): Transaction flag color (`red`, `orange`, `yellow`, `green`, `blue`, `purple`)
748
+ - `dry_run` (boolean, optional): Validate and return simulated result; no API call
749
+ - `subtransactions` (array, optional): Split line items; each entry accepts `amount` (milliunits), plus optional `memo`, `category_id`, `payee_id`, and `payee_name`
750
+
751
+ When `subtransactions` are supplied, their `amount` values must sum to the parent `amount`, matching YNAB API requirements.
752
+
753
+ **Example Request:**
754
+ ```json
755
+ {
756
+ "name": "create_transaction",
757
+ "arguments": {
758
+ "budget_id": "12345678-1234-1234-1234-123456789012",
759
+ "account_id": "87654321-4321-4321-4321-210987654321",
760
+ "amount": -5000,
761
+ "date": "2024-01-15",
762
+ "payee_name": "Coffee Shop",
763
+ "category_id": "category-id",
764
+ "memo": "Morning coffee",
765
+ "cleared": "cleared",
766
+ "approved": true
767
+ }
768
+ }
769
+ ```
770
+
771
+ **Split Transaction Example:**
772
+ ```json
773
+ {
774
+ "name": "create_transaction",
775
+ "arguments": {
776
+ "budget_id": "12345678-1234-1234-1234-123456789012",
777
+ "account_id": "87654321-4321-4321-4321-210987654321",
778
+ "amount": -125000,
779
+ "date": "2024-02-01",
780
+ "memo": "Rent and utilities",
781
+ "subtransactions": [
782
+ { "amount": -100000, "category_id": "rent-category", "memo": "Rent" },
783
+ { "amount": -25000, "category_id": "utilities-category", "memo": "Utilities" }
784
+ ]
785
+ }
786
+ }
787
+ ```
788
+
789
+ ### create_receipt_split_transaction
790
+
791
+ Creates a split transaction from categorized receipt data and allocates taxes proportionally across the selected categories. Use this helper after the user has confirmed the receipt breakdown and category assignments.
792
+
793
+ **Parameters:**
794
+ - `budget_id` (string, required): The ID of the budget
795
+ - `account_id` (string, required): The ID of the account
796
+ - `payee_name` (string, required): Payee to assign to the transaction (e.g., the store name)
797
+ - `date` (string, optional): Transaction date in ISO format (defaults to today when omitted)
798
+ - `memo` (string, optional): Memo applied to the parent transaction
799
+ - `receipt_subtotal` (number, optional): Pre-tax subtotal for validation (calculated automatically if omitted)
800
+ - `receipt_tax` (number, required): Total tax collected on the receipt
801
+ - `receipt_total` (number, required): Final total including tax
802
+ - `categories` (array, required): Categorized line items. Each entry accepts:
803
+ - `category_id` (string, required)
804
+ - `category_name` (string, optional, used for tax memo labels)
805
+ - `items` (array, required): Each item includes `name` (string), `amount` (number), optional `quantity` (number), and optional `memo` (string)
806
+ - `cleared` (string, optional): Cleared status (`cleared`, `uncleared`, `reconciled`). Defaults to `uncleared`
807
+ - `approved` (boolean, optional): Whether the transaction should be marked approved
808
+ - `flag_color` (string, optional): Flag color (`red`, `orange`, `yellow`, `green`, `blue`, `purple`)
809
+ - `dry_run` (boolean, optional): When true, returns a preview without calling YNAB
810
+
811
+ **Example Request:**
812
+ ```json
813
+ {
814
+ "name": "create_receipt_split_transaction",
815
+ "arguments": {
816
+ "budget_id": "12345678-1234-1234-1234-123456789012",
817
+ "account_id": "87654321-4321-4321-4321-210987654321",
818
+ "payee_name": "IKEA",
819
+ "date": "2025-10-13",
820
+ "memo": "Receipt import",
821
+ "receipt_subtotal": 112.34,
822
+ "receipt_tax": 11.84,
823
+ "receipt_total": 124.18,
824
+ "categories": [
825
+ {
826
+ "category_id": "baby-stuff",
827
+ "category_name": "Baby Stuff",
828
+ "items": [
829
+ { "name": "Crib pillow", "amount": 12.99 },
830
+ { "name": "Bed linen", "amount": 24.99 }
831
+ ]
832
+ },
833
+ {
834
+ "category_id": "home-maintenance",
835
+ "category_name": "Home Maintenance",
836
+ "items": [
837
+ { "name": "Teapot", "amount": 19.99 },
838
+ { "name": "Toothbrush holder", "amount": 3.99 }
839
+ ]
840
+ }
841
+ ]
842
+ }
843
+ }
844
+ ```
845
+
846
+ **Example Response:**
847
+ ```json
848
+ {
849
+ "transaction": {
850
+ "id": "new-transaction-456",
851
+ "amount": -124.18,
852
+ "payee_name": "IKEA",
853
+ "cleared": "uncleared",
854
+ "subtransactions": [
855
+ { "memo": "Crib pillow", "amount": -12.99, "category_id": "baby-stuff" },
856
+ { "memo": "Bed linen", "amount": -24.99, "category_id": "baby-stuff" },
857
+ { "memo": "Tax - Baby Stuff", "amount": -6.11, "category_id": "baby-stuff" },
858
+ { "memo": "Teapot", "amount": -19.99, "category_id": "home-maintenance" },
859
+ { "memo": "Toothbrush holder", "amount": -3.99, "category_id": "home-maintenance" },
860
+ { "memo": "Tax - Home Maintenance", "amount": -5.99, "category_id": "home-maintenance" }
861
+ ],
862
+ "account_balance": 2534.87,
863
+ "account_cleared_balance": 2450.22
864
+ },
865
+ "receipt_summary": {
866
+ "subtotal": 112.34,
867
+ "tax": 11.84,
868
+ "total": 124.18,
869
+ "categories": [
870
+ {
871
+ "category_id": "baby-stuff",
872
+ "category_name": "Baby Stuff",
873
+ "subtotal": 37.98,
874
+ "tax": 6.11,
875
+ "total": 44.09
876
+ },
877
+ {
878
+ "category_id": "home-maintenance",
879
+ "category_name": "Home Maintenance",
880
+ "subtotal": 74.36,
881
+ "tax": 5.73,
882
+ "total": 80.09
883
+ }
884
+ ]
885
+ }
886
+ }
887
+ ```
888
+
889
+ ### update_transaction
890
+
891
+ Updates an existing transaction.
892
+
893
+ **Parameters:**
894
+ - `budget_id` (string, required): The ID of the budget
895
+ - `transaction_id` (string, required): The ID of the transaction to update
896
+ - `account_id` (string, optional): Update the account ID
897
+ - `amount` (number, optional): Update the amount in milliunits
898
+ - `date` (string, optional): Update the date (YYYY-MM-DD)
899
+ - `payee_name` (string, optional): Update the payee name
900
+ - `payee_id` (string, optional): Update the payee ID
901
+ - `category_id` (string, optional): Update the category ID
902
+ - `memo` (string, optional): Update the memo
903
+ - `cleared` (string, optional): Update the cleared status
904
+ - `approved` (boolean, optional): Update the approved status
905
+ - `flag_color` (string, optional): Update the flag color
906
+ - `dry_run` (boolean, optional): Validate and return simulated result; no API call
907
+
908
+ **Example Request:**
909
+ ```json
910
+ {
911
+ "name": "update_transaction",
912
+ "arguments": {
913
+ "budget_id": "12345678-1234-1234-1234-123456789012",
914
+ "transaction_id": "transaction-id",
915
+ "amount": -6000,
916
+ "memo": "Updated memo",
917
+ "flag_color": "red"
918
+ }
919
+ }
920
+ ```
921
+
922
+ ### delete_transaction
923
+
924
+ Deletes a transaction from the specified budget.
925
+
926
+ **Parameters:**
927
+ - `budget_id` (string, required): The ID of the budget
928
+ - `transaction_id` (string, required): The ID of the transaction to delete
929
+ - `dry_run` (boolean, optional): Validate and return simulated result; no API call
930
+
931
+ **Example Request:**
932
+ ```json
933
+ {
934
+ "name": "delete_transaction",
935
+ "arguments": {
936
+ "budget_id": "12345678-1234-1234-1234-123456789012",
937
+ "transaction_id": "transaction-id"
938
+ }
939
+ }
940
+ ```
941
+
942
+ ## Category Management Tools
943
+
944
+ ### list_categories
945
+
946
+ Lists all categories for a specific budget.
947
+
948
+ **Parameters:**
949
+ - `budget_id` (string, required): The ID of the budget
950
+
951
+ **Example Request:**
952
+ ```json
953
+ {
954
+ "name": "list_categories",
955
+ "arguments": {
956
+ "budget_id": "12345678-1234-1234-1234-123456789012"
957
+ }
958
+ }
959
+ ```
960
+
961
+ **Example Response:**
962
+ ```json
963
+ {
964
+ "content": [
965
+ {
966
+ "type": "text",
967
+ "text": "{\n \"category_groups\": [\n {\n \"id\": \"group-id\",\n \"name\": \"Monthly Bills\",\n \"hidden\": false,\n \"deleted\": false,\n \"categories\": [\n {\n \"id\": \"category-id\",\n \"category_group_id\": \"group-id\",\n \"name\": \"Rent/Mortgage\",\n \"hidden\": false,\n \"original_category_group_id\": null,\n \"note\": null,\n \"budgeted\": 150000,\n \"activity\": -150000,\n \"balance\": 0,\n \"goal_type\": null,\n \"goal_creation_month\": null,\n \"goal_target\": null,\n \"goal_target_month\": null,\n \"goal_percentage_complete\": null,\n \"goal_months_to_budget\": null,\n \"goal_under_funded\": null,\n \"goal_overall_funded\": null,\n \"goal_overall_left\": null,\n \"deleted\": false\n }\n ]\n }\n ]\n}"
968
+ }
969
+ ]
970
+ }
971
+ ```
972
+
973
+ ### get_category
974
+
975
+ Gets detailed information for a specific category.
976
+
977
+ **Parameters:**
978
+ - `budget_id` (string, required): The ID of the budget
979
+ - `category_id` (string, required): The ID of the category
980
+
981
+ ### update_category
982
+
983
+ Updates the budgeted amount for a category in the current month.
984
+
985
+ **Parameters:**
986
+ - `budget_id` (string, required): The ID of the budget
987
+ - `category_id` (string, required): The ID of the category
988
+ - `budgeted` (number, required): The budgeted amount in milliunits
989
+ - `dry_run` (boolean, optional): Validate and return simulated result; no API call
990
+
991
+ **Example Request:**
992
+ ```json
993
+ {
994
+ "name": "update_category",
995
+ "arguments": {
996
+ "budget_id": "12345678-1234-1234-1234-123456789012",
997
+ "category_id": "category-id",
998
+ "budgeted": 50000
999
+ }
1000
+ }
1001
+ ```
1002
+
1003
+ ## Payee Management Tools
1004
+
1005
+ ### list_payees
1006
+
1007
+ Lists all payees for a specific budget.
1008
+
1009
+ **Parameters:**
1010
+ - `budget_id` (string, required): The ID of the budget
1011
+
1012
+ **Example Request:**
1013
+ ```json
1014
+ {
1015
+ "name": "list_payees",
1016
+ "arguments": {
1017
+ "budget_id": "12345678-1234-1234-1234-123456789012"
1018
+ }
1019
+ }
1020
+ ```
1021
+
1022
+ ### get_payee
1023
+
1024
+ Gets detailed information for a specific payee.
1025
+
1026
+ **Parameters:**
1027
+ - `budget_id` (string, required): The ID of the budget
1028
+ - `payee_id` (string, required): The ID of the payee
1029
+
1030
+ ## Monthly Data Tools
1031
+
1032
+ ### get_month
1033
+
1034
+ Gets budget data for a specific month.
1035
+
1036
+ **Parameters:**
1037
+ - `budget_id` (string, required): The ID of the budget
1038
+ - `month` (string, required): The month in ISO format (YYYY-MM-DD, typically first day of month)
1039
+
1040
+ **Example Request:**
1041
+ ```json
1042
+ {
1043
+ "name": "get_month",
1044
+ "arguments": {
1045
+ "budget_id": "12345678-1234-1234-1234-123456789012",
1046
+ "month": "2024-01-01"
1047
+ }
1048
+ }
1049
+ ```
1050
+
1051
+ ### list_months
1052
+
1053
+ Lists all months summary data for a budget.
1054
+
1055
+ **Parameters:**
1056
+ - `budget_id` (string, required): The ID of the budget
1057
+
1058
+ ## Utility Tools
1059
+
1060
+ ### get_user
1061
+
1062
+ Gets information about the authenticated user.
1063
+
1064
+ **Parameters:** None
1065
+
1066
+ **Example Request:**
1067
+ ```json
1068
+ {
1069
+ "name": "get_user",
1070
+ "arguments": {}
1071
+ }
1072
+ ```
1073
+
1074
+ **Example Response:**
1075
+ ```json
1076
+ {
1077
+ "content": [
1078
+ {
1079
+ "type": "text",
1080
+ "text": "{\n \"user\": {\n \"id\": \"user-id\",\n \"email\": \"user@example.com\",\n \"trial_expires_on\": null,\n \"subscription\": {\n \"trial_expires_on\": null,\n \"cancelled_at\": null,\n \"date_first_current\": \"2020-01-01T00:00:00.000Z\",\n \"frequency\": \"annually\"\n }\n }\n}"
1081
+ }
1082
+ ]
1083
+ }
1084
+ ```
1085
+
1086
+ ### convert_amount
1087
+
1088
+ Converts between dollars and milliunits with integer arithmetic for precision.
1089
+
1090
+ **Parameters:**
1091
+ - `amount` (number, required): The amount to convert
1092
+ - `to_milliunits` (boolean, required): If true, convert from dollars to milliunits. If false, convert from milliunits to dollars
1093
+
1094
+ **Example Request (dollars to milliunits):**
1095
+ ```json
1096
+ {
1097
+ "name": "convert_amount",
1098
+ "arguments": {
1099
+ "amount": 50.25,
1100
+ "to_milliunits": true
1101
+ }
1102
+ }
1103
+ ```
1104
+
1105
+ **Example Response:**
1106
+ ```json
1107
+ {
1108
+ "content": [
1109
+ {
1110
+ "type": "text",
1111
+ "text": "{\n \"original_amount\": 50.25,\n \"converted_amount\": 50250,\n \"conversion_type\": \"dollars_to_milliunits\"\n}"
1112
+ }
1113
+ ]
1114
+ }
1115
+ ```
1116
+
1117
+ **Example Request (milliunits to dollars):**
1118
+ ```json
1119
+ {
1120
+ "name": "convert_amount",
1121
+ "arguments": {
1122
+ "amount": 50250,
1123
+ "to_milliunits": false
1124
+ }
1125
+ }
1126
+ ```
1127
+
1128
+ **Example Response:**
1129
+ ```json
1130
+ {
1131
+ "content": [
1132
+ {
1133
+ "type": "text",
1134
+ "text": "{\n \"original_amount\": 50250,\n \"converted_amount\": 50.25,\n \"conversion_type\": \"milliunits_to_dollars\"\n}"
1135
+ }
1136
+ ]
1137
+ }
1138
+ ```
1139
+
1140
+ ## Diagnostic Tools
1141
+
1142
+ These tools help inspect the server, environment, and performance. They do not modify YNAB data.
1143
+
1144
+ ### diagnostic_info
1145
+
1146
+ Returns comprehensive diagnostic information about the MCP server with flexible parameter control.
1147
+
1148
+ **Parameters:**
1149
+ - `include_memory` (boolean, optional): Include memory usage statistics (default: true)
1150
+ - `include_environment` (boolean, optional): Include environment and token status (default: true)
1151
+ - `include_server` (boolean, optional): Include server version and runtime info (default: true)
1152
+ - `include_security` (boolean, optional): Include security and rate limiting stats (default: true)
1153
+ - `include_cache` (boolean, optional): Include cache statistics (default: true)
1154
+
1155
+ **Example Request (all sections):**
1156
+ ```json
1157
+ {
1158
+ "name": "diagnostic_info",
1159
+ "arguments": {}
1160
+ }
1161
+ ```
1162
+
1163
+ **Example Request (selective sections):**
1164
+ ```json
1165
+ {
1166
+ "name": "diagnostic_info",
1167
+ "arguments": {
1168
+ "include_memory": true,
1169
+ "include_server": true,
1170
+ "include_security": false,
1171
+ "include_cache": false,
1172
+ "include_environment": false
1173
+ }
1174
+ }
1175
+ ```
1176
+
1177
+ **Example Response:**
1178
+ ```json
1179
+ {
1180
+ "content": [
1181
+ {
1182
+ "type": "text",
1183
+ "text": "{\n \"timestamp\": \"2024-01-15T10:30:00.000Z\",\n \"server\": {\n \"name\": \"ynab-mcp-server\",\n \"version\": \"0.6.0\",\n \"node_version\": \"v20.10.0\",\n \"platform\": \"win32\",\n \"arch\": \"x64\",\n \"pid\": 12345,\n \"uptime_ms\": 3600000,\n \"uptime_readable\": \"1h 0m 0s\",\n \"env\": {\n \"node_env\": \"development\",\n \"minify_output\": \"true\"\n }\n },\n \"memory\": {\n \"rss_mb\": 45.2,\n \"heap_used_mb\": 32.1,\n \"heap_total_mb\": 40.5,\n \"external_mb\": 2.1,\n \"array_buffers_mb\": 0.5,\n \"description\": {\n \"rss\": \"Resident Set Size - total memory allocated for the process\",\n \"heap_used\": \"Used heap memory (objects, closures, etc.)\",\n \"heap_total\": \"Total heap memory allocated\",\n \"external\": \"Memory used by C++ objects bound to JavaScript objects\",\n \"array_buffers\": \"Memory allocated for ArrayBuffer and SharedArrayBuffer\"\n }\n },\n \"environment\": {\n \"token_present\": true,\n \"token_length\": 64,\n \"token_preview\": \"abcd...xyz\",\n \"ynab_env_keys_present\": [\"YNAB_ACCESS_TOKEN\"],\n \"working_directory\": \"/path/to/project\"\n },\n \"security\": {\n \"requests_processed\": 1250,\n \"rate_limit_hits\": 0,\n \"errors_logged\": 2\n },\n \"cache\": {\n \"entries\": 15,\n \"estimated_size_kb\": 128,\n \"keys\": [\"budget_123\", \"account_456\"]\n }\n}"
1184
+ }
1185
+ ]
1186
+ }
1187
+ ```
1188
+
1189
+ ### clear_cache
1190
+
1191
+ Clears the in-memory cache. Safe; does not modify YNAB data.
1192
+
1193
+ **Parameters:** None
1194
+
1195
+ Example Request:
1196
+ ```json
1197
+ { "name": "clear_cache", "arguments": {} }
1198
+ ```
1199
+
1200
+ ### set_output_format
1201
+
1202
+ Configures default JSON formatting for responses.
1203
+
1204
+ Parameters:
1205
+ - `default_minify` (boolean, optional): Minify JSON outputs by default (default: true)
1206
+ - `pretty_spaces` (number, optional): Spaces to use when pretty-printing (0-10)
1207
+
1208
+ Example Request:
1209
+ ```json
1210
+ { "name": "set_output_format", "arguments": { "default_minify": false, "pretty_spaces": 2 } }
1211
+ ```
1212
+
1213
+ ## Error Handling
1214
+
1215
+ All tools implement comprehensive error handling with consistent error response formats.
1216
+
1217
+ ### Error Response Format
1218
+
1219
+ ```json
1220
+ {
1221
+ "content": [
1222
+ {
1223
+ "type": "text",
1224
+ "text": "{\n \"error\": {\n \"code\": \"ERROR_CODE\",\n \"message\": \"Human-readable error message\",\n \"tool\": \"tool_name\",\n \"operation\": \"operation_description\"\n }\n}"
1225
+ }
1226
+ ]
1227
+ }
1228
+ ```
1229
+
1230
+ ### Common Error Types
1231
+
1232
+ #### Authentication Errors (401)
1233
+
1234
+ **Cause**: Invalid or expired YNAB access token
1235
+
1236
+ **Example Response:**
1237
+ ```json
1238
+ {
1239
+ "error": {
1240
+ "code": "AUTHENTICATION_ERROR",
1241
+ "message": "Invalid or expired YNAB access token. Please check your YNAB_ACCESS_TOKEN environment variable.",
1242
+ "tool": "list_budgets",
1243
+ "operation": "listing budgets"
1244
+ }
1245
+ }
1246
+ ```
1247
+
1248
+ **Solutions:**
1249
+ - Verify the `YNAB_ACCESS_TOKEN` environment variable is set correctly
1250
+ - Check if the token has expired in YNAB Developer Settings
1251
+ - Generate a new token if necessary
1252
+
1253
+ #### Authorization Errors (403)
1254
+
1255
+ **Cause**: Insufficient permissions for the requested operation
1256
+
1257
+ **Example Response:**
1258
+ ```json
1259
+ {
1260
+ "error": {
1261
+ "code": "AUTHORIZATION_ERROR",
1262
+ "message": "Insufficient permissions to access this resource.",
1263
+ "tool": "get_budget",
1264
+ "operation": "retrieving budget details"
1265
+ }
1266
+ }
1267
+ ```
1268
+
1269
+ #### Resource Not Found (404)
1270
+
1271
+ **Cause**: Invalid budget_id, account_id, transaction_id, etc.
1272
+
1273
+ **Example Response:**
1274
+ ```json
1275
+ {
1276
+ "error": {
1277
+ "code": "RESOURCE_NOT_FOUND",
1278
+ "message": "The requested resource was not found. Please verify the ID is correct.",
1279
+ "tool": "get_account",
1280
+ "operation": "retrieving account details"
1281
+ }
1282
+ }
1283
+ ```
1284
+
1285
+ **Solutions:**
1286
+ - Verify the ID is correct and exists
1287
+ - Use list operations to find valid IDs
1288
+ - Check if the resource has been deleted
1289
+
1290
+ #### Rate Limiting (429)
1291
+
1292
+ **Cause**: Too many requests to YNAB API
1293
+
1294
+ **Example Response:**
1295
+ ```json
1296
+ {
1297
+ "error": {
1298
+ "code": "RATE_LIMIT_EXCEEDED",
1299
+ "message": "Rate limit exceeded. Please wait before making more requests.",
1300
+ "tool": "list_transactions",
1301
+ "operation": "listing transactions"
1302
+ }
1303
+ }
1304
+ ```
1305
+
1306
+ **Solutions:**
1307
+ - Wait before making additional requests
1308
+ - Implement exponential backoff in your client
1309
+ - Reduce the frequency of API calls
1310
+
1311
+ #### Validation Errors
1312
+
1313
+ **Cause**: Invalid parameters provided to tools
1314
+
1315
+ **Example Response:**
1316
+ ```json
1317
+ {
1318
+ "error": {
1319
+ "code": "VALIDATION_ERROR",
1320
+ "message": "Invalid parameters: date must be in ISO format (YYYY-MM-DD)",
1321
+ "tool": "create_transaction",
1322
+ "operation": "creating transaction"
1323
+ }
1324
+ }
1325
+ ```
1326
+
1327
+ **Solutions:**
1328
+ - Check parameter formats and types
1329
+ - Refer to the tool documentation for valid values
1330
+ - Ensure required parameters are provided
1331
+
1332
+ #### Server Errors (500)
1333
+
1334
+ **Cause**: YNAB service issues or internal server errors
1335
+
1336
+ **Example Response:**
1337
+ ```json
1338
+ {
1339
+ "error": {
1340
+ "code": "SERVER_ERROR",
1341
+ "message": "An internal server error occurred. Please try again later.",
1342
+ "tool": "get_budget",
1343
+ "operation": "retrieving budget details"
1344
+ }
1345
+ }
1346
+ ```
1347
+
1348
+ **Solutions:**
1349
+ - Retry the request after a short delay
1350
+ - Check YNAB service status
1351
+ - Contact support if the issue persists
1352
+
1353
+ ## Best Practices
1354
+
1355
+ ### 1. Error Handling
1356
+
1357
+ Always handle errors gracefully in your client applications:
1358
+
1359
+ ```javascript
1360
+ try {
1361
+ const result = await mcpClient.callTool('list_budgets', {});
1362
+ // Process successful result
1363
+ } catch (error) {
1364
+ // Handle error based on error code
1365
+ if (error.code === 'AUTHENTICATION_ERROR') {
1366
+ // Prompt user to update token
1367
+ } else if (error.code === 'RATE_LIMIT_EXCEEDED') {
1368
+ // Implement retry with backoff
1369
+ }
1370
+ }
1371
+ ```
1372
+
1373
+ ### 2. Parameter Validation
1374
+
1375
+ Validate parameters before making tool calls:
1376
+
1377
+ ```javascript
1378
+ // Validate date format
1379
+ const dateRegex = /^\d{4}-\d{2}-\d{2}$/;
1380
+ if (!dateRegex.test(date)) {
1381
+ throw new Error('Date must be in YYYY-MM-DD format');
1382
+ }
1383
+
1384
+ // Validate amount is in milliunits
1385
+ if (!Number.isInteger(amount)) {
1386
+ throw new Error('Amount must be an integer in milliunits');
1387
+ }
1388
+ ```
1389
+
1390
+ ### 3. Efficient Data Retrieval
1391
+
1392
+ Use filtering parameters to reduce data transfer:
1393
+
1394
+ ```javascript
1395
+ // Instead of getting all transactions and filtering client-side
1396
+ const allTransactions = await mcpClient.callTool('list_transactions', {
1397
+ budget_id: budgetId
1398
+ });
1399
+
1400
+ // Use server-side filtering
1401
+ const recentTransactions = await mcpClient.callTool('list_transactions', {
1402
+ budget_id: budgetId,
1403
+ since_date: '2024-01-01',
1404
+ account_id: specificAccountId
1405
+ });
1406
+ ```
1407
+
1408
+ ### 4. Amount Conversions
1409
+
1410
+ Use the conversion utility for user-friendly displays:
1411
+
1412
+ ```javascript
1413
+ // Convert milliunits to dollars for display
1414
+ const dollarsResult = await mcpClient.callTool('convert_amount', {
1415
+ amount: 50250,
1416
+ to_milliunits: false
1417
+ });
1418
+ console.log(`Amount: $${dollarsResult.converted_amount}`); // Amount: $50.25
1419
+
1420
+ // Convert user input to milliunits for API calls
1421
+ const milliUnitsResult = await mcpClient.callTool('convert_amount', {
1422
+ amount: 50.25,
1423
+ to_milliunits: true
1424
+ });
1425
+ // Use milliUnitsResult.converted_amount in transaction creation
1426
+ ```
1427
+
1428
+ ### 5. Caching Strategies
1429
+
1430
+ Cache relatively static data to improve performance:
1431
+
1432
+ ```javascript
1433
+ // Cache budget and account information
1434
+ const budgets = await mcpClient.callTool('list_budgets', {});
1435
+ // Cache for 1 hour
1436
+
1437
+ const accounts = await mcpClient.callTool('list_accounts', {
1438
+ budget_id: budgetId
1439
+ });
1440
+ // Cache for 30 minutes
1441
+
1442
+ // Don't cache frequently changing data like transactions
1443
+ const transactions = await mcpClient.callTool('list_transactions', {
1444
+ budget_id: budgetId,
1445
+ since_date: today
1446
+ });
1447
+ // Always fetch fresh
1448
+ ```
1449
+
1450
+ This API reference provides comprehensive documentation for all available tools. For additional information, see the [Developer Guide](DEVELOPER.md) for best practices and common usage patterns.