@dizzlkheinz/ynab-mcpb 0.18.3 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/CLAUDE.md +87 -8
  3. package/bin/ynab-mcp-server.cjs +2 -2
  4. package/bin/ynab-mcp-server.js +3 -3
  5. package/biome.json +39 -0
  6. package/dist/bundle/index.cjs +67 -67
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.js +27 -27
  9. package/dist/server/YNABMCPServer.d.ts +3 -4
  10. package/dist/server/YNABMCPServer.js +111 -116
  11. package/dist/server/budgetResolver.d.ts +6 -5
  12. package/dist/server/budgetResolver.js +46 -36
  13. package/dist/server/cacheKeys.js +6 -6
  14. package/dist/server/cacheManager.js +14 -11
  15. package/dist/server/completions.d.ts +2 -2
  16. package/dist/server/completions.js +20 -15
  17. package/dist/server/config.d.ts +10 -5
  18. package/dist/server/config.js +24 -7
  19. package/dist/server/deltaCache.d.ts +2 -2
  20. package/dist/server/deltaCache.js +22 -16
  21. package/dist/server/deltaCache.merge.d.ts +2 -2
  22. package/dist/server/diagnostics.d.ts +4 -4
  23. package/dist/server/diagnostics.js +38 -32
  24. package/dist/server/errorHandler.d.ts +5 -12
  25. package/dist/server/errorHandler.js +219 -217
  26. package/dist/server/prompts.d.ts +2 -2
  27. package/dist/server/prompts.js +45 -45
  28. package/dist/server/rateLimiter.js +4 -4
  29. package/dist/server/requestLogger.d.ts +1 -1
  30. package/dist/server/requestLogger.js +40 -35
  31. package/dist/server/resources.d.ts +3 -3
  32. package/dist/server/resources.js +55 -52
  33. package/dist/server/responseFormatter.js +6 -6
  34. package/dist/server/securityMiddleware.d.ts +2 -2
  35. package/dist/server/securityMiddleware.js +22 -20
  36. package/dist/server/serverKnowledgeStore.js +1 -1
  37. package/dist/server/toolRegistry.d.ts +3 -3
  38. package/dist/server/toolRegistry.js +47 -40
  39. package/dist/tools/__tests__/deltaTestUtils.d.ts +3 -3
  40. package/dist/tools/__tests__/deltaTestUtils.js +2 -2
  41. package/dist/tools/accountTools.d.ts +9 -8
  42. package/dist/tools/accountTools.js +47 -47
  43. package/dist/tools/adapters.d.ts +13 -8
  44. package/dist/tools/adapters.js +21 -11
  45. package/dist/tools/budgetTools.d.ts +8 -7
  46. package/dist/tools/budgetTools.js +22 -22
  47. package/dist/tools/categoryTools.d.ts +9 -8
  48. package/dist/tools/categoryTools.js +68 -59
  49. package/dist/tools/compareTransactions/formatter.d.ts +3 -3
  50. package/dist/tools/compareTransactions/formatter.js +9 -9
  51. package/dist/tools/compareTransactions/index.d.ts +6 -6
  52. package/dist/tools/compareTransactions/index.js +58 -43
  53. package/dist/tools/compareTransactions/matcher.d.ts +1 -1
  54. package/dist/tools/compareTransactions/matcher.js +28 -15
  55. package/dist/tools/compareTransactions/parser.d.ts +2 -2
  56. package/dist/tools/compareTransactions/parser.js +144 -138
  57. package/dist/tools/compareTransactions/types.d.ts +4 -4
  58. package/dist/tools/compareTransactions.d.ts +1 -1
  59. package/dist/tools/compareTransactions.js +1 -1
  60. package/dist/tools/deltaFetcher.d.ts +2 -2
  61. package/dist/tools/deltaFetcher.js +16 -15
  62. package/dist/tools/deltaSupport.d.ts +4 -4
  63. package/dist/tools/deltaSupport.js +35 -41
  64. package/dist/tools/exportTransactions.d.ts +5 -4
  65. package/dist/tools/exportTransactions.js +61 -59
  66. package/dist/tools/monthTools.d.ts +7 -6
  67. package/dist/tools/monthTools.js +31 -29
  68. package/dist/tools/payeeTools.d.ts +7 -6
  69. package/dist/tools/payeeTools.js +28 -28
  70. package/dist/tools/reconcileAdapter.d.ts +2 -2
  71. package/dist/tools/reconcileAdapter.js +21 -11
  72. package/dist/tools/reconciliation/analyzer.d.ts +4 -4
  73. package/dist/tools/reconciliation/analyzer.js +136 -57
  74. package/dist/tools/reconciliation/csvParser.d.ts +3 -3
  75. package/dist/tools/reconciliation/csvParser.js +128 -104
  76. package/dist/tools/reconciliation/executor.d.ts +4 -4
  77. package/dist/tools/reconciliation/executor.js +148 -109
  78. package/dist/tools/reconciliation/index.d.ts +10 -10
  79. package/dist/tools/reconciliation/index.js +96 -83
  80. package/dist/tools/reconciliation/matcher.d.ts +3 -3
  81. package/dist/tools/reconciliation/matcher.js +17 -16
  82. package/dist/tools/reconciliation/payeeNormalizer.js +19 -8
  83. package/dist/tools/reconciliation/recommendationEngine.d.ts +1 -1
  84. package/dist/tools/reconciliation/recommendationEngine.js +40 -40
  85. package/dist/tools/reconciliation/reportFormatter.d.ts +2 -2
  86. package/dist/tools/reconciliation/reportFormatter.js +79 -54
  87. package/dist/tools/reconciliation/signDetector.d.ts +1 -1
  88. package/dist/tools/reconciliation/types.d.ts +19 -16
  89. package/dist/tools/reconciliation/ynabAdapter.d.ts +2 -2
  90. package/dist/tools/schemas/common.d.ts +1 -1
  91. package/dist/tools/schemas/common.js +1 -1
  92. package/dist/tools/schemas/outputs/accountOutputs.d.ts +1 -1
  93. package/dist/tools/schemas/outputs/accountOutputs.js +24 -18
  94. package/dist/tools/schemas/outputs/budgetOutputs.d.ts +1 -1
  95. package/dist/tools/schemas/outputs/budgetOutputs.js +14 -11
  96. package/dist/tools/schemas/outputs/categoryOutputs.d.ts +1 -1
  97. package/dist/tools/schemas/outputs/categoryOutputs.js +49 -29
  98. package/dist/tools/schemas/outputs/comparisonOutputs.d.ts +1 -1
  99. package/dist/tools/schemas/outputs/comparisonOutputs.js +12 -12
  100. package/dist/tools/schemas/outputs/index.d.ts +14 -14
  101. package/dist/tools/schemas/outputs/index.js +14 -14
  102. package/dist/tools/schemas/outputs/monthOutputs.d.ts +1 -1
  103. package/dist/tools/schemas/outputs/monthOutputs.js +56 -41
  104. package/dist/tools/schemas/outputs/payeeOutputs.d.ts +1 -1
  105. package/dist/tools/schemas/outputs/payeeOutputs.js +10 -10
  106. package/dist/tools/schemas/outputs/reconciliationOutputs.d.ts +2 -2
  107. package/dist/tools/schemas/outputs/reconciliationOutputs.js +45 -45
  108. package/dist/tools/schemas/outputs/transactionMutationOutputs.d.ts +1 -1
  109. package/dist/tools/schemas/outputs/transactionMutationOutputs.js +28 -22
  110. package/dist/tools/schemas/outputs/transactionOutputs.d.ts +1 -1
  111. package/dist/tools/schemas/outputs/transactionOutputs.js +43 -35
  112. package/dist/tools/schemas/outputs/utilityOutputs.d.ts +1 -1
  113. package/dist/tools/schemas/outputs/utilityOutputs.js +5 -3
  114. package/dist/tools/schemas/shared/commonOutputs.d.ts +1 -1
  115. package/dist/tools/schemas/shared/commonOutputs.js +15 -9
  116. package/dist/tools/transactionReadTools.d.ts +11 -0
  117. package/dist/tools/transactionReadTools.js +202 -0
  118. package/dist/tools/transactionSchemas.d.ts +309 -0
  119. package/dist/tools/transactionSchemas.js +235 -0
  120. package/dist/tools/transactionTools.d.ts +6 -302
  121. package/dist/tools/transactionTools.js +7 -2054
  122. package/dist/tools/transactionUtils.d.ts +31 -0
  123. package/dist/tools/transactionUtils.js +364 -0
  124. package/dist/tools/transactionWriteTools.d.ts +20 -0
  125. package/dist/tools/transactionWriteTools.js +1342 -0
  126. package/dist/tools/utilityTools.d.ts +5 -4
  127. package/dist/tools/utilityTools.js +11 -11
  128. package/dist/types/index.d.ts +7 -7
  129. package/dist/types/index.js +6 -6
  130. package/dist/types/reconciliation.d.ts +1 -1
  131. package/dist/types/toolRegistration.d.ts +14 -12
  132. package/dist/utils/amountUtils.js +1 -1
  133. package/dist/utils/dateUtils.js +4 -4
  134. package/dist/utils/errors.d.ts +3 -3
  135. package/dist/utils/errors.js +4 -4
  136. package/dist/utils/money.d.ts +2 -2
  137. package/dist/utils/money.js +8 -8
  138. package/dist/utils/validationError.d.ts +1 -1
  139. package/dist/utils/validationError.js +1 -1
  140. package/docs/assets/examples/reconciliation-with-recommendations.json +66 -66
  141. package/docs/assets/schemas/reconciliation-v2.json +360 -336
  142. package/docs/plans/2025-12-25-transaction-tools-refactor-design.md +211 -0
  143. package/docs/plans/2025-12-25-transaction-tools-refactor.md +905 -0
  144. package/esbuild.config.mjs +53 -50
  145. package/meta.json +12548 -12548
  146. package/package.json +98 -109
  147. package/scripts/analyze-bundle.mjs +33 -30
  148. package/scripts/create-pr-description.js +169 -120
  149. package/scripts/run-all-tests.js +205 -0
  150. package/scripts/run-domain-integration-tests.js +28 -18
  151. package/scripts/run-generate-mcpb.js +19 -17
  152. package/scripts/run-throttled-integration-tests.js +92 -83
  153. package/scripts/test-delta-params.mjs +149 -120
  154. package/scripts/test-recommendations.ts +36 -32
  155. package/scripts/tmpTransaction.ts +80 -43
  156. package/scripts/validate-env.js +98 -91
  157. package/scripts/verify-build.js +78 -76
  158. package/src/__tests__/comprehensive.integration.test.ts +1281 -1154
  159. package/src/__tests__/performance.test.ts +723 -671
  160. package/src/__tests__/setup.ts +442 -395
  161. package/src/__tests__/smoke.e2e.test.ts +41 -39
  162. package/src/__tests__/testRunner.ts +314 -295
  163. package/src/__tests__/testUtils.ts +456 -364
  164. package/src/__tests__/tools/reconciliation/csvParser.integration.test.ts +109 -107
  165. package/src/__tests__/tools/reconciliation/real-world.integration.test.ts +41 -41
  166. package/src/index.ts +68 -59
  167. package/src/server/CLAUDE.md +480 -0
  168. package/src/server/YNABMCPServer.ts +821 -794
  169. package/src/server/__tests__/YNABMCPServer.integration.test.ts +929 -893
  170. package/src/server/__tests__/YNABMCPServer.test.ts +903 -899
  171. package/src/server/__tests__/budgetResolver.test.ts +466 -423
  172. package/src/server/__tests__/cacheManager.test.ts +891 -874
  173. package/src/server/__tests__/completions.integration.test.ts +115 -106
  174. package/src/server/__tests__/completions.test.ts +334 -313
  175. package/src/server/__tests__/config.test.ts +98 -86
  176. package/src/server/__tests__/deltaCache.merge.test.ts +774 -703
  177. package/src/server/__tests__/deltaCache.swr.test.ts +198 -153
  178. package/src/server/__tests__/deltaCache.test.ts +946 -759
  179. package/src/server/__tests__/diagnostics.test.ts +825 -792
  180. package/src/server/__tests__/errorHandler.integration.test.ts +512 -462
  181. package/src/server/__tests__/errorHandler.test.ts +402 -397
  182. package/src/server/__tests__/prompts.test.ts +424 -347
  183. package/src/server/__tests__/rateLimiter.test.ts +313 -309
  184. package/src/server/__tests__/requestLogger.test.ts +443 -403
  185. package/src/server/__tests__/resources.template.test.ts +196 -185
  186. package/src/server/__tests__/resources.test.ts +294 -288
  187. package/src/server/__tests__/security.integration.test.ts +487 -421
  188. package/src/server/__tests__/securityMiddleware.test.ts +519 -444
  189. package/src/server/__tests__/server-startup.integration.test.ts +509 -490
  190. package/src/server/__tests__/serverKnowledgeStore.test.ts +174 -173
  191. package/src/server/__tests__/toolRegistration.test.ts +239 -210
  192. package/src/server/__tests__/toolRegistry.test.ts +907 -845
  193. package/src/server/budgetResolver.ts +221 -181
  194. package/src/server/cacheKeys.ts +6 -6
  195. package/src/server/cacheManager.ts +498 -484
  196. package/src/server/completions.ts +267 -243
  197. package/src/server/config.ts +35 -14
  198. package/src/server/deltaCache.merge.ts +146 -128
  199. package/src/server/deltaCache.ts +352 -309
  200. package/src/server/diagnostics.ts +257 -242
  201. package/src/server/errorHandler.ts +747 -744
  202. package/src/server/prompts.ts +181 -176
  203. package/src/server/rateLimiter.ts +131 -129
  204. package/src/server/requestLogger.ts +350 -322
  205. package/src/server/resources.ts +442 -374
  206. package/src/server/responseFormatter.ts +41 -37
  207. package/src/server/securityMiddleware.ts +223 -205
  208. package/src/server/serverKnowledgeStore.ts +67 -67
  209. package/src/server/toolRegistry.ts +508 -474
  210. package/src/tools/CLAUDE.md +604 -0
  211. package/src/tools/__tests__/accountTools.delta.integration.test.ts +128 -111
  212. package/src/tools/__tests__/accountTools.integration.test.ts +129 -111
  213. package/src/tools/__tests__/accountTools.test.ts +685 -638
  214. package/src/tools/__tests__/adapters.test.ts +142 -108
  215. package/src/tools/__tests__/budgetTools.delta.integration.test.ts +73 -73
  216. package/src/tools/__tests__/budgetTools.integration.test.ts +132 -124
  217. package/src/tools/__tests__/budgetTools.test.ts +442 -413
  218. package/src/tools/__tests__/categoryTools.delta.integration.test.ts +76 -68
  219. package/src/tools/__tests__/categoryTools.integration.test.ts +314 -288
  220. package/src/tools/__tests__/categoryTools.test.ts +656 -625
  221. package/src/tools/__tests__/compareTransactions/formatter.test.ts +535 -462
  222. package/src/tools/__tests__/compareTransactions/index.test.ts +378 -358
  223. package/src/tools/__tests__/compareTransactions/matcher.test.ts +497 -398
  224. package/src/tools/__tests__/compareTransactions/parser.test.ts +765 -747
  225. package/src/tools/__tests__/compareTransactions.test.ts +352 -332
  226. package/src/tools/__tests__/compareTransactions.window.test.ts +150 -146
  227. package/src/tools/__tests__/deltaFetcher.scheduled.integration.test.ts +69 -65
  228. package/src/tools/__tests__/deltaFetcher.test.ts +325 -265
  229. package/src/tools/__tests__/deltaSupport.test.ts +211 -184
  230. package/src/tools/__tests__/deltaTestUtils.ts +37 -33
  231. package/src/tools/__tests__/exportTransactions.test.ts +205 -200
  232. package/src/tools/__tests__/monthTools.delta.integration.test.ts +68 -68
  233. package/src/tools/__tests__/monthTools.integration.test.ts +178 -166
  234. package/src/tools/__tests__/monthTools.test.ts +561 -512
  235. package/src/tools/__tests__/payeeTools.delta.integration.test.ts +68 -68
  236. package/src/tools/__tests__/payeeTools.integration.test.ts +158 -142
  237. package/src/tools/__tests__/payeeTools.test.ts +486 -434
  238. package/src/tools/__tests__/transactionSchemas.test.ts +1204 -0
  239. package/src/tools/__tests__/transactionTools.integration.test.ts +875 -825
  240. package/src/tools/__tests__/transactionTools.test.ts +4923 -4366
  241. package/src/tools/__tests__/transactionUtils.test.ts +1016 -0
  242. package/src/tools/__tests__/utilityTools.integration.test.ts +32 -32
  243. package/src/tools/__tests__/utilityTools.test.ts +68 -58
  244. package/src/tools/accountTools.ts +293 -271
  245. package/src/tools/adapters.ts +120 -63
  246. package/src/tools/budgetTools.ts +121 -116
  247. package/src/tools/categoryTools.ts +379 -339
  248. package/src/tools/compareTransactions/formatter.ts +131 -119
  249. package/src/tools/compareTransactions/index.ts +249 -214
  250. package/src/tools/compareTransactions/matcher.ts +259 -209
  251. package/src/tools/compareTransactions/parser.ts +517 -487
  252. package/src/tools/compareTransactions/types.ts +38 -38
  253. package/src/tools/compareTransactions.ts +1 -1
  254. package/src/tools/deltaFetcher.ts +281 -260
  255. package/src/tools/deltaSupport.ts +264 -259
  256. package/src/tools/exportTransactions.ts +230 -218
  257. package/src/tools/monthTools.ts +180 -165
  258. package/src/tools/payeeTools.ts +152 -140
  259. package/src/tools/reconcileAdapter.ts +297 -246
  260. package/src/tools/reconciliation/CLAUDE.md +506 -0
  261. package/src/tools/reconciliation/__tests__/adapter.causes.test.ts +135 -112
  262. package/src/tools/reconciliation/__tests__/adapter.test.ts +249 -227
  263. package/src/tools/reconciliation/__tests__/analyzer.test.ts +408 -335
  264. package/src/tools/reconciliation/__tests__/csvParser.test.ts +71 -69
  265. package/src/tools/reconciliation/__tests__/executor.integration.test.ts +348 -323
  266. package/src/tools/reconciliation/__tests__/executor.progress.test.ts +503 -457
  267. package/src/tools/reconciliation/__tests__/executor.test.ts +898 -831
  268. package/src/tools/reconciliation/__tests__/matcher.test.ts +667 -663
  269. package/src/tools/reconciliation/__tests__/payeeNormalizer.test.ts +296 -276
  270. package/src/tools/reconciliation/__tests__/recommendationEngine.integration.test.ts +692 -624
  271. package/src/tools/reconciliation/__tests__/recommendationEngine.test.ts +1008 -986
  272. package/src/tools/reconciliation/__tests__/reconciliation.delta.integration.test.ts +187 -146
  273. package/src/tools/reconciliation/__tests__/reportFormatter.test.ts +583 -530
  274. package/src/tools/reconciliation/__tests__/scenarios/adapterCurrency.scenario.test.ts +75 -71
  275. package/src/tools/reconciliation/__tests__/scenarios/extremes.scenario.test.ts +70 -58
  276. package/src/tools/reconciliation/__tests__/scenarios/repeatAmount.scenario.test.ts +102 -88
  277. package/src/tools/reconciliation/__tests__/schemaUrl.test.ts +58 -43
  278. package/src/tools/reconciliation/__tests__/signDetector.test.ts +209 -206
  279. package/src/tools/reconciliation/__tests__/ynabAdapter.test.ts +66 -60
  280. package/src/tools/reconciliation/analyzer.ts +582 -406
  281. package/src/tools/reconciliation/csvParser.ts +656 -609
  282. package/src/tools/reconciliation/executor.ts +1290 -1128
  283. package/src/tools/reconciliation/index.ts +580 -528
  284. package/src/tools/reconciliation/matcher.ts +256 -240
  285. package/src/tools/reconciliation/payeeNormalizer.ts +92 -78
  286. package/src/tools/reconciliation/recommendationEngine.ts +357 -345
  287. package/src/tools/reconciliation/reportFormatter.ts +349 -276
  288. package/src/tools/reconciliation/signDetector.ts +89 -83
  289. package/src/tools/reconciliation/types.ts +164 -153
  290. package/src/tools/reconciliation/ynabAdapter.ts +17 -15
  291. package/src/tools/schemas/CLAUDE.md +546 -0
  292. package/src/tools/schemas/common.ts +1 -1
  293. package/src/tools/schemas/outputs/__tests__/accountOutputs.test.ts +410 -409
  294. package/src/tools/schemas/outputs/__tests__/budgetOutputs.test.ts +305 -299
  295. package/src/tools/schemas/outputs/__tests__/categoryOutputs.test.ts +431 -430
  296. package/src/tools/schemas/outputs/__tests__/comparisonOutputs.test.ts +510 -495
  297. package/src/tools/schemas/outputs/__tests__/dateValidation.test.ts +179 -153
  298. package/src/tools/schemas/outputs/__tests__/discrepancyDirection.test.ts +293 -254
  299. package/src/tools/schemas/outputs/__tests__/monthOutputs.test.ts +457 -457
  300. package/src/tools/schemas/outputs/__tests__/payeeOutputs.test.ts +362 -356
  301. package/src/tools/schemas/outputs/__tests__/reconciliationOutputs.test.ts +402 -399
  302. package/src/tools/schemas/outputs/__tests__/transactionMutationSchemas.test.ts +225 -211
  303. package/src/tools/schemas/outputs/__tests__/transactionOutputs.test.ts +457 -454
  304. package/src/tools/schemas/outputs/__tests__/utilityOutputs.test.ts +316 -315
  305. package/src/tools/schemas/outputs/accountOutputs.ts +40 -34
  306. package/src/tools/schemas/outputs/budgetOutputs.ts +24 -19
  307. package/src/tools/schemas/outputs/categoryOutputs.ts +76 -56
  308. package/src/tools/schemas/outputs/comparisonOutputs.ts +192 -169
  309. package/src/tools/schemas/outputs/index.ts +163 -163
  310. package/src/tools/schemas/outputs/monthOutputs.ts +95 -80
  311. package/src/tools/schemas/outputs/payeeOutputs.ts +18 -18
  312. package/src/tools/schemas/outputs/reconciliationOutputs.ts +386 -373
  313. package/src/tools/schemas/outputs/transactionMutationOutputs.ts +259 -231
  314. package/src/tools/schemas/outputs/transactionOutputs.ts +81 -71
  315. package/src/tools/schemas/outputs/utilityOutputs.ts +90 -84
  316. package/src/tools/schemas/shared/commonOutputs.ts +27 -19
  317. package/src/tools/toolCategories.ts +114 -114
  318. package/src/tools/transactionReadTools.ts +327 -0
  319. package/src/tools/transactionSchemas.ts +484 -0
  320. package/src/tools/transactionTools.ts +107 -2990
  321. package/src/tools/transactionUtils.ts +621 -0
  322. package/src/tools/transactionWriteTools.ts +2110 -0
  323. package/src/tools/utilityTools.ts +46 -41
  324. package/src/types/CLAUDE.md +477 -0
  325. package/src/types/__tests__/index.test.ts +51 -51
  326. package/src/types/index.ts +43 -39
  327. package/src/types/integration-tests.d.ts +26 -26
  328. package/src/types/reconciliation.ts +29 -29
  329. package/src/types/toolAnnotations.ts +30 -30
  330. package/src/types/toolRegistration.ts +43 -32
  331. package/src/utils/CLAUDE.md +508 -0
  332. package/src/utils/__tests__/dateUtils.test.ts +174 -168
  333. package/src/utils/__tests__/money.test.ts +193 -187
  334. package/src/utils/amountUtils.ts +5 -5
  335. package/src/utils/baseError.ts +5 -5
  336. package/src/utils/dateUtils.ts +29 -26
  337. package/src/utils/errors.ts +14 -14
  338. package/src/utils/money.ts +66 -52
  339. package/src/utils/validationError.ts +1 -1
  340. package/tsconfig.json +29 -29
  341. package/tsconfig.prod.json +16 -16
  342. package/vitest-reporters/split-json-reporter.ts +247 -204
  343. package/vitest.config.ts +99 -95
  344. package/.prettierignore +0 -10
  345. package/.prettierrc.json +0 -10
  346. package/eslint.config.js +0 -49
