@dizzlkheinz/ynab-mcpb 0.18.4 → 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 (343) hide show
  1. package/CLAUDE.md +87 -8
  2. package/bin/ynab-mcp-server.cjs +2 -2
  3. package/bin/ynab-mcp-server.js +3 -3
  4. package/biome.json +39 -0
  5. package/dist/bundle/index.cjs +67 -67
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.js +27 -27
  8. package/dist/server/YNABMCPServer.d.ts +3 -4
  9. package/dist/server/YNABMCPServer.js +111 -116
  10. package/dist/server/budgetResolver.d.ts +6 -5
  11. package/dist/server/budgetResolver.js +46 -36
  12. package/dist/server/cacheKeys.js +6 -6
  13. package/dist/server/cacheManager.js +14 -11
  14. package/dist/server/completions.d.ts +2 -2
  15. package/dist/server/completions.js +20 -15
  16. package/dist/server/config.d.ts +10 -5
  17. package/dist/server/config.js +24 -7
  18. package/dist/server/deltaCache.d.ts +2 -2
  19. package/dist/server/deltaCache.js +22 -16
  20. package/dist/server/deltaCache.merge.d.ts +2 -2
  21. package/dist/server/diagnostics.d.ts +4 -4
  22. package/dist/server/diagnostics.js +38 -32
  23. package/dist/server/errorHandler.d.ts +5 -12
  24. package/dist/server/errorHandler.js +219 -217
  25. package/dist/server/prompts.d.ts +2 -2
  26. package/dist/server/prompts.js +45 -45
  27. package/dist/server/rateLimiter.js +4 -4
  28. package/dist/server/requestLogger.d.ts +1 -1
  29. package/dist/server/requestLogger.js +40 -35
  30. package/dist/server/resources.d.ts +3 -3
  31. package/dist/server/resources.js +55 -52
  32. package/dist/server/responseFormatter.js +6 -6
  33. package/dist/server/securityMiddleware.d.ts +2 -2
  34. package/dist/server/securityMiddleware.js +22 -20
  35. package/dist/server/serverKnowledgeStore.js +1 -1
  36. package/dist/server/toolRegistry.d.ts +3 -3
  37. package/dist/server/toolRegistry.js +47 -40
  38. package/dist/tools/__tests__/deltaTestUtils.d.ts +3 -3
  39. package/dist/tools/__tests__/deltaTestUtils.js +2 -2
  40. package/dist/tools/accountTools.d.ts +9 -8
  41. package/dist/tools/accountTools.js +47 -47
  42. package/dist/tools/adapters.d.ts +13 -8
  43. package/dist/tools/adapters.js +21 -11
  44. package/dist/tools/budgetTools.d.ts +8 -7
  45. package/dist/tools/budgetTools.js +22 -22
  46. package/dist/tools/categoryTools.d.ts +9 -8
  47. package/dist/tools/categoryTools.js +68 -59
  48. package/dist/tools/compareTransactions/formatter.d.ts +3 -3
  49. package/dist/tools/compareTransactions/formatter.js +9 -9
  50. package/dist/tools/compareTransactions/index.d.ts +6 -6
  51. package/dist/tools/compareTransactions/index.js +58 -43
  52. package/dist/tools/compareTransactions/matcher.d.ts +1 -1
  53. package/dist/tools/compareTransactions/matcher.js +28 -15
  54. package/dist/tools/compareTransactions/parser.d.ts +2 -2
  55. package/dist/tools/compareTransactions/parser.js +144 -138
  56. package/dist/tools/compareTransactions/types.d.ts +4 -4
  57. package/dist/tools/compareTransactions.d.ts +1 -1
  58. package/dist/tools/compareTransactions.js +1 -1
  59. package/dist/tools/deltaFetcher.d.ts +2 -2
  60. package/dist/tools/deltaFetcher.js +16 -15
  61. package/dist/tools/deltaSupport.d.ts +4 -4
  62. package/dist/tools/deltaSupport.js +35 -41
  63. package/dist/tools/exportTransactions.d.ts +5 -4
  64. package/dist/tools/exportTransactions.js +61 -59
  65. package/dist/tools/monthTools.d.ts +7 -6
  66. package/dist/tools/monthTools.js +31 -29
  67. package/dist/tools/payeeTools.d.ts +7 -6
  68. package/dist/tools/payeeTools.js +28 -28
  69. package/dist/tools/reconcileAdapter.d.ts +2 -2
  70. package/dist/tools/reconcileAdapter.js +19 -12
  71. package/dist/tools/reconciliation/analyzer.d.ts +4 -4
  72. package/dist/tools/reconciliation/analyzer.js +73 -59
  73. package/dist/tools/reconciliation/csvParser.d.ts +3 -3
  74. package/dist/tools/reconciliation/csvParser.js +128 -104
  75. package/dist/tools/reconciliation/executor.d.ts +4 -4
  76. package/dist/tools/reconciliation/executor.js +148 -109
  77. package/dist/tools/reconciliation/index.d.ts +10 -10
  78. package/dist/tools/reconciliation/index.js +96 -83
  79. package/dist/tools/reconciliation/matcher.d.ts +3 -3
  80. package/dist/tools/reconciliation/matcher.js +17 -16
  81. package/dist/tools/reconciliation/payeeNormalizer.js +19 -8
  82. package/dist/tools/reconciliation/recommendationEngine.d.ts +1 -1
  83. package/dist/tools/reconciliation/recommendationEngine.js +40 -40
  84. package/dist/tools/reconciliation/reportFormatter.d.ts +2 -2
  85. package/dist/tools/reconciliation/reportFormatter.js +59 -58
  86. package/dist/tools/reconciliation/signDetector.d.ts +1 -1
  87. package/dist/tools/reconciliation/types.d.ts +16 -16
  88. package/dist/tools/reconciliation/ynabAdapter.d.ts +2 -2
  89. package/dist/tools/schemas/common.d.ts +1 -1
  90. package/dist/tools/schemas/common.js +1 -1
  91. package/dist/tools/schemas/outputs/accountOutputs.d.ts +1 -1
  92. package/dist/tools/schemas/outputs/accountOutputs.js +24 -18
  93. package/dist/tools/schemas/outputs/budgetOutputs.d.ts +1 -1
  94. package/dist/tools/schemas/outputs/budgetOutputs.js +14 -11
  95. package/dist/tools/schemas/outputs/categoryOutputs.d.ts +1 -1
  96. package/dist/tools/schemas/outputs/categoryOutputs.js +49 -29
  97. package/dist/tools/schemas/outputs/comparisonOutputs.d.ts +1 -1
  98. package/dist/tools/schemas/outputs/comparisonOutputs.js +12 -12
  99. package/dist/tools/schemas/outputs/index.d.ts +14 -14
  100. package/dist/tools/schemas/outputs/index.js +14 -14
  101. package/dist/tools/schemas/outputs/monthOutputs.d.ts +1 -1
  102. package/dist/tools/schemas/outputs/monthOutputs.js +56 -41
  103. package/dist/tools/schemas/outputs/payeeOutputs.d.ts +1 -1
  104. package/dist/tools/schemas/outputs/payeeOutputs.js +10 -10
  105. package/dist/tools/schemas/outputs/reconciliationOutputs.d.ts +2 -2
  106. package/dist/tools/schemas/outputs/reconciliationOutputs.js +45 -45
  107. package/dist/tools/schemas/outputs/transactionMutationOutputs.d.ts +1 -1
  108. package/dist/tools/schemas/outputs/transactionMutationOutputs.js +28 -22
  109. package/dist/tools/schemas/outputs/transactionOutputs.d.ts +1 -1
  110. package/dist/tools/schemas/outputs/transactionOutputs.js +43 -35
  111. package/dist/tools/schemas/outputs/utilityOutputs.d.ts +1 -1
  112. package/dist/tools/schemas/outputs/utilityOutputs.js +5 -3
  113. package/dist/tools/schemas/shared/commonOutputs.d.ts +1 -1
  114. package/dist/tools/schemas/shared/commonOutputs.js +15 -9
  115. package/dist/tools/transactionReadTools.d.ts +11 -0
  116. package/dist/tools/transactionReadTools.js +202 -0
  117. package/dist/tools/transactionSchemas.d.ts +7 -7
  118. package/dist/tools/transactionSchemas.js +77 -57
  119. package/dist/tools/transactionTools.d.ts +6 -24
  120. package/dist/tools/transactionTools.js +7 -1499
  121. package/dist/tools/transactionUtils.d.ts +6 -6
  122. package/dist/tools/transactionUtils.js +78 -63
  123. package/dist/tools/transactionWriteTools.d.ts +20 -0
  124. package/dist/tools/transactionWriteTools.js +1342 -0
  125. package/dist/tools/utilityTools.d.ts +5 -4
  126. package/dist/tools/utilityTools.js +11 -11
  127. package/dist/types/index.d.ts +7 -7
  128. package/dist/types/index.js +6 -6
  129. package/dist/types/reconciliation.d.ts +1 -1
  130. package/dist/types/toolRegistration.d.ts +14 -12
  131. package/dist/utils/amountUtils.js +1 -1
  132. package/dist/utils/dateUtils.js +4 -4
  133. package/dist/utils/errors.d.ts +3 -3
  134. package/dist/utils/errors.js +4 -4
  135. package/dist/utils/money.d.ts +2 -2
  136. package/dist/utils/money.js +8 -8
  137. package/dist/utils/validationError.d.ts +1 -1
  138. package/dist/utils/validationError.js +1 -1
  139. package/docs/assets/examples/reconciliation-with-recommendations.json +66 -66
  140. package/docs/assets/schemas/reconciliation-v2.json +360 -336
  141. package/esbuild.config.mjs +53 -50
  142. package/meta.json +12548 -12548
  143. package/package.json +98 -111
  144. package/scripts/analyze-bundle.mjs +33 -30
  145. package/scripts/create-pr-description.js +169 -120
  146. package/scripts/run-all-tests.js +178 -169
  147. package/scripts/run-domain-integration-tests.js +28 -18
  148. package/scripts/run-generate-mcpb.js +19 -17
  149. package/scripts/run-throttled-integration-tests.js +92 -83
  150. package/scripts/test-delta-params.mjs +149 -120
  151. package/scripts/test-recommendations.ts +36 -32
  152. package/scripts/tmpTransaction.ts +80 -43
  153. package/scripts/validate-env.js +98 -91
  154. package/scripts/verify-build.js +78 -76
  155. package/src/__tests__/comprehensive.integration.test.ts +1281 -1154
  156. package/src/__tests__/performance.test.ts +723 -671
  157. package/src/__tests__/setup.ts +442 -395
  158. package/src/__tests__/smoke.e2e.test.ts +41 -39
  159. package/src/__tests__/testRunner.ts +314 -295
  160. package/src/__tests__/testUtils.ts +456 -364
  161. package/src/__tests__/tools/reconciliation/csvParser.integration.test.ts +109 -107
  162. package/src/__tests__/tools/reconciliation/real-world.integration.test.ts +41 -41
  163. package/src/index.ts +68 -59
  164. package/src/server/CLAUDE.md +480 -0
  165. package/src/server/YNABMCPServer.ts +821 -794
  166. package/src/server/__tests__/YNABMCPServer.integration.test.ts +929 -893
  167. package/src/server/__tests__/YNABMCPServer.test.ts +903 -899
  168. package/src/server/__tests__/budgetResolver.test.ts +466 -423
  169. package/src/server/__tests__/cacheManager.test.ts +891 -874
  170. package/src/server/__tests__/completions.integration.test.ts +115 -106
  171. package/src/server/__tests__/completions.test.ts +334 -313
  172. package/src/server/__tests__/config.test.ts +98 -86
  173. package/src/server/__tests__/deltaCache.merge.test.ts +774 -703
  174. package/src/server/__tests__/deltaCache.swr.test.ts +198 -153
  175. package/src/server/__tests__/deltaCache.test.ts +946 -759
  176. package/src/server/__tests__/diagnostics.test.ts +825 -792
  177. package/src/server/__tests__/errorHandler.integration.test.ts +512 -462
  178. package/src/server/__tests__/errorHandler.test.ts +402 -397
  179. package/src/server/__tests__/prompts.test.ts +424 -347
  180. package/src/server/__tests__/rateLimiter.test.ts +313 -309
  181. package/src/server/__tests__/requestLogger.test.ts +443 -403
  182. package/src/server/__tests__/resources.template.test.ts +196 -185
  183. package/src/server/__tests__/resources.test.ts +294 -288
  184. package/src/server/__tests__/security.integration.test.ts +487 -421
  185. package/src/server/__tests__/securityMiddleware.test.ts +519 -444
  186. package/src/server/__tests__/server-startup.integration.test.ts +509 -490
  187. package/src/server/__tests__/serverKnowledgeStore.test.ts +174 -173
  188. package/src/server/__tests__/toolRegistration.test.ts +239 -210
  189. package/src/server/__tests__/toolRegistry.test.ts +907 -845
  190. package/src/server/budgetResolver.ts +221 -181
  191. package/src/server/cacheKeys.ts +6 -6
  192. package/src/server/cacheManager.ts +498 -484
  193. package/src/server/completions.ts +267 -243
  194. package/src/server/config.ts +35 -14
  195. package/src/server/deltaCache.merge.ts +146 -128
  196. package/src/server/deltaCache.ts +352 -309
  197. package/src/server/diagnostics.ts +257 -242
  198. package/src/server/errorHandler.ts +747 -744
  199. package/src/server/prompts.ts +181 -176
  200. package/src/server/rateLimiter.ts +131 -129
  201. package/src/server/requestLogger.ts +350 -322
  202. package/src/server/resources.ts +442 -374
  203. package/src/server/responseFormatter.ts +41 -37
  204. package/src/server/securityMiddleware.ts +223 -205
  205. package/src/server/serverKnowledgeStore.ts +67 -67
  206. package/src/server/toolRegistry.ts +508 -474
  207. package/src/tools/CLAUDE.md +604 -0
  208. package/src/tools/__tests__/accountTools.delta.integration.test.ts +128 -111
  209. package/src/tools/__tests__/accountTools.integration.test.ts +129 -111
  210. package/src/tools/__tests__/accountTools.test.ts +685 -638
  211. package/src/tools/__tests__/adapters.test.ts +142 -108
  212. package/src/tools/__tests__/budgetTools.delta.integration.test.ts +73 -73
  213. package/src/tools/__tests__/budgetTools.integration.test.ts +132 -124
  214. package/src/tools/__tests__/budgetTools.test.ts +442 -413
  215. package/src/tools/__tests__/categoryTools.delta.integration.test.ts +76 -68
  216. package/src/tools/__tests__/categoryTools.integration.test.ts +314 -288
  217. package/src/tools/__tests__/categoryTools.test.ts +656 -625
  218. package/src/tools/__tests__/compareTransactions/formatter.test.ts +535 -462
  219. package/src/tools/__tests__/compareTransactions/index.test.ts +378 -358
  220. package/src/tools/__tests__/compareTransactions/matcher.test.ts +497 -398
  221. package/src/tools/__tests__/compareTransactions/parser.test.ts +765 -747
  222. package/src/tools/__tests__/compareTransactions.test.ts +352 -332
  223. package/src/tools/__tests__/compareTransactions.window.test.ts +150 -146
  224. package/src/tools/__tests__/deltaFetcher.scheduled.integration.test.ts +69 -65
  225. package/src/tools/__tests__/deltaFetcher.test.ts +325 -265
  226. package/src/tools/__tests__/deltaSupport.test.ts +211 -184
  227. package/src/tools/__tests__/deltaTestUtils.ts +37 -33
  228. package/src/tools/__tests__/exportTransactions.test.ts +205 -200
  229. package/src/tools/__tests__/monthTools.delta.integration.test.ts +68 -68
  230. package/src/tools/__tests__/monthTools.integration.test.ts +178 -166
  231. package/src/tools/__tests__/monthTools.test.ts +561 -512
  232. package/src/tools/__tests__/payeeTools.delta.integration.test.ts +68 -68
  233. package/src/tools/__tests__/payeeTools.integration.test.ts +158 -142
  234. package/src/tools/__tests__/payeeTools.test.ts +486 -434
  235. package/src/tools/__tests__/transactionSchemas.test.ts +1202 -1186
  236. package/src/tools/__tests__/transactionTools.integration.test.ts +875 -825
  237. package/src/tools/__tests__/transactionTools.test.ts +4923 -4366
  238. package/src/tools/__tests__/transactionUtils.test.ts +1004 -977
  239. package/src/tools/__tests__/utilityTools.integration.test.ts +32 -32
  240. package/src/tools/__tests__/utilityTools.test.ts +68 -58
  241. package/src/tools/accountTools.ts +293 -271
  242. package/src/tools/adapters.ts +120 -63
  243. package/src/tools/budgetTools.ts +121 -116
  244. package/src/tools/categoryTools.ts +379 -339
  245. package/src/tools/compareTransactions/formatter.ts +131 -119
  246. package/src/tools/compareTransactions/index.ts +249 -214
  247. package/src/tools/compareTransactions/matcher.ts +259 -209
  248. package/src/tools/compareTransactions/parser.ts +517 -487
  249. package/src/tools/compareTransactions/types.ts +38 -38
  250. package/src/tools/compareTransactions.ts +1 -1
  251. package/src/tools/deltaFetcher.ts +281 -260
  252. package/src/tools/deltaSupport.ts +264 -259
  253. package/src/tools/exportTransactions.ts +230 -218
  254. package/src/tools/monthTools.ts +180 -165
  255. package/src/tools/payeeTools.ts +152 -140
  256. package/src/tools/reconcileAdapter.ts +297 -252
  257. package/src/tools/reconciliation/CLAUDE.md +506 -0
  258. package/src/tools/reconciliation/__tests__/adapter.causes.test.ts +133 -124
  259. package/src/tools/reconciliation/__tests__/adapter.test.ts +249 -230
  260. package/src/tools/reconciliation/__tests__/analyzer.test.ts +408 -400
  261. package/src/tools/reconciliation/__tests__/csvParser.test.ts +71 -69
  262. package/src/tools/reconciliation/__tests__/executor.integration.test.ts +348 -323
  263. package/src/tools/reconciliation/__tests__/executor.progress.test.ts +503 -457
  264. package/src/tools/reconciliation/__tests__/executor.test.ts +898 -831
  265. package/src/tools/reconciliation/__tests__/matcher.test.ts +667 -663
  266. package/src/tools/reconciliation/__tests__/payeeNormalizer.test.ts +296 -276
  267. package/src/tools/reconciliation/__tests__/recommendationEngine.integration.test.ts +692 -624
  268. package/src/tools/reconciliation/__tests__/recommendationEngine.test.ts +1008 -989
  269. package/src/tools/reconciliation/__tests__/reconciliation.delta.integration.test.ts +187 -146
  270. package/src/tools/reconciliation/__tests__/reportFormatter.test.ts +583 -533
  271. package/src/tools/reconciliation/__tests__/scenarios/adapterCurrency.scenario.test.ts +75 -74
  272. package/src/tools/reconciliation/__tests__/scenarios/extremes.scenario.test.ts +70 -62
  273. package/src/tools/reconciliation/__tests__/scenarios/repeatAmount.scenario.test.ts +102 -88
  274. package/src/tools/reconciliation/__tests__/schemaUrl.test.ts +56 -55
  275. package/src/tools/reconciliation/__tests__/signDetector.test.ts +209 -206
  276. package/src/tools/reconciliation/__tests__/ynabAdapter.test.ts +66 -60
  277. package/src/tools/reconciliation/analyzer.ts +564 -504
  278. package/src/tools/reconciliation/csvParser.ts +656 -609
  279. package/src/tools/reconciliation/executor.ts +1290 -1128
  280. package/src/tools/reconciliation/index.ts +580 -528
  281. package/src/tools/reconciliation/matcher.ts +256 -240
  282. package/src/tools/reconciliation/payeeNormalizer.ts +92 -78
  283. package/src/tools/reconciliation/recommendationEngine.ts +357 -345
  284. package/src/tools/reconciliation/reportFormatter.ts +343 -307
  285. package/src/tools/reconciliation/signDetector.ts +89 -83
  286. package/src/tools/reconciliation/types.ts +164 -159
  287. package/src/tools/reconciliation/ynabAdapter.ts +17 -15
  288. package/src/tools/schemas/CLAUDE.md +546 -0
  289. package/src/tools/schemas/common.ts +1 -1
  290. package/src/tools/schemas/outputs/__tests__/accountOutputs.test.ts +410 -409
  291. package/src/tools/schemas/outputs/__tests__/budgetOutputs.test.ts +305 -299
  292. package/src/tools/schemas/outputs/__tests__/categoryOutputs.test.ts +431 -430
  293. package/src/tools/schemas/outputs/__tests__/comparisonOutputs.test.ts +510 -495
  294. package/src/tools/schemas/outputs/__tests__/dateValidation.test.ts +179 -153
  295. package/src/tools/schemas/outputs/__tests__/discrepancyDirection.test.ts +293 -254
  296. package/src/tools/schemas/outputs/__tests__/monthOutputs.test.ts +457 -457
  297. package/src/tools/schemas/outputs/__tests__/payeeOutputs.test.ts +362 -356
  298. package/src/tools/schemas/outputs/__tests__/reconciliationOutputs.test.ts +402 -399
  299. package/src/tools/schemas/outputs/__tests__/transactionMutationSchemas.test.ts +225 -211
  300. package/src/tools/schemas/outputs/__tests__/transactionOutputs.test.ts +457 -454
  301. package/src/tools/schemas/outputs/__tests__/utilityOutputs.test.ts +316 -315
  302. package/src/tools/schemas/outputs/accountOutputs.ts +40 -34
  303. package/src/tools/schemas/outputs/budgetOutputs.ts +24 -19
  304. package/src/tools/schemas/outputs/categoryOutputs.ts +76 -56
  305. package/src/tools/schemas/outputs/comparisonOutputs.ts +192 -169
  306. package/src/tools/schemas/outputs/index.ts +163 -163
  307. package/src/tools/schemas/outputs/monthOutputs.ts +95 -80
  308. package/src/tools/schemas/outputs/payeeOutputs.ts +18 -18
  309. package/src/tools/schemas/outputs/reconciliationOutputs.ts +386 -373
  310. package/src/tools/schemas/outputs/transactionMutationOutputs.ts +259 -231
  311. package/src/tools/schemas/outputs/transactionOutputs.ts +81 -71
  312. package/src/tools/schemas/outputs/utilityOutputs.ts +90 -84
  313. package/src/tools/schemas/shared/commonOutputs.ts +27 -19
  314. package/src/tools/toolCategories.ts +114 -114
  315. package/src/tools/transactionReadTools.ts +327 -0
  316. package/src/tools/transactionSchemas.ts +322 -291
  317. package/src/tools/transactionTools.ts +84 -2246
  318. package/src/tools/transactionUtils.ts +507 -422
  319. package/src/tools/transactionWriteTools.ts +2110 -0
  320. package/src/tools/utilityTools.ts +46 -41
  321. package/src/types/CLAUDE.md +477 -0
  322. package/src/types/__tests__/index.test.ts +51 -51
  323. package/src/types/index.ts +43 -39
  324. package/src/types/integration-tests.d.ts +26 -26
  325. package/src/types/reconciliation.ts +29 -29
  326. package/src/types/toolAnnotations.ts +30 -30
  327. package/src/types/toolRegistration.ts +43 -32
  328. package/src/utils/CLAUDE.md +508 -0
  329. package/src/utils/__tests__/dateUtils.test.ts +174 -168
  330. package/src/utils/__tests__/money.test.ts +193 -187
  331. package/src/utils/amountUtils.ts +5 -5
  332. package/src/utils/baseError.ts +5 -5
  333. package/src/utils/dateUtils.ts +29 -26
  334. package/src/utils/errors.ts +14 -14
  335. package/src/utils/money.ts +66 -52
  336. package/src/utils/validationError.ts +1 -1
  337. package/tsconfig.json +29 -29
  338. package/tsconfig.prod.json +16 -16
  339. package/vitest-reporters/split-json-reporter.ts +247 -204
  340. package/vitest.config.ts +99 -95
  341. package/.prettierignore +0 -10
  342. package/.prettierrc.json +0 -10
  343. package/eslint.config.js +0 -49
@@ -1,5 +1,5 @@
1
- import { z } from 'zod/v4';
2
- import * as ynab from 'ynab';
1
+ import type * as ynab from "ynab";
2
+ import { z } from "zod/v4";
3
3
 
4
4
  /**
5
5
  * Transaction Schemas and Types
@@ -16,17 +16,17 @@ import * as ynab from 'ynab';
16
16
  * Schema for ynab:list_transactions tool parameters
17
17
  */
18
18
  export const ListTransactionsSchema = z
19
- .object({
20
- budget_id: z.string().min(1, 'Budget ID is required'),
21
- account_id: z.string().optional(),
22
- category_id: z.string().optional(),
23
- since_date: z
24
- .string()
25
- .regex(/^\d{4}-\d{2}-\d{2}$/, 'Date must be in ISO format (YYYY-MM-DD)')
26
- .optional(),
27
- type: z.enum(['uncategorized', 'unapproved']).optional(),
28
- })
29
- .strict();
19
+ .object({
20
+ budget_id: z.string().min(1, "Budget ID is required"),
21
+ account_id: z.string().optional(),
22
+ category_id: z.string().optional(),
23
+ since_date: z
24
+ .string()
25
+ .regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in ISO format (YYYY-MM-DD)")
26
+ .optional(),
27
+ type: z.enum(["uncategorized", "unapproved"]).optional(),
28
+ })
29
+ .strict();
30
30
 