@@ -1,7 +1,7 @@
1
- import { cacheManager } from '../server/cacheManager.js';
2
- import { DeltaCache } from '../server/deltaCache.js';
3
- import { ServerKnowledgeStore } from '../server/serverKnowledgeStore.js';
4
- import { DeltaFetcher } from './deltaFetcher.js';
1
+ import { cacheManager } from "../server/cacheManager.js";
2
+ import { DeltaCache } from "../server/deltaCache.js";
3
+ import { ServerKnowledgeStore } from "../server/serverKnowledgeStore.js";
4
+ import { DeltaFetcher } from "./deltaFetcher.js";
5
5
  let sharedDeltaContext;
6
6
  export function setSharedDeltaSupport(options) {
7
7
  if (!options) {
@@ -39,7 +39,9 @@ function resolveSharedDeltaFetcher(ynabAPI) {
39
39
  if (sharedDeltaContext?.deltaFetcher) {
40
40
  return sharedDeltaContext.deltaFetcher;
41
41
  }
42
- const context = sharedDeltaContext ? { ...sharedDeltaContext } : {};
42
+ const context = sharedDeltaContext
43
+ ? { ...sharedDeltaContext }
44
+ : {};
43
45
  if (context.manuallyConfigured === undefined) {
44
46
  context.manuallyConfigured = false;
45
47
  }
@@ -59,37 +61,37 @@ function resolveSharedDeltaFetcher(ynabAPI) {
59
61
  }
60
62
  function isDeltaFetcher(value) {
61
63
  return (value !== null &&
62
- typeof value === 'object' &&
64
+ typeof value === "object" &&
63
65
  value instanceof DeltaFetcher &&
64
- typeof value.fetchAccounts === 'function' &&
65
- typeof value.fetchCategories === 'function');
66
+ typeof value.fetchAccounts === "function" &&
67
+ typeof value.fetchCategories === "function");
66
68
  }
67
69
  function isDeltaCache(value) {
68
70
  return (value !== null &&
69
- typeof value === 'object' &&
71
+ typeof value === "object" &&
70
72
  value instanceof DeltaCache &&
71
- typeof value.fetchWithDelta === 'function');
73
+ typeof value.fetchWithDelta === "function");
72
74
  }
73
75
  function isServerKnowledgeStore(value) {
74
76
  return (value !== null &&
75
- typeof value === 'object' &&
77
+ typeof value === "object" &&
76
78
  value instanceof ServerKnowledgeStore &&
77
- typeof value.get === 'function' &&
78
- typeof value.update === 'function');
79
+ typeof value.get === "function" &&
80
+ typeof value.update === "function");
79
81
  }