31
31
  export type ListTransactionsParams = z.infer<typeof ListTransactionsSchema>;
32
32
 
@@ -38,11 +38,11 @@ export type ListTransactionsParams = z.infer<typeof ListTransactionsSchema>;
38
38
  * Schema for ynab:get_transaction tool parameters
39
39
  */
40
40
  export const GetTransactionSchema = z
41
- .object({
42
- budget_id: z.string().min(1, 'Budget ID is required'),
43
- transaction_id: z.string().min(1, 'Transaction ID is required'),
44
- })
45
- .strict();
41
+ .object({
42
+ budget_id: z.string().min(1, "Budget ID is required"),
43
+ transaction_id: z.string().min(1, "Transaction ID is required"),
44
+ })
45
+ .strict();
46
46
 
47
47
  export type GetTransactionParams = z.infer<typeof GetTransactionSchema>;
48
48
 
@@ -54,48 +54,57 @@ export type GetTransactionParams = z.infer<typeof GetTransactionSchema>;
54
54
  * Schema for ynab:create_transaction tool parameters
55
55
  */
56
56
  export const CreateTransactionSchema = z
57
- .object({
58
- budget_id: z.string().min(1, 'Budget ID is required'),
59
- account_id: z.string().min(1, 'Account ID is required'),
60
- amount: z.number().int('Amount must be an integer in milliunits'),
61
- date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, 'Date must be in ISO format (YYYY-MM-DD)'),
62
- payee_name: z.string().optional(),
63
- payee_id: z.string().optional(),
64
- category_id: z.string().optional(),
65
- memo: z.string().optional(),
66
- cleared: z.enum(['cleared', 'uncleared', 'reconciled']).optional(),
67
- approved: z.boolean().optional(),
68
- flag_color: z.enum(['red', 'orange', 'yellow', 'green', 'blue', 'purple']).optional(),
69
- import_id: z.string().min(1, 'Import ID cannot be empty').optional(),
70
- dry_run: z.boolean().optional(),
71
- subtransactions: z
72
- .array(
73
- z
74
- .object({
75
- amount: z.number().int('Subtransaction amount must be an integer in milliunits'),
76
- payee_name: z.string().optional(),
77
- payee_id: z.string().optional(),
78
- category_id: z.string().optional(),
79
- memo: z.string().optional(),
80
- })
81
- .strict(),
82
- )
83
- .min(1, 'At least one subtransaction is required when provided')
84
- .optional(),
85
- })
86
- .strict()
87
- .superRefine((data, ctx) => {
88
- if (data.subtransactions && data.subtransactions.length > 0) {
89
- const total = data.subtransactions.reduce((sum, sub) => sum + sub.amount, 0);
90
- if (total !== data.amount) {
91
- ctx.addIssue({
92
- code: z.ZodIssueCode.custom,
93
- message: 'Amount must equal the sum of subtransaction amounts',
94
- path: ['amount'],
95
- });
96
- }
97
- }
98
- });
57
+ .object({
58
+ budget_id: z.string().min(1, "Budget ID is required"),
59
+ account_id: z.string().min(1, "Account ID is required"),
60
+ amount: z.number().int("Amount must be an integer in milliunits"),
61
+ date: z
62
+ .string()
63
+ .regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in ISO format (YYYY-MM-DD)"),
64
+ payee_name: z.string().optional(),
65
+ payee_id: z.string().optional(),
66
+ category_id: z.string().optional(),
67
+ memo: z.string().optional(),
68
+ cleared: z.enum(["cleared", "uncleared", "reconciled"]).optional(),
69
+ approved: z.boolean().optional(),
70
+ flag_color: z
71
+ .enum(["red", "orange", "yellow", "green", "blue", "purple"])
72
+ .optional(),
73
+ import_id: z.string().min(1, "Import ID cannot be empty").optional(),
74
+ dry_run: z.boolean().optional(),
75
+ subtransactions: z
76
+ .array(
77
+ z
78
+ .object({
79
+ amount: z
80
+ .number()
81
+ .int("Subtransaction amount must be an integer in milliunits"),
82
+ payee_name: z.string().optional(),
83
+ payee_id: z.string().optional(),
84
+ category_id: z.string().optional(),
85
+ memo: z.string().optional(),
86
+ })
87
+ .strict(),
88
+ )
89
+ .min(1, "At least one subtransaction is required when provided")
90
+ .optional(),
91
+ })
92
+ .strict()
93
+ .superRefine((data, ctx) => {
94
+ if (data.subtransactions && data.subtransactions.length > 0) {
95
+ const total = data.subtransactions.reduce(
96
+ (sum, sub) => sum + sub.amount,
97
+ 0,
98
+ );
99
+ if (total !== data.amount) {
100
+ ctx.addIssue({
101
+ code: z.ZodIssueCode.custom,
102
+ message: "Amount must equal the sum of subtransaction amounts",
103
+ path: ["amount"],
104
+ });
105
+ }
106
+ }
107
+ });
99
108
 