80
82
  function isParamsObject(value) {
81
83
  return (value !== null &&
82
- typeof value === 'object' &&
84
+ typeof value === "object" &&
83
85
  !Array.isArray(value) &&
84
86
  (value.constructor === Object || value.constructor === undefined));
85
87
  }
86
88
  function getTypeName(value) {
87
89
  if (value === null)
88
- return 'null';
90
+ return "null";
89
91
  if (value === undefined)
90
- return 'undefined';
92
+ return "undefined";
91
93
  const type = typeof value;
92
- if (type !== 'object')
94
+ if (type !== "object")
93
95
  return type;
94
96
  const constructorName = value.constructor?.name;
95
97
  return constructorName ? `${type} (${constructorName})` : type;
@@ -97,12 +99,10 @@ function getTypeName(value) {
97
99
  export function resolveDeltaFetcherArgs(ynabAPI, deltaFetcherOrParams, maybeParams) {
98
100
  if (maybeParams !== undefined) {
99
101
  if (!isDeltaFetcher(deltaFetcherOrParams)) {
100
- throw new Error('resolveDeltaFetcherArgs: When providing 3 arguments, the second argument must be a DeltaFetcher instance. ' +
101
- `Got: ${getTypeName(deltaFetcherOrParams)}`);
102
+ throw new Error(`resolveDeltaFetcherArgs: When providing 3 arguments, the second argument must be a DeltaFetcher instance. Got: ${getTypeName(deltaFetcherOrParams)}`);
102
103
  }
103
104
  if (!isParamsObject(maybeParams)) {
104
- throw new Error('resolveDeltaFetcherArgs: When providing 3 arguments, the third argument must be a params object. ' +
105
- `Got: ${getTypeName(maybeParams)}`);
105
+ throw new Error(`resolveDeltaFetcherArgs: When providing 3 arguments, the third argument must be a params object. Got: ${getTypeName(maybeParams)}`);
106
106
  }
107
107
  return {
108
108
  deltaFetcher: deltaFetcherOrParams,
@@ -110,12 +110,11 @@ export function resolveDeltaFetcherArgs(ynabAPI, deltaFetcherOrParams, maybePara
110
110
  };
111
111
  }
112
112
  if (isDeltaFetcher(deltaFetcherOrParams)) {
113
- throw new Error('resolveDeltaFetcherArgs: When providing 2 arguments, the second argument must be a params object, not a DeltaFetcher. ' +
114
- 'To use a custom DeltaFetcher, provide all 3 arguments: (ynabAPI, deltaFetcher, params)');
113
+ throw new Error("resolveDeltaFetcherArgs: When providing 2 arguments, the second argument must be a params object, not a DeltaFetcher. " +
114
+ "To use a custom DeltaFetcher, provide all 3 arguments: (ynabAPI, deltaFetcher, params)");
115
115
  }
116
116
  if (!isParamsObject(deltaFetcherOrParams)) {
117
- throw new Error('resolveDeltaFetcherArgs: When providing 2 arguments, the second argument must be a params object. ' +
118
- `Got: ${getTypeName(deltaFetcherOrParams)}`);
117
+ throw new Error(`resolveDeltaFetcherArgs: When providing 2 arguments, the second argument must be a params object. Got: ${getTypeName(deltaFetcherOrParams)}`);
119
118
  }
120
119
  return {
121
120
  deltaFetcher: resolveSharedDeltaFetcher(ynabAPI),
@@ -125,16 +124,13 @@ export function resolveDeltaFetcherArgs(ynabAPI, deltaFetcherOrParams, maybePara
125
124
  export function resolveDeltaWriteArgs(deltaCacheOrParams, knowledgeStoreOrParams, maybeParams) {
126
125
  if (maybeParams !== undefined) {
127
126
  if (!isDeltaCache(deltaCacheOrParams)) {
128
- throw new Error('resolveDeltaWriteArgs: When providing 3 arguments, the first argument must be a DeltaCache instance. ' +
129
- `Got: ${getTypeName(deltaCacheOrParams)}`);
127
+ throw new Error(`resolveDeltaWriteArgs: When providing 3 arguments, the first argument must be a DeltaCache instance. Got: ${getTypeName(deltaCacheOrParams)}`);
130
128
  }
131
129
  if (!isServerKnowledgeStore(knowledgeStoreOrParams)) {
132
- throw new Error('resolveDeltaWriteArgs: When providing 3 arguments, the second argument must be a ServerKnowledgeStore instance. ' +
133
- `Got: ${getTypeName(knowledgeStoreOrParams)}`);
130
+ throw new Error(`resolveDeltaWriteArgs: When providing 3 arguments, the second argument must be a ServerKnowledgeStore instance. Got: ${getTypeName(knowledgeStoreOrParams)}`);
134
131
  }
135
132
  if (!isParamsObject(maybeParams)) {
136
- throw new Error('resolveDeltaWriteArgs: When providing 3 arguments, the third argument must be a params object. ' +
137
- `Got: ${getTypeName(maybeParams)}`);
133
+ throw new Error(`resolveDeltaWriteArgs: When providing 3 arguments, the third argument must be a params object. Got: ${getTypeName(maybeParams)}`);
138
134
  }
139
135
  return {
140
136
  deltaCache: deltaCacheOrParams,
@@ -146,25 +142,23 @@ export function resolveDeltaWriteArgs(deltaCacheOrParams, knowledgeStoreOrParams
146
142
  const isKnowledgeStore = isServerKnowledgeStore(knowledgeStoreOrParams);
147
143
  const isParams = isParamsObject(knowledgeStoreOrParams);
148
144
  if (!isKnowledgeStore && !isParams) {
149
- throw new Error('resolveDeltaWriteArgs: When providing 2 arguments, the second argument must be either a ServerKnowledgeStore or a params object. ' +
150
- `Got: ${getTypeName(knowledgeStoreOrParams)}`);
145
+ throw new Error(`resolveDeltaWriteArgs: When providing 2 arguments, the second argument must be either a ServerKnowledgeStore or a params object. Got: ${getTypeName(knowledgeStoreOrParams)}`);
151
146
  }
152
147
  if (isParams) {
153
- throw new Error('resolveDeltaWriteArgs: Invalid argument combination. When providing 2 arguments where the second is a params object, ' +
154
- 'this is ambiguous. Either provide 1 argument (params only) or 3 arguments (deltaCache, knowledgeStore, params).');
148
+ throw new Error("resolveDeltaWriteArgs: Invalid argument combination. When providing 2 arguments where the second is a params object, " +
149
+ "this is ambiguous. Either provide 1 argument (params only) or 3 arguments (deltaCache, knowledgeStore, params).");
155
150
  }
156
151
  if (isKnowledgeStore) {
157
- throw new Error('resolveDeltaWriteArgs: When providing DeltaCache and ServerKnowledgeStore, you must also provide params as the third argument. ' +
158
- 'Got 2 arguments, expected 3: (deltaCache, knowledgeStore, params)');
152
+ throw new Error("resolveDeltaWriteArgs: When providing DeltaCache and ServerKnowledgeStore, you must also provide params as the third argument. " +
153
+ "Got 2 arguments, expected 3: (deltaCache, knowledgeStore, params)");
159
154
  }
160
155
  }
161
156
  if (isDeltaCache(deltaCacheOrParams)) {
162
- throw new Error('resolveDeltaWriteArgs: When providing only 1 argument, it must be a params object, not a DeltaCache. ' +
163
- 'To use a custom DeltaCache, provide all 3 arguments: (deltaCache, knowledgeStore, params)');
157
+ throw new Error("resolveDeltaWriteArgs: When providing only 1 argument, it must be a params object, not a DeltaCache. " +
158
+ "To use a custom DeltaCache, provide all 3 arguments: (deltaCache, knowledgeStore, params)");
164
159
  }
165
160
  if (!isParamsObject(deltaCacheOrParams)) {
166
- throw new Error('resolveDeltaWriteArgs: When providing only 1 argument, it must be a params object. ' +
167
- `Got: ${getTypeName(deltaCacheOrParams)}`);
161
+ throw new Error(`resolveDeltaWriteArgs: When providing only 1 argument, it must be a params object. Got: ${getTypeName(deltaCacheOrParams)}`);
168
162
  }
169
163
  if (sharedDeltaContext) {
170
164
  if (!sharedDeltaContext.knowledgeStore) {
@@ -1,6 +1,7 @@
1
- import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
- import * as ynab from 'ynab';
3
- import { z } from 'zod/v4';
1
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ import type * as ynab from "ynab";
3
+ import { z } from "zod/v4";
4
+ import type { ErrorHandler } from "../server/errorHandler.js";
4
5
  export declare const ExportTransactionsSchema: z.ZodObject<{
5
6
  budget_id: z.ZodString;
6
7
  account_id: z.ZodOptional<z.ZodString>;
@@ -14,4 +15,4 @@ export declare const ExportTransactionsSchema: z.ZodObject<{
14
15
  minimal: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
15
16
  }, z.core.$strict>;
16
17
  export type ExportTransactionsParams = z.infer<typeof ExportTransactionsSchema>;
17
- export declare function handleExportTransactions(ynabAPI: ynab.API, params: ExportTransactionsParams): Promise<CallToolResult>;
18
+ export declare function handleExportTransactions(ynabAPI: ynab.API, params: ExportTransactionsParams, errorHandler?: ErrorHandler): Promise<CallToolResult>;
@@ -1,30 +1,32 @@
1
- import { z } from 'zod/v4';
2
- import { withToolErrorHandling } from '../types/index.js';
3
- import { responseFormatter } from '../server/responseFormatter.js';
4
- import { writeFileSync, mkdirSync } from 'fs';
5
- import { format } from 'date-fns';
6
- import { join, resolve } from 'path';
7
- import { homedir } from 'os';
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join, resolve } from "node:path";
4
+ import { format } from "date-fns";
5
+ import { z } from "zod/v4";
6
+ import { responseFormatter } from "../server/responseFormatter.js";
7
+ import { withToolErrorHandling } from "../types/index.js";
8
8
  export const ExportTransactionsSchema = z
9
9
  .object({
10
- budget_id: z.string().min(1, 'Budget ID is required'),
10
+ budget_id: z.string().min(1, "Budget ID is required"),
11
11
  account_id: z.string().optional(),
12
12
  category_id: z.string().optional(),
13
13
  since_date: z
14
14
  .string()
15
- .regex(/^\d{4}-\d{2}-\d{2}$/, 'Date must be in ISO format (YYYY-MM-DD)')
15
+ .regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in ISO format (YYYY-MM-DD)")
16
16
  .optional(),
17
- type: z.enum(['uncategorized', 'unapproved']).optional(),
17
+ type: z.enum(["uncategorized", "unapproved"]).optional(),
18
18
  filename: z.string().optional(),
19
19
  minimal: z.boolean().optional().default(true),
20
20
  })
21
21
  .strict();
22
22
  function generateExportFilename(params, transactionCount) {
23
23
  if (params.filename) {
24
- return params.filename.endsWith('.json') ? params.filename : `${params.filename}.json`;
24
+ return params.filename.endsWith(".json")
25
+ ? params.filename
26
+ : `${params.filename}.json`;
25
27
  }
26
- const timestamp = format(new Date(), 'yyyy-MM-dd_HH-mm-ss');
27
- let description = 'transactions';
28
+ const timestamp = format(new Date(), "yyyy-MM-dd_HH-mm-ss");
29
+ let description = "transactions";
28
30
  const filters = [];
29
31
  if (params.since_date) {
30
32
  filters.push(`since_${params.since_date}`);
@@ -39,10 +41,10 @@ function generateExportFilename(params, transactionCount) {
39
41
  filters.push(params.type);
40
42
  }
41
43
  if (params.minimal !== false) {
42
- filters.push('minimal');
44
+ filters.push("minimal");
43
45
  }
44
46
  if (filters.length > 0) {
45
- description = filters.join('_');
47
+ description = filters.join("_");
46
48
  }
47
49
  return `ynab_${description}_${transactionCount}items_${timestamp}.json`;
48
50
  }
@@ -50,28 +52,28 @@ function getDefaultExportPath() {
50
52
  const platform = process.platform;
51
53
  const home = homedir();
52
54
  switch (platform) {
53
- case 'win32':
54
- return join(home, 'Downloads');
55
- case 'darwin':
56
- return join(home, 'Downloads');
57
- case 'linux':
58
- case 'freebsd':
59
- case 'openbsd':
60
- case 'sunos':
61
- case 'aix':
62
- return process.env['XDG_DOCUMENTS_DIR'] || join(home, 'Documents');
55
+ case "win32":
56
+ return join(home, "Downloads");
57
+ case "darwin":
58
+ return join(home, "Downloads");
59
+ case "linux":
60
+ case "freebsd":
61
+ case "openbsd":
62
+ case "sunos":
63
+ case "aix":
64
+ return process.env["XDG_DOCUMENTS_DIR"] || join(home, "Documents");
63
65
  default:
64
- return join(home, 'Downloads');
66
+ return join(home, "Downloads");
65
67
  }
66
68
  }
67
69
  function getExportPath() {
68
- const exportPath = process.env['YNAB_EXPORT_PATH']?.trim();
70
+ const exportPath = process.env["YNAB_EXPORT_PATH"]?.trim();
69
71
  let targetPath;
70
72
  if (!exportPath) {
71
73
  targetPath = getDefaultExportPath();
72
74
  }
73
75
  else {
74
- if (exportPath.startsWith('~/')) {
76
+ if (exportPath.startsWith("~/")) {
75
77
  targetPath = join(homedir(), exportPath.slice(2));
76
78
  }
77
79
  else {
@@ -89,13 +91,13 @@ function getExportPath() {
89
91
  return fallbackPath;
90
92
  }
91
93
  catch (fallbackError) {
92
- console.warn('Failed to create default folder, using current directory:', fallbackError);
94
+ console.warn("Failed to create default folder, using current directory:", fallbackError);
93
95
  return process.cwd();
94
96
  }
95
97
  }
96
98
  return targetPath;
97
99
  }
98
- export async function handleExportTransactions(ynabAPI, params) {
100
+ export async function handleExportTransactions(ynabAPI, params, errorHandler) {
99
101
  return await withToolErrorHandling(async () => {
100
102
  let response;
101
103
  if (params.account_id) {
@@ -134,45 +136,45 @@ export async function handleExportTransactions(ynabAPI, params) {
134
136
  cleared: transaction.cleared,
135
137
  };
136
138
  }
137
- else {
138
- return {
139
- id: transaction.id,
140
- date: transaction.date,
141
- amount: transaction.amount,
142
- memo: transaction.memo,
143
- cleared: transaction.cleared,
144
- approved: transaction.approved,
145
- flag_color: transaction.flag_color,
146
- account_id: transaction.account_id,
147
- payee_id: transaction.payee_id,
148
- category_id: transaction.category_id,
149
- transfer_account_id: transaction.transfer_account_id,
150
- transfer_transaction_id: transaction.transfer_transaction_id,
151
- matched_transaction_id: transaction.matched_transaction_id,
152
- import_id: transaction.import_id,
153
- deleted: transaction.deleted,
154
- account_name: transaction.account_name,
155
- payee_name: transaction.payee_name,
156
- category_name: transaction.category_name,
157
- };
158
- }
139
+ return {
140
+ id: transaction.id,
141
+ date: transaction.date,
142
+ amount: transaction.amount,
143
+ memo: transaction.memo,
144
+ cleared: transaction.cleared,
145
+ approved: transaction.approved,
146
+ flag_color: transaction.flag_color,
147
+ account_id: transaction.account_id,
148
+ payee_id: transaction.payee_id,
149
+ category_id: transaction.category_id,
150
+ transfer_account_id: transaction.transfer_account_id,
151
+ transfer_transaction_id: transaction.transfer_transaction_id,
152
+ matched_transaction_id: transaction.matched_transaction_id,
153
+ import_id: transaction.import_id,
154
+ deleted: transaction.deleted,
155
+ account_name: transaction.account_name,
156
+ payee_name: transaction.payee_name,
157
+ category_name: transaction.category_name,
158
+ };
159
159
  }),
160
160
  };
161
- writeFileSync(fullPath, JSON.stringify(exportData, null, 2), 'utf-8');
161
+ writeFileSync(fullPath, JSON.stringify(exportData, null, 2), "utf-8");
162
162
  const previewCount = Math.min(10, transactions.length);
163
163
  const preview = transactions.slice(0, previewCount);
164
164
  return {
165
165
  content: [
166
166
  {
167
- type: 'text',
167
+ type: "text",
168
168
  text: responseFormatter.format({
169
- message: `Successfully exported ${transactions.length} transactions${params.minimal !== false ? ' (minimal fields)' : ' (full fields)'}`,
169
+ message: `Successfully exported ${transactions.length} transactions${params.minimal !== false ? " (minimal fields)" : " (full fields)"}`,
170
170
  filename: filename,
171
171
  full_path: fullPath,
172
172
  export_directory: exportDir,
173
- export_mode: params.minimal !== false ? 'minimal' : 'full',
174
- minimal_fields: params.minimal !== false ? 'id, date, amount, payee_name, cleared' : null,
175
- filename_explanation: 'Filename format: ynab_{filters}_{count}items_{timestamp}.json - identifies what data was exported, when, and how many transactions',
173
+ export_mode: params.minimal !== false ? "minimal" : "full",
174
+ minimal_fields: params.minimal !== false
175
+ ? "id, date, amount, payee_name, cleared"
176
+ : null,
177
+ filename_explanation: "Filename format: ynab_{filters}_{count}items_{timestamp}.json - identifies what data was exported, when, and how many transactions",
176
178
  preview_count: previewCount,
177
179
  total_count: transactions.length,
178
180
  preview_transactions: preview.map((transaction) => ({
@@ -187,5 +189,5 @@ export async function handleExportTransactions(ynabAPI, params) {
187
189
  },
188
190
  ],
189
191
  };
190
- }, 'ynab:export_transactions', 'exporting transactions');
192
+ }, "ynab:export_transactions", "exporting transactions", errorHandler);
191
193
  }
@@ -1,8 +1,9 @@
1
- import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
- import * as ynab from 'ynab';
3
- import { z } from 'zod/v4';
4
- import type { DeltaFetcher } from './deltaFetcher.js';
5
- import type { ToolFactory } from '../types/toolRegistration.js';
1
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ import type * as ynab from "ynab";
3
+ import { z } from "zod/v4";
4
+ import type { ErrorHandler } from "../server/errorHandler.js";
5
+ import type { ToolFactory } from "../types/toolRegistration.js";
6
+ import type { DeltaFetcher } from "./deltaFetcher.js";
6
7
  export declare const GetMonthSchema: z.ZodObject<{
7
8
  budget_id: z.ZodString;
8
9
  month: z.ZodString;
@@ -12,7 +13,7 @@ export declare const ListMonthsSchema: z.ZodObject<{
12
13
  budget_id: z.ZodString;
13
14
  }, z.core.$strict>;
14
15
  export type ListMonthsParams = z.infer<typeof ListMonthsSchema>;
15
- export declare function handleGetMonth(ynabAPI: ynab.API, params: GetMonthParams): Promise<CallToolResult>;
16
+ export declare function handleGetMonth(ynabAPI: ynab.API, params: GetMonthParams, errorHandler?: ErrorHandler): Promise<CallToolResult>;
16
17
  export declare function handleListMonths(ynabAPI: ynab.API, deltaFetcher: DeltaFetcher, params: ListMonthsParams): Promise<CallToolResult>;
17
18
  export declare function handleListMonths(ynabAPI: ynab.API, params: ListMonthsParams): Promise<CallToolResult>;
18
19
  export declare const registerMonthTools: ToolFactory;
@@ -1,26 +1,28 @@
1
- import { z } from 'zod/v4';
2
- import { withToolErrorHandling } from '../types/index.js';
3
- import { responseFormatter } from '../server/responseFormatter.js';
4
- import { milliunitsToAmount } from '../utils/amountUtils.js';
5
- import { cacheManager, CACHE_TTLS, CacheManager } from '../server/cacheManager.js';
6
- import { CacheKeys } from '../server/cacheKeys.js';
7
- import { resolveDeltaFetcherArgs } from './deltaSupport.js';
8
- import { createAdapters, createBudgetResolver } from './adapters.js';
9
- import { ToolAnnotationPresets } from './toolCategories.js';
1
+ import { z } from "zod/v4";
2
+ import { CacheKeys } from "../server/cacheKeys.js";
3
+ import { CACHE_TTLS, CacheManager, cacheManager, } from "../server/cacheManager.js";
4
+ import { responseFormatter } from "../server/responseFormatter.js";
5
+ import { withToolErrorHandling } from "../types/index.js";
6
+ import { milliunitsToAmount } from "../utils/amountUtils.js";
7
+ import { createAdapters, createBudgetResolver } from "./adapters.js";
8
+ import { resolveDeltaFetcherArgs } from "./deltaSupport.js";
9
+ import { ToolAnnotationPresets } from "./toolCategories.js";
10
10
  export const GetMonthSchema = z
11
11
  .object({
12
- budget_id: z.string().min(1, 'Budget ID is required'),
13
- month: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, 'Month must be in YYYY-MM-DD format'),
12
+ budget_id: z.string().min(1, "Budget ID is required"),
13
+ month: z
14
+ .string()
15
+ .regex(/^\d{4}-\d{2}-\d{2}$/, "Month must be in YYYY-MM-DD format"),
14
16
  })
15
17
  .strict();
16
18
  export const ListMonthsSchema = z
17
19
  .object({
18
- budget_id: z.string().min(1, 'Budget ID is required'),
20
+ budget_id: z.string().min(1, "Budget ID is required"),
19
21
  })
20
22
  .strict();
21
- export async function handleGetMonth(ynabAPI, params) {
23
+ export async function handleGetMonth(ynabAPI, params, errorHandler) {
22
24
  return await withToolErrorHandling(async () => {
23
- const cacheKey = CacheManager.generateKey(CacheKeys.MONTHS, 'get', params.budget_id, params.month);
25
+ const cacheKey = CacheManager.generateKey(CacheKeys.MONTHS, "get", params.budget_id, params.month);
24
26
  const wasCached = cacheManager.has(cacheKey);
25
27
  const month = await cacheManager.wrap(cacheKey, {
26
28
  ttl: CACHE_TTLS.MONTHS,
@@ -32,7 +34,7 @@ export async function handleGetMonth(ynabAPI, params) {
32
34
  return {
33
35
  content: [
34
36
  {
35
- type: 'text',
37
+ type: "text",
36
38
  text: responseFormatter.format({
37
39
  month: {
38
40
  month: month.month,
@@ -68,15 +70,15 @@ export async function handleGetMonth(ynabAPI, params) {
68
70
  },
69
71
  cached: wasCached,
70
72
  cache_info: wasCached
71
- ? 'Data retrieved from cache for improved performance'
72
- : 'Fresh data retrieved from YNAB API',
73
+ ? "Data retrieved from cache for improved performance"
74
+ : "Fresh data retrieved from YNAB API",
73
75
  }),
74
76
  },
75
77
  ],
76
78
  };
77
- }, 'ynab:get_month', 'getting month data');
79
+ }, "ynab:get_month", "getting month data", errorHandler);
78
80
  }
79
- export async function handleListMonths(ynabAPI, deltaFetcherOrParams, maybeParams) {
81
+ export async function handleListMonths(ynabAPI, deltaFetcherOrParams, maybeParams, errorHandler) {
80
82
  const { deltaFetcher, params } = resolveDeltaFetcherArgs(ynabAPI, deltaFetcherOrParams, maybeParams);
81
83
  return await withToolErrorHandling(async () => {
82
84
  const result = await deltaFetcher.fetchMonths(params.budget_id);
@@ -86,7 +88,7 @@ export async function handleListMonths(ynabAPI, deltaFetcherOrParams, maybeParam
86
88
  return {
87
89
  content: [
88
90
  {
89
- type: 'text',
91
+ type: "text",
90
92
  text: responseFormatter.format({
91
93
  months: months.map((month) => ({
92
94
  month: month.month,
@@ -100,40 +102,40 @@ export async function handleListMonths(ynabAPI, deltaFetcherOrParams, maybeParam
100
102
  })),
101
103
  cached: wasCached,
102
104
  cache_info: wasCached
103
- ? `Data retrieved from cache for improved performance${usedDelta ? ' (delta merge applied)' : ''}`
104
- : 'Fresh data retrieved from YNAB API',
105
+ ? `Data retrieved from cache for improved performance${usedDelta ? " (delta merge applied)" : ""}`
106
+ : "Fresh data retrieved from YNAB API",
105
107
  }),
106
108
  },
107
109
  ],
108
110
  };
109
- }, 'ynab:list_months', 'listing months');
111
+ }, "ynab:list_months", "listing months", errorHandler);
110
112
  }
111
113
  export const registerMonthTools = (registry, context) => {
112
114
  const { adapt, adaptWithDelta } = createAdapters(context);
113
115
  const budgetResolver = createBudgetResolver(context);
114
116
  registry.register({
115
- name: 'get_month',
116
- description: 'Get budget data for a specific month',
117
+ name: "get_month",
118
+ description: "Get budget data for a specific month",
117
119
  inputSchema: GetMonthSchema,
118
120
  handler: adapt(handleGetMonth),
119
121
  defaultArgumentResolver: budgetResolver(),
120
122
  metadata: {
121
123
  annotations: {
122
124
  ...ToolAnnotationPresets.READ_ONLY_EXTERNAL,
123
- title: 'YNAB: Get Month Details',
125
+ title: "YNAB: Get Month Details",
124
126
  },
125
127
  },
126
128
  });
127
129
  registry.register({
128
- name: 'list_months',
129
- description: 'List all months summary data for a budget',
130
+ name: "list_months",
131
+ description: "List all months summary data for a budget",
130
132
  inputSchema: ListMonthsSchema,
131
133
  handler: adaptWithDelta(handleListMonths),
132
134
  defaultArgumentResolver: budgetResolver(),
133
135
  metadata: {
134
136
  annotations: {
135
137
  ...ToolAnnotationPresets.READ_ONLY_EXTERNAL,
136
- title: 'YNAB: List Months',
138
+ title: "YNAB: List Months",
137
139
  },
138
140
  },
139
141
  });
@@ -1,8 +1,9 @@
1
- import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
- import * as ynab from 'ynab';
3
- import { z } from 'zod/v4';
4
- import type { DeltaFetcher } from './deltaFetcher.js';
5
- import type { ToolFactory } from '../types/toolRegistration.js';
1
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ import type * as ynab from "ynab";
3
+ import { z } from "zod/v4";
4
+ import type { ErrorHandler } from "../server/errorHandler.js";
5
+ import type { ToolFactory } from "../types/toolRegistration.js";
6
+ import type { DeltaFetcher } from "./deltaFetcher.js";
6
7
  export declare const ListPayeesSchema: z.ZodObject<{
7
8
  budget_id: z.ZodString;
8
9
  limit: z.ZodOptional<z.ZodNumber>;
@@ -15,5 +16,5 @@ export declare const GetPayeeSchema: z.ZodObject<{
15
16
  export type GetPayeeParams = z.infer<typeof GetPayeeSchema>;
16
17
  export declare function handleListPayees(ynabAPI: ynab.API, deltaFetcher: DeltaFetcher, params: ListPayeesParams): Promise<CallToolResult>;
17
18
  export declare function handleListPayees(ynabAPI: ynab.API, params: ListPayeesParams): Promise<CallToolResult>;
18
- export declare function handleGetPayee(ynabAPI: ynab.API, params: GetPayeeParams): Promise<CallToolResult>;
19
+ export declare function handleGetPayee(ynabAPI: ynab.API, params: GetPayeeParams, errorHandler?: ErrorHandler): Promise<CallToolResult>;
19
20
  export declare const registerPayeeTools: ToolFactory;