100
109
  export type CreateTransactionParams = z.infer<typeof CreateTransactionSchema>;
101
110
 
@@ -103,11 +112,11 @@ export type CreateTransactionParams = z.infer<typeof CreateTransactionSchema>;
103
112
  * Schema for subtransaction input
104
113
  */
105
114
  export interface SubtransactionInput {
106
- amount: number;
107
- payee_name?: string;
108
- payee_id?: string;
109
- category_id?: string;
110
- memo?: string;
115
+ amount: number;
116
+ payee_name?: string;
117
+ payee_id?: string;
118
+ category_id?: string;
119
+ memo?: string;
111
120
  }
112
121
 
113
122
  // ============================================================================
@@ -115,22 +124,22 @@ export interface SubtransactionInput {
115
124
  // ============================================================================
116
125
 
117
126
  const BulkTransactionInputSchemaBase = CreateTransactionSchema.pick({
118
- account_id: true,
119
- amount: true,
120
- date: true,
121
- payee_name: true,
122
- payee_id: true,
123
- category_id: true,
124
- memo: true,
125
- cleared: true,
126
- approved: true,
127
- flag_color: true,
128
- import_id: true,
127
+ account_id: true,
128
+ amount: true,
129
+ date: true,
130
+ payee_name: true,
131
+ payee_id: true,
132
+ category_id: true,
133
+ memo: true,
134
+ cleared: true,
135
+ approved: true,
136
+ flag_color: true,
137
+ import_id: true,
129
138
  });
130
139
 
131
140
  export type BulkTransactionInput = Omit<
132
- CreateTransactionParams,
133
- 'budget_id' | 'dry_run' | 'subtransactions'
141
+ CreateTransactionParams,
142
+ "budget_id" | "dry_run" | "subtransactions"
134
143
  >;
135
144
 
136
145
  // Schema for bulk transaction creation - subtransactions are not supported
@@ -138,41 +147,41 @@ export type BulkTransactionInput = Omit<
138
147
  const BulkTransactionInputSchema = BulkTransactionInputSchemaBase.strict();
139
148
 
140
149
  export const CreateTransactionsSchema = z
141
- .object({
142
- budget_id: z.string().min(1, 'Budget ID is required'),
143
- transactions: z
144
- .array(BulkTransactionInputSchema)
145
- .min(1, 'At least one transaction is required')
146
- .max(100, 'A maximum of 100 transactions may be created at once'),
147
- dry_run: z.boolean().optional(),
148
- })
149
- .strict();
150
+ .object({
151
+ budget_id: z.string().min(1, "Budget ID is required"),
152
+ transactions: z
153
+ .array(BulkTransactionInputSchema)
154
+ .min(1, "At least one transaction is required")
155
+ .max(100, "A maximum of 100 transactions may be created at once"),
156
+ dry_run: z.boolean().optional(),
157
+ })
158
+ .strict();
150
159
 
151
160
  export type CreateTransactionsParams = z.infer<typeof CreateTransactionsSchema>;
152
161
 
153
162
  export interface BulkTransactionResult {
154
- request_index: number;
155
- status: 'created' | 'duplicate' | 'failed';
156
- transaction_id?: string | undefined;
157
- correlation_key: string;
158
- error_code?: string | undefined;
159
- error?: string | undefined;
163
+ request_index: number;
164
+ status: "created" | "duplicate" | "failed";
165
+ transaction_id?: string | undefined;
166
+ correlation_key: string;
167
+ error_code?: string | undefined;
168
+ error?: string | undefined;
160
169
  }
161
170
 
162
171
  export interface BulkCreateResponse {
163
- success: boolean;
164
- server_knowledge?: number;
165
- summary: {
166
- total_requested: number;
167
- created: number;
168
- duplicates: number;
169
- failed: number;
170
- };
171
- results: BulkTransactionResult[];
172
- transactions?: ynab.TransactionDetail[];
173
- duplicate_import_ids?: string[];
174
- message?: string;
175
- mode?: 'full' | 'summary' | 'ids_only';
172
+ success: boolean;
173
+ server_knowledge?: number;
174
+ summary: {
175
+ total_requested: number;
176
+ created: number;
177
+ duplicates: number;
178
+ failed: number;
179
+ };
180
+ results: BulkTransactionResult[];
181
+ transactions?: ynab.TransactionDetail[];
182
+ duplicate_import_ids?: string[];
183
+ message?: string;
184
+ mode?: "full" | "summary" | "ids_only";
176
185
  }
177
186
 
178
187
  // ============================================================================
@@ -180,100 +189,110 @@ export interface BulkCreateResponse {
180
189
  // ============================================================================
181
190
 
182
191
  const ReceiptSplitItemSchema = z
183
- .object({
184
- name: z.string().min(1, 'Item name is required'),
185
- amount: z.number().finite('Item amount must be a finite number'),
186
- quantity: z
187
- .number()
188
- .finite('Quantity must be a finite number')
189
- .positive('Quantity must be greater than zero')
190
- .optional(),
191
- memo: z.string().optional(),
192
- })
193
- .strict();
192
+ .object({
193
+ name: z.string().min(1, "Item name is required"),
194
+ amount: z.number().finite("Item amount must be a finite number"),
195
+ quantity: z
196
+ .number()
197
+ .finite("Quantity must be a finite number")
198
+ .positive("Quantity must be greater than zero")
199
+ .optional(),
200
+ memo: z.string().optional(),
201
+ })
202
+ .strict();
194
203
 
195
204
  const ReceiptSplitCategorySchema = z
196
- .object({
197
- category_id: z.string().min(1, 'Category ID is required'),
198
- category_name: z.string().optional(),
199
- items: z.array(ReceiptSplitItemSchema).min(1, 'Each category must include at least one item'),
200
- })
201
- .strict();
205
+ .object({
206
+ category_id: z.string().min(1, "Category ID is required"),
207
+ category_name: z.string().optional(),
208
+ items: z
209
+ .array(ReceiptSplitItemSchema)
210
+ .min(1, "Each category must include at least one item"),
211
+ })
212
+ .strict();
202
213
 
203
214
  export const CreateReceiptSplitTransactionSchema = z
204
- .object({
205
- budget_id: z.string().min(1, 'Budget ID is required'),
206
- account_id: z.string().min(1, 'Account ID is required'),
207
- payee_name: z.string().min(1, 'Payee name is required'),
208
- date: z
209
- .string()
210
- .regex(/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/, 'Date must be in ISO format (YYYY-MM-DD)')
211
- .optional(),
212
- memo: z.string().optional(),
213
- receipt_subtotal: z
214
- .number()
215
- .finite('Receipt subtotal must be a finite number')
216
- .refine((value) => value >= 0, 'Receipt subtotal must be zero or greater')
217
- .optional(),
218
- receipt_tax: z.number().finite('Receipt tax must be a finite number'),
219
- receipt_total: z
220
- .number()
221
- .finite('Receipt total must be a finite number')
222
- .refine((value) => value > 0, 'Receipt total must be greater than zero'),
223
- categories: z
224
- .array(ReceiptSplitCategorySchema)
225
- .min(1, 'At least one categorized group is required to create a split transaction'),
226
- cleared: z.enum(['cleared', 'uncleared', 'reconciled']).optional(),
227
- approved: z.boolean().optional(),
228
- flag_color: z.enum(['red', 'orange', 'yellow', 'green', 'blue', 'purple']).optional(),
229
- dry_run: z.boolean().optional(),
230
- })
231
- .strict()
232
- .superRefine((data, ctx) => {
233
- const itemsSubtotal = data.categories
234
- .flatMap((category) => category.items)
235
- .reduce((sum, item) => sum + item.amount, 0);
236
-
237
- if (data.receipt_subtotal !== undefined) {
238
- const delta = Math.abs(data.receipt_subtotal - itemsSubtotal);
239
- if (delta > 0.01) {
240
- ctx.addIssue({
241
- code: z.ZodIssueCode.custom,
242
- message: `Receipt subtotal (${data.receipt_subtotal.toFixed(2)}) does not match categorized items total (${itemsSubtotal.toFixed(2)})`,
243
- path: ['receipt_subtotal'],
244
- });
245
- }
246
- }
247
-
248
- const expectedTotal = itemsSubtotal + data.receipt_tax;
249
- const deltaTotal = Math.abs(expectedTotal - data.receipt_total);
250
- if (deltaTotal > 0.01) {
251
- ctx.addIssue({
252
- code: z.ZodIssueCode.custom,
253
- message: `Receipt total (${data.receipt_total.toFixed(2)}) does not match subtotal plus tax (${expectedTotal.toFixed(2)})`,
254
- path: ['receipt_total'],
255
- });
256
- }
257
- });
215
+ .object({
216
+ budget_id: z.string().min(1, "Budget ID is required"),
217
+ account_id: z.string().min(1, "Account ID is required"),
218
+ payee_name: z.string().min(1, "Payee name is required"),
219
+ date: z
220
+ .string()
221
+ .regex(
222
+ /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/,
223
+ "Date must be in ISO format (YYYY-MM-DD)",
224
+ )
225
+ .optional(),
226
+ memo: z.string().optional(),
227
+ receipt_subtotal: z
228
+ .number()
229
+ .finite("Receipt subtotal must be a finite number")
230
+ .refine((value) => value >= 0, "Receipt subtotal must be zero or greater")
231
+ .optional(),
232
+ receipt_tax: z.number().finite("Receipt tax must be a finite number"),
233
+ receipt_total: z
234
+ .number()
235
+ .finite("Receipt total must be a finite number")
236
+ .refine((value) => value > 0, "Receipt total must be greater than zero"),
237
+ categories: z
238
+ .array(ReceiptSplitCategorySchema)
239
+ .min(
240
+ 1,
241
+ "At least one categorized group is required to create a split transaction",
242
+ ),
243
+ cleared: z.enum(["cleared", "uncleared", "reconciled"]).optional(),
244
+ approved: z.boolean().optional(),
245
+ flag_color: z
246
+ .enum(["red", "orange", "yellow", "green", "blue", "purple"])
247
+ .optional(),
248
+ dry_run: z.boolean().optional(),
249
+ })
250
+ .strict()
251
+ .superRefine((data, ctx) => {
252
+ const itemsSubtotal = data.categories
253
+ .flatMap((category) => category.items)
254
+ .reduce((sum, item) => sum + item.amount, 0);
255
+
256
+ if (data.receipt_subtotal !== undefined) {
257
+ const delta = Math.abs(data.receipt_subtotal - itemsSubtotal);
258
+ if (delta > 0.01) {
259
+ ctx.addIssue({
260
+ code: z.ZodIssueCode.custom,
261
+ message: `Receipt subtotal (${data.receipt_subtotal.toFixed(2)}) does not match categorized items total (${itemsSubtotal.toFixed(2)})`,
262
+ path: ["receipt_subtotal"],
263
+ });
264
+ }
265
+ }
266
+
267
+ const expectedTotal = itemsSubtotal + data.receipt_tax;
268
+ const deltaTotal = Math.abs(expectedTotal - data.receipt_total);
269
+ if (deltaTotal > 0.01) {
270
+ ctx.addIssue({
271
+ code: z.ZodIssueCode.custom,
272
+ message: `Receipt total (${data.receipt_total.toFixed(2)}) does not match subtotal plus tax (${expectedTotal.toFixed(2)})`,
273
+ path: ["receipt_total"],
274
+ });
275
+ }
276
+ });
258
277
 
259
278
  export type CreateReceiptSplitTransactionParams = z.infer<
260
- typeof CreateReceiptSplitTransactionSchema
279
+ typeof CreateReceiptSplitTransactionSchema
261
280
  >;
262
281
 
263
282
  /**
264
283
  * Interface for receipt category calculation
265
284
  */
266
285
  export interface ReceiptCategoryCalculation {
267
- category_id: string;
268
- category_name: string | undefined;
269
- subtotal_milliunits: number;
270
- tax_milliunits: number;
271
- items: {
272
- name: string;
273
- amount_milliunits: number;
274
- quantity: number | undefined;
275
- memo: string | undefined;
276
- }[];
286
+ category_id: string;
287
+ category_name: string | undefined;
288
+ subtotal_milliunits: number;
289
+ tax_milliunits: number;
290
+ items: {
291
+ name: string;
292
+ amount_milliunits: number;
293
+ quantity: number | undefined;
294
+ memo: string | undefined;
295
+ }[];
277
296
  }
278
297
 
279
298
  // ============================================================================
@@ -284,25 +303,30 @@ export interface ReceiptCategoryCalculation {
284
303
  * Schema for ynab:update_transaction tool parameters
285
304
  */
286
305
  export const UpdateTransactionSchema = z
287
- .object({
288
- budget_id: z.string().min(1, 'Budget ID is required'),
289
- transaction_id: z.string().min(1, 'Transaction ID is required'),
290
- account_id: z.string().optional(),
291
- amount: z.number().int('Amount must be an integer in milliunits').optional(),
292
- date: z
293
- .string()
294
- .regex(/^\d{4}-\d{2}-\d{2}$/, 'Date must be in ISO format (YYYY-MM-DD)')
295
- .optional(),
296
- payee_name: z.string().optional(),
297
- payee_id: z.string().optional(),
298
- category_id: z.string().optional(),
299
- memo: z.string().optional(),
300
- cleared: z.enum(['cleared', 'uncleared', 'reconciled']).optional(),
301
- approved: z.boolean().optional(),
302
- flag_color: z.enum(['red', 'orange', 'yellow', 'green', 'blue', 'purple']).optional(),
303
- dry_run: z.boolean().optional(),
304
- })
305
- .strict();
306
+ .object({
307
+ budget_id: z.string().min(1, "Budget ID is required"),
308
+ transaction_id: z.string().min(1, "Transaction ID is required"),
309
+ account_id: z.string().optional(),
310
+ amount: z
311
+ .number()
312
+ .int("Amount must be an integer in milliunits")
313
+ .optional(),
314
+ date: z
315
+ .string()
316
+ .regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in ISO format (YYYY-MM-DD)")
317
+ .optional(),
318
+ payee_name: z.string().optional(),
319
+ payee_id: z.string().optional(),
320
+ category_id: z.string().optional(),
321
+ memo: z.string().optional(),
322
+ cleared: z.enum(["cleared", "uncleared", "reconciled"]).optional(),
323
+ approved: z.boolean().optional(),
324
+ flag_color: z
325
+ .enum(["red", "orange", "yellow", "green", "blue", "purple"])
326
+ .optional(),
327
+ dry_run: z.boolean().optional(),
328
+ })
329
+ .strict();
306
330
 
307
331
  export type UpdateTransactionParams = z.infer<typeof UpdateTransactionSchema>;
308
332
 
@@ -315,68 +339,75 @@ export type UpdateTransactionParams = z.infer<typeof UpdateTransactionSchema>;
315
339
  * Note: account_id is intentionally excluded as account moves are not supported in bulk updates
316
340
  */
317
341
  const BulkUpdateTransactionInputSchema = z
318
- .object({
319
- id: z.string().min(1, 'Transaction ID is required'),
320
- amount: z.number().int('Amount must be an integer in milliunits').optional(),
321
- date: z
322
- .string()
323
- .regex(/^\d{4}-\d{2}-\d{2}$/, 'Date must be in ISO format (YYYY-MM-DD)')
324
- .optional(),
325
- payee_name: z.string().optional(),
326
- payee_id: z.string().optional(),
327
- category_id: z.string().optional(),
328
- memo: z.string().optional(),
329
- cleared: z.enum(['cleared', 'uncleared', 'reconciled']).optional(),
330
- approved: z.boolean().optional(),
331
- flag_color: z.enum(['red', 'orange', 'yellow', 'green', 'blue', 'purple']).optional(),
332
- // Metadata fields for cache invalidation
333
- original_account_id: z.string().optional(),
334
- original_date: z
335
- .string()
336
- .regex(/^\d{4}-\d{2}-\d{2}$/, 'Date must be in ISO format (YYYY-MM-DD)')
337
- .optional(),
338
- })
339
- .strict();
340
-
341
- export type BulkUpdateTransactionInput = z.infer<typeof BulkUpdateTransactionInputSchema>;
342
+ .object({
343
+ id: z.string().min(1, "Transaction ID is required"),
344
+ amount: z
345
+ .number()
346
+ .int("Amount must be an integer in milliunits")
347
+ .optional(),
348
+ date: z
349
+ .string()
350
+ .regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in ISO format (YYYY-MM-DD)")
351
+ .optional(),
352
+ payee_name: z.string().optional(),
353
+ payee_id: z.string().optional(),
354
+ category_id: z.string().optional(),
355
+ memo: z.string().optional(),
356
+ cleared: z.enum(["cleared", "uncleared", "reconciled"]).optional(),
357
+ approved: z.boolean().optional(),
358
+ flag_color: z
359
+ .enum(["red", "orange", "yellow", "green", "blue", "purple"])
360
+ .optional(),
361
+ // Metadata fields for cache invalidation
362
+ original_account_id: z.string().optional(),
363
+ original_date: z
364
+ .string()
365
+ .regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in ISO format (YYYY-MM-DD)")
366
+ .optional(),
367
+ })
368
+ .strict();
369
+
370
+ export type BulkUpdateTransactionInput = z.infer<
371
+ typeof BulkUpdateTransactionInputSchema
372
+ >;
342
373
 
343
374
  /**
344
375
  * Schema for ynab:update_transactions tool parameters
345
376
  */
346
377
  export const UpdateTransactionsSchema = z
347
- .object({
348
- budget_id: z.string().min(1, 'Budget ID is required'),
349
- transactions: z
350
- .array(BulkUpdateTransactionInputSchema)
351
- .min(1, 'At least one transaction is required')
352
- .max(100, 'A maximum of 100 transactions may be updated at once'),
353
- dry_run: z.boolean().optional(),
354
- })
355
- .strict();
378
+ .object({
379
+ budget_id: z.string().min(1, "Budget ID is required"),
380
+ transactions: z
381
+ .array(BulkUpdateTransactionInputSchema)
382
+ .min(1, "At least one transaction is required")
383
+ .max(100, "A maximum of 100 transactions may be updated at once"),
384
+ dry_run: z.boolean().optional(),
385
+ })
386
+ .strict();
356
387
 
357
388
  export type UpdateTransactionsParams = z.infer<typeof UpdateTransactionsSchema>;
358
389
 
359
390
  export interface BulkUpdateResult {
360
- request_index: number;
361
- status: 'updated' | 'failed';
362
- transaction_id: string;
363
- correlation_key: string;
364
- error_code?: string;
365
- error?: string;
391
+ request_index: number;
392
+ status: "updated" | "failed";
393
+ transaction_id: string;
394
+ correlation_key: string;
395
+ error_code?: string;
396
+ error?: string;
366
397
  }
367
398
 
368
399
  export interface BulkUpdateResponse {
369
- success: boolean;
370
- server_knowledge?: number;
371
- summary: {
372
- total_requested: number;
373
- updated: number;
374
- failed: number;
375
- };
376
- results: BulkUpdateResult[];
377
- transactions?: ynab.TransactionDetail[];
378
- message?: string;
379
- mode?: 'full' | 'summary' | 'ids_only';
400
+ success: boolean;
401
+ server_knowledge?: number;
402
+ summary: {
403
+ total_requested: number;
404
+ updated: number;
405
+ failed: number;
406
+ };
407
+ results: BulkUpdateResult[];
408
+ transactions?: ynab.TransactionDetail[];
409
+ message?: string;
410
+ mode?: "full" | "summary" | "ids_only";
380
411
  }
381
412
 
382
413
  // ============================================================================
@@ -387,12 +418,12 @@ export interface BulkUpdateResponse {
387
418
  * Schema for ynab:delete_transaction tool parameters
388
419
  */
389
420
  export const DeleteTransactionSchema = z
390
- .object({
391
- budget_id: z.string().min(1, 'Budget ID is required'),
392
- transaction_id: z.string().min(1, 'Transaction ID is required'),
393
- dry_run: z.boolean().optional(),
394
- })
395
- .strict();
421
+ .object({
422
+ budget_id: z.string().min(1, "Budget ID is required"),
423
+ transaction_id: z.string().min(1, "Transaction ID is required"),
424
+ dry_run: z.boolean().optional(),
425
+ })
426
+ .strict();
396
427
 
397
428
  export type DeleteTransactionParams = z.infer<typeof DeleteTransactionSchema>;
398
429
 
@@ -404,50 +435,50 @@ export type DeleteTransactionParams = z.infer<typeof DeleteTransactionSchema>;
404
435
  * Type for correlation payload used in bulk operations
405
436
  */
406
437
  export interface CorrelationPayload {
407
- account_id?: string;
408
- date?: string;
409
- amount?: number;
410
- payee_id?: string | null;
411
- payee_name?: string | null;
412
- category_id?: string | null;
413
- memo?: string | null;
414
- cleared?: ynab.TransactionClearedStatus;
415
- approved?: boolean;
416
- flag_color?: ynab.TransactionFlagColor | null;
417
- import_id?: string | null;
438
+ account_id?: string;
439
+ date?: string;
440
+ amount?: number;
441
+ payee_id?: string | null;
442
+ payee_name?: string | null;
443
+ category_id?: string | null;
444
+ memo?: string | null;
445
+ cleared?: ynab.TransactionClearedStatus;
446
+ approved?: boolean;
447
+ flag_color?: ynab.TransactionFlagColor | null;
448
+ import_id?: string | null;
418
449
  }
419
450
 
420
451
  /**
421
452
  * Interface for correlation payload input (with optional fields)
422
453
  */
423
454
  export interface CorrelationPayloadInput {
424
- account_id?: string | undefined;
425
- date?: string | undefined;
426
- amount?: number | undefined;
427
- payee_id?: string | null | undefined;
428
- payee_name?: string | null | undefined;
429
- category_id?: string | null | undefined;
430
- memo?: string | null | undefined;
431
- cleared?: ynab.TransactionClearedStatus | undefined;
432
- approved?: boolean | undefined;
433
- flag_color?: ynab.TransactionFlagColor | null | undefined;
434
- import_id?: string | null | undefined;
455
+ account_id?: string | undefined;
456
+ date?: string | undefined;
457
+ amount?: number | undefined;
458
+ payee_id?: string | null | undefined;
459
+ payee_name?: string | null | undefined;
460
+ category_id?: string | null | undefined;
461
+ memo?: string | null | undefined;
462
+ cleared?: ynab.TransactionClearedStatus | undefined;
463
+ approved?: boolean | undefined;
464
+ flag_color?: ynab.TransactionFlagColor | null | undefined;
465
+ import_id?: string | null | undefined;
435
466
  }
436
467
 
437
468
  /**
438
469
  * Interface for category source (used in cache invalidation)
439
470
  */
440
471
  export interface CategorySource {
441
- category_id?: string | null;
442
- subtransactions?: { category_id?: string | null }[] | null | undefined;
472
+ category_id?: string | null;
473
+ subtransactions?: { category_id?: string | null }[] | null | undefined;
443
474
  }
444
475
 
445
476
  /**
446
477
  * Interface for transaction cache invalidation options
447
478
  */
448
479
  export interface TransactionCacheInvalidationOptions {
449
- affectedCategoryIds?: Set<string>;
450
- invalidateAllCategories?: boolean;
451
- accountTotalsChanged?: boolean;
452
- invalidateMonths?: boolean;
480
+ affectedCategoryIds?: Set<string>;
481
+ invalidateAllCategories?: boolean;
482
+ accountTotalsChanged?: boolean;
483
+ invalidateMonths?: boolean;
453
484
  